From ab5bd36cec274d5017fb44aaae83e021bcf7bf46 Mon Sep 17 00:00:00 2001 From: zhonghua Date: Thu, 2 Apr 2026 17:14:11 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4node=E5=90=8E=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.cursor/rules/backend-specific.mdc | 122 - backend/.eslintrc.js | 26 - backend/.gitignore | 47 - backend/.npmrc | 4 - backend/.prettierrc | 5 - ...petition-management-service-test-1.0.0.tgz | Bin 345732 -> 0 bytes backend/data/competition_management.sql | 2059 --- backend/data/menus.json | 372 - backend/data/permissions.json | 737 -- backend/docs/ADMIN_ACCOUNT.md | 184 - backend/docs/CONTEST_JUDGE_DESIGN.md | 271 - backend/docs/DATABASE_SETUP.md | 183 - backend/docs/DATABASE_URL_SOURCE.md | 165 - backend/docs/ENVIRONMENT_CONFIG.md | 290 - backend/docs/ENV_CHANGE_GUIDE.md | 254 - backend/docs/MENU_INIT.md | 219 - backend/docs/MIGRATION_INCREMENTAL_GUIDE.md | 312 - backend/docs/QUICK_START_ENV.md | 131 - backend/docs/RBAC_EXAMPLES.md | 444 - backend/docs/RBAC_GUIDE.md | 397 - backend/docs/README.md | 105 - backend/docs/SCHEMA_CHANGE_GUIDE.md | 128 - backend/docs/SCHOOL_MODULE_SCHEMA.md | 301 - backend/docs/TENANT_GUIDE.md | 270 - backend/docs/TENANT_LOGIN_GUIDE.md | 226 - backend/docs/功能描述.md | 1 - backend/ecosystem.config.js | 123 - backend/nest-cli.json | 9 - backend/package-lock.json | 10990 ---------------- backend/package.json | 122 - backend/prisma/schema.prisma | 1164 -- backend/scripts/check-permissions.js | 60 - backend/scripts/check-registrations.js | 64 - backend/scripts/check-student-permissions.js | 52 - backend/scripts/check-users.js | 22 - backend/scripts/cleanup-tenant-permissions.ts | 127 - backend/scripts/compress.sh | 219 - backend/scripts/init-admin-permissions.ts | 598 - backend/scripts/init-admin.ts | 277 - backend/scripts/init-dev-tenants.ts | 438 - backend/scripts/init-guangdong-library.ts | 193 - backend/scripts/init-linksea-tenant.ts | 210 - backend/scripts/init-menus.ts | 277 - backend/scripts/init-roles-permissions.ts | 576 - backend/scripts/init-super-tenant.ts | 322 - backend/scripts/init-tenant-admin.ts | 1324 -- .../scripts/init-tenant-menu-permissions.ts | 429 - backend/scripts/init-tenant.ts | 429 - backend/sql/add_tenant_menu.sql | 58 - backend/sql/competition.sql | 276 - backend/sql/init_data.sql | 1573 --- backend/src/app.module.ts | 78 - backend/src/auth/auth.controller.ts | 41 - backend/src/auth/auth.module.ts | 30 - backend/src/auth/auth.service.ts | 127 - .../decorators/current-tenant-id.decorator.ts | 12 - .../src/auth/decorators/public.decorator.ts | 4 - .../require-permission.decorator.ts | 10 - .../src/auth/decorators/roles.decorator.ts | 4 - backend/src/auth/dto/login.dto.ts | 15 - backend/src/auth/guards/jwt-auth.guard.ts | 50 - backend/src/auth/guards/permissions.guard.ts | 49 - backend/src/auth/guards/roles.guard.ts | 56 - backend/src/auth/strategies/jwt.strategy.ts | 40 - backend/src/auth/strategies/local.strategy.ts | 50 - .../common/filters/http-exception.filter.ts | 89 - .../interceptors/logging.interceptor.ts | 94 - .../interceptors/transform.interceptor.ts | 32 - .../config/config-verification.controller.ts | 114 - backend/src/config/config.controller.ts | 73 - backend/src/config/config.module.ts | 10 - backend/src/config/config.service.ts | 88 - backend/src/config/dto/create-config.dto.ts | 13 - backend/src/config/dto/update-config.dto.ts | 15 - .../analytics/analytics.controller.ts | 36 - .../contests/analytics/analytics.module.ts | 11 - .../contests/analytics/analytics.service.ts | 296 - .../attachments/attachments.controller.ts | 60 - .../attachments/attachments.module.ts | 13 - .../attachments/attachments.service.ts | 108 - .../attachments/dto/create-attachment.dto.ts | 25 - .../attachments/dto/update-attachment.dto.ts | 5 - backend/src/contests/contests.module.ts | 46 - .../contests/contests/contests.controller.ts | 116 - .../src/contests/contests/contests.module.ts | 13 - .../src/contests/contests/contests.service.ts | 1198 -- .../contests/dto/create-contest.dto.ts | 187 - .../contests/dto/publish-contest.dto.ts | 8 - .../contests/dto/query-contest.dto.ts | 66 - .../contests/dto/update-contest.dto.ts | 5 - .../contests/judges/dto/create-judge.dto.ts | 24 - .../contests/judges/dto/update-judge.dto.ts | 5 - .../src/contests/judges/judges.controller.ts | 60 - backend/src/contests/judges/judges.module.ts | 13 - backend/src/contests/judges/judges.service.ts | 267 - .../contests/notices/dto/create-notice.dto.ts | 29 - .../contests/notices/dto/query-notice.dto.ts | 34 - .../contests/notices/dto/update-notice.dto.ts | 31 - .../contests/notices/notices.controller.ts | 68 - .../src/contests/notices/notices.module.ts | 13 - .../src/contests/notices/notices.service.ts | 196 - .../dto/create-preset-comment.dto.ts | 20 - .../dto/sync-preset-comments.dto.ts | 11 - .../dto/update-preset-comment.dto.ts | 18 - .../preset-comments.controller.ts | 85 - .../preset-comments/preset-comments.module.ts | 12 - .../preset-comments.service.ts | 234 - .../dto/create-registration.dto.ts | 22 - .../dto/query-registration.dto.ts | 45 - .../dto/review-registration.dto.ts | 18 - .../registrations/registrations.controller.ts | 151 - .../registrations/registrations.module.ts | 13 - .../registrations/registrations.service.ts | 807 -- .../results/dto/auto-set-awards.dto.ts | 18 - .../results/dto/batch-set-awards.dto.ts | 22 - .../contests/results/dto/query-results.dto.ts | 24 - .../src/contests/results/dto/set-award.dto.ts | 14 - .../contests/results/results.controller.ts | 117 - .../src/contests/results/results.module.ts | 12 - .../src/contests/results/results.service.ts | 685 - .../dto/create-review-rule.dto.ts | 48 - .../dto/update-review-rule.dto.ts | 5 - .../review-rules/review-rules.controller.ts | 107 - .../review-rules/review-rules.module.ts | 13 - .../review-rules/review-rules.service.ts | 239 - .../contests/reviews/dto/assign-work.dto.ts | 11 - .../contests/reviews/dto/batch-assign.dto.ts | 13 - .../contests/reviews/dto/create-score.dto.ts | 27 - .../contests/reviews/reviews.controller.ts | 153 - .../src/contests/reviews/reviews.module.ts | 13 - .../src/contests/reviews/reviews.service.ts | 1043 -- .../src/contests/teams/dto/create-team.dto.ts | 28 - .../contests/teams/dto/invite-member.dto.ts | 17 - .../src/contests/teams/dto/update-team.dto.ts | 5 - .../src/contests/teams/teams.controller.ts | 113 - backend/src/contests/teams/teams.module.ts | 13 - backend/src/contests/teams/teams.service.ts | 522 - .../works/dto/query-guided-work.dto.ts | 34 - .../src/contests/works/dto/query-work.dto.ts | 77 - .../src/contests/works/dto/submit-work.dto.ts | 55 - .../src/contests/works/works.controller.ts | 92 - backend/src/contests/works/works.module.ts | 13 - backend/src/contests/works/works.service.ts | 718 - backend/src/dict/dict.controller.ts | 73 - backend/src/dict/dict.module.ts | 9 - backend/src/dict/dict.service.ts | 112 - backend/src/dict/dto/create-dict.dto.ts | 13 - backend/src/dict/dto/update-dict.dto.ts | 15 - backend/src/homework/homework.module.ts | 21 - .../homeworks/dto/create-homework.dto.ts | 51 - .../homeworks/dto/query-homework.dto.ts | 30 - .../homeworks/dto/update-homework.dto.ts | 4 - .../homeworks/homeworks.controller.ts | 135 - .../homework/homeworks/homeworks.module.ts | 12 - .../homework/homeworks/homeworks.service.ts | 430 - .../dto/create-review-rule.dto.ts | 34 - .../dto/update-review-rule.dto.ts | 4 - .../review-rules/review-rules.controller.ts | 106 - .../review-rules/review-rules.module.ts | 12 - .../review-rules/review-rules.service.ts | 224 - .../homework/scores/dto/create-score.dto.ts | 34 - .../src/homework/scores/scores.controller.ts | 63 - backend/src/homework/scores/scores.module.ts | 12 - backend/src/homework/scores/scores.service.ts | 181 - .../submissions/dto/create-submission.dto.ts | 29 - .../submissions/dto/query-submission.dto.ts | 49 - .../submissions/submissions.controller.ts | 86 - .../submissions/submissions.module.ts | 12 - .../submissions/submissions.service.ts | 331 - .../judges-management/dto/create-judge.dto.ts | 35 - .../judges-management/dto/query-judge.dto.ts | 31 - .../judges-management/dto/update-judge.dto.ts | 40 - .../judges-management.controller.ts | 103 - .../judges-management.module.ts | 12 - .../judges-management.service.ts | 372 - backend/src/logs/dto/create-log.dto.ts | 22 - backend/src/logs/dto/query-log.dto.ts | 39 - backend/src/logs/logs.controller.ts | 64 - backend/src/logs/logs.module.ts | 13 - backend/src/logs/logs.service.ts | 227 - backend/src/main.ts | 33 - backend/src/menus/dto/create-menu.dto.ts | 30 - backend/src/menus/dto/update-menu.dto.ts | 31 - backend/src/menus/menus.controller.ts | 55 - backend/src/menus/menus.module.ts | 11 - backend/src/menus/menus.service.ts | 221 - backend/src/oss/oss.module.ts | 9 - backend/src/oss/oss.service.ts | 376 - .../permissions/dto/create-permission.dto.ts | 20 - .../permissions/dto/update-permission.dto.ts | 24 - .../src/permissions/permissions.controller.ts | 71 - backend/src/permissions/permissions.module.ts | 11 - .../src/permissions/permissions.service.ts | 87 - backend/src/prisma/prisma.module.ts | 9 - backend/src/prisma/prisma.service.ts | 16 - .../src/public/content-review.controller.ts | 121 - backend/src/public/content-review.service.ts | 367 - backend/src/public/creation.service.ts | 184 - backend/src/public/dto/child.dto.ts | 67 - backend/src/public/dto/register.dto.ts | 47 - backend/src/public/dto/registration.dto.ts | 25 - backend/src/public/gallery.service.ts | 136 - backend/src/public/interaction.service.ts | 173 - backend/src/public/public.controller.ts | 473 - backend/src/public/public.module.ts | 31 - backend/src/public/public.service.ts | 1209 -- backend/src/public/tags.controller.ts | 50 - backend/src/public/tags.service.ts | 114 - backend/src/public/user-works.service.ts | 283 - backend/src/roles/dto/create-role.dto.ts | 18 - backend/src/roles/dto/update-role.dto.ts | 20 - backend/src/roles/roles.controller.ts | 67 - backend/src/roles/roles.module.ts | 10 - backend/src/roles/roles.service.ts | 158 - .../tenants/decorators/tenant.decorator.ts | 16 - backend/src/tenants/dto/create-tenant.dto.ts | 35 - backend/src/tenants/dto/update-tenant.dto.ts | 31 - backend/src/tenants/guards/tenant.guard.ts | 89 - backend/src/tenants/tenants.controller.ts | 98 - backend/src/tenants/tenants.module.ts | 13 - backend/src/tenants/tenants.service.ts | 381 - backend/src/upload/upload.controller.ts | 49 - backend/src/upload/upload.module.ts | 13 - backend/src/upload/upload.service.ts | 38 - backend/src/users/dto/create-user.dto.ts | 54 - backend/src/users/dto/update-user.dto.ts | 41 - backend/src/users/users.controller.ts | 108 - backend/src/users/users.module.ts | 10 - backend/src/users/users.service.ts | 400 - backend/tsconfig.json | 27 - 230 files changed, 45899 deletions(-) delete mode 100644 backend/.cursor/rules/backend-specific.mdc delete mode 100644 backend/.eslintrc.js delete mode 100644 backend/.gitignore delete mode 100644 backend/.npmrc delete mode 100644 backend/.prettierrc delete mode 100644 backend/competition-management-service-test-1.0.0.tgz delete mode 100644 backend/data/competition_management.sql delete mode 100644 backend/data/menus.json delete mode 100644 backend/data/permissions.json delete mode 100644 backend/docs/ADMIN_ACCOUNT.md delete mode 100644 backend/docs/CONTEST_JUDGE_DESIGN.md delete mode 100644 backend/docs/DATABASE_SETUP.md delete mode 100644 backend/docs/DATABASE_URL_SOURCE.md delete mode 100644 backend/docs/ENVIRONMENT_CONFIG.md delete mode 100644 backend/docs/ENV_CHANGE_GUIDE.md delete mode 100644 backend/docs/MENU_INIT.md delete mode 100644 backend/docs/MIGRATION_INCREMENTAL_GUIDE.md delete mode 100644 backend/docs/QUICK_START_ENV.md delete mode 100644 backend/docs/RBAC_EXAMPLES.md delete mode 100644 backend/docs/RBAC_GUIDE.md delete mode 100644 backend/docs/README.md delete mode 100644 backend/docs/SCHEMA_CHANGE_GUIDE.md delete mode 100644 backend/docs/SCHOOL_MODULE_SCHEMA.md delete mode 100644 backend/docs/TENANT_GUIDE.md delete mode 100644 backend/docs/TENANT_LOGIN_GUIDE.md delete mode 100644 backend/docs/功能描述.md delete mode 100644 backend/ecosystem.config.js delete mode 100644 backend/nest-cli.json delete mode 100644 backend/package-lock.json delete mode 100644 backend/package.json delete mode 100644 backend/prisma/schema.prisma delete mode 100644 backend/scripts/check-permissions.js delete mode 100644 backend/scripts/check-registrations.js delete mode 100644 backend/scripts/check-student-permissions.js delete mode 100644 backend/scripts/check-users.js delete mode 100644 backend/scripts/cleanup-tenant-permissions.ts delete mode 100644 backend/scripts/compress.sh delete mode 100644 backend/scripts/init-admin-permissions.ts delete mode 100644 backend/scripts/init-admin.ts delete mode 100644 backend/scripts/init-dev-tenants.ts delete mode 100644 backend/scripts/init-guangdong-library.ts delete mode 100644 backend/scripts/init-linksea-tenant.ts delete mode 100644 backend/scripts/init-menus.ts delete mode 100644 backend/scripts/init-roles-permissions.ts delete mode 100644 backend/scripts/init-super-tenant.ts delete mode 100644 backend/scripts/init-tenant-admin.ts delete mode 100644 backend/scripts/init-tenant-menu-permissions.ts delete mode 100644 backend/scripts/init-tenant.ts delete mode 100644 backend/sql/add_tenant_menu.sql delete mode 100644 backend/sql/competition.sql delete mode 100644 backend/sql/init_data.sql delete mode 100644 backend/src/app.module.ts delete mode 100644 backend/src/auth/auth.controller.ts delete mode 100644 backend/src/auth/auth.module.ts delete mode 100644 backend/src/auth/auth.service.ts delete mode 100644 backend/src/auth/decorators/current-tenant-id.decorator.ts delete mode 100644 backend/src/auth/decorators/public.decorator.ts delete mode 100644 backend/src/auth/decorators/require-permission.decorator.ts delete mode 100644 backend/src/auth/decorators/roles.decorator.ts delete mode 100644 backend/src/auth/dto/login.dto.ts delete mode 100644 backend/src/auth/guards/jwt-auth.guard.ts delete mode 100644 backend/src/auth/guards/permissions.guard.ts delete mode 100644 backend/src/auth/guards/roles.guard.ts delete mode 100644 backend/src/auth/strategies/jwt.strategy.ts delete mode 100644 backend/src/auth/strategies/local.strategy.ts delete mode 100644 backend/src/common/filters/http-exception.filter.ts delete mode 100644 backend/src/common/interceptors/logging.interceptor.ts delete mode 100644 backend/src/common/interceptors/transform.interceptor.ts delete mode 100644 backend/src/config/config-verification.controller.ts delete mode 100644 backend/src/config/config.controller.ts delete mode 100644 backend/src/config/config.module.ts delete mode 100644 backend/src/config/config.service.ts delete mode 100644 backend/src/config/dto/create-config.dto.ts delete mode 100644 backend/src/config/dto/update-config.dto.ts delete mode 100644 backend/src/contests/analytics/analytics.controller.ts delete mode 100644 backend/src/contests/analytics/analytics.module.ts delete mode 100644 backend/src/contests/analytics/analytics.service.ts delete mode 100644 backend/src/contests/attachments/attachments.controller.ts delete mode 100644 backend/src/contests/attachments/attachments.module.ts delete mode 100644 backend/src/contests/attachments/attachments.service.ts delete mode 100644 backend/src/contests/attachments/dto/create-attachment.dto.ts delete mode 100644 backend/src/contests/attachments/dto/update-attachment.dto.ts delete mode 100644 backend/src/contests/contests.module.ts delete mode 100644 backend/src/contests/contests/contests.controller.ts delete mode 100644 backend/src/contests/contests/contests.module.ts delete mode 100644 backend/src/contests/contests/contests.service.ts delete mode 100644 backend/src/contests/contests/dto/create-contest.dto.ts delete mode 100644 backend/src/contests/contests/dto/publish-contest.dto.ts delete mode 100644 backend/src/contests/contests/dto/query-contest.dto.ts delete mode 100644 backend/src/contests/contests/dto/update-contest.dto.ts delete mode 100644 backend/src/contests/judges/dto/create-judge.dto.ts delete mode 100644 backend/src/contests/judges/dto/update-judge.dto.ts delete mode 100644 backend/src/contests/judges/judges.controller.ts delete mode 100644 backend/src/contests/judges/judges.module.ts delete mode 100644 backend/src/contests/judges/judges.service.ts delete mode 100644 backend/src/contests/notices/dto/create-notice.dto.ts delete mode 100644 backend/src/contests/notices/dto/query-notice.dto.ts delete mode 100644 backend/src/contests/notices/dto/update-notice.dto.ts delete mode 100644 backend/src/contests/notices/notices.controller.ts delete mode 100644 backend/src/contests/notices/notices.module.ts delete mode 100644 backend/src/contests/notices/notices.service.ts delete mode 100644 backend/src/contests/preset-comments/dto/create-preset-comment.dto.ts delete mode 100644 backend/src/contests/preset-comments/dto/sync-preset-comments.dto.ts delete mode 100644 backend/src/contests/preset-comments/dto/update-preset-comment.dto.ts delete mode 100644 backend/src/contests/preset-comments/preset-comments.controller.ts delete mode 100644 backend/src/contests/preset-comments/preset-comments.module.ts delete mode 100644 backend/src/contests/preset-comments/preset-comments.service.ts delete mode 100644 backend/src/contests/registrations/dto/create-registration.dto.ts delete mode 100644 backend/src/contests/registrations/dto/query-registration.dto.ts delete mode 100644 backend/src/contests/registrations/dto/review-registration.dto.ts delete mode 100644 backend/src/contests/registrations/registrations.controller.ts delete mode 100644 backend/src/contests/registrations/registrations.module.ts delete mode 100644 backend/src/contests/registrations/registrations.service.ts delete mode 100644 backend/src/contests/results/dto/auto-set-awards.dto.ts delete mode 100644 backend/src/contests/results/dto/batch-set-awards.dto.ts delete mode 100644 backend/src/contests/results/dto/query-results.dto.ts delete mode 100644 backend/src/contests/results/dto/set-award.dto.ts delete mode 100644 backend/src/contests/results/results.controller.ts delete mode 100644 backend/src/contests/results/results.module.ts delete mode 100644 backend/src/contests/results/results.service.ts delete mode 100644 backend/src/contests/review-rules/dto/create-review-rule.dto.ts delete mode 100644 backend/src/contests/review-rules/dto/update-review-rule.dto.ts delete mode 100644 backend/src/contests/review-rules/review-rules.controller.ts delete mode 100644 backend/src/contests/review-rules/review-rules.module.ts delete mode 100644 backend/src/contests/review-rules/review-rules.service.ts delete mode 100644 backend/src/contests/reviews/dto/assign-work.dto.ts delete mode 100644 backend/src/contests/reviews/dto/batch-assign.dto.ts delete mode 100644 backend/src/contests/reviews/dto/create-score.dto.ts delete mode 100644 backend/src/contests/reviews/reviews.controller.ts delete mode 100644 backend/src/contests/reviews/reviews.module.ts delete mode 100644 backend/src/contests/reviews/reviews.service.ts delete mode 100644 backend/src/contests/teams/dto/create-team.dto.ts delete mode 100644 backend/src/contests/teams/dto/invite-member.dto.ts delete mode 100644 backend/src/contests/teams/dto/update-team.dto.ts delete mode 100644 backend/src/contests/teams/teams.controller.ts delete mode 100644 backend/src/contests/teams/teams.module.ts delete mode 100644 backend/src/contests/teams/teams.service.ts delete mode 100644 backend/src/contests/works/dto/query-guided-work.dto.ts delete mode 100644 backend/src/contests/works/dto/query-work.dto.ts delete mode 100644 backend/src/contests/works/dto/submit-work.dto.ts delete mode 100644 backend/src/contests/works/works.controller.ts delete mode 100644 backend/src/contests/works/works.module.ts delete mode 100644 backend/src/contests/works/works.service.ts delete mode 100644 backend/src/dict/dict.controller.ts delete mode 100644 backend/src/dict/dict.module.ts delete mode 100644 backend/src/dict/dict.service.ts delete mode 100644 backend/src/dict/dto/create-dict.dto.ts delete mode 100644 backend/src/dict/dto/update-dict.dto.ts delete mode 100644 backend/src/homework/homework.module.ts delete mode 100644 backend/src/homework/homeworks/dto/create-homework.dto.ts delete mode 100644 backend/src/homework/homeworks/dto/query-homework.dto.ts delete mode 100644 backend/src/homework/homeworks/dto/update-homework.dto.ts delete mode 100644 backend/src/homework/homeworks/homeworks.controller.ts delete mode 100644 backend/src/homework/homeworks/homeworks.module.ts delete mode 100644 backend/src/homework/homeworks/homeworks.service.ts delete mode 100644 backend/src/homework/review-rules/dto/create-review-rule.dto.ts delete mode 100644 backend/src/homework/review-rules/dto/update-review-rule.dto.ts delete mode 100644 backend/src/homework/review-rules/review-rules.controller.ts delete mode 100644 backend/src/homework/review-rules/review-rules.module.ts delete mode 100644 backend/src/homework/review-rules/review-rules.service.ts delete mode 100644 backend/src/homework/scores/dto/create-score.dto.ts delete mode 100644 backend/src/homework/scores/scores.controller.ts delete mode 100644 backend/src/homework/scores/scores.module.ts delete mode 100644 backend/src/homework/scores/scores.service.ts delete mode 100644 backend/src/homework/submissions/dto/create-submission.dto.ts delete mode 100644 backend/src/homework/submissions/dto/query-submission.dto.ts delete mode 100644 backend/src/homework/submissions/submissions.controller.ts delete mode 100644 backend/src/homework/submissions/submissions.module.ts delete mode 100644 backend/src/homework/submissions/submissions.service.ts delete mode 100644 backend/src/judges-management/dto/create-judge.dto.ts delete mode 100644 backend/src/judges-management/dto/query-judge.dto.ts delete mode 100644 backend/src/judges-management/dto/update-judge.dto.ts delete mode 100644 backend/src/judges-management/judges-management.controller.ts delete mode 100644 backend/src/judges-management/judges-management.module.ts delete mode 100644 backend/src/judges-management/judges-management.service.ts delete mode 100644 backend/src/logs/dto/create-log.dto.ts delete mode 100644 backend/src/logs/dto/query-log.dto.ts delete mode 100644 backend/src/logs/logs.controller.ts delete mode 100644 backend/src/logs/logs.module.ts delete mode 100644 backend/src/logs/logs.service.ts delete mode 100644 backend/src/main.ts delete mode 100644 backend/src/menus/dto/create-menu.dto.ts delete mode 100644 backend/src/menus/dto/update-menu.dto.ts delete mode 100644 backend/src/menus/menus.controller.ts delete mode 100644 backend/src/menus/menus.module.ts delete mode 100644 backend/src/menus/menus.service.ts delete mode 100644 backend/src/oss/oss.module.ts delete mode 100644 backend/src/oss/oss.service.ts delete mode 100644 backend/src/permissions/dto/create-permission.dto.ts delete mode 100644 backend/src/permissions/dto/update-permission.dto.ts delete mode 100644 backend/src/permissions/permissions.controller.ts delete mode 100644 backend/src/permissions/permissions.module.ts delete mode 100644 backend/src/permissions/permissions.service.ts delete mode 100644 backend/src/prisma/prisma.module.ts delete mode 100644 backend/src/prisma/prisma.service.ts delete mode 100644 backend/src/public/content-review.controller.ts delete mode 100644 backend/src/public/content-review.service.ts delete mode 100644 backend/src/public/creation.service.ts delete mode 100644 backend/src/public/dto/child.dto.ts delete mode 100644 backend/src/public/dto/register.dto.ts delete mode 100644 backend/src/public/dto/registration.dto.ts delete mode 100644 backend/src/public/gallery.service.ts delete mode 100644 backend/src/public/interaction.service.ts delete mode 100644 backend/src/public/public.controller.ts delete mode 100644 backend/src/public/public.module.ts delete mode 100644 backend/src/public/public.service.ts delete mode 100644 backend/src/public/tags.controller.ts delete mode 100644 backend/src/public/tags.service.ts delete mode 100644 backend/src/public/user-works.service.ts delete mode 100644 backend/src/roles/dto/create-role.dto.ts delete mode 100644 backend/src/roles/dto/update-role.dto.ts delete mode 100644 backend/src/roles/roles.controller.ts delete mode 100644 backend/src/roles/roles.module.ts delete mode 100644 backend/src/roles/roles.service.ts delete mode 100644 backend/src/tenants/decorators/tenant.decorator.ts delete mode 100644 backend/src/tenants/dto/create-tenant.dto.ts delete mode 100644 backend/src/tenants/dto/update-tenant.dto.ts delete mode 100644 backend/src/tenants/guards/tenant.guard.ts delete mode 100644 backend/src/tenants/tenants.controller.ts delete mode 100644 backend/src/tenants/tenants.module.ts delete mode 100644 backend/src/tenants/tenants.service.ts delete mode 100644 backend/src/upload/upload.controller.ts delete mode 100644 backend/src/upload/upload.module.ts delete mode 100644 backend/src/upload/upload.service.ts delete mode 100644 backend/src/users/dto/create-user.dto.ts delete mode 100644 backend/src/users/dto/update-user.dto.ts delete mode 100644 backend/src/users/users.controller.ts delete mode 100644 backend/src/users/users.module.ts delete mode 100644 backend/src/users/users.service.ts delete mode 100644 backend/tsconfig.json diff --git a/backend/.cursor/rules/backend-specific.mdc b/backend/.cursor/rules/backend-specific.mdc deleted file mode 100644 index efd47e7..0000000 --- a/backend/.cursor/rules/backend-specific.mdc +++ /dev/null @@ -1,122 +0,0 @@ ---- -description: 后端特定的开发规范(仅作用于 backend 目录) -globs: -alwaysApply: true ---- - -# 后端特定规范 - -本规则仅作用于 `backend/` 目录。 - -## NestJS 最佳实践 - -### 依赖注入 - -始终使用构造函数注入: - -```typescript -@Injectable() -export class MyService { - constructor( - private readonly prisma: PrismaService, - private readonly otherService: OtherService, - ) {} -} -``` - -### 全局模块 - -PrismaModule 已设为全局模块,无需在每个模块中导入。 - -### 环境变量 - -使用 `@nestjs/config` 的 ConfigService: - -```typescript -constructor(private configService: ConfigService) { - const jwtSecret = this.configService.get('JWT_SECRET'); -} -``` - -## 测试规范 - -### 单元测试 - -```typescript -describe('UsersService', () => { - let service: UsersService; - let prisma: PrismaService; - - beforeEach(async () => { - const module = await Test.createTestingModule({ - providers: [ - UsersService, - { - provide: PrismaService, - useValue: mockPrismaService, - }, - ], - }).compile(); - - service = module.get(UsersService); - prisma = module.get(PrismaService); - }); - - it('should create a user', async () => { - const dto = { username: 'test', password: 'pass123' }; - const result = await service.create(dto, 1); - expect(result).toBeDefined(); - }); -}); -``` - -## 日志记录 - -使用 NestJS Logger: - -```typescript -import { Logger } from '@nestjs/common'; - -export class MyService { - private readonly logger = new Logger(MyService.name); - - async someMethod() { - this.logger.log('执行某操作'); - this.logger.warn('警告信息'); - this.logger.error('错误信息', error.stack); - } -} -``` - -## 常用脚本 - -```bash -# 开发 -pnpm start:dev - -# 数据库迁移 -pnpm prisma:migrate:dev - -# 初始化管理员 -pnpm init:admin - -# 初始化菜单 -pnpm init:menus -``` - -## 项目结构 - -``` -src/ -├── auth/ # 认证模块 -├── users/ # 用户管理 -├── roles/ # 角色管理 -├── permissions/ # 权限管理 -├── menus/ # 菜单管理 -├── tenants/ # 租户管理 -├── school/ # 学校管理 -├── contests/ # 竞赛管理 -├── common/ # 公共模块 -├── prisma/ # Prisma 服务 -└── main.ts # 入口文件 -``` diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js deleted file mode 100644 index 13002d1..0000000 --- a/backend/.eslintrc.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - project: 'tsconfig.json', - tsconfigRootDir: __dirname, - sourceType: 'module', - }, - plugins: ['@typescript-eslint/eslint-plugin'], - extends: [ - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended', - ], - root: true, - env: { - node: true, - jest: true, - }, - ignorePatterns: ['.eslintrc.js'], - rules: { - '@typescript-eslint/interface-name-prefix': 'off', - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-explicit-any': 'off', - }, -}; - diff --git a/backend/.gitignore b/backend/.gitignore deleted file mode 100644 index ad972f7..0000000 --- a/backend/.gitignore +++ /dev/null @@ -1,47 +0,0 @@ -# compiled output -/dist -/node_modules - -# Logs -/logs -*.log -npm-debug.log* -pnpm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# OS -.DS_Store - -# Tests -/coverage -/.nyc_output - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -# Environment -.env -.env.local -.env.*.local -.env.development -.env.production -.env.test -.env.staging -# 保留示例文件 -!.env*.example - diff --git a/backend/.npmrc b/backend/.npmrc deleted file mode 100644 index f82384e..0000000 --- a/backend/.npmrc +++ /dev/null @@ -1,4 +0,0 @@ -# 后端 pnpm 配置 -shamefully-hoist=true -strict-peer-dependencies=false - diff --git a/backend/.prettierrc b/backend/.prettierrc deleted file mode 100644 index 8fca6bb..0000000 --- a/backend/.prettierrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "all" -} - diff --git a/backend/competition-management-service-test-1.0.0.tgz b/backend/competition-management-service-test-1.0.0.tgz deleted file mode 100644 index 9fa0db34b92f35e01a6aa531f228b7e5c6473501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345732 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

OwDcsEi`(CG4+ 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 diff --git a/backend/data/competition_management.sql b/backend/data/competition_management.sql deleted file mode 100644 index 6d2f5f6..0000000 --- a/backend/data/competition_management.sql +++ /dev/null @@ -1,2059 +0,0 @@ --- MySQL dump 10.13 Distrib 9.6.0, for macos15.7 (arm64) --- --- Host: localhost Database: competition_management --- ------------------------------------------------------ --- Server version 9.6.0 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `_prisma_migrations` --- - -DROP TABLE IF EXISTS `_prisma_migrations`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `_prisma_migrations` ( - `id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL, - `checksum` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL, - `finished_at` datetime(3) DEFAULT NULL, - `migration_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, - `logs` text COLLATE utf8mb4_unicode_ci, - `rolled_back_at` datetime(3) DEFAULT NULL, - `started_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `applied_steps_count` int unsigned NOT NULL DEFAULT '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `_prisma_migrations` --- - -LOCK TABLES `_prisma_migrations` WRITE; -/*!40000 ALTER TABLE `_prisma_migrations` DISABLE KEYS */; -INSERT INTO `_prisma_migrations` VALUES ('eed57bce-0d55-4029-b5a3-f3aaf9ad5f4b','fd64a8349d045bcad571fb63dd7935f608b152828ebe31618b987dd62338248a','2026-03-23 06:13:57.306','20260323061356_init',NULL,NULL,'2026-03-23 06:13:56.429',1); -/*!40000 ALTER TABLE `_prisma_migrations` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `children` --- - -DROP TABLE IF EXISTS `children`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `children` ( - `id` int NOT NULL AUTO_INCREMENT, - `parent_id` int NOT NULL, - `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, - `gender` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `birthday` date DEFAULT NULL, - `grade` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `city` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `school_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `avatar` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `is_deleted` int NOT NULL DEFAULT '0', - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `children_parent_id_idx` (`parent_id`), - CONSTRAINT `children_parent_id_fkey` FOREIGN KEY (`parent_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `children` --- - -LOCK TABLES `children` WRITE; -/*!40000 ALTER TABLE `children` DISABLE KEYS */; -INSERT INTO `children` VALUES (1,7,'小明','male','2018-05-15','二年级','广州','广州市天河区实验小学',NULL,0,'2026-03-24 03:31:25.303','2026-03-24 03:31:25.303'),(2,7,'小红','female','2020-09-01','大班','广州','广州市天河幼儿园',NULL,0,'2026-03-24 03:31:25.327','2026-03-24 03:31:25.327'),(3,10,'测试小明','male','2018-03-15','二年级','广州','测试小学',NULL,0,'2026-03-24 08:05:32.926','2026-03-24 08:05:32.926'),(4,10,'小宝宝',NULL,'2024-01-01',NULL,'广州',NULL,NULL,0,'2026-03-24 08:10:25.284','2026-03-24 08:10:25.284'); -/*!40000 ALTER TABLE `children` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `classes` --- - -DROP TABLE IF EXISTS `classes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `classes` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `grade_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `type` int NOT NULL DEFAULT '1', - `capacity` int DEFAULT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `classes_tenant_id_code_key` (`tenant_id`,`code`), - KEY `classes_grade_id_fkey` (`grade_id`), - KEY `classes_creator_fkey` (`creator`), - KEY `classes_modifier_fkey` (`modifier`), - CONSTRAINT `classes_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `classes_grade_id_fkey` FOREIGN KEY (`grade_id`) REFERENCES `grades` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `classes_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `classes_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `classes` --- - -LOCK TABLES `classes` WRITE; -/*!40000 ALTER TABLE `classes` DISABLE KEYS */; -/*!40000 ALTER TABLE `classes` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `configs` --- - -DROP TABLE IF EXISTS `configs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `configs` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `key` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `value` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `configs_tenant_id_key_key` (`tenant_id`,`key`), - KEY `configs_creator_fkey` (`creator`), - KEY `configs_modifier_fkey` (`modifier`), - CONSTRAINT `configs_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `configs_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `configs_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `configs` --- - -LOCK TABLES `configs` WRITE; -/*!40000 ALTER TABLE `configs` DISABLE KEYS */; -/*!40000 ALTER TABLE `configs` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `content_review_logs` --- - -DROP TABLE IF EXISTS `content_review_logs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `content_review_logs` ( - `id` int NOT NULL AUTO_INCREMENT, - `target_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `target_id` int NOT NULL, - `work_id` int DEFAULT NULL, - `action` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `reason` text COLLATE utf8mb4_unicode_ci, - `note` text COLLATE utf8mb4_unicode_ci, - `operator_id` int NOT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `content_review_logs_target_type_target_id_idx` (`target_type`,`target_id`), - KEY `content_review_logs_work_id_idx` (`work_id`), - KEY `content_review_logs_operator_id_fkey` (`operator_id`), - CONSTRAINT `content_review_logs_operator_id_fkey` FOREIGN KEY (`operator_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `content_review_logs_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `user_works` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `content_review_logs` --- - -LOCK TABLES `content_review_logs` WRITE; -/*!40000 ALTER TABLE `content_review_logs` DISABLE KEYS */; -INSERT INTO `content_review_logs` VALUES (1,'work',9,9,'reject','含不适宜未成年人的内容',NULL,1,'2026-03-31 06:21:29.754'),(2,'work',10,10,'approve',NULL,NULL,1,'2026-03-31 06:21:45.105'),(3,'work',11,11,'approve',NULL,NULL,1,'2026-03-31 06:26:24.211'),(4,'work',11,11,'revoke',NULL,'撤销审核操作',1,'2026-03-31 06:26:25.759'),(5,'work',10,10,'revoke',NULL,'撤销审核操作',1,'2026-03-31 06:29:09.451'),(6,'work',9,9,'revoke',NULL,'撤销审核操作',1,'2026-03-31 06:29:12.282'),(7,'work',9,9,'approve',NULL,NULL,1,'2026-03-31 06:35:54.974'),(8,'work',10,10,'approve',NULL,NULL,1,'2026-03-31 06:37:13.682'),(9,'work',11,11,'approve',NULL,NULL,1,'2026-03-31 06:37:31.464'),(10,'work',12,12,'approve',NULL,NULL,1,'2026-03-31 06:42:21.470'),(11,'work',13,13,'approve',NULL,NULL,1,'2026-03-31 06:42:27.051'),(12,'work',9,9,'revoke',NULL,'撤销审核操作',1,'2026-03-31 06:42:30.645'),(13,'work',10,10,'revoke',NULL,'撤销审核操作',1,'2026-03-31 06:42:32.774'),(14,'work',11,11,'revoke',NULL,'撤销审核操作',1,'2026-03-31 06:42:34.462'),(15,'work',12,12,'revoke',NULL,'撤销审核操作',1,'2026-03-31 06:42:36.441'),(16,'work',13,13,'revoke',NULL,'撤销审核操作',1,'2026-03-31 06:42:39.420'),(17,'work',9,9,'approve',NULL,NULL,1,'2026-03-31 06:42:45.467'),(18,'work',10,10,'approve',NULL,NULL,1,'2026-03-31 06:42:48.317'),(19,'work',10,10,'takedown','违反平台规范',NULL,1,'2026-03-31 06:56:27.914'),(20,'work',8,8,'takedown','用户投诉/举报',NULL,1,'2026-03-31 07:03:34.055'); -/*!40000 ALTER TABLE `content_review_logs` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `departments` --- - -DROP TABLE IF EXISTS `departments`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `departments` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `parent_id` int DEFAULT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `sort` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `departments_tenant_id_code_key` (`tenant_id`,`code`), - KEY `departments_parent_id_fkey` (`parent_id`), - KEY `departments_creator_fkey` (`creator`), - KEY `departments_modifier_fkey` (`modifier`), - CONSTRAINT `departments_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `departments_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `departments_parent_id_fkey` FOREIGN KEY (`parent_id`) REFERENCES `departments` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `departments_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `departments` --- - -LOCK TABLES `departments` WRITE; -/*!40000 ALTER TABLE `departments` DISABLE KEYS */; -/*!40000 ALTER TABLE `departments` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `dict_items` --- - -DROP TABLE IF EXISTS `dict_items`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `dict_items` ( - `id` int NOT NULL AUTO_INCREMENT, - `dict_id` int NOT NULL, - `label` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `value` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `sort` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `dict_items_dict_id_fkey` (`dict_id`), - KEY `dict_items_creator_fkey` (`creator`), - KEY `dict_items_modifier_fkey` (`modifier`), - CONSTRAINT `dict_items_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `dict_items_dict_id_fkey` FOREIGN KEY (`dict_id`) REFERENCES `dicts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `dict_items_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `dict_items` --- - -LOCK TABLES `dict_items` WRITE; -/*!40000 ALTER TABLE `dict_items` DISABLE KEYS */; -/*!40000 ALTER TABLE `dict_items` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `dicts` --- - -DROP TABLE IF EXISTS `dicts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `dicts` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `dicts_tenant_id_code_key` (`tenant_id`,`code`), - KEY `dicts_creator_fkey` (`creator`), - KEY `dicts_modifier_fkey` (`modifier`), - CONSTRAINT `dicts_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `dicts_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `dicts_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `dicts` --- - -LOCK TABLES `dicts` WRITE; -/*!40000 ALTER TABLE `dicts` DISABLE KEYS */; -/*!40000 ALTER TABLE `dicts` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `grades` --- - -DROP TABLE IF EXISTS `grades`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `grades` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `level` int NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `grades_tenant_id_code_key` (`tenant_id`,`code`), - UNIQUE KEY `grades_tenant_id_level_key` (`tenant_id`,`level`), - KEY `grades_creator_fkey` (`creator`), - KEY `grades_modifier_fkey` (`modifier`), - CONSTRAINT `grades_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `grades_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `grades_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `grades` --- - -LOCK TABLES `grades` WRITE; -/*!40000 ALTER TABLE `grades` DISABLE KEYS */; -/*!40000 ALTER TABLE `grades` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `logs` --- - -DROP TABLE IF EXISTS `logs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `logs` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int DEFAULT NULL, - `action` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `content` text COLLATE utf8mb4_unicode_ci, - `ip` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `user_agent` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `logs_user_id_fkey` (`user_id`), - CONSTRAINT `logs_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=4468 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `logs` --- - -LOCK TABLES `logs` WRITE; -/*!40000 ALTER TABLE `logs` DISABLE KEYS */; -INSERT INTO `logs` VALUES (1,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:29:00.016'),(2,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:29:00.031'),(3,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:29:00.034'),(4,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:29:00.050'),(5,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:37:18.840'),(6,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:37:18.846'),(7,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:37:18.847'),(8,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:37:18.850'),(9,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:38:34.522'),(10,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:38:34.529'),(11,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:38:34.529'),(12,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:38:34.533'),(13,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:43:15.911'),(14,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:43:15.916'),(15,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:43:15.917'),(16,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:43:15.922'),(17,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:43:29.448'),(18,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:43:29.454'),(19,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:43:29.455'),(20,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:43:29.461'),(21,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:49:53.128'),(22,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 06:54:42.684'),(23,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 06:59:14.044'),(24,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:25.531'),(25,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:25.533'),(26,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:25.543'),(27,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:25.550'),(28,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:25.631'),(29,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:25.632'),(30,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:25.634'),(31,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:25.636'),(32,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:29.787'),(33,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:29.789'),(34,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:29.791'),(35,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:29.793'),(36,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:31.416'),(37,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:31.421'),(38,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:31.423'),(39,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 06:59:31.426'),(40,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:36:20.229'),(41,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:37:14.067'),(42,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:37:29.616'),(43,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:38:31.867'),(44,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:39:49.761'),(45,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:40:24.047'),(46,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:48:49.876'),(47,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:52:39.046'),(48,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 07:57:45.148'),(49,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:01:48.409'),(50,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:04:40.055'),(51,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:05:24.989'),(52,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:06:28.721'),(53,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:08:16.049'),(54,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:11:03.425'),(55,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:12:21.952'),(56,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:19:03.202'),(57,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:19:30.992'),(58,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.491'),(59,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.504'),(60,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.505'),(61,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.512'),(62,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.518'),(63,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.971'),(64,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.978'),(65,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.980'),(66,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.988'),(67,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:24:03.997'),(68,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 08:26:40.168'),(69,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:29:27.529'),(70,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:29:27.530'),(71,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:30:01.035'),(72,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:34:13.752'),(73,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:34:13.753'),(74,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:35:11.602'),(75,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 08:35:11.603'),(76,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:06:06.515'),(77,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:08:30.868'),(78,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:08:30.868'),(79,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::ffff:127.0.0.1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:08:30.869'),(80,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:58:01.642'),(81,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:58:01.650'),(82,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:58:01.651'),(83,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:58:01.656'),(84,3,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:41.464'),(85,3,'GET /api/schools','{\"method\":\"GET\",\"url\":\"/api/schools\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:41.596'),(86,3,'GET /api/departments?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/departments?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:43.507'),(87,3,'GET /api/departments/tree','{\"method\":\"GET\",\"url\":\"/api/departments/tree\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:43.508'),(88,3,'GET /api/grades?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/grades?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:44.107'),(89,3,'GET /api/classes?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/classes?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:44.624'),(90,3,'GET /api/grades?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/grades?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:44.625'),(91,3,'GET /api/teachers?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/teachers?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:45.155'),(92,3,'GET /api/departments/tree','{\"method\":\"GET\",\"url\":\"/api/departments/tree\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:45.156'),(93,3,'GET /api/students?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/students?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:45.788'),(94,3,'GET /api/classes?page=1&pageSize=100&type=1','{\"method\":\"GET\",\"url\":\"/api/classes?page=1&pageSize=100&type=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"type\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:45.789'),(95,3,'GET /api/classes?page=1&pageSize=100&type=2','{\"method\":\"GET\",\"url\":\"/api/classes?page=1&pageSize=100&type=2\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"type\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:45.794'),(96,3,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:49.628'),(97,4,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:53.001'),(98,4,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 09:59:57.634'),(99,5,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:00.035'),(100,5,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:05.156'),(101,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:07.377'),(102,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:09.924'),(103,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:16.542'),(104,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:43.138'),(105,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:43.139'),(106,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:43.148'),(107,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:00:43.156'),(108,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 10:01:09.690'),(109,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 10:01:51.353'),(110,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:02:15.688'),(111,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:02:15.693'),(112,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:02:15.701'),(113,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:02:15.705'),(114,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:02:15.778'),(115,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:02:15.783'),(116,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:02:15.792'),(117,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:02:15.796'),(118,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.008'),(119,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.009'),(120,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.013'),(121,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.014'),(122,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.015'),(123,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.016'),(124,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.019'),(125,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.020'),(126,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.172'),(127,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.173'),(128,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.174'),(129,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.177'),(130,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.179'),(131,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.180'),(132,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.182'),(133,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 10:04:14.186'),(134,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 10:06:28.598'),(135,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:33:17.871'),(136,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:33:17.872'),(137,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:33:17.879'),(138,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:33:17.884'),(139,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:33:18.009'),(140,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:33:18.010'),(141,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:33:18.011'),(142,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:33:18.013'),(143,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.391'),(144,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.398'),(145,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.402'),(146,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.407'),(147,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.418'),(148,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.422'),(149,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.423'),(150,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.426'),(151,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.528'),(152,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.529'),(153,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.530'),(154,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:28.531'),(155,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:29.894'),(156,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:29.895'),(157,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:29.897'),(158,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:37:29.904'),(159,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:09.237'),(160,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:09.239'),(161,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:09.247'),(162,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:09.254'),(163,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:09.379'),(164,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:09.380'),(165,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:09.382'),(166,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:09.383'),(167,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:14.804'),(168,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:17.323'),(169,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:17.325'),(170,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:17.332'),(171,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:17.340'),(172,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:17.465'),(173,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:17.467'),(174,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:17.469'),(175,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:17.471'),(176,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:20.701'),(177,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:23.202'),(178,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:23.314'),(179,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:23.314'),(180,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:23.315'),(181,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:38:23.315'),(182,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:40:38.851'),(183,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:40:38.858'),(184,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:40:38.862'),(185,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:40:38.867'),(186,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:40:38.973'),(187,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:40:38.974'),(188,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:40:38.976'),(189,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:40:38.977'),(190,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:47:02.826'),(191,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:47:02.834'),(192,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:47:02.835'),(193,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:47:02.841'),(194,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:12.886'),(195,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:12.890'),(196,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:12.903'),(197,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:12.908'),(198,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:19.605'),(199,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.317'),(200,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.319'),(201,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.329'),(202,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.338'),(203,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.734'),(204,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.736'),(205,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.744'),(206,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.748'),(207,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.877'),(208,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.878'),(209,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.887'),(210,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:23.895'),(211,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:24.072'),(212,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:24.073'),(213,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:24.084'),(214,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:24.092'),(215,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:27.258'),(216,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:48:28.363'),(217,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 11:49:52.847'),(218,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 11:51:36.457'),(219,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:52:57.067'),(220,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:52:57.080'),(221,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:52:57.083'),(222,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:52:57.092'),(223,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:52:57.240'),(224,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:52:57.242'),(225,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:52:57.246'),(226,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:52:57.249'),(227,1,'GET /api/users','{\"method\":\"GET\",\"url\":\"/api/users\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 11:53:33.884'),(228,1,'GET /api/users','{\"method\":\"GET\",\"url\":\"/api/users\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 11:53:48.398'),(229,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:55:02.959'),(230,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:55:02.964'),(231,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:55:02.965'),(232,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:55:02.972'),(233,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:55:03.095'),(234,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:55:03.096'),(235,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:55:03.096'),(236,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-23 11:55:03.097'),(237,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','curl/8.7.1','2026-03-23 11:56:28.670'),(238,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','curl/8.7.1','2026-03-23 11:56:28.715'),(239,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-23 11:56:28.734'),(240,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','curl/8.7.1','2026-03-23 11:56:28.753'),(241,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:48.159'),(242,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:48.362'),(243,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:48.367'),(244,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:48.364'),(245,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:48.365'),(246,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:52.003'),(247,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:52.007'),(248,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:53.950'),(249,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:54.776'),(250,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:56.360'),(251,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:57.133'),(252,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:57.830'),(253,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:57.835'),(254,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:58.457'),(255,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:43:59.025'),(256,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:00.331'),(257,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:00.333'),(258,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:02.657'),(259,3,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:04.561'),(260,3,'GET /api/schools','{\"method\":\"GET\",\"url\":\"/api/schools\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:04.688'),(261,3,'GET /api/departments?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/departments?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:07.164'),(262,3,'GET /api/departments/tree','{\"method\":\"GET\",\"url\":\"/api/departments/tree\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:07.165'),(263,3,'GET /api/grades?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/grades?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:08.198'),(264,3,'GET /api/classes?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/classes?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:08.927'),(265,3,'GET /api/grades?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/grades?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:08.929'),(266,3,'GET /api/teachers?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/teachers?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:09.454'),(267,3,'GET /api/departments/tree','{\"method\":\"GET\",\"url\":\"/api/departments/tree\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:09.456'),(268,3,'GET /api/students?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/students?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:09.882'),(269,3,'GET /api/classes?page=1&pageSize=100&type=1','{\"method\":\"GET\",\"url\":\"/api/classes?page=1&pageSize=100&type=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"type\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:09.885'),(270,3,'GET /api/classes?page=1&pageSize=100&type=2','{\"method\":\"GET\",\"url\":\"/api/classes?page=1&pageSize=100&type=2\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"type\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:09.891'),(271,3,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:13.550'),(272,4,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:16.050'),(273,4,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:21.367'),(274,5,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:23.606'),(275,5,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:30.369'),(276,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:32.200'),(277,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:36.712'),(278,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:38.590'),(279,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:38.710'),(280,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:38.712'),(281,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:38.713'),(282,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:44:38.714'),(283,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:46:52.445'),(284,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:46:52.450'),(285,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:46:52.451'),(286,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:46:52.456'),(287,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:46:52.562'),(288,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:46:52.563'),(289,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:46:52.564'),(290,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:46:52.565'),(291,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:48:51.571'),(292,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:48:51.572'),(293,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:48:51.580'),(294,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:48:51.585'),(295,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:48:51.685'),(296,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:48:51.685'),(297,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:48:51.686'),(298,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:48:51.687'),(299,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:04.395'),(300,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:04.407'),(301,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:04.411'),(302,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:04.421'),(303,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:04.529'),(304,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:04.531'),(305,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:04.533'),(306,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:04.535'),(307,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.185'),(308,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.195'),(309,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.196'),(310,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.206'),(311,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.315'),(312,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.315'),(313,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.317'),(314,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.318'),(315,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.334'),(316,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.343'),(317,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.345'),(318,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.354'),(319,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.451'),(320,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.452'),(321,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.453'),(322,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.455'),(323,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.494'),(324,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.506'),(325,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.508'),(326,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.517'),(327,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.615'),(328,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.616'),(329,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.619'),(330,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.620'),(331,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.670'),(332,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.682'),(333,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.684'),(334,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.696'),(335,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.798'),(336,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.800'),(337,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.802'),(338,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:49:05.804'),(339,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:05.921'),(340,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:05.927'),(341,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:06.585'),(342,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.214'),(343,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.214'),(344,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.218'),(345,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.223'),(346,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.426'),(347,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.426'),(348,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.431'),(349,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.436'),(350,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.513'),(351,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.513'),(352,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.517'),(353,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.523'),(354,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.647'),(355,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.720'),(356,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.721'),(357,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.726'),(358,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.731'),(359,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.854'),(360,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.927'),(361,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.929'),(362,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.934'),(363,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:10.939'),(364,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:51:11.062'),(365,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:05.243'),(366,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:05.253'),(367,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:05.254'),(368,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:05.262'),(369,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:05.405'),(370,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:34.928'),(371,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:34.928'),(372,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:34.933'),(373,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:34.938'),(374,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.070'),(375,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.646'),(376,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.647'),(377,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.653'),(378,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.659'),(379,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.776'),(380,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.777'),(381,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.782'),(382,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.787'),(383,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.914'),(384,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.987'),(385,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.989'),(386,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.994'),(387,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:35.999'),(388,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:36.122'),(389,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:56:38.061'),(390,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:09.987'),(391,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:10.692'),(392,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:11.308'),(393,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:11.886'),(394,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:12.566'),(395,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:13.051'),(396,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:13.484'),(397,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:17.129'),(398,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:20.388'),(399,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:20.390'),(400,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:20.393'),(401,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 01:57:20.395'),(402,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:02:55.110'),(403,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:02:55.155'),(404,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:02:55.156'),(405,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:02:55.163'),(406,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:02:55.338'),(407,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:02:55.340'),(408,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:02:55.342'),(409,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:02:55.344'),(410,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:41.824'),(411,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:41.825'),(412,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:41.830'),(413,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:41.835'),(414,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:41.947'),(415,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:41.948'),(416,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:41.950'),(417,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:41.952'),(418,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.187'),(419,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.195'),(420,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.202'),(421,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.210'),(422,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.318'),(423,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.319'),(424,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.321'),(425,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.322'),(426,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.339'),(427,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.345'),(428,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.345'),(429,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.350'),(430,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.447'),(431,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.448'),(432,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.450'),(433,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.452'),(434,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.488'),(435,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.498'),(436,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.501'),(437,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.510'),(438,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.611'),(439,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.613'),(440,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.616'),(441,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:57.618'),(442,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.146'),(443,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.157'),(444,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.158'),(445,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.168'),(446,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.280'),(447,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.281'),(448,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.282'),(449,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.283'),(450,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.300'),(451,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.312'),(452,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.314'),(453,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.324'),(454,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.426'),(455,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.427'),(456,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.430'),(457,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:04:58.431'),(458,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:09:58.164'),(459,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:09:58.165'),(460,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:09:58.170'),(461,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:09:58.174'),(462,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:09:58.290'),(463,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:09:58.291'),(464,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:09:58.291'),(465,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:09:58.293'),(466,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:15:36.011'),(467,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:15:36.022'),(468,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:15:36.029'),(469,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:15:36.038'),(470,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:15:36.150'),(471,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:15:36.152'),(472,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:15:36.154'),(473,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:15:36.156'),(474,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:16:30.169'),(475,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:16:30.169'),(476,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:16:30.170'),(477,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:16:30.171'),(478,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:18.793'),(479,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:18.796'),(480,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:19.325'),(481,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:20.006'),(482,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:20.598'),(483,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:21.101'),(484,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:21.666'),(485,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:22.547'),(486,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:22.548'),(487,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:22.549'),(488,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:22.551'),(489,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:25.684'),(490,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:25.690'),(491,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:26.282'),(492,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:26.760'),(493,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:27.260'),(494,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:29.237'),(495,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:29.238'),(496,1,'GET /api/config?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/config?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:30.175'),(497,1,'GET /api/dict?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/dict?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:31.056'),(498,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:32.067'),(499,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:19:32.068'),(500,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:20:52.645'),(501,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:20:52.650'),(502,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:20:52.650'),(503,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:20:52.655'),(504,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:20:52.769'),(505,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:20:52.769'),(506,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:20:57.172'),(507,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:20:57.171'),(508,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:10.050'),(509,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:10.060'),(510,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:10.062'),(511,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:10.071'),(512,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:10.183'),(513,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:10.184'),(514,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:54.381'),(515,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:54.387'),(516,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:54.387'),(517,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:54.392'),(518,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:54.516'),(519,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:54.518'),(520,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:56.723'),(521,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:56.724'),(522,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:56.726'),(523,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:56.728'),(524,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:58.212'),(525,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:58.215'),(526,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:58.741'),(527,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:59.342'),(528,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:22:59.945'),(529,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:23:00.455'),(530,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:23:00.959'),(531,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:23:00.963'),(532,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:23:01.399'),(533,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:23:02.962'),(534,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:23:03.511'),(535,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:23:04.419'),(536,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:23:04.890'),(537,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:50.343'),(538,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:50.352'),(539,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:51.059'),(540,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:51.060'),(541,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:51.062'),(542,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:51.064'),(543,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:51.946'),(544,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:51.959'),(545,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:52.373'),(546,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:52.760'),(547,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:53.168'),(548,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:53.633'),(549,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:54.004'),(550,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:54.009'),(551,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:54.410'),(552,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:54.811'),(553,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:55.660'),(554,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:55.664'),(555,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:56.305'),(556,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:56.661'),(557,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:57.047'),(558,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:57.481'),(559,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:58.153'),(560,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:58.158'),(561,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:58.526'),(562,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:26:59.299'),(563,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:29:22.869'),(564,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:29:22.873'),(565,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:29:22.873'),(566,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:29:22.878'),(567,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:29:23.005'),(568,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:19.062'),(569,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:19.065'),(570,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:19.081'),(571,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:19.090'),(572,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:19.236'),(573,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:20.374'),(574,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:20.375'),(575,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:20.385'),(576,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:20.395'),(577,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:20.528'),(578,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:22.573'),(579,1,'GET /api/contests?contestName=&contestType=team&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=team&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"team\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:23.742'),(580,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:24.299'),(581,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:24.941'),(582,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:25.699'),(583,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:26.473'),(584,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:27.067'),(585,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:27.071'),(586,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:27.613'),(587,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:28.072'),(588,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:30:28.460'),(589,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:33:46.566'),(590,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:33:46.571'),(591,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:33:47.265'),(592,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:17.386'),(593,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:17.959'),(594,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:18.438'),(595,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:18.441'),(596,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:18.877'),(597,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:19.374'),(598,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:19.886'),(599,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:20.685'),(600,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:21.181'),(601,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:21.186'),(602,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:22.863'),(603,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:23.227'),(604,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:25.448'),(605,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:27.018'),(606,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:27.024'),(607,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:27.510'),(608,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:29.942'),(609,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:30.317'),(610,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:30.327'),(611,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:30.819'),(612,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:31.424'),(613,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:32.030'),(614,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:32.448'),(615,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:32.916'),(616,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:33.288'),(617,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:33.650'),(618,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:33.985'),(619,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:33.995'),(620,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:51.579'),(621,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:52.582'),(622,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:53.311'),(623,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:53.815'),(624,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:59.341'),(625,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:59.342'),(626,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:59.344'),(627,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:34:59.348'),(628,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:07.712'),(629,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:07.720'),(630,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:08.420'),(631,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:08.422'),(632,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:08.425'),(633,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:08.426'),(634,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:12.496'),(635,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:12.505'),(636,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:12.951'),(637,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:13.458'),(638,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:14.064'),(639,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:20.302'),(640,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:20.780'),(641,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:20.786'),(642,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:21.577'),(643,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:22.468'),(644,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:22.470'),(645,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:23.298'),(646,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:23.809'),(647,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:23.813'),(648,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:24.446'),(649,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:24.797'),(650,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:25.184'),(651,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:25.618'),(652,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:35:25.622'),(653,1,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:36:31.693'),(654,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:36:54.046'),(655,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 02:36:54.050'),(656,7,'POST /api/public/mine/children','{\"method\":\"POST\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{\"name\":\"小明\",\"gender\":\"male\",\"birthday\":\"2018-05-15\",\"grade\":\"二年级\",\"city\":\"广州\",\"schoolName\":\"广州市天河区实验小学\"}}','::1','curl/8.7.1','2026-03-24 03:31:25.302'),(657,7,'POST /api/public/mine/children','{\"method\":\"POST\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{\"name\":\"小红\",\"gender\":\"female\",\"birthday\":\"2020-09-01\",\"grade\":\"大班\",\"city\":\"广州\",\"schoolName\":\"广州市天河幼儿园\"}}','::1','curl/8.7.1','2026-03-24 03:31:25.327'),(658,7,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 03:31:25.351'),(659,7,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 03:31:25.375'),(660,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:36:58.466'),(661,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:36:58.475'),(662,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:36:58.477'),(663,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:36:58.484'),(664,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:00.305'),(665,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:00.306'),(666,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:17.420'),(667,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:17.426'),(668,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:17.428'),(669,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:17.433'),(670,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:18.955'),(671,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:18.960'),(672,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:28.060'),(673,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 03:37:28.077'),(674,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 04:42:31.365'),(675,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 04:42:31.372'),(676,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 04:42:31.373'),(677,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 04:42:31.378'),(678,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 04:42:31.380'),(679,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 04:42:31.385'),(680,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 04:42:33.006'),(681,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 04:42:33.011'),(682,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:34:59.179'),(683,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:34:59.184'),(684,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:34:59.185'),(685,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:34:59.189'),(686,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:34:59.350'),(687,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:34:59.353'),(688,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:00.136'),(689,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:00.144'),(690,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:06.236'),(691,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:06.240'),(692,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:06.241'),(693,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:06.246'),(694,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:06.384'),(695,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:06.386'),(696,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:07.131'),(697,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:07.140'),(698,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:12.152'),(699,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:12.156'),(700,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:12.156'),(701,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:12.161'),(702,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:12.296'),(703,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:12.299'),(704,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:13.131'),(705,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:13.142'),(706,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:21.865'),(707,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:21.870'),(708,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:21.870'),(709,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:21.875'),(710,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:22.009'),(711,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:22.012'),(712,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:22.110'),(713,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:22.121'),(714,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:34.048'),(715,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:34.052'),(716,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:34.053'),(717,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:34.057'),(718,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:34.106'),(719,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:34.115'),(720,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:34.182'),(721,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:35:34.186'),(722,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:42.726'),(723,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:42.742'),(724,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:42.744'),(725,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:42.752'),(726,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:42.890'),(727,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:42.892'),(728,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:42.898'),(729,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:42.901'),(730,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:52.336'),(731,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:52.340'),(732,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:52.350'),(733,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:52.361'),(734,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:52.476'),(735,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:52.479'),(736,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:52.481'),(737,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:44:52.484'),(738,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:45:04.724'),(739,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:45:48.887'),(740,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:45:49.069'),(741,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:46:05.582'),(742,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:46:05.595'),(743,8,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:47:17.054'),(744,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:47:17.055'),(745,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:47:18.152'),(746,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:47:18.153'),(747,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:01.919'),(748,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:01.922'),(749,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:01.936'),(750,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:01.948'),(751,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:02.051'),(752,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:02.055'),(753,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:09.087'),(754,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:10.216'),(755,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:10.801'),(756,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:11.325'),(757,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:11.929'),(758,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:12.496'),(759,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:13.092'),(760,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:49:14.207'),(761,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:58:15.360'),(762,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:58:53.371'),(763,1,'GET /api/users?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:58:53.508'),(764,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:58:53.509'),(765,1,'GET /api/logs?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:58:53.509'),(766,1,'GET /api/roles?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 05:58:53.508'),(767,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:01:07.209'),(768,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:01:07.211'),(769,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:15.483'),(770,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:15.492'),(771,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:15.493'),(772,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:15.499'),(773,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:15.658'),(774,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:15.663'),(775,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:16.210'),(776,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:16.219'),(777,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:28.640'),(778,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:28.646'),(779,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:28.647'),(780,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:28.652'),(781,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:28.815'),(782,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:28.817'),(783,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:58.190'),(784,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:15:58.191'),(785,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:04.507'),(786,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:05.650'),(787,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:05.651'),(788,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:10.981'),(789,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:10.983'),(790,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:17.746'),(791,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:17.753'),(792,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:18.415'),(793,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:19.175'),(794,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:19.179'),(795,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:20.494'),(796,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:21.201'),(797,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:22.595'),(798,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:23.528'),(799,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:24.175'),(800,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:24.183'),(801,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:24.603'),(802,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:25.019'),(803,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:25.712'),(804,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:16:25.717'),(805,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:17:44.318'),(806,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:17:44.320'),(807,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:17:45.918'),(808,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:17:45.921'),(809,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:17:46.694'),(810,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:13.574'),(811,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:13.579'),(812,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:13.580'),(813,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:13.586'),(814,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:13.710'),(815,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:14.205'),(816,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:14.211'),(817,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:14.211'),(818,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:14.215'),(819,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:14.217'),(820,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:14.223'),(821,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:15.611'),(822,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:15.616'),(823,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:33.724'),(824,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:33.729'),(825,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:33.729'),(826,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:33.734'),(827,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:33.858'),(828,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:34.202'),(829,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:34.212'),(830,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:34.213'),(831,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:34.220'),(832,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:34.223'),(833,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:34.227'),(834,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:35.676'),(835,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:18:35.682'),(836,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:18.735'),(837,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:18.742'),(838,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:18.743'),(839,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:18.748'),(840,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:18.873'),(841,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:19.203'),(842,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:19.213'),(843,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:19.216'),(844,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:19.227'),(845,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:19.230'),(846,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:19.236'),(847,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:20.457'),(848,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:20.464'),(849,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:47.353'),(850,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:47.360'),(851,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:47.361'),(852,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:47.369'),(853,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:47.535'),(854,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:20:47.537'),(855,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:23:13.844'),(856,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:23:20.737'),(857,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:23:20.866'),(858,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:23:22.479'),(859,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:23:23.143'),(860,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:23:41.948'),(861,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:24:01.280'),(862,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:24:01.456'),(863,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:24:01.461'),(864,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:29:47.302'),(865,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:29:47.310'),(866,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:21.119'),(867,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:21.120'),(868,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:21.136'),(869,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:21.147'),(870,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:21.311'),(871,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:21.313'),(872,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:23.271'),(873,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:23.858'),(874,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:24.486'),(875,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:25.090'),(876,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:26.810'),(877,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:29.084'),(878,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:29.090'),(879,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:29.607'),(880,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:30.058'),(881,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:31.084'),(882,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:31.742'),(883,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:32.621'),(884,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:33.133'),(885,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:34.633'),(886,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:35.018'),(887,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:35.394'),(888,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:35.827'),(889,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:36.209'),(890,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:36.688'),(891,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:37.126'),(892,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:37.510'),(893,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:37.872'),(894,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:38.237'),(895,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:38.623'),(896,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:39.061'),(897,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:39.512'),(898,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:39.517'),(899,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:42.318'),(900,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:43.511'),(901,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:43.932'),(902,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:34:44.359'),(903,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:35:05.381'),(904,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:35:05.391'),(905,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:47:17.101'),(906,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:47:17.112'),(907,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:49:48.745'),(908,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:49:48.748'),(909,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:49:48.764'),(910,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:49:48.774'),(911,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:49:48.940'),(912,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:49:48.942'),(913,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:49:58.802'),(914,1,'GET /api/contests?contestName=&contestType=team&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=team&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"team\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:00.188'),(915,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:00.761'),(916,1,'GET /api/contests?contestName=&contestType=team&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=team&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"team\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:03.118'),(917,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:03.659'),(918,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:04.697'),(919,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:04.703'),(920,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:05.334'),(921,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:05.781'),(922,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:06.301'),(923,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:06.695'),(924,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:06.704'),(925,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:18.874'),(926,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:19.336'),(927,1,'GET /api/contests?page=1&pageSize=10&contestType=team','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=team\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"team\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:20.818'),(928,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:21.345'),(929,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:22.130'),(930,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:26.445'),(931,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:34.347'),(932,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:41.717'),(933,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:42.387'),(934,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:43.124'),(935,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:43.804'),(936,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:43.808'),(937,1,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:46.634'),(938,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:53.557'),(939,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:53.561'),(940,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:55.272'),(941,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:50:55.273'),(942,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:53:04.673'),(943,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:53:04.674'),(944,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.306'),(945,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.309'),(946,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.323'),(947,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.334'),(948,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.479'),(949,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.481'),(950,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.908'),(951,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.910'),(952,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.924'),(953,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:04.935'),(954,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:05.070'),(955,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:05.073'),(956,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:15.390'),(957,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:15.403'),(958,1,'GET /api/tenants/7','{\"method\":\"GET\",\"url\":\"/api/tenants/7\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:21.998'),(959,1,'GET /api/tenants/7/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/7/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:22.019'),(960,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:36.117'),(961,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:36.132'),(962,1,'GET /api/tenants/1','{\"method\":\"GET\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:48.074'),(963,1,'GET /api/tenants/1/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/1/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:55:48.092'),(964,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:56:05.423'),(965,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:56:05.425'),(966,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:56:27.631'),(967,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:56:27.633'),(968,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:56:27.645'),(969,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:56:27.657'),(970,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:56:27.806'),(971,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:56:27.809'),(972,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:47.579'),(973,1,'GET /api/contests?contestName=&contestType=team&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=team&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"team\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:49.402'),(974,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:49.945'),(975,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:50.943'),(976,1,'GET /api/contests?page=1&pageSize=10&contestType=team','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=team\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"team\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:52.405'),(977,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:52.969'),(978,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:53.734'),(979,1,'GET /api/contests?page=1&pageSize=10&contestType=team','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=team\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"team\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:54.546'),(980,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:55.176'),(981,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:57:55.952'),(982,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:58:04.922'),(983,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:58:07.916'),(984,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:58:07.921'),(985,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:58:09.564'),(986,1,'GET /api/public/users/7','{\"method\":\"GET\",\"url\":\"/api/public/users/7\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:58:14.374'),(987,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:58:21.423'),(988,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 06:58:28.780'),(989,6,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:01:51.738'),(990,6,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:01:51.750'),(991,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:01:51.751'),(992,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:01:51.760'),(993,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:01:51.877'),(994,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:25.679'),(995,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:28.304'),(996,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:28.471'),(997,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:31.621'),(998,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:32.093'),(999,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:32.461'),(1000,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:32.855'),(1001,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:33.229'),(1002,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:33.569'),(1003,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:33.953'),(1004,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:02:39.638'),(1005,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:06:57.328'),(1006,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:07:05.072'),(1007,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:07:11.320'),(1008,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:26.664'),(1009,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:26.841'),(1010,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:26.843'),(1011,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:41.803'),(1012,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:45.003'),(1013,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:48.486'),(1014,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:51.611'),(1015,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:55.120'),(1016,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:09:59.207'),(1017,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:10:08.555'),(1018,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:10:29.138'),(1019,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:10:32.595'),(1020,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:10:32.604'),(1021,1,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:10:33.759'),(1022,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:10:45.489'),(1023,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:10:45.493'),(1024,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:11:17.800'),(1025,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:11:57.316'),(1026,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:11:57.317'),(1027,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:11:59.825'),(1028,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:11:59.826'),(1029,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:00.993'),(1030,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:00.994'),(1031,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:04.807'),(1032,1,'GET /api/dict?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/dict?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:05.641'),(1033,1,'GET /api/config?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/config?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:06.152'),(1034,1,'GET /api/logs?page=1&pageSize=20','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=20\",\"query\":{\"page\":\"1\",\"pageSize\":\"20\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:06.599'),(1035,1,'GET /api/logs/statistics?days=7','{\"method\":\"GET\",\"url\":\"/api/logs/statistics?days=7\",\"query\":{\"days\":\"7\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:06.600'),(1036,1,'GET /api/permissions?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:06.913'),(1037,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:08.867'),(1038,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:10.622'),(1039,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:10.776'),(1040,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:19.039'),(1041,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:19.538'),(1042,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:20.144'),(1043,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:20.836'),(1044,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:25.489'),(1045,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:26.281'),(1046,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:27.337'),(1047,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:28.025'),(1048,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:28.319'),(1049,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:29.518'),(1050,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:33.050'),(1051,8,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:33.051'),(1052,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:34.191'),(1053,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:34.192'),(1054,8,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:34.878'),(1055,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:34.879'),(1056,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:35.456'),(1057,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:35.457'),(1058,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:35.941'),(1059,8,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:35.942'),(1060,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:38.887'),(1061,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:40.632'),(1062,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:40.738'),(1063,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:41.747'),(1064,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:42.241'),(1065,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:12:46.968'),(1066,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:15:15.351'),(1067,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:35:25.569'),(1068,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:35:25.580'),(1069,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:35:25.574'),(1070,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:35:33.814'),(1071,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:35:33.817'),(1072,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:35:33.820'),(1073,9,'GET /api/public/mine/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 07:37:10.906'),(1074,10,'POST /api/public/mine/children','{\"method\":\"POST\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{\"name\":\"测试小明\",\"gender\":\"male\",\"birthday\":\"2018-03-15\",\"grade\":\"二年级\",\"city\":\"广州\",\"schoolName\":\"测试小学\"}}','::1','curl/8.7.1','2026-03-24 08:05:32.926'),(1075,10,'POST /api/public/mine/children','{\"method\":\"POST\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{\"grade\":\"一年级\"}}','::1','curl/8.7.1','2026-03-24 08:05:32.944'),(1076,10,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:05:32.963'),(1077,10,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:05:32.982'),(1078,8,'POST /api/contests','{\"method\":\"POST\",\"url\":\"/api/contests\",\"query\":{},\"body\":{\"contestName\":\"全国少儿绘本创作大赛(测试)\",\"contestType\":\"individual\",\"visibility\":\"public\",\"ageMin\":3,\"ageMax\":16,\"startTime\":\"2026-03-01T00:00:00Z\",\"endTime\":\"2026-06-30T00:00:00Z\",\"registerStartTime\":\"2026-03-01T00:00:00Z\",\"registerEndTime\":\"2026-05-30T00:00:00Z\",\"submitStartTime\":\"2026-03-01T00:00:00Z\",\"submitEndTime\":\"2026-06-15T00:00:00Z\",\"reviewStartTime\":\"2026-06-16T00:00:00Z\",\"reviewEndTime\":\"2026-06-25T00:00:00Z\",\"organizers\":\"广东省立中山图书馆\",\"content\":\"

全国少儿绘本创作活动

\"}}','::1','curl/8.7.1','2026-03-24 08:05:51.082'),(1079,8,'POST /api/contests','{\"method\":\"POST\",\"url\":\"/api/contests\",\"query\":{},\"body\":{\"contestName\":\"广州绘本工作坊(测试)\",\"contestType\":\"individual\",\"visibility\":\"targeted\",\"targetCities\":[\"广州\",\"深圳\"],\"ageMin\":6,\"ageMax\":12,\"startTime\":\"2026-03-01T00:00:00Z\",\"endTime\":\"2026-06-30T00:00:00Z\",\"registerStartTime\":\"2026-03-01T00:00:00Z\",\"registerEndTime\":\"2026-05-30T00:00:00Z\",\"submitStartTime\":\"2026-03-01T00:00:00Z\",\"submitEndTime\":\"2026-06-15T00:00:00Z\",\"reviewStartTime\":\"2026-06-16T00:00:00Z\",\"reviewEndTime\":\"2026-06-25T00:00:00Z\",\"organizers\":\"广东省立中山图书馆\",\"content\":\"

广州地区定向活动

\"}}','::1','curl/8.7.1','2026-03-24 08:05:51.101'),(1080,8,'POST /api/contests','{\"method\":\"POST\",\"url\":\"/api/contests\",\"query\":{},\"body\":{\"contestName\":\"测试活动A\",\"contestType\":\"individual\",\"visibility\":\"public\",\"startTime\":\"2026-03-01T00:00:00Z\",\"endTime\":\"2026-06-30T00:00:00Z\",\"registerStartTime\":\"2026-03-01T00:00:00Z\",\"registerEndTime\":\"2026-05-30T00:00:00Z\",\"submitStartTime\":\"2026-03-01T00:00:00Z\",\"submitEndTime\":\"2026-06-15T00:00:00Z\",\"reviewStartTime\":\"2026-06-16T00:00:00Z\",\"reviewEndTime\":\"2026-06-25T00:00:00Z\",\"organizers\":\"广东省立中山图书馆\",\"content\":\"测试\"}}','::1','curl/8.7.1','2026-03-24 08:06:00.010'),(1081,8,'POST /api/contests','{\"method\":\"POST\",\"url\":\"/api/contests\",\"query\":{},\"body\":{\"contestName\":\"全国少儿绘本创作大赛\",\"contestType\":\"individual\",\"visibility\":\"public\",\"ageMin\":3,\"ageMax\":16,\"startTime\":\"2026-03-01T00:00:00Z\",\"endTime\":\"2026-06-30T00:00:00Z\",\"registerStartTime\":\"2026-03-01T00:00:00Z\",\"registerEndTime\":\"2026-04-15T00:00:00Z\",\"submitStartTime\":\"2026-04-16T00:00:00Z\",\"submitEndTime\":\"2026-05-30T00:00:00Z\",\"reviewStartTime\":\"2026-06-01T00:00:00Z\",\"reviewEndTime\":\"2026-06-25T00:00:00Z\",\"organizers\":\"广东省立中山图书馆\",\"content\":\"

面向全国3-16岁少儿的绘本创作活动

\"}}','::1','curl/8.7.1','2026-03-24 08:06:30.158'),(1082,8,'POST /api/contests','{\"method\":\"POST\",\"url\":\"/api/contests\",\"query\":{},\"body\":{\"contestName\":\"广州绘本工作坊\",\"contestType\":\"individual\",\"visibility\":\"targeted\",\"targetCities\":[\"广州\",\"深圳\"],\"ageMin\":6,\"ageMax\":12,\"startTime\":\"2026-03-01T00:00:00Z\",\"endTime\":\"2026-06-30T00:00:00Z\",\"registerStartTime\":\"2026-03-01T00:00:00Z\",\"registerEndTime\":\"2026-04-15T00:00:00Z\",\"submitStartTime\":\"2026-04-16T00:00:00Z\",\"submitEndTime\":\"2026-05-30T00:00:00Z\",\"reviewStartTime\":\"2026-06-01T00:00:00Z\",\"reviewEndTime\":\"2026-06-25T00:00:00Z\",\"organizers\":\"广东省立中山图书馆\",\"content\":\"

广州深圳地区6-12岁绘本工作坊

\"}}','::1','curl/8.7.1','2026-03-24 08:06:30.178'),(1083,8,'POST /api/contests','{\"method\":\"POST\",\"url\":\"/api/contests\",\"query\":{},\"body\":{\"contestName\":\"内部测试活动\",\"contestType\":\"individual\",\"visibility\":\"internal\",\"startTime\":\"2026-03-01T00:00:00Z\",\"endTime\":\"2026-06-30T00:00:00Z\",\"registerStartTime\":\"2026-03-01T00:00:00Z\",\"registerEndTime\":\"2026-04-15T00:00:00Z\",\"submitStartTime\":\"2026-04-16T00:00:00Z\",\"submitEndTime\":\"2026-05-30T00:00:00Z\",\"reviewStartTime\":\"2026-06-01T00:00:00Z\",\"reviewEndTime\":\"2026-06-25T00:00:00Z\",\"organizers\":\"内部\",\"content\":\"

内部测试

\"}}','::1','curl/8.7.1','2026-03-24 08:06:30.196'),(1084,8,'POST /api/contests','{\"method\":\"POST\",\"url\":\"/api/contests\",\"query\":{},\"body\":{\"contestName\":\"广州绘本工作坊\",\"contestType\":\"individual\",\"visibility\":\"targeted\",\"targetCities\":[\"广州\",\"深圳\"],\"ageMin\":6,\"ageMax\":12,\"startTime\":\"2026-03-01T00:00:00Z\",\"endTime\":\"2026-06-30T00:00:00Z\",\"registerStartTime\":\"2026-03-01T00:00:00Z\",\"registerEndTime\":\"2026-04-15T00:00:00Z\",\"submitStartTime\":\"2026-04-16T00:00:00Z\",\"submitEndTime\":\"2026-05-30T00:00:00Z\",\"reviewStartTime\":\"2026-06-01T00:00:00Z\",\"reviewEndTime\":\"2026-06-25T00:00:00Z\",\"organizers\":\"广东省立中山图书馆\",\"content\":\"test\"}}','::1','curl/8.7.1','2026-03-24 08:06:38.679'),(1085,8,'POST /api/contests','{\"method\":\"POST\",\"url\":\"/api/contests\",\"query\":{},\"body\":{\"contestName\":\"广州绘本工作坊\",\"contestType\":\"individual\",\"visibility\":\"targeted\",\"targetCities\":[\"广州\",\"深圳\"],\"ageMin\":6,\"ageMax\":12,\"startTime\":\"2026-03-01T00:00:00Z\",\"endTime\":\"2026-06-30T00:00:00Z\",\"registerStartTime\":\"2026-03-01T00:00:00Z\",\"registerEndTime\":\"2026-04-15T00:00:00Z\",\"submitStartTime\":\"2026-04-16T00:00:00Z\",\"submitEndTime\":\"2026-05-30T00:00:00Z\",\"reviewStartTime\":\"2026-06-01T00:00:00Z\",\"reviewEndTime\":\"2026-06-25T00:00:00Z\",\"organizers\":\"广东省立中山图书馆\",\"content\":\"

广深地区6-12岁

\"}}','::1','curl/8.7.1','2026-03-24 08:07:08.174'),(1086,8,'PATCH /api/contests/1/publish','{\"method\":\"PATCH\",\"url\":\"/api/contests/1/publish\",\"query\":{},\"body\":{\"contestState\":\"published\",\"contestTenants\":[]}}','::1','curl/8.7.1','2026-03-24 08:07:16.505'),(1087,8,'PATCH /api/contests/2/publish','{\"method\":\"PATCH\",\"url\":\"/api/contests/2/publish\",\"query\":{},\"body\":{\"contestState\":\"published\",\"contestTenants\":[]}}','::1','curl/8.7.1','2026-03-24 08:07:16.524'),(1088,8,'PATCH /api/contests/3/publish','{\"method\":\"PATCH\",\"url\":\"/api/contests/3/publish\",\"query\":{},\"body\":{\"contestState\":\"published\",\"contestTenants\":[]}}','::1','curl/8.7.1','2026-03-24 08:07:16.544'),(1089,8,'PATCH /api/contests/1/publish','{\"method\":\"PATCH\",\"url\":\"/api/contests/1/publish\",\"query\":{},\"body\":{\"contestState\":\"published\",\"contestTenants\":[]}}','::1','curl/8.7.1','2026-03-24 08:07:22.193'),(1090,8,'PATCH /api/contests/1/publish','{\"method\":\"PATCH\",\"url\":\"/api/contests/1/publish\",\"query\":{},\"body\":{\"action\":\"publish\",\"tenantIds\":[]}}','::1','curl/8.7.1','2026-03-24 08:07:28.642'),(1091,8,'PATCH /api/contests/1/publish','{\"method\":\"PATCH\",\"url\":\"/api/contests/1/publish\",\"query\":{},\"body\":{\"contestState\":\"published\"}}','::1','curl/8.7.1','2026-03-24 08:07:34.784'),(1092,8,'PATCH /api/contests/2/publish','{\"method\":\"PATCH\",\"url\":\"/api/contests/2/publish\",\"query\":{},\"body\":{\"contestState\":\"published\"}}','::1','curl/8.7.1','2026-03-24 08:07:34.804'),(1093,8,'PATCH /api/contests/3/publish','{\"method\":\"PATCH\",\"url\":\"/api/contests/3/publish\",\"query\":{},\"body\":{\"contestState\":\"published\"}}','::1','curl/8.7.1','2026-03-24 08:07:34.823'),(1094,10,'POST /api/public/activities/1/register','{\"method\":\"POST\",\"url\":\"/api/public/activities/1/register\",\"query\":{},\"body\":{\"participantType\":\"self\",\"contestId\":1}}','::1','curl/8.7.1','2026-03-24 08:10:06.290'),(1095,10,'POST /api/public/activities/1/register','{\"method\":\"POST\",\"url\":\"/api/public/activities/1/register\",\"query\":{},\"body\":{\"participantType\":\"self\",\"contestId\":1}}','::1','curl/8.7.1','2026-03-24 08:10:06.309'),(1096,10,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:10:06.329'),(1097,10,'POST /api/public/activities/1/register','{\"method\":\"POST\",\"url\":\"/api/public/activities/1/register\",\"query\":{},\"body\":{\"participantType\":\"child\",\"childId\":3,\"contestId\":1}}','::1','curl/8.7.1','2026-03-24 08:10:06.348'),(1098,10,'POST /api/public/activities/1/register','{\"method\":\"POST\",\"url\":\"/api/public/activities/1/register\",\"query\":{},\"body\":{\"participantType\":\"child\",\"childId\":3,\"contestId\":1}}','::1','curl/8.7.1','2026-03-24 08:10:06.367'),(1099,10,'GET /api/public/mine/registrations','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:10:06.386'),(1100,10,'POST /api/public/mine/children','{\"method\":\"POST\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{\"name\":\"小宝宝\",\"birthday\":\"2024-01-01\",\"city\":\"广州\"}}','::1','curl/8.7.1','2026-03-24 08:10:25.284'),(1101,10,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:10:25.291'),(1102,10,'POST /api/public/activities/3/register','{\"method\":\"POST\",\"url\":\"/api/public/activities/3/register\",\"query\":{},\"body\":{\"participantType\":\"child\",\"childId\":4,\"contestId\":3}}','::1','curl/8.7.1','2026-03-24 08:10:25.311'),(1103,10,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:10:25.330'),(1104,10,'POST /api/public/activities/3/register','{\"method\":\"POST\",\"url\":\"/api/public/activities/3/register\",\"query\":{},\"body\":{\"participantType\":\"child\",\"childId\":3,\"contestId\":3}}','::1','curl/8.7.1','2026-03-24 08:10:25.349'),(1105,10,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:11:22.663'),(1106,10,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:11:22.680'),(1107,10,'POST /api/public/activities/3/register','{\"method\":\"POST\",\"url\":\"/api/public/activities/3/register\",\"query\":{},\"body\":{\"participantType\":\"child\",\"childId\":4,\"contestId\":3}}','::1','curl/8.7.1','2026-03-24 08:11:22.700'),(1108,10,'POST /api/public/activities/3/register','{\"method\":\"POST\",\"url\":\"/api/public/activities/3/register\",\"query\":{},\"body\":{\"participantType\":\"child\",\"childId\":3,\"contestId\":3}}','::1','curl/8.7.1','2026-03-24 08:11:22.719'),(1109,1,'GET /api/public/users','{\"method\":\"GET\",\"url\":\"/api/public/users\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-24 08:11:46.504'),(1110,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:16:52.504'),(1111,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:16:52.505'),(1112,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:16:52.511'),(1113,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:16:54.113'),(1114,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:16:54.114'),(1115,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:16:54.114'),(1116,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:16:55.720'),(1117,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:00.412'),(1118,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:00.575'),(1119,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:00.581'),(1120,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:02.484'),(1121,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:02.490'),(1122,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:02.490'),(1123,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:02.496'),(1124,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:02.621'),(1125,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:17:02.623'),(1126,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:20:56.605'),(1127,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:20:56.605'),(1128,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:20:56.612'),(1129,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:20:58.228'),(1130,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:20:58.229'),(1131,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:20:58.229'),(1132,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:20:59.835'),(1133,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:04.543'),(1134,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:04.701'),(1135,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:04.705'),(1136,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:08.539'),(1137,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:08.660'),(1138,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:12.552'),(1139,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:12.636'),(1140,6,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:15.564'),(1141,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/145.0.7632.6 Safari/537.36','2026-03-24 08:21:15.575'),(1142,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:23:50.918'),(1143,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:23:50.920'),(1144,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:23:50.923'),(1145,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:23:55.284'),(1146,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:23:55.447'),(1147,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:23:55.449'),(1148,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:23:58.524'),(1149,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:01.236'),(1150,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:01.870'),(1151,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:02.450'),(1152,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:03.095'),(1153,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:03.531'),(1154,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:04.354'),(1155,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:06.047'),(1156,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:07.715'),(1157,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:07.716'),(1158,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:08.469'),(1159,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:08.470'),(1160,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:09.128'),(1161,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:09.130'),(1162,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:09.531'),(1163,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:10.853'),(1164,1,'GET /api/permissions?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:11.180'),(1165,1,'GET /api/dict?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/dict?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:11.870'),(1166,1,'GET /api/config?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/config?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:13.847'),(1167,1,'GET /api/logs?page=1&pageSize=20','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=20\",\"query\":{\"page\":\"1\",\"pageSize\":\"20\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:14.427'),(1168,1,'GET /api/logs/statistics?days=7','{\"method\":\"GET\",\"url\":\"/api/logs/statistics?days=7\",\"query\":{\"days\":\"7\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:14.428'),(1169,1,'GET /api/dict?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/dict?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:14.871'),(1170,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:34.279'),(1171,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:36.385'),(1172,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:36.525'),(1173,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:37.555'),(1174,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:38.015'),(1175,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:38.427'),(1176,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:38.862'),(1177,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:39.192'),(1178,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:39.469'),(1179,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:39.865'),(1180,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:41.119'),(1181,8,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:41.120'),(1182,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:42.251'),(1183,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:42.253'),(1184,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:43.623'),(1185,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:46.856'),(1186,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:46.964'),(1187,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:47.818'),(1188,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:48.141'),(1189,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:49.646'),(1190,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:58.431'),(1191,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:58.432'),(1192,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:24:58.441'),(1193,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:07.893'),(1194,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:07.896'),(1195,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:07.899'),(1196,9,'GET /api/public/mine/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:08.929'),(1197,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:10.044'),(1198,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:10.047'),(1199,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:10.050'),(1200,9,'GET /api/public/mine/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:11.406'),(1201,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:12.733'),(1202,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:12.736'),(1203,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:12.738'),(1204,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:13.520'),(1205,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:14.779'),(1206,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:14.783'),(1207,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:14.785'),(1208,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:18.520'),(1209,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:18.666'),(1210,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:18.670'),(1211,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:22.252'),(1212,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:22.849'),(1213,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:23.265'),(1214,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:23.912'),(1215,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:26.002'),(1216,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:26.467'),(1217,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:26.862'),(1218,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:27.237'),(1219,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:27.824'),(1220,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:30.893'),(1221,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:32.805'),(1222,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:32.932'),(1223,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:36.353'),(1224,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:36.717'),(1225,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:37.081'),(1226,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:37.852'),(1227,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:38.326'),(1228,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:38.698'),(1229,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:39.128'),(1230,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:39.592'),(1231,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:40.032'),(1232,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:40.439'),(1233,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:42.100'),(1234,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:43.496'),(1235,8,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:25:43.497'),(1236,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:15.303'),(1237,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:21.302'),(1238,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:21.468'),(1239,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:21.472'),(1240,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:25.998'),(1241,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:26.492'),(1242,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:26.920'),(1243,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:27.295'),(1244,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:27.845'),(1245,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:28.590'),(1246,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:29.438'),(1247,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:30.673'),(1248,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:31.394'),(1249,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:32.106'),(1250,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:32.112'),(1251,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:38.487'),(1252,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:26:38.498'),(1253,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:08.520'),(1254,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:09.776'),(1255,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:09.777'),(1256,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:12.097'),(1257,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:45.104'),(1258,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:46.801'),(1259,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:46.941'),(1260,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:49.893'),(1261,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:50.293'),(1262,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:50.631'),(1263,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:50.952'),(1264,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:51.693'),(1265,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:52.500'),(1266,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:53.702'),(1267,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:54.281'),(1268,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:55.270'),(1269,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:56.371'),(1270,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:57.114'),(1271,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:27:57.679'),(1272,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:28:01.745'),(1273,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:28:11.321'),(1274,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:28:18.974'),(1275,8,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:28:21.096'),(1276,8,'GET /api/contests/registrations?contestId=3&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=3&page=1&pageSize=10\",\"query\":{\"contestId\":\"3\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:28:21.105'),(1277,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:28:27.609'),(1278,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:12.842'),(1279,8,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:12.843'),(1280,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:14.736'),(1281,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:14.737'),(1282,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:15.306'),(1283,8,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:15.308'),(1284,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:19.725'),(1285,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:21.826'),(1286,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:21.927'),(1287,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:22.767'),(1288,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:23.287'),(1289,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:31.183'),(1290,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:33.111'),(1291,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:33.247'),(1292,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:34.966'),(1293,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:53.958'),(1294,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:55.766'),(1295,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:55.913'),(1296,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:55.914'),(1297,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:58.656'),(1298,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:29:58.659'),(1299,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:30:15.554'),(1300,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:06.161'),(1301,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:13.631'),(1302,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:13.632'),(1303,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:13.646'),(1304,9,'GET /api/public/activities/1/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/1/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:15.484'),(1305,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:15.485'),(1306,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:15.492'),(1307,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:17.592'),(1308,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:17.595'),(1309,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:17.598'),(1310,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:21.234'),(1311,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:25.525'),(1312,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:25.528'),(1313,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:31:25.531'),(1314,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:32:02.084'),(1315,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:32:02.236'),(1316,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:32:03.225'),(1317,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:32:03.227'),(1318,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-24 08:32:04.165'),(1319,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:04.984'),(1320,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:05.029'),(1321,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:05.030'),(1322,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:05.037'),(1323,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:05.400'),(1324,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:05.403'),(1325,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:12.122'),(1326,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:15.875'),(1327,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:16.036'),(1328,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:05:16.036'),(1329,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:11:15.101'),(1330,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:11:15.103'),(1331,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:11:17.888'),(1332,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:11:17.896'),(1333,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:13.624'),(1334,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:13.625'),(1335,1,'GET /api/contests/registrations?contestId=3&userId=1&page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=3&userId=1&page=1&pageSize=1\",\"query\":{\"contestId\":\"3\",\"userId\":\"1\",\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:13.636'),(1336,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:18.759'),(1337,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:18.763'),(1338,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:21.669'),(1339,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:22.875'),(1340,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:22.887'),(1341,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:24.217'),(1342,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:24.925'),(1343,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 02:25:24.931'),(1344,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 03:19:41.280'),(1345,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 03:27:28.809'),(1346,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 03:27:28.813'),(1347,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:41:39.008'),(1348,1,'GET /api/public/users/11','{\"method\":\"GET\",\"url\":\"/api/public/users/11\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:41:40.503'),(1349,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:56:43.339'),(1350,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:56:43.348'),(1351,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:56:43.351'),(1352,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:56:43.359'),(1353,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:56:43.497'),(1354,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:58:21.505'),(1355,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:58:21.510'),(1356,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:58:21.511'),(1357,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:58:21.517'),(1358,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 05:58:21.645'),(1359,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:48:15.150'),(1360,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:48:15.159'),(1361,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:48:58.998'),(1362,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:48:59.002'),(1363,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:00.785'),(1364,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:00.805'),(1365,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:00.807'),(1366,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:00.822'),(1367,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:00.972'),(1368,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:00.976'),(1369,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:22.198'),(1370,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:22.208'),(1371,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:26.476'),(1372,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:26.478'),(1373,1,'GET /api/contests/registrations?contestId=3&userId=1&page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=3&userId=1&page=1&pageSize=1\",\"query\":{\"contestId\":\"3\",\"userId\":\"1\",\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:26.491'),(1374,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:28.600'),(1375,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:28.607'),(1376,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:30.814'),(1377,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:31.628'),(1378,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:32.535'),(1379,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:33.938'),(1380,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:34.853'),(1381,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:35.982'),(1382,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:37.172'),(1383,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:38.415'),(1384,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:38.422'),(1385,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:41.887'),(1386,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:47.242'),(1387,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:47.401'),(1388,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:47.404'),(1389,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:55.647'),(1390,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:55.662'),(1391,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:55.663'),(1392,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:55.680'),(1393,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:49:55.823'),(1394,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:50:10.067'),(1395,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:50:13.493'),(1396,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:50:13.625'),(1397,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:50:20.927'),(1398,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:50:22.268'),(1399,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:50:25.581'),(1400,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:03.620'),(1401,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:03.620'),(1402,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:03.635'),(1403,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:08.721'),(1404,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:08.723'),(1405,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:08.724'),(1406,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:28.641'),(1407,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:28.808'),(1408,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:28.813'),(1409,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:51:57.933'),(1410,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:20.352'),(1411,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:20.354'),(1412,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:20.355'),(1413,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:37.406'),(1414,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:37.407'),(1415,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:37.412'),(1416,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:42.085'),(1417,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:42.239'),(1418,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 07:52:42.241'),(1419,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:05:38.729'),(1420,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:05:38.732'),(1421,1,'GET /api/public/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:15:55.709'),(1422,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:15:58.958'),(1423,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:15:58.959'),(1424,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:15:58.964'),(1425,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:16:07.644'),(1426,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:16:08.832'),(1427,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:16:10.068'),(1428,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:16:11.612'),(1429,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:25:15.632'),(1430,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:25:23.440'),(1431,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:25:23.460'),(1432,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:25:23.462'),(1433,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:25:23.478'),(1434,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:25:23.612'),(1435,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:09.739'),(1436,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:12.798'),(1437,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:12.969'),(1438,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:12.973'),(1439,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:21.756'),(1440,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:21.772'),(1441,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:21.773'),(1442,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:21.790'),(1443,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:32:21.937'),(1444,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:40:26.344'),(1445,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:40:29.406'),(1446,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:40:29.568'),(1447,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:40:29.575'),(1448,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:08.390'),(1449,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:08.391'),(1450,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:08.398'),(1451,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:12.289'),(1452,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:13.391'),(1453,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:14.752'),(1454,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:15.642'),(1455,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:17.349'),(1456,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:41:18.473'),(1457,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:44:31.154'),(1458,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:36.154'),(1459,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:36.156'),(1460,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:36.157'),(1461,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:41.151'),(1462,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:41.308'),(1463,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:41.311'),(1464,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:45.475'),(1465,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:45.476'),(1466,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:45.481'),(1467,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:46:49.809'),(1468,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:47:06.116'),(1469,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:47:07.281'),(1470,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:47:10.090'),(1471,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:47:12.539'),(1472,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:47:13.635'),(1473,1,'GET /api/users/11','{\"method\":\"GET\",\"url\":\"/api/users/11\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:48:19.614'),(1474,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 08:50:29.126'),(1475,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:23.889'),(1476,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:23.891'),(1477,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:23.893'),(1478,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:27.941'),(1479,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:28.097'),(1480,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:28.101'),(1481,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:32.016'),(1482,1,'DELETE /api/menus/31','{\"method\":\"DELETE\",\"url\":\"/api/menus/31\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:56.297'),(1483,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:56.329'),(1484,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:58.255'),(1485,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:58.270'),(1486,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:58.273'),(1487,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:58.286'),(1488,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:28:58.411'),(1489,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:00.583'),(1490,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:00.585'),(1491,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:00.589'),(1492,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:02.983'),(1493,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:02.984'),(1494,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:03.658'),(1495,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:03.659'),(1496,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:03.667'),(1497,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:25.793'),(1498,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:27.074'),(1499,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:28.284'),(1500,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:33.230'),(1501,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:41.543'),(1502,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:29:41.546'),(1503,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:33:33.568'),(1504,1,'GET /api/contests?contestName=&contestType=team&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=team&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"team\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:33:38.776'),(1505,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:33:40.301'),(1506,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:34:46.265'),(1507,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:34:46.273'),(1508,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:55:17.943'),(1509,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:55:17.944'),(1510,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:55:32.001'),(1511,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:55:32.003'),(1512,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:57:16.053'),(1513,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:57:16.053'),(1514,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:57:16.055'),(1515,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:58:38.764'),(1516,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:58:38.772'),(1517,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:58:38.777'),(1518,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:58:38.784'),(1519,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:58:40.372'),(1520,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:58:40.374'),(1521,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 11:58:40.377'),(1522,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:01.165'),(1523,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:01.182'),(1524,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:01.182'),(1525,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:01.193'),(1526,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:01.354'),(1527,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:01.357'),(1528,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:01.358'),(1529,1,'GET /api/contests?page=1&pageSize=10&stage=registering','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=registering\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"registering\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:04.362'),(1530,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:05.186'),(1531,1,'GET /api/contests?page=1&pageSize=10&stage=registering','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=registering\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"registering\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:05.690'),(1532,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:07.297'),(1533,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:45.352'),(1534,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:51.630'),(1535,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:51.636'),(1536,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:51.640'),(1537,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:55.269'),(1538,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:00:55.269'),(1539,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:01:24.404'),(1540,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:01:24.405'),(1541,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:01:24.411'),(1542,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:03:10.999'),(1543,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:03:11.000'),(1544,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:03:11.002'),(1545,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:03:19.475'),(1546,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:03:19.479'),(1547,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:03:19.483'),(1548,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:04:27.586'),(1549,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:04:27.595'),(1550,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:04:27.596'),(1551,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:04:27.605'),(1552,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:04:27.756'),(1553,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:04:27.758'),(1554,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:04:27.762'),(1555,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:05:10.648'),(1556,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:05:10.649'),(1557,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:05:10.653'),(1558,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:05:38.208'),(1559,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:05:38.210'),(1560,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:30.295'),(1561,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:32.977'),(1562,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:32.981'),(1563,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:32.988'),(1564,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:34.059'),(1565,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:34.060'),(1566,1,'GET /api/contests/works?page=1&pageSize=10&contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=3\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:35.456'),(1567,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:35.456'),(1568,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:38.424'),(1569,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:38.424'),(1570,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:38.430'),(1571,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:39.815'),(1572,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:39.816'),(1573,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:58.444'),(1574,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:59.682'),(1575,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:06:59.683'),(1576,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:07.338'),(1577,1,'GET /api/contests/works?page=1&pageSize=10&contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=3\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:07.339'),(1578,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:10.474'),(1579,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:10.475'),(1580,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:11.703'),(1581,1,'GET /api/contests/works?page=1&pageSize=10&contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=3\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:11.704'),(1582,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:13.857'),(1583,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:13.858'),(1584,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:14.859'),(1585,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:14.860'),(1586,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:16.835'),(1587,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:16.836'),(1588,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:18.360'),(1589,1,'GET /api/contests/works?page=1&pageSize=10&contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=3\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:18.361'),(1590,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:20.841'),(1591,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:07:20.841'),(1592,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:08:26.270'),(1593,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:16:38.263'),(1594,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:16:43.703'),(1595,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:18:39.461'),(1596,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:18:39.471'),(1597,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:18:39.472'),(1598,1,'GET /api/contests/registrations?page=1&pageSize=10®istrationState=pending','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10®istrationState=pending\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"registrationState\":\"pending\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:19:51.886'),(1599,1,'GET /api/contests/registrations?page=1&pageSize=10®istrationState=passed','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10®istrationState=passed\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"registrationState\":\"passed\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:19:52.663'),(1600,1,'GET /api/contests/registrations?page=1&pageSize=10®istrationState=pending','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10®istrationState=pending\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"registrationState\":\"pending\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:19:53.635'),(1601,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:19:54.270'),(1602,1,'GET /api/contests/registrations?page=1&pageSize=10®istrationState=pending','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10®istrationState=pending\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"registrationState\":\"pending\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:19:54.879'),(1603,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:19:55.542'),(1604,1,'GET /api/contests/registrations?page=1&pageSize=10®istrationState=pending','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10®istrationState=pending\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"registrationState\":\"pending\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:19:56.223'),(1605,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:19:56.848'),(1606,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:26.098'),(1607,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:26.101'),(1608,1,'GET /api/tenants?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:26.107'),(1609,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:28.514'),(1610,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:28.515'),(1611,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:29.955'),(1612,1,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:29.958'),(1613,1,'GET /api/contests/registrations?page=1&pageSize=10&contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10&contestId=3\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:29.960'),(1614,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:32.959'),(1615,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:32.960'),(1616,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:32.962'),(1617,1,'GET /api/contests/registrations/3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:20:43.105'),(1618,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:21:23.782'),(1619,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:25:12.924'),(1620,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:25:12.928'),(1621,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:25:12.929'),(1622,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:25:17.430'),(1623,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:25:18.643'),(1624,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:25:18.644'),(1625,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:25:18.644'),(1626,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:27:28.661'),(1627,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:27:28.663'),(1628,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:27:28.665'),(1629,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:27:39.703'),(1630,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:27:39.707'),(1631,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:27:39.708'),(1632,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:17.447'),(1633,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:17.451'),(1634,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:17.453'),(1635,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:23.619'),(1636,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:23.621'),(1637,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:23.623'),(1638,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:24.214'),(1639,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:24.215'),(1640,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:24.217'),(1641,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:25.033'),(1642,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:26.457'),(1643,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:26.459'),(1644,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:26.460'),(1645,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:26.949'),(1646,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:26.952'),(1647,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:26.953'),(1648,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:27.481'),(1649,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:27.483'),(1650,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:27.486'),(1651,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:44.870'),(1652,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:44.873'),(1653,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:44.874'),(1654,1,'GET /api/contests/registrations?page=1&pageSize=10®istrationState=pending','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10®istrationState=pending\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"registrationState\":\"pending\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:47.155'),(1655,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:47.799'),(1656,1,'GET /api/contests?page=1&pageSize=200','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=200\",\"query\":{\"page\":\"1\",\"pageSize\":\"200\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:48.577'),(1657,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:48.579'),(1658,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:30:48.584'),(1659,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:31:55.683'),(1660,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:31:55.683'),(1661,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:31:55.684'),(1662,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:31.333'),(1663,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:31.350'),(1664,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:31.352'),(1665,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:31.364'),(1666,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:31.529'),(1667,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:31.530'),(1668,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:31.531'),(1669,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:32.248'),(1670,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:32.250'),(1671,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:32.250'),(1672,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:32.945'),(1673,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:32.947'),(1674,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:32.948'),(1675,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:34.075'),(1676,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:35.562'),(1677,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:35.561'),(1678,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:35.567'),(1679,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:32:36.188'),(1680,1,'GET /api/contests/works?page=1&pageSize=10&contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=3\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:34:29.426'),(1681,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:34:29.426'),(1682,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:34:32.600'),(1683,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:34:32.604'),(1684,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:34:32.609'),(1685,1,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:34:34.743'),(1686,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:38:42.345'),(1687,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:38:42.349'),(1688,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:38:42.345'),(1689,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:53.981'),(1690,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:53.998'),(1691,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:53.999'),(1692,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.010'),(1693,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.160'),(1694,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.161'),(1695,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.161'),(1696,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.688'),(1697,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.704'),(1698,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.705'),(1699,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.718'),(1700,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.858'),(1701,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.859'),(1702,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.860'),(1703,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.882'),(1704,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.894'),(1705,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.895'),(1706,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:54.907'),(1707,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.035'),(1708,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.037'),(1709,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.036'),(1710,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.059'),(1711,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.075'),(1712,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.076'),(1713,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.085'),(1714,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.212'),(1715,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.213'),(1716,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:39:55.214'),(1717,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:08.402'),(1718,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:08.403'),(1719,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:08.404'),(1720,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:11.938'),(1721,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:11.939'),(1722,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:11.939'),(1723,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:12.695'),(1724,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:15.241'),(1725,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:15.242'),(1726,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:15.245'),(1727,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:40:16.738'),(1728,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:09.635'),(1729,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:09.649'),(1730,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:09.650'),(1731,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:09.661'),(1732,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:09.808'),(1733,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:10.408'),(1734,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:10.425'),(1735,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:10.426'),(1736,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:10.438'),(1737,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:10.582'),(1738,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.048'),(1739,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.061'),(1740,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.062'),(1741,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.074'),(1742,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.213'),(1743,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.239'),(1744,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.253'),(1745,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.254'),(1746,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.268'),(1747,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.408'),(1748,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.434'),(1749,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.449'),(1750,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.449'),(1751,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.460'),(1752,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.589'),(1753,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.615'),(1754,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.629'),(1755,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.629'),(1756,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.641'),(1757,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:11.769'),(1758,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:44:29.377'),(1759,1,'GET /api/menus/42','{\"method\":\"GET\",\"url\":\"/api/menus/42\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:45:06.616'),(1760,1,'GET /api/menus/42','{\"method\":\"GET\",\"url\":\"/api/menus/42\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:45:13.357'),(1761,1,'GET /api/menus/42','{\"method\":\"GET\",\"url\":\"/api/menus/42\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:45:28.660'),(1762,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:38.169'),(1763,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:38.175'),(1764,1,'GET /api/tenants/1','{\"method\":\"GET\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:41.354'),(1765,1,'GET /api/tenants/1/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/1/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:41.375'),(1766,1,'PATCH /api/tenants/1','{\"method\":\"PATCH\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{\"name\":\"超级租户\",\"code\":\"super\",\"domain\":\"super\",\"description\":\"系统超级租户,拥有所有权限\",\"validState\":1,\"menuIds\":[37,38,39,40,41,43,44,45,29,32,33,14,17,18,19,20,21]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:53.779'),(1767,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:53.881'),(1768,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:57.285'),(1769,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:57.300'),(1770,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:57.301'),(1771,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:57.313'),(1772,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:57.469'),(1773,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:57.469'),(1774,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:57.470'),(1775,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:59.072'),(1776,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:59.087'),(1777,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:59.088'),(1778,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:59.101'),(1779,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:59.252'),(1780,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:59.255'),(1781,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:46:59.259'),(1782,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:05.282'),(1783,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:06.772'),(1784,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:06.773'),(1785,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:06.774'),(1786,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:07.334'),(1787,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:11.175'),(1788,1,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:12.062'),(1789,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:12.584'),(1790,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:47:13.000'),(1791,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:47.509'),(1792,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:47.522'),(1793,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:47.524'),(1794,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:47.536'),(1795,1,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:47.662'),(1796,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:49.256'),(1797,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:49.262'),(1798,1,'GET /api/tenants/1','{\"method\":\"GET\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:51.711'),(1799,1,'GET /api/tenants/1/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/1/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:50:51.732'),(1800,1,'GET /api/tenants/1','{\"method\":\"GET\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:51:23.507'),(1801,1,'GET /api/tenants/1/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/1/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:51:23.522'),(1802,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:54:41.604'),(1803,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:54:41.611'),(1804,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:54:48.311'),(1805,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:54:48.313'),(1806,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:54:54.098'),(1807,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:54:54.100'),(1808,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:55:53.259'),(1809,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:55:53.272'),(1810,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:55:53.273'),(1811,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:55:53.283'),(1812,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:55:53.416'),(1813,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:55:53.419'),(1814,1,'GET /api/tenants/1','{\"method\":\"GET\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:55:58.016'),(1815,1,'GET /api/tenants/1/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/1/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:55:58.035'),(1816,1,'PATCH /api/tenants/1','{\"method\":\"PATCH\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{\"name\":\"超级租户\",\"code\":\"super\",\"domain\":\"super\",\"description\":\"系统超级租户,拥有所有权限\",\"validState\":1,\"menuIds\":[37,38,39,40,41,44,45,29,32,33,14,17,18,19,20,21,28,30]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:29.170'),(1817,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:29.264'),(1818,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:31.498'),(1819,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:31.513'),(1820,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:31.514'),(1821,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:31.529'),(1822,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:31.662'),(1823,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:31.666'),(1824,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 12:56:35.082'),(1825,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:00:43.130'),(1826,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:00:43.134'),(1827,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:00:43.136'),(1828,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:43.568'),(1829,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:43.575'),(1830,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:43.576'),(1831,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:43.583'),(1832,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:43.719'),(1833,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:43.722'),(1834,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:43.719'),(1835,1,'GET /api/contests/results/3?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/3?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:45.761'),(1836,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:47.395'),(1837,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:47.397'),(1838,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:47.400'),(1839,1,'GET /api/contests/results/3?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/3?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:02:49.286'),(1840,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:03:00.705'),(1841,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:03:00.706'),(1842,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:03:00.708'),(1843,1,'GET /api/contests/results/3?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/3?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:03:59.232'),(1844,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:04:07.455'),(1845,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:04:07.456'),(1846,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:04:07.462'),(1847,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:05:34.783'),(1848,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:05:34.797'),(1849,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:05:34.798'),(1850,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:05:34.812'),(1851,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:05:34.948'),(1852,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:05:34.950'),(1853,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:05:34.956'),(1854,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:47.648'),(1855,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:47.651'),(1856,1,'GET /api/tenants/1','{\"method\":\"GET\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:49.327'),(1857,1,'GET /api/tenants/1/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/1/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:49.340'),(1858,1,'PATCH /api/tenants/1','{\"method\":\"PATCH\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{\"name\":\"超级租户\",\"code\":\"super\",\"domain\":\"super\",\"description\":\"系统超级租户,拥有所有权限\",\"validState\":1,\"menuIds\":[37,38,39,40,41,44,29,32,33,14,17,18,19,20,21,28,30]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:55.491'),(1859,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:55.575'),(1860,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:57.312'),(1861,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:57.326'),(1862,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:57.327'),(1863,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:57.341'),(1864,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:57.478'),(1865,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:57.482'),(1866,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:59.811'),(1867,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:59.811'),(1868,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:07:59.812'),(1869,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:00.291'),(1870,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:00.291'),(1871,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:00.292'),(1872,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:00.772'),(1873,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:00.773'),(1874,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:00.781'),(1875,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:01.246'),(1876,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:01.246'),(1877,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:01.247'),(1878,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:01.769'),(1879,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:01.770'),(1880,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:01.773'),(1881,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.090'),(1882,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.090'),(1883,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.102'),(1884,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.493'),(1885,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.495'),(1886,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.496'),(1887,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.937'),(1888,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.937'),(1889,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:03.938'),(1890,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:04.755'),(1891,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:04.757'),(1892,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:04.758'),(1893,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:05.827'),(1894,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:05.828'),(1895,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:05.829'),(1896,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:06.187'),(1897,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:06.188'),(1898,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:06.188'),(1899,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:06.555'),(1900,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:06.556'),(1901,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:06.557'),(1902,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:07.128'),(1903,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:07.131'),(1904,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:07.133'),(1905,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:12.334'),(1906,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:12.337'),(1907,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:29.334'),(1908,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:29.335'),(1909,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:29.337'),(1910,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:33.441'),(1911,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:33.442'),(1912,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:34.052'),(1913,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:34.053'),(1914,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:34.063'),(1915,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:34.877'),(1916,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:35.572'),(1917,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:36.122'),(1918,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:36.668'),(1919,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:37.502'),(1920,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:37.980'),(1921,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:38.438'),(1922,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:39.556'),(1923,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:39.556'),(1924,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:55.674'),(1925,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:55.675'),(1926,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:08:55.676'),(1927,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:58:51.756'),(1928,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:58:51.772'),(1929,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:58:51.774'),(1930,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:58:51.785'),(1931,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:58:51.941'),(1932,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:58:51.949'),(1933,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 13:58:51.951'),(1934,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:49.860'),(1935,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:49.862'),(1936,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:49.867'),(1937,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:50.580'),(1938,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:50.582'),(1939,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:50.584'),(1940,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:52.512'),(1941,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:52.513'),(1942,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:52.515'),(1943,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:53.227'),(1944,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:53.228'),(1945,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:53.231'),(1946,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:54.232'),(1947,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:54.234'),(1948,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:54.241'),(1949,1,'GET /api/contests?page=1&pageSize=10&stage=registering','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=registering\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"registering\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:54.915'),(1950,1,'GET /api/contests?page=1&pageSize=10&stage=submitting','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=submitting\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"submitting\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:55.655'),(1951,1,'GET /api/contests?page=1&pageSize=10&stage=reviewing','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=reviewing\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"reviewing\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:00:56.506'),(1952,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:05:32.045'),(1953,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:05:32.054'),(1954,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:05:32.057'),(1955,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:05:32.063'),(1956,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:05:32.209'),(1957,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:05:32.215'),(1958,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:05:32.216'),(1959,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:08:23.409'),(1960,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:08:23.417'),(1961,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:08:23.418'),(1962,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:08:23.425'),(1963,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:08:23.573'),(1964,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:08:23.574'),(1965,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:08:23.574'),(1966,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:51.193'),(1967,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:51.198'),(1968,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:53.808'),(1969,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:53.826'),(1970,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:53.828'),(1971,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:53.842'),(1972,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:53.982'),(1973,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:53.983'),(1974,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.005'),(1975,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.021'),(1976,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.023'),(1977,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.034'),(1978,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.154'),(1979,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.157'),(1980,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.177'),(1981,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.191'),(1982,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.192'),(1983,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.205'),(1984,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.326'),(1985,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.330'),(1986,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.349'),(1987,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.363'),(1988,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.364'),(1989,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.374'),(1990,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.494'),(1991,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:09:54.498'),(1992,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:00.303'),(1993,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:00.305'),(1994,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:00.322'),(1995,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:00.336'),(1996,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:00.470'),(1997,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:00.475'),(1998,1,'GET /api/tenants/1','{\"method\":\"GET\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:01.927'),(1999,1,'GET /api/tenants/1/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/1/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:01.942'),(2000,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:43.235'),(2001,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:10:43.285'),(2002,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:04.349'),(2003,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:22.047'),(2004,9,'GET /api/public/works?page=1&pageSize=12&status=draft','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=draft\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"draft\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:24.334'),(2005,9,'GET /api/public/works?page=1&pageSize=12&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:24.742'),(2006,9,'GET /api/public/works?page=1&pageSize=12&status=published','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:25.287'),(2007,9,'GET /api/public/works?page=1&pageSize=12&status=rejected','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=rejected\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"rejected\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:25.670'),(2008,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:27.308'),(2009,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:27.313'),(2010,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:27.314'),(2011,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:42.367'),(2012,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:42.368'),(2013,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:42.371'),(2014,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:45.181'),(2015,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:45.183'),(2016,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:11:45.188'),(2017,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:12:58.536'),(2018,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:12:58.555'),(2019,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:12:58.557'),(2020,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:12:58.570'),(2021,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:12:58.721'),(2022,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:12:58.722'),(2023,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:12:58.726'),(2024,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:01.468'),(2025,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:01.469'),(2026,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:02.641'),(2027,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:02.642'),(2028,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:04.684'),(2029,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:05.403'),(2030,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:05.405'),(2031,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:06.675'),(2032,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:06.676'),(2033,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:07.959'),(2034,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:07.959'),(2035,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:08.648'),(2036,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:08.649'),(2037,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:09.320'),(2038,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:09.319'),(2039,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:28.908'),(2040,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:28.910'),(2041,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:31.842'),(2042,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:31.842'),(2043,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:35.010'),(2044,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:35.010'),(2045,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:36.672'),(2046,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:36.673'),(2047,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:37.619'),(2048,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:37.619'),(2049,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:41.479'),(2050,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:41.479'),(2051,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:45.548'),(2052,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:47.329'),(2053,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:13:47.330'),(2054,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:16:50.308'),(2055,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:16:50.310'),(2056,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:16:50.314'),(2057,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:16:51.948'),(2058,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-27 14:16:51.952'),(2059,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:19.452'),(2060,9,'GET /api/public/works?page=1&pageSize=12&status=draft','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=draft\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"draft\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:22.136'),(2061,9,'GET /api/public/works?page=1&pageSize=12&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:22.955'),(2062,9,'GET /api/public/works?page=1&pageSize=12&status=published','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:23.792'),(2063,9,'GET /api/public/works?page=1&pageSize=12&status=rejected','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=rejected\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"rejected\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:24.784'),(2064,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:35.740'),(2065,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:35.741'),(2066,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:35.744'),(2067,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:37.129'),(2068,9,'GET /api/public/works?page=1&pageSize=12&status=draft','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=draft\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"draft\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:40.370'),(2069,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:43.643'),(2070,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:43.644'),(2071,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:06:43.648'),(2072,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:07:39.609'),(2073,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:07:39.609'),(2074,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:07:39.620'),(2075,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:10:49.441'),(2076,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:11:19.076'),(2077,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:11:19.077'),(2078,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:11:19.078'),(2079,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:11:27.490'),(2080,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:11:27.868'),(2081,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:11:27.869'),(2082,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:11:27.871'),(2083,1,'GET /api/contests?page=1&pageSize=10&stage=registering','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=registering\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"registering\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:13.868'),(2084,1,'GET /api/contests?page=1&pageSize=10&stage=submitting','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=submitting\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"submitting\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:15.187'),(2085,1,'GET /api/contests?page=1&pageSize=10&stage=reviewing','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=reviewing\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"reviewing\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:16.067'),(2086,1,'GET /api/contests?page=1&pageSize=10&stage=finished','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=finished\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"finished\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:16.892'),(2087,1,'GET /api/contests?page=1&pageSize=10&stage=unpublished','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=unpublished\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"unpublished\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:18.501'),(2088,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:20.412'),(2089,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:23.205'),(2090,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:23.206'),(2091,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:35.891'),(2092,1,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:35.893'),(2093,1,'GET /api/contests/registrations?page=1&pageSize=10&contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10&contestId=3\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:35.894'),(2094,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:39.337'),(2095,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:39.338'),(2096,1,'GET /api/contests/works?page=1&pageSize=10&contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=3\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:40.918'),(2097,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:40.918'),(2098,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:42.851'),(2099,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:12:42.852'),(2100,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:16:28.529'),(2101,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:16:28.529'),(2102,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:16:54.814'),(2103,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:16:54.814'),(2104,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:16:56.430'),(2105,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:16:56.434'),(2106,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:24:50.370'),(2107,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:24:50.374'),(2108,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:04.134'),(2109,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:17.962'),(2110,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:17.963'),(2111,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:19.265'),(2112,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:19.265'),(2113,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:29.277'),(2114,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:29.278'),(2115,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:29.288'),(2116,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:30.251'),(2117,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:30.254'),(2118,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:30.254'),(2119,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:31.175'),(2120,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:31.176'),(2121,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:31.176'),(2122,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:31.973'),(2123,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:31.974'),(2124,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:31.974'),(2125,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:32.748'),(2126,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:32.749'),(2127,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:32.751'),(2128,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:34.754'),(2129,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:34.754'),(2130,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:37.771'),(2131,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:37.774'),(2132,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:37.778'),(2133,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:50.132'),(2134,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:50.134'),(2135,1,'GET /api/tenants/1','{\"method\":\"GET\",\"url\":\"/api/tenants/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:54.675'),(2136,1,'GET /api/tenants/1/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/1/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:25:54.694'),(2137,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:08.393'),(2138,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:08.393'),(2139,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:08.396'),(2140,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:16.709'),(2141,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:18.877'),(2142,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:19.786'),(2143,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:21.519'),(2144,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:38.902'),(2145,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:43.269'),(2146,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:26:48.738'),(2147,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:27:03.411'),(2148,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:27:22.908'),(2149,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:27:55.315'),(2150,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:27:58.436'),(2151,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:27:58.587'),(2152,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:28:01.578'),(2153,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:28:03.390'),(2154,8,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:28:05.393'),(2155,8,'GET /api/contests/judges/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/judges/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:28:05.446'),(2156,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:28:05.447'),(2157,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:28:16.337'),(2158,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:04.667'),(2159,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:07.563'),(2160,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:07.719'),(2161,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:07.721'),(2162,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:07.722'),(2163,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:10.850'),(2164,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:10.854'),(2165,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:14.369'),(2166,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:14.371'),(2167,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:14.376'),(2168,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:34.398'),(2169,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:30:43.638'),(2170,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:22.162'),(2171,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:25.599'),(2172,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:25.751'),(2173,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:29.224'),(2174,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:29.225'),(2175,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:31.025'),(2176,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:31.025'),(2177,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:32.202'),(2178,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:32.198'),(2179,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:33.208'),(2180,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:33.209'),(2181,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:50.972'),(2182,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:53.888'),(2183,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:32:54.010'),(2184,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:33:05.291'),(2185,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:33:06.281'),(2186,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:33:07.184'),(2187,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:33:08.102'),(2188,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:33:09.254'),(2189,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:36:43.808'),(2190,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:36:45.630'),(2191,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:36:45.735'),(2192,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:36:48.577'),(2193,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:37:17.840'),(2194,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:37:18.000'),(2195,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:37:18.002'),(2196,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:37:18.003'),(2197,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:39:06.041'),(2198,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:39:06.047'),(2199,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:39:06.048'),(2200,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:39:07.605'),(2201,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:39:37.024'),(2202,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:41:19.123'),(2203,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:41:22.201'),(2204,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:41:22.361'),(2205,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:41:24.959'),(2206,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:41:41.882'),(2207,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:43:30.253'),(2208,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:43:31.433'),(2209,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:43:45.098'),(2210,8,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:43:52.005'),(2211,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:43:52.053'),(2212,8,'GET /api/contests/judges/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/judges/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:43:52.054'),(2213,8,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:45:28.038'),(2214,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:45:28.090'),(2215,8,'GET /api/contests/judges/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/judges/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:45:28.091'),(2216,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:45:32.860'),(2217,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:45:42.096'),(2218,8,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:45:44.114'),(2219,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:45:44.161'),(2220,8,'GET /api/contests/judges/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/judges/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:45:44.162'),(2221,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:48:25.823'),(2222,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:50:32.486'),(2223,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:51:41.035'),(2224,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:51:41.910'),(2225,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:51:43.480'),(2226,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:51:44.559'),(2227,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:51:45.609'),(2228,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:51:48.037'),(2229,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:51:55.715'),(2230,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:52:05.189'),(2231,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:52:10.262'),(2232,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:52:10.263'),(2233,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:52:10.274'),(2234,9,'GET /api/public/activities/1/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/1/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:54:08.458'),(2235,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:54:08.458'),(2236,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:54:08.467'),(2237,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:58:25.109'),(2238,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:58:25.111'),(2239,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:58:25.115'),(2240,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:58:33.040'),(2241,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:58:33.173'),(2242,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 02:58:36.023'),(2243,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:01:41.049'),(2244,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:03:53.625'),(2245,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:03:56.873'),(2246,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:03:57.041'),(2247,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:03:57.042'),(2248,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:03:57.044'),(2249,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:04:27.866'),(2250,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:05:43.415'),(2251,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:05:44.761'),(2252,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:05:44.762'),(2253,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:05:44.763'),(2254,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:05:45.905'),(2255,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:06:04.144'),(2256,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:06:05.545'),(2257,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:06:05.547'),(2258,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:06:05.551'),(2259,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:26:33.327'),(2260,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:26:33.330'),(2261,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:26:33.332'),(2262,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:26:39.547'),(2263,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:26:39.706'),(2264,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:26:39.709'),(2265,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 03:26:39.709'),(2266,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:50.980'),(2267,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:51.344'),(2268,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:51.344'),(2269,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:51.348'),(2270,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:53.517'),(2271,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:53.518'),(2272,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:53.519'),(2273,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:53.989'),(2274,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:53.989'),(2275,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:53.992'),(2276,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:54.398'),(2277,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:54.399'),(2278,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:54.400'),(2279,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:55.765'),(2280,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:56.090'),(2281,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:56.092'),(2282,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:56.095'),(2283,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:58.042'),(2284,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:58.042'),(2285,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:59.064'),(2286,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:59.066'),(2287,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:39:59.504'),(2288,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:40:00.048'),(2289,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:40:00.049'),(2290,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:40:18.573'),(2291,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 05:40:18.576'),(2292,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:02:13.329'),(2293,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:02:13.331'),(2294,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:02:13.332'),(2295,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:02:14.704'),(2296,1,'GET /api/users/9','{\"method\":\"GET\",\"url\":\"/api/users/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:02:17.395'),(2297,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:03:41.367'),(2298,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:03:41.442'),(2299,1,'GET /api/users/8','{\"method\":\"GET\",\"url\":\"/api/users/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:03:42.536'),(2300,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:03:44.640'),(2301,1,'GET /api/users/11','{\"method\":\"GET\",\"url\":\"/api/users/11\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 06:03:45.337'),(2302,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:09.490'),(2303,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:10.092'),(2304,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:10.095'),(2305,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:10.098'),(2306,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:14.054'),(2307,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:14.055'),(2308,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:14.055'),(2309,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:14.752'),(2310,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:14.753'),(2311,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:14.754'),(2312,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:15.628'),(2313,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:15.629'),(2314,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:15.631'),(2315,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:16.342'),(2316,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:16.343'),(2317,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:16.348'),(2318,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:19.169'),(2319,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:19.170'),(2320,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:20.519'),(2321,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:20.520'),(2322,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:21.253'),(2323,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:23.708'),(2324,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:23.708'),(2325,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:23.716'),(2326,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:31.156'),(2327,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:31.157'),(2328,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:31.160'),(2329,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:39.686'),(2330,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:42.076'),(2331,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:42.387'),(2332,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:44.916'),(2333,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:45.941'),(2334,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:47.024'),(2335,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:48.539'),(2336,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:49.391'),(2337,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:49.915'),(2338,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:50.587'),(2339,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:51.998'),(2340,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:52.001'),(2341,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:53.274'),(2342,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:53.274'),(2343,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:57:58.835'),(2344,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:00.638'),(2345,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:01.257'),(2346,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:02.127'),(2347,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:02.798'),(2348,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:14.035'),(2349,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:17.916'),(2350,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:29.135'),(2351,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:31.707'),(2352,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:33.843'),(2353,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:34.011'),(2354,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:35.537'),(2355,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:36.635'),(2356,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:39.673'),(2357,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:47.383'),(2358,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:47.383'),(2359,9,'GET /api/public/mine/works?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:47.403'),(2360,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:53.010'),(2361,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:53.012'),(2362,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:58:53.012'),(2363,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:09.043'),(2364,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:09.044'),(2365,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:09.045'),(2366,9,'GET /api/public/mine/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:10.469'),(2367,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:11.874'),(2368,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:11.877'),(2369,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:11.879'),(2370,9,'GET /api/public/children/accounts','{\"method\":\"GET\",\"url\":\"/api/public/children/accounts\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:12.942'),(2371,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:12.945'),(2372,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:22.066'),(2373,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:22.067'),(2374,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:22.068'),(2375,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:45.680'),(2376,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:45.682'),(2377,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:45.683'),(2378,9,'GET /api/public/mine/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 06:59:47.399'),(2379,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:25:44.322'),(2380,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:25:44.329'),(2381,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:25:44.330'),(2382,9,'GET /api/public/mine/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:25:45.949'),(2383,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:07.512'),(2384,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:07.515'),(2385,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:07.516'),(2386,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:14.242'),(2387,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:14.613'),(2388,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:14.614'),(2389,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:14.617'),(2390,1,'GET /api/dict?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/dict?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:20.575'),(2391,1,'GET /api/config?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/config?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:21.714'),(2392,1,'GET /api/logs?page=1&pageSize=20','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=20\",\"query\":{\"page\":\"1\",\"pageSize\":\"20\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:22.648'),(2393,1,'GET /api/logs/statistics?days=7','{\"method\":\"GET\",\"url\":\"/api/logs/statistics?days=7\",\"query\":{\"days\":\"7\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:22.649'),(2394,1,'GET /api/dict?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/dict?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:23.315'),(2395,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:24.139'),(2396,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:30.006'),(2397,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:30.009'),(2398,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:31.488'),(2399,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:31.491'),(2400,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:31.495'),(2401,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:32.219'),(2402,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:32.220'),(2403,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:38.591'),(2404,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:38.594'),(2405,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:40.214'),(2406,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:40.214'),(2407,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:41.344'),(2408,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:41.344'),(2409,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:42.126'),(2410,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:44.184'),(2411,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:44.185'),(2412,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:28:44.188'),(2413,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:10.415'),(2414,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:10.417'),(2415,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:10.422'),(2416,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:11.164'),(2417,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:11.165'),(2418,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:11.165'),(2419,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:11.945'),(2420,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:11.945'),(2421,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:11.946'),(2422,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:12.384'),(2423,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:12.384'),(2424,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:12.387'),(2425,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:15.785'),(2426,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:15.787'),(2427,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:15.790'),(2428,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:16.333'),(2429,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:16.333'),(2430,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:16.334'),(2431,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:16.770'),(2432,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:16.771'),(2433,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:16.772'),(2434,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:17.419'),(2435,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:17.419'),(2436,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:17.420'),(2437,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.062'),(2438,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.062'),(2439,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.065'),(2440,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.465'),(2441,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.466'),(2442,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.466'),(2443,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.797'),(2444,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.797'),(2445,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:18.798'),(2446,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:19.131'),(2447,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:19.133'),(2448,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:19.133'),(2449,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:19.463'),(2450,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:19.464'),(2451,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:19.467'),(2452,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:27.018'),(2453,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:29.188'),(2454,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:29.463'),(2455,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:32.749'),(2456,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:33.232'),(2457,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:33.606'),(2458,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:34.076'),(2459,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:34.828'),(2460,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:35.135'),(2461,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:35.511'),(2462,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:38.194'),(2463,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:40.368'),(2464,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:40.757'),(2465,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:40.759'),(2466,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:33:40.764'),(2467,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:40:23.523'),(2468,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:40:23.524'),(2469,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:40:23.527'),(2470,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:49:02.148'),(2471,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:49:02.148'),(2472,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:08.495'),(2473,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:08.495'),(2474,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:08.496'),(2475,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:09.340'),(2476,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:09.340'),(2477,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:09.341'),(2478,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:10.328'),(2479,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:10.330'),(2480,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:10.330'),(2481,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:11.230'),(2482,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:11.231'),(2483,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:11.233'),(2484,1,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:14.602'),(2485,1,'GET /api/contests/notices/contest/3','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:14.603'),(2486,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:20.263'),(2487,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:20.264'),(2488,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:20.265'),(2489,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:22.186'),(2490,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:22.188'),(2491,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:22.191'),(2492,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:22.922'),(2493,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:22.922'),(2494,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:22.923'),(2495,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:24.804'),(2496,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:24.804'),(2497,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:24.808'),(2498,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:25.493'),(2499,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:25.493'),(2500,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:25.494'),(2501,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:26.042'),(2502,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:26.042'),(2503,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:26.043'),(2504,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:27.525'),(2505,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:27.526'),(2506,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:27.526'),(2507,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:28.474'),(2508,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:28.475'),(2509,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:28.477'),(2510,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:35.887'),(2511,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:35.887'),(2512,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:35.888'),(2513,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:36.710'),(2514,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:36.711'),(2515,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:36.713'),(2516,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:38.089'),(2517,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:38.090'),(2518,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:38.090'),(2519,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:39.498'),(2520,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:39.499'),(2521,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:39.499'),(2522,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:41.571'),(2523,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:41.572'),(2524,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:41.575'),(2525,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:43.079'),(2526,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:43.080'),(2527,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:43.080'),(2528,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:43.818'),(2529,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:43.819'),(2530,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:43.821'),(2531,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:44.544'),(2532,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:44.546'),(2533,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:44.558'),(2534,1,'GET /api/contests/2','{\"method\":\"GET\",\"url\":\"/api/contests/2\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:45.341'),(2535,1,'GET /api/contests/notices/contest/2','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/2\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:53:45.342'),(2536,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:13.995'),(2537,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:13.995'),(2538,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:13.997'),(2539,1,'GET /api/contests/1','{\"method\":\"GET\",\"url\":\"/api/contests/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:16.420'),(2540,1,'GET /api/contests/notices/contest/1','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:16.421'),(2541,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:21.671'),(2542,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:21.672'),(2543,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:21.674'),(2544,1,'GET /api/contests/results/3?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/3?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:24.031'),(2545,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:27.946'),(2546,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:27.947'),(2547,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:27.950'),(2548,1,'GET /api/contests/results/1?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/1?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:29.823'),(2549,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:31.199'),(2550,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:31.199'),(2551,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:31.202'),(2552,1,'GET /api/contests/1','{\"method\":\"GET\",\"url\":\"/api/contests/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:32.391'),(2553,1,'GET /api/contests/notices/contest/1','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:32.391'),(2554,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:34.059'),(2555,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:34.061'),(2556,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:55:34.062'),(2557,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:52.174'),(2558,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:52.175'),(2559,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:52.175'),(2560,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.110'),(2561,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.111'),(2562,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.112'),(2563,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.574'),(2564,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.575'),(2565,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.575'),(2566,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.889'),(2567,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.890'),(2568,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:53.892'),(2569,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.129'),(2570,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.129'),(2571,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.132'),(2572,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.562'),(2573,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.562'),(2574,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.563'),(2575,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.858'),(2576,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.859'),(2577,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:55.859'),(2578,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:56.177'),(2579,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:56.177'),(2580,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:56.178'),(2581,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:57.201'),(2582,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:57.202'),(2583,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:57.208'),(2584,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:57.617'),(2585,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:57.617'),(2586,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:57.618'),(2587,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:58.497'),(2588,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:58.498'),(2589,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:58.500'),(2590,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:58.806'),(2591,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:58.806'),(2592,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:58.807'),(2593,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:59.118'),(2594,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:59.119'),(2595,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:59.119'),(2596,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:59.651'),(2597,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:59.652'),(2598,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:56:59.655'),(2599,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.134'),(2600,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.135'),(2601,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.135'),(2602,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.488'),(2603,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.489'),(2604,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.489'),(2605,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.865'),(2606,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.865'),(2607,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:00.867'),(2608,1,'GET /api/contests/results/3?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/3?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:06.985'),(2609,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:09.602'),(2610,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:09.603'),(2611,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:57:09.607'),(2612,1,'GET /api/contests?page=1&pageSize=10&stage=registering','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=registering\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"registering\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:39.118'),(2613,1,'GET /api/contests?page=1&pageSize=10&stage=submitting','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=submitting\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"submitting\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:39.620'),(2614,1,'GET /api/contests?page=1&pageSize=10&stage=reviewing','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=reviewing\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"reviewing\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:40.178'),(2615,1,'GET /api/contests?page=1&pageSize=10&stage=finished','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=finished\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"finished\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:40.639'),(2616,1,'GET /api/contests?page=1&pageSize=10&stage=unpublished','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=unpublished\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"unpublished\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:41.168'),(2617,1,'GET /api/contests?page=1&pageSize=10&stage=submitting','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=submitting\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"submitting\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:42.373'),(2618,1,'GET /api/contests?page=1&pageSize=10&stage=registering','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=registering\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"registering\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:43.182'),(2619,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:43.749'),(2620,1,'GET /api/contests?page=1&pageSize=10&stage=registering','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=registering\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"registering\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:55.164'),(2621,1,'GET /api/contests?page=1&pageSize=10&stage=submitting','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=submitting\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"submitting\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:56.143'),(2622,1,'GET /api/contests?page=1&pageSize=10&stage=reviewing','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=reviewing\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"reviewing\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:56.774'),(2623,1,'GET /api/contests?page=1&pageSize=10&stage=finished','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=finished\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"finished\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:57.151'),(2624,1,'GET /api/contests?page=1&pageSize=10&stage=unpublished','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&stage=unpublished\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"stage\":\"unpublished\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:58:58.518'),(2625,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 07:59:00.302'),(2626,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-30 08:29:08.401'),(2627,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:11.475'),(2628,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:11.476'),(2629,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:11.483'),(2630,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:17.439'),(2631,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:17.440'),(2632,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:17.442'),(2633,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:23.662'),(2634,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:23.663'),(2635,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:23.670'),(2636,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:41.694'),(2637,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:41.694'),(2638,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:56:41.700'),(2639,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:57:12.176'),(2640,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:57:12.175'),(2641,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 09:57:12.177'),(2642,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:35.263'),(2643,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:35.264'),(2644,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:35.282'),(2645,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:35.294'),(2646,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:35.472'),(2647,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:35.474'),(2648,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:35.476'),(2649,1,'GET /api/users/11','{\"method\":\"GET\",\"url\":\"/api/users/11\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:44.613'),(2650,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:46.631'),(2651,1,'GET /api/users/11','{\"method\":\"GET\",\"url\":\"/api/users/11\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:47.351'),(2652,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:52.594'),(2653,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:52.596'),(2654,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:52.612'),(2655,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:52.624'),(2656,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:52.766'),(2657,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:52.767'),(2658,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:01:52.768'),(2659,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:02:00.822'),(2660,1,'GET /api/users/11','{\"method\":\"GET\",\"url\":\"/api/users/11\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:02:01.863'),(2661,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:02:14.308'),(2662,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:02:15.183'),(2663,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:02:15.619'),(2664,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:02:16.128'),(2665,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-30 10:02:16.837'),(2666,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:31:05.507'),(2667,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:31:05.896'),(2668,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:31:05.897'),(2669,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:31:05.897'),(2670,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:31:10.142'),(2671,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:31:10.143'),(2672,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:31:17.327'),(2673,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:26.210'),(2674,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:31.033'),(2675,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:34.476'),(2676,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:34.478'),(2677,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:34.479'),(2678,9,'GET /api/public/mine/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:43.351'),(2679,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:45.151'),(2680,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:45.155'),(2681,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:45.156'),(2682,9,'GET /api/public/mine/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:46.475'),(2683,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:48.469'),(2684,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:48.474'),(2685,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:48.474'),(2686,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:49.547'),(2687,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:50.795'),(2688,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:50.797'),(2689,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:34:50.800'),(2690,9,'GET /api/public/mine/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:35:21.178'),(2691,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:37:17.343'),(2692,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:37:17.347'),(2693,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:37:17.348'),(2694,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:24.375'),(2695,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:24.376'),(2696,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:24.376'),(2697,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:27.911'),(2698,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:27.912'),(2699,9,'GET /api/public/mine/works?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/works?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:27.912'),(2700,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:33.600'),(2701,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:33.601'),(2702,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:41.414'),(2703,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:41.415'),(2704,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:49.911'),(2705,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:41:49.912'),(2706,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:44:18.831'),(2707,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:44:18.833'),(2708,9,'GET /api/public/mine/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:44:19.704'),(2709,9,'GET /api/public/mine/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:44:43.413'),(2710,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:44:49.802'),(2711,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:44:55.082'),(2712,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:52:40.079'),(2713,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:52:40.081'),(2714,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:52:44.486'),(2715,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:52:44.671'),(2716,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:52:44.672'),(2717,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:52:44.678'),(2718,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:53:32.031'),(2719,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:53:32.032'),(2720,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:53:36.633'),(2721,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:53:36.634'),(2722,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:53:38.126'),(2723,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:53:39.182'),(2724,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 02:53:39.184'),(2725,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:27:25.690'),(2726,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:27:25.699'),(2727,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:27:25.700'),(2728,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:27:25.707'),(2729,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:27:25.861'),(2730,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:27:25.861'),(2731,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:34.076'),(2732,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:34.094'),(2733,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:34.096'),(2734,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:34.109'),(2735,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:34.249'),(2736,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:34.250'),(2737,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.118'),(2738,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.137'),(2739,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.138'),(2740,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.153'),(2741,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.292'),(2742,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.293'),(2743,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.848'),(2744,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.862'),(2745,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.864'),(2746,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:35.875'),(2747,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.008'),(2748,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.009'),(2749,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.034'),(2750,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.048'),(2751,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.049'),(2752,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.059'),(2753,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.181'),(2754,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.181'),(2755,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.242'),(2756,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.257'),(2757,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.258'),(2758,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.270'),(2759,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.395'),(2760,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:36.395'),(2761,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:46.204'),(2762,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:46.204'),(2763,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:48.072'),(2764,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:48.073'),(2765,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:48.973'),(2766,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:48.974'),(2767,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:50.586'),(2768,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:50.587'),(2769,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:29:51.198'),(2770,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:34:26.725'),(2771,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:34:30.833'),(2772,9,'GET /api/public/works/8','{\"method\":\"GET\",\"url\":\"/api/public/works/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:34:37.450'),(2773,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:34:39.894'),(2774,9,'GET /api/public/works/7','{\"method\":\"GET\",\"url\":\"/api/public/works/7\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:34:53.019'),(2775,9,'GET /api/public/works/7','{\"method\":\"GET\",\"url\":\"/api/public/works/7\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:35:49.714'),(2776,9,'GET /api/public/works/7/interaction','{\"method\":\"GET\",\"url\":\"/api/public/works/7/interaction\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:35:56.201'),(2777,9,'POST /api/public/works/7/favorite','{\"method\":\"POST\",\"url\":\"/api/public/works/7/favorite\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:12.222'),(2778,9,'POST /api/public/works/7/favorite','{\"method\":\"POST\",\"url\":\"/api/public/works/7/favorite\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:12.928'),(2779,9,'POST /api/public/works/7/like','{\"method\":\"POST\",\"url\":\"/api/public/works/7/like\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:13.725'),(2780,9,'POST /api/public/works/7/like','{\"method\":\"POST\",\"url\":\"/api/public/works/7/like\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:14.278'),(2781,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:18.212'),(2782,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:18.213'),(2783,9,'GET /api/public/mine/favorites?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/mine/favorites?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:19.738'),(2784,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:23.992'),(2785,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:30.733'),(2786,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:40.871'),(2787,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[4,8,2,5,7,6,1,3]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:43.887'),(2788,9,'GET /api/public/works/4/interaction','{\"method\":\"GET\",\"url\":\"/api/public/works/4/interaction\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:45.167'),(2789,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:39:51.306'),(2790,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:41:53.118'),(2791,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:41:53.119'),(2792,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:41:55.455'),(2793,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:41:57.648'),(2794,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:41:58.361'),(2795,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:09.770'),(2796,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:09.772'),(2797,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:13.279'),(2798,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:13.459'),(2799,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:13.462'),(2800,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:13.465'),(2801,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:16.634'),(2802,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:16.635'),(2803,1,'GET /api/content-review/works/1','{\"method\":\"GET\",\"url\":\"/api/content-review/works/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:19.295'),(2804,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:36.255'),(2805,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:42.999'),(2806,9,'GET /api/public/works/8/interaction','{\"method\":\"GET\",\"url\":\"/api/public/works/8/interaction\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:52.433'),(2807,9,'POST /api/public/works/8/like','{\"method\":\"POST\",\"url\":\"/api/public/works/8/like\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:57.146'),(2808,9,'POST /api/public/works/8/favorite','{\"method\":\"POST\",\"url\":\"/api/public/works/8/favorite\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:42:57.802'),(2809,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:00.472'),(2810,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:04.375'),(2811,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:04.375'),(2812,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:12.835'),(2813,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:17.645'),(2814,9,'GET /api/public/works?page=1&pageSize=12&status=draft','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12&status=draft\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"status\":\"draft\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:20.786'),(2815,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:25.385'),(2816,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:29.460'),(2817,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:29.462'),(2818,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:33.175'),(2819,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:33.334'),(2820,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:33.341'),(2821,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:33.349'),(2822,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:36.677'),(2823,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:36.678'),(2824,1,'GET /api/content-review/works/1','{\"method\":\"GET\",\"url\":\"/api/content-review/works/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:51.371'),(2825,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:56.452'),(2826,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:43:56.453'),(2827,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:05.535'),(2828,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:08.031'),(2829,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:08.032'),(2830,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:10.359'),(2831,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:11.126'),(2832,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:11.126'),(2833,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:11.934'),(2834,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:11.934'),(2835,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:15.612'),(2836,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:21.199'),(2837,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:21.199'),(2838,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:21.201'),(2839,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:30.140'),(2840,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:30.141'),(2841,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:37.977'),(2842,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:37.981'),(2843,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:46.373'),(2844,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:47.522'),(2845,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:47.523'),(2846,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:47.904'),(2847,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:47.904'),(2848,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:52.376'),(2849,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:54.662'),(2850,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:54.806'),(2851,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:44:59.968'),(2852,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:45:00.488'),(2853,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:45:01.982'),(2854,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:45:07.061'),(2855,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:45:35.919'),(2856,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 03:45:45.704'),(2857,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:44:23.124'),(2858,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:44:25.190'),(2859,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:44:25.359'),(2860,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:44:25.361'),(2861,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:44:25.361'),(2862,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:19.059'),(2863,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:19.064'),(2864,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:19.066'),(2865,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:19.072'),(2866,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:19.298'),(2867,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:19.299'),(2868,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:19.300'),(2869,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:38.312'),(2870,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:38.355'),(2871,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:41.810'),(2872,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:41.836'),(2873,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:41.839'),(2874,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:41.859'),(2875,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:42.223'),(2876,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:42.226'),(2877,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:46.459'),(2878,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:46.461'),(2879,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:46.466'),(2880,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:51.370'),(2881,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:45:51.370'),(2882,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:46:14.137'),(2883,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:46:14.153'),(2884,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:46:14.154'),(2885,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:46:14.164'),(2886,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:46:14.376'),(2887,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:46:14.379'),(2888,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:22.299'),(2889,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:22.313'),(2890,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:22.525'),(2891,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:22.540'),(2892,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:23.313'),(2893,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:23.313'),(2894,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:37.287'),(2895,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:37.289'),(2896,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:37.290'),(2897,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:41.937'),(2898,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:44.007'),(2899,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:44.347'),(2900,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:48.802'),(2901,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:51.192'),(2902,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:51.378'),(2903,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:54.406'),(2904,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:56.785'),(2905,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:57.128'),(2906,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:57.129'),(2907,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:46:57.131'),(2908,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:47:44.439'),(2909,9,'GET /api/public/activities/1/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/1/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:47:50.463'),(2910,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-03-31 05:47:50.469'),(2911,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:24.067'),(2912,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:24.068'),(2913,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:25.253'),(2914,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:25.257'),(2915,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:26.859'),(2916,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:26.860'),(2917,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:26.860'),(2918,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:27.579'),(2919,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:27.580'),(2920,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:27.579'),(2921,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:27.917'),(2922,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:27.920'),(2923,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:27.926'),(2924,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:30.694'),(2925,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:30.695'),(2926,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:30.704'),(2927,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:31.619'),(2928,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:31.622'),(2929,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:31.623'),(2930,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:31.983'),(2931,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:31.985'),(2932,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:31.986'),(2933,1,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:32.404'),(2934,1,'GET /api/contests?page=1&pageSize=10&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:32.407'),(2935,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:32.412'),(2936,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:33.490'),(2937,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 05:48:33.494'),(2938,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:13:50.210'),(2939,1,'GET /api/content-review/works?page=1&pageSize=10&status=published','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:13:50.211'),(2940,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:15:55.309'),(2941,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:15:55.309'),(2942,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:29.072'),(2943,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:29.076'),(2944,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:29.094'),(2945,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:29.109'),(2946,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:29.270'),(2947,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:29.271'),(2948,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:34.647'),(2949,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:34.653'),(2950,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:35.604'),(2951,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:35.603'),(2952,1,'GET /api/content-review/works/8','{\"method\":\"GET\",\"url\":\"/api/content-review/works/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:37.304'),(2953,1,'GET /api/content-review/works/7','{\"method\":\"GET\",\"url\":\"/api/content-review/works/7\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:19:52.009'),(2954,1,'POST /api/content-review/works/7/recommend','{\"method\":\"POST\",\"url\":\"/api/content-review/works/7/recommend\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:20:03.287'),(2955,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:20:03.333'),(2956,1,'POST /api/content-review/works/7/recommend','{\"method\":\"POST\",\"url\":\"/api/content-review/works/7/recommend\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:20:05.877'),(2957,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:20:05.910'),(2958,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:20:08.058'),(2959,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:20:08.060'),(2960,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:16.811'),(2961,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:16.816'),(2962,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:16.829'),(2963,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:16.841'),(2964,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:16.989'),(2965,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:16.989'),(2966,1,'POST /api/content-review/works/9/reject','{\"method\":\"POST\",\"url\":\"/api/content-review/works/9/reject\",\"query\":{},\"body\":{\"reason\":\"含不适宜未成年人的内容\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:29.745'),(2967,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:29.782'),(2968,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:29.782'),(2969,1,'GET /api/content-review/works/9','{\"method\":\"GET\",\"url\":\"/api/content-review/works/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:31.535'),(2970,1,'GET /api/content-review/logs?workId=9&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=9&pageSize=50\",\"query\":{\"workId\":\"9\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:31.535'),(2971,1,'POST /api/content-review/works/10/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/10/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:45.099'),(2972,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:45.128'),(2973,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:21:45.129'),(2974,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:23:16.288'),(2975,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:23:16.289'),(2976,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:23:21.957'),(2977,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:23:21.959'),(2978,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:23:37.981'),(2979,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:23:37.982'),(2980,1,'POST /api/content-review/works/11/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/11/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:26:24.203'),(2981,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:26:24.255'),(2982,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:26:24.256'),(2983,1,'POST /api/content-review/works/11/revoke','{\"method\":\"POST\",\"url\":\"/api/content-review/works/11/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:26:25.751'),(2984,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:26:25.782'),(2985,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:26:25.784'),(2986,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:27:41.933'),(2987,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:27:41.933'),(2988,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:27:47.378'),(2989,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:27:47.378'),(2990,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:28:04.381'),(2991,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:28:04.381'),(2992,1,'POST /api/content-review/works/10/revoke','{\"method\":\"POST\",\"url\":\"/api/content-review/works/10/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:29:09.442'),(2993,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:29:09.480'),(2994,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:29:09.481'),(2995,1,'POST /api/content-review/works/9/revoke','{\"method\":\"POST\",\"url\":\"/api/content-review/works/9/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:29:12.276'),(2996,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:29:12.307'),(2997,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:29:12.309'),(2998,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:29:47.470'),(2999,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:29:47.470'),(3000,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:30:12.925'),(3001,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:30:12.925'),(3002,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:30:53.143'),(3003,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:30:53.146'),(3004,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:30:53.163'),(3005,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:30:53.177'),(3006,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:30:53.330'),(3007,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:30:53.330'),(3008,1,'GET /api/content-review/works/9','{\"method\":\"GET\",\"url\":\"/api/content-review/works/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:32:19.451'),(3009,1,'GET /api/content-review/logs?workId=9&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=9&pageSize=50\",\"query\":{\"workId\":\"9\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:32:19.453'),(3010,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:09.699'),(3011,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:09.699'),(3012,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:50.755'),(3013,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:50.759'),(3014,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:50.773'),(3015,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:50.784'),(3016,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:50.921'),(3017,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:50.922'),(3018,1,'POST /api/content-review/works/9/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/9/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:54.966'),(3019,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:55.015'),(3020,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:35:55.016'),(3021,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:36:14.941'),(3022,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:36:14.942'),(3023,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:36:16.850'),(3024,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:36:16.852'),(3025,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:05.542'),(3026,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:05.544'),(3027,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:05.561'),(3028,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:05.574'),(3029,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:05.726'),(3030,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:05.727'),(3031,1,'POST /api/content-review/works/10/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/10/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:13.675'),(3032,1,'GET /api/content-review/works?page=1&pageSize=10&status=rejected','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=rejected\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"rejected\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:13.708'),(3033,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:13.709'),(3034,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:16.569'),(3035,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:16.569'),(3036,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:17.083'),(3037,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:17.085'),(3038,1,'POST /api/content-review/works/11/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/11/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:31.458'),(3039,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:31.492'),(3040,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:37:31.493'),(3041,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:38:03.226'),(3042,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:38:03.227'),(3043,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:38:08.617'),(3044,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:38:08.618'),(3045,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:38:16.720'),(3046,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:38:16.720'),(3047,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:39:29.249'),(3048,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:39:29.250'),(3049,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:39:29.266'),(3050,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:39:29.278'),(3051,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:39:29.425'),(3052,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:39:29.427'),(3053,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:06.510'),(3054,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:06.513'),(3055,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:06.526'),(3056,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:06.537'),(3057,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:06.701'),(3058,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:06.702'),(3059,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:07.833'),(3060,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:07.834'),(3061,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:07.848'),(3062,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:07.860'),(3063,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:08.005'),(3064,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:08.006'),(3065,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:09.969'),(3066,1,'GET /api/content-review/works/12','{\"method\":\"GET\",\"url\":\"/api/content-review/works/12\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:17.307'),(3067,1,'GET /api/content-review/logs?workId=12&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=12&pageSize=50\",\"query\":{\"workId\":\"12\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:17.310'),(3068,1,'POST /api/content-review/works/12/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/12/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:21.465'),(3069,1,'GET /api/content-review/works/13','{\"method\":\"GET\",\"url\":\"/api/content-review/works/13\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:21.504'),(3070,1,'GET /api/content-review/logs?workId=13&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=13&pageSize=50\",\"query\":{\"workId\":\"13\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:21.505'),(3071,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:21.510'),(3072,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:21.511'),(3073,1,'POST /api/content-review/works/13/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/13/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:27.043'),(3074,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:27.080'),(3075,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:27.081'),(3076,1,'POST /api/content-review/works/9/revoke','{\"method\":\"POST\",\"url\":\"/api/content-review/works/9/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:30.637'),(3077,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:30.670'),(3078,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:30.671'),(3079,1,'POST /api/content-review/works/10/revoke','{\"method\":\"POST\",\"url\":\"/api/content-review/works/10/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:32.768'),(3080,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:32.799'),(3081,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:32.800'),(3082,1,'POST /api/content-review/works/11/revoke','{\"method\":\"POST\",\"url\":\"/api/content-review/works/11/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:34.458'),(3083,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:34.486'),(3084,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:34.486'),(3085,1,'POST /api/content-review/works/12/revoke','{\"method\":\"POST\",\"url\":\"/api/content-review/works/12/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:36.436'),(3086,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:36.461'),(3087,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:36.462'),(3088,1,'POST /api/content-review/works/13/revoke','{\"method\":\"POST\",\"url\":\"/api/content-review/works/13/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:39.416'),(3089,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:39.448'),(3090,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:39.449'),(3091,1,'GET /api/content-review/works/9','{\"method\":\"GET\",\"url\":\"/api/content-review/works/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:41.482'),(3092,1,'GET /api/content-review/logs?workId=9&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=9&pageSize=50\",\"query\":{\"workId\":\"9\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:41.482'),(3093,1,'POST /api/content-review/works/9/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/9/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:45.461'),(3094,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:45.496'),(3095,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:45.496'),(3096,1,'GET /api/content-review/works/10','{\"method\":\"GET\",\"url\":\"/api/content-review/works/10\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:45.499'),(3097,1,'GET /api/content-review/logs?workId=10&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=10&pageSize=50\",\"query\":{\"workId\":\"10\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:45.502'),(3098,1,'POST /api/content-review/works/10/approve','{\"method\":\"POST\",\"url\":\"/api/content-review/works/10/approve\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:48.311'),(3099,1,'GET /api/content-review/works/11','{\"method\":\"GET\",\"url\":\"/api/content-review/works/11\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:48.346'),(3100,1,'GET /api/content-review/logs?workId=11&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=11&pageSize=50\",\"query\":{\"workId\":\"11\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:48.348'),(3101,1,'GET /api/content-review/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:48.348'),(3102,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:48.350'),(3103,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:51.233'),(3104,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:42:51.233'),(3105,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:47.555'),(3106,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:47.561'),(3107,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:50.005'),(3108,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:50.006'),(3109,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:50.008'),(3110,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:54.406'),(3111,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:54.408'),(3112,1,'GET /api/logs?page=1&pageSize=20','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=20\",\"query\":{\"page\":\"1\",\"pageSize\":\"20\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:59.047'),(3113,1,'GET /api/logs/statistics?days=7','{\"method\":\"GET\",\"url\":\"/api/logs/statistics?days=7\",\"query\":{\"days\":\"7\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:46:59.048'),(3114,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:47:07.367'),(3115,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:47:07.368'),(3116,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:08.148'),(3117,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:08.150'),(3118,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:08.168'),(3119,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:08.182'),(3120,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:08.336'),(3121,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:08.337'),(3122,1,'POST /api/content-review/works/10/recommend','{\"method\":\"POST\",\"url\":\"/api/content-review/works/10/recommend\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:13.140'),(3123,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:13.184'),(3124,1,'POST /api/content-review/works/10/recommend','{\"method\":\"POST\",\"url\":\"/api/content-review/works/10/recommend\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:17.139'),(3125,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:48:17.167'),(3126,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:52:50.212'),(3127,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:52:50.226'),(3128,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[10,9,8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:53:11.569'),(3129,9,'GET /api/public/works/8/interaction','{\"method\":\"GET\",\"url\":\"/api/public/works/8/interaction\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:53:13.879'),(3130,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[10,9,8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:53:24.077'),(3131,9,'GET /api/public/works/10/interaction','{\"method\":\"GET\",\"url\":\"/api/public/works/10/interaction\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:53:25.113'),(3132,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[10,9,8,7,5,6,3,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:53:30.158'),(3133,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:56:12.130'),(3134,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:56:18.252'),(3135,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:56:18.253'),(3136,1,'POST /api/content-review/works/10/takedown','{\"method\":\"POST\",\"url\":\"/api/content-review/works/10/takedown\",\"query\":{},\"body\":{\"reason\":\"违反平台规范\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:56:27.908'),(3137,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:56:27.945'),(3138,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:56:27.946'),(3139,1,'GET /api/content-review/works?page=1&pageSize=10&status=taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:56:32.280'),(3140,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:56:33.721'),(3141,1,'GET /api/content-review/works/10','{\"method\":\"GET\",\"url\":\"/api/content-review/works/10\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:57:15.977'),(3142,1,'GET /api/content-review/logs?workId=10&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=10&pageSize=50\",\"query\":{\"workId\":\"10\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 06:57:15.978'),(3143,1,'POST /api/content-review/works/8/takedown','{\"method\":\"POST\",\"url\":\"/api/content-review/works/8/takedown\",\"query\":{},\"body\":{\"reason\":\"用户投诉/举报\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:03:34.046'),(3144,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:03:34.084'),(3145,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:03:34.085'),(3146,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:03:54.476'),(3147,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:03:54.476'),(3148,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:08:57.854'),(3149,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:12:52.174'),(3150,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:12:52.176'),(3151,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:13:15.591'),(3152,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:13:21.916'),(3153,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:13:22.269'),(3154,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:13:22.273'),(3155,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:13:22.276'),(3156,1,'GET /api/content-review/works/10','{\"method\":\"GET\",\"url\":\"/api/content-review/works/10\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:15:44.758'),(3157,1,'GET /api/content-review/logs?workId=10&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=10&pageSize=50\",\"query\":{\"workId\":\"10\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:15:44.759'),(3158,1,'GET /api/content-review/logs?workId=5&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=5&pageSize=50\",\"query\":{\"workId\":\"5\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:15:50.676'),(3159,1,'GET /api/content-review/works/5','{\"method\":\"GET\",\"url\":\"/api/content-review/works/5\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:15:50.677'),(3160,1,'GET /api/tags/categories','{\"method\":\"GET\",\"url\":\"/api/tags/categories\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:43.482'),(3161,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:43.483'),(3162,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:47.478'),(3163,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:47.481'),(3164,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:47.496'),(3165,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:47.510'),(3166,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:47.628'),(3167,1,'GET /api/tags/categories','{\"method\":\"GET\",\"url\":\"/api/tags/categories\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:47.629'),(3168,1,'POST /api/tags/batch-sort','{\"method\":\"POST\",\"url\":\"/api/tags/batch-sort\",\"query\":{},\"body\":{\"items\":[{\"id\":1,\"sort\":2},{\"id\":2,\"sort\":1}]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:49.570'),(3169,1,'POST /api/tags/batch-sort','{\"method\":\"POST\",\"url\":\"/api/tags/batch-sort\",\"query\":{},\"body\":{\"items\":[{\"id\":2,\"sort\":2},{\"id\":1,\"sort\":1}]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:50.242'),(3170,1,'POST /api/tags/batch-sort','{\"method\":\"POST\",\"url\":\"/api/tags/batch-sort\",\"query\":{},\"body\":{\"items\":[{\"id\":1,\"sort\":2},{\"id\":2,\"sort\":1}]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:50.830'),(3171,1,'POST /api/tags/batch-sort','{\"method\":\"POST\",\"url\":\"/api/tags/batch-sort\",\"query\":{},\"body\":{\"items\":[{\"id\":1,\"sort\":1},{\"id\":2,\"sort\":2}]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:51.817'),(3172,1,'POST /api/tags/batch-sort','{\"method\":\"POST\",\"url\":\"/api/tags/batch-sort\",\"query\":{},\"body\":{\"items\":[{\"id\":2,\"sort\":1},{\"id\":1,\"sort\":2}]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:16:52.462'),(3173,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:07.497'),(3174,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:07.497'),(3175,1,'GET /api/content-review/works?page=1&pageSize=10&status=published&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:10.063'),(3176,1,'GET /api/content-review/works?page=1&pageSize=10&status=published&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:10.739'),(3177,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:11.389'),(3178,1,'GET /api/content-review/works?page=1&pageSize=10&status=taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:12.053'),(3179,1,'GET /api/content-review/works?page=1&pageSize=10&status=published&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:12.910'),(3180,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:13.813'),(3181,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:13.814'),(3182,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:52.390'),(3183,1,'GET /api/tags/categories','{\"method\":\"GET\",\"url\":\"/api/tags/categories\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:17:52.391'),(3184,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:12.437'),(3185,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:21.622'),(3186,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[7,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:26.941'),(3187,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[5,4]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:27.584'),(3188,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[7,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:28.138'),(3189,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[7,4,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:29.091'),(3190,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:31.134'),(3191,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:48.813'),(3192,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:48.814'),(3193,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:52.102'),(3194,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:52.266'),(3195,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:52.269'),(3196,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:52.271'),(3197,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:54.030'),(3198,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:54.037'),(3199,1,'GET /api/tags/categories','{\"method\":\"GET\",\"url\":\"/api/tags/categories\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:57.162'),(3200,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:19:57.162'),(3201,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:24:03.002'),(3202,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:27:08.331'),(3203,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:27:08.483'),(3204,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:31:13.471'),(3205,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:31:15.556'),(3206,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:31:15.712'),(3207,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:31:15.713'),(3208,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:31:15.713'),(3209,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:31:17.306'),(3210,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:31:17.311'),(3211,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:32:48.708'),(3212,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:32:48.713'),(3213,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:32:48.807'),(3214,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:32:48.810'),(3215,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:32:48.811'),(3216,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:34:24.983'),(3217,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:34:24.988'),(3218,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:37.919'),(3219,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:37.922'),(3220,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:37.937'),(3221,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:37.950'),(3222,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:38.084'),(3223,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:38.088'),(3224,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:39.132'),(3225,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:39.134'),(3226,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:39.147'),(3227,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:39.160'),(3228,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:39.288'),(3229,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:39.293'),(3230,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:41.456'),(3231,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:41.471'),(3232,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.017'),(3233,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.019'),(3234,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.033'),(3235,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.048'),(3236,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.183'),(3237,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.187'),(3238,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.566'),(3239,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.569'),(3240,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.585'),(3241,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.599'),(3242,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.744'),(3243,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:35:59.748'),(3244,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:36:00.669'),(3245,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:36:00.670'),(3246,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:36:00.684'),(3247,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:36:00.698'),(3248,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:36:00.843'),(3249,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:36:00.847'),(3250,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:36:02.659'),(3251,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:36:02.674'),(3252,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:27.349'),(3253,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:27.352'),(3254,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:27.367'),(3255,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:27.380'),(3256,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:27.528'),(3257,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:27.533'),(3258,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:29.088'),(3259,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:29.103'),(3260,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:37.704'),(3261,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:37.708'),(3262,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:37.710'),(3263,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:38.259'),(3264,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:37:38.260'),(3265,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:40:04.525'),(3266,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:40:07.071'),(3267,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:40:07.222'),(3268,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 07:42:55.328'),(3269,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 07:48:43.276'),(3270,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.439'),(3271,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.454'),(3272,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.455'),(3273,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.466'),(3274,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.601'),(3275,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.610'),(3276,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.613'),(3277,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.628'),(3278,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:53.632'),(3279,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:54.854'),(3280,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:54.856'),(3281,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:50:54.863'),(3282,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 07:51:38.624'),(3283,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 07:52:05.890'),(3284,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.339'),(3285,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.349'),(3286,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.349'),(3287,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.358'),(3288,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.467'),(3289,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.474'),(3290,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.480'),(3291,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.490'),(3292,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:05.509'),(3293,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:06.727'),(3294,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:06.731'),(3295,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:53:06.735'),(3296,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 07:53:40.598'),(3297,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:03.290'),(3298,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:03.294'),(3299,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:03.311'),(3300,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:03.325'),(3301,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:03.488'),(3302,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:04.845'),(3303,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:15.944'),(3304,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:16.971'),(3305,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:17.391'),(3306,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:58:23.013'),(3307,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:59:49.459'),(3308,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:59:49.559'),(3309,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:59:49.559'),(3310,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 07:59:49.561'),(3311,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:33.129'),(3312,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:41.651'),(3313,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:41.653'),(3314,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:41.686'),(3315,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:41.730'),(3316,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:41.835'),(3317,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:43.279'),(3318,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:43.281'),(3319,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:43.297'),(3320,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:43.312'),(3321,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:43.408'),(3322,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:45.592'),(3323,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:46.410'),(3324,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:47.203'),(3325,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:47.680'),(3326,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:48.199'),(3327,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:48.724'),(3328,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:51.214'),(3329,8,'GET /api/tenants/my-tenant','{\"method\":\"GET\",\"url\":\"/api/tenants/my-tenant\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:53.880'),(3330,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:56.659'),(3331,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:56.661'),(3332,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:58.039'),(3333,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:58.040'),(3334,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:58.917'); -INSERT INTO `logs` VALUES (3335,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:58.921'),(3336,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:59.572'),(3337,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:02:59.573'),(3338,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:00.244'),(3339,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:00.246'),(3340,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:01.541'),(3341,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:01.542'),(3342,8,'GET /api/logs?page=1&pageSize=20','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=20\",\"query\":{\"page\":\"1\",\"pageSize\":\"20\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:02.457'),(3343,8,'GET /api/logs/statistics?days=7','{\"method\":\"GET\",\"url\":\"/api/logs/statistics?days=7\",\"query\":{\"days\":\"7\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:02.458'),(3344,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:03.256'),(3345,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:03.257'),(3346,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:03.998'),(3347,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:03.999'),(3348,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:04.495'),(3349,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:03:04.496'),(3350,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:06:13.473'),(3351,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:06:26.414'),(3352,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:06:30.960'),(3353,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:06:33.876'),(3354,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:06:34.537'),(3355,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 08:07:42.609'),(3356,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:16:22.714'),(3357,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:21:38.429'),(3358,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:21:38.433'),(3359,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:21:38.450'),(3360,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:21:38.464'),(3361,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:21:38.585'),(3362,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:22:59.418'),(3363,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:22:59.435'),(3364,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:22:59.437'),(3365,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:22:59.450'),(3366,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:22:59.550'),(3367,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:23:01.214'),(3368,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:23:02.883'),(3369,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:23:05.168'),(3370,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:23:05.169'),(3371,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:23:06.542'),(3372,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:23:08.090'),(3373,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:23:09.829'),(3374,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 08:23:40.068'),(3375,8,'GET /api/contests','{\"method\":\"GET\",\"url\":\"/api/contests\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 08:24:06.761'),(3376,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 08:24:54.111'),(3377,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 08:26:11.693'),(3378,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 08:26:44.345'),(3379,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:28:45.285'),(3380,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:28:45.289'),(3381,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:28:45.304'),(3382,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:28:45.321'),(3383,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:28:45.418'),(3384,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:28:52.689'),(3385,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:28:54.318'),(3386,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:32:21.061'),(3387,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:34:48.972'),(3388,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:34:48.975'),(3389,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:34:49.307'),(3390,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:34:49.308'),(3391,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:34:49.321'),(3392,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:40:05.763'),(3393,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:40:05.766'),(3394,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:40:05.785'),(3395,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:40:05.800'),(3396,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:40:05.944'),(3397,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:40:05.945'),(3398,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:40:14.011'),(3399,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:42:45.192'),(3400,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:54:02.865'),(3401,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:54:02.870'),(3402,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:54:10.045'),(3403,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:54:11.252'),(3404,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:54:11.252'),(3405,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:54:11.922'),(3406,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:09.786'),(3407,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:09.786'),(3408,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:14.771'),(3409,8,'GET /api/contests/judges/contest/4','{\"method\":\"GET\",\"url\":\"/api/contests/judges/contest/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:14.822'),(3410,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:14.823'),(3411,8,'GET /api/judges-management/17','{\"method\":\"GET\",\"url\":\"/api/judges-management/17\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:14.845'),(3412,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:23.975'),(3413,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:23.976'),(3414,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:26.963'),(3415,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:26.964'),(3416,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:30.931'),(3417,8,'GET /api/contests/3','{\"method\":\"GET\",\"url\":\"/api/contests/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:30.932'),(3418,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:32.480'),(3419,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:32.481'),(3420,8,'GET /api/contests/review-rules/select','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules/select\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:35.855'),(3421,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:35.856'),(3422,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:41.923'),(3423,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:41.925'),(3424,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:45.058'),(3425,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:45.724'),(3426,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:55:45.725'),(3427,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 08:58:15.710'),(3428,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:02:46.102'),(3429,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:02:57.298'),(3430,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:41.674'),(3431,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:41.674'),(3432,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:41.686'),(3433,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:41.695'),(3434,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:41.857'),(3435,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:50.525'),(3436,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:50.526'),(3437,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:54.573'),(3438,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:55.085'),(3439,8,'GET /api/contests?contestName=&contestType=team&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=team&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"team\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:57.153'),(3440,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:03:57.836'),(3441,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:08:00.267'),(3442,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.518'),(3443,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.522'),(3444,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.539'),(3445,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.554'),(3446,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.732'),(3447,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.734'),(3448,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.755'),(3449,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.756'),(3450,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.759'),(3451,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.764'),(3452,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.767'),(3453,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:26.768'),(3454,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:29.820'),(3455,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:29.821'),(3456,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:29.845'),(3457,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:29.846'),(3458,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:29.849'),(3459,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:29.852'),(3460,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:29.853'),(3461,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:29.854'),(3462,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:39.694'),(3463,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:39.703'),(3464,8,'GET /api/contests/registrations/7','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/7\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:09:59.082'),(3465,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:41.124'),(3466,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:41.124'),(3467,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:41.140'),(3468,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:41.140'),(3469,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:41.143'),(3470,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:41.146'),(3471,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:41.148'),(3472,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:41.149'),(3473,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:45.432'),(3474,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:45.450'),(3475,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:47.299'),(3476,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:47.300'),(3477,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:47.320'),(3478,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:47.321'),(3479,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:47.321'),(3480,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:47.324'),(3481,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:47.327'),(3482,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:47.328'),(3483,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:54.981'),(3484,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:54.998'),(3485,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:58.241'),(3486,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:58.242'),(3487,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:58.263'),(3488,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:58.264'),(3489,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:58.265'),(3490,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:58.265'),(3491,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:58.267'),(3492,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:10:58.268'),(3493,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:11:23.417'),(3494,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:11:23.432'),(3495,8,'GET /api/contests/registrations/8','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:11:32.936'),(3496,8,'GET /api/contests/registrations/8','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:11:34.909'),(3497,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:21.181'),(3498,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:21.194'),(3499,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:21.342'),(3500,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:21.343'),(3501,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:21.347'),(3502,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:52.863'),(3503,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:52.871'),(3504,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:58.623'),(3505,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:13:58.639'),(3506,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:09.633'),(3507,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:09.648'),(3508,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:24.665'),(3509,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:24.682'),(3510,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:32.902'),(3511,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:32.917'),(3512,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:44.394'),(3513,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:44.414'),(3514,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:50.372'),(3515,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:50.387'),(3516,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:55.607'),(3517,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:14:55.626'),(3518,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:15:01.385'),(3519,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:15:01.393'),(3520,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:15:01.394'),(3521,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:08.955'),(3522,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:08.957'),(3523,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:09.005'),(3524,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:09.005'),(3525,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:09.005'),(3526,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:09.007'),(3527,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:09.006'),(3528,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:09.008'),(3529,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.112'),(3530,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.116'),(3531,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.132'),(3532,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.148'),(3533,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.284'),(3534,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.285'),(3535,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.307'),(3536,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.308'),(3537,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.312'),(3538,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.314'),(3539,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.317'),(3540,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:11.319'),(3541,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:12.659'),(3542,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:12.677'),(3543,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:12.679'),(3544,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:46.211'),(3545,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:46.211'),(3546,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:46.229'),(3547,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:46.229'),(3548,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:46.231'),(3549,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:46.233'),(3550,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:46.234'),(3551,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:46.234'),(3552,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:49.739'),(3553,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:49.754'),(3554,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:49.755'),(3555,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:55.015'),(3556,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:55.030'),(3557,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:17:55.030'),(3558,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10®istrationState=passed','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10®istrationState=passed\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\",\"registrationState\":\"passed\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:10.147'),(3559,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:11.345'),(3560,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10®istrationState=rejected','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10®istrationState=rejected\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\",\"registrationState\":\"rejected\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:13.665'),(3561,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:14.585'),(3562,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:18.755'),(3563,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:18.757'),(3564,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:18.774'),(3565,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:18.774'),(3566,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:18.777'),(3567,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:18.780'),(3568,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:18.783'),(3569,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:18.785'),(3570,8,'GET /api/contests/5','{\"method\":\"GET\",\"url\":\"/api/contests/5\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:21.105'),(3571,8,'GET /api/contests/registrations?contestId=5&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=5&page=1&pageSize=10\",\"query\":{\"contestId\":\"5\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:21.122'),(3572,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:21.123'),(3573,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:23.546'),(3574,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:23.546'),(3575,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:23.569'),(3576,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:23.570'),(3577,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:23.571'),(3578,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:23.574'),(3579,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:23.575'),(3580,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:23.576'),(3581,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:24.489'),(3582,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:24.505'),(3583,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:24.506'),(3584,8,'GET /api/contests/registrations/6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/6\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:18:31.308'),(3585,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:19:54.882'),(3586,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:19:54.890'),(3587,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:19:54.891'),(3588,8,'GET /api/contests/registrations/8','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:20:23.480'),(3589,8,'PATCH /api/contests/registrations/8/review','{\"method\":\"PATCH\",\"url\":\"/api/contests/registrations/8/review\",\"query\":{},\"body\":{\"registrationState\":\"rejected\",\"reason\":\"测试\\n\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:20:36.480'),(3590,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:20:36.529'),(3591,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:20:36.529'),(3592,8,'GET /api/contests/registrations/8','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:20:38.400'),(3593,8,'PATCH /api/contests/registrations/8/review','{\"method\":\"PATCH\",\"url\":\"/api/contests/registrations/8/review\",\"query\":{},\"body\":{\"registrationState\":\"passed\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:20:42.980'),(3594,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:21:53.108'),(3595,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:21:53.121'),(3596,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:21:53.122'),(3597,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:21:53.178'),(3598,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:21:53.178'),(3599,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:21:53.181'),(3600,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:22:49.956'),(3601,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:22:49.973'),(3602,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:22:49.973'),(3603,8,'PATCH /api/contests/registrations/8/revoke','{\"method\":\"PATCH\",\"url\":\"/api/contests/registrations/8/revoke\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:22:54.279'),(3604,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:22:54.315'),(3605,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:22:54.316'),(3606,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:16.302'),(3607,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:16.304'),(3608,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:16.327'),(3609,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:16.350'),(3610,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:16.506'),(3611,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:16.519'),(3612,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:16.520'),(3613,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:21.927'),(3614,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:21.928'),(3615,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:21.950'),(3616,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:21.951'),(3617,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:21.954'),(3618,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:21.958'),(3619,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:21.961'),(3620,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:21.963'),(3621,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:23.254'),(3622,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:23.269'),(3623,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:23.271'),(3624,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:23:43.918'),(3625,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:26:12.857'),(3626,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:26:34.048'),(3627,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:26:39.943'),(3628,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:26:39.948'),(3629,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:05.428'),(3630,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:05.437'),(3631,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:05.444'),(3632,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:05.452'),(3633,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:05.599'),(3634,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:05.600'),(3635,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:08.706'),(3636,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:08.719'),(3637,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:08.759'),(3638,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:08.771'),(3639,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:09.470'),(3640,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:09.471'),(3641,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:09.477'),(3642,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:16.406'),(3643,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:16.413'),(3644,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:16.414'),(3645,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:16.421'),(3646,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:16.560'),(3647,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:16.561'),(3648,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:18.847'),(3649,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:18.859'),(3650,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:18.861'),(3651,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:18.873'),(3652,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:19.386'),(3653,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:19.387'),(3654,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:19.392'),(3655,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:25.532'),(3656,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:25.539'),(3657,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:25.540'),(3658,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:25.547'),(3659,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:25.681'),(3660,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:25.681'),(3661,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:29.117'),(3662,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:29.129'),(3663,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:29.130'),(3664,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:29.140'),(3665,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:30.536'),(3666,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:30.537'),(3667,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:30.540'),(3668,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:40.728'),(3669,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:40.739'),(3670,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:40.740'),(3671,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:40.748'),(3672,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:40.888'),(3673,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:40.888'),(3674,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:41.150'),(3675,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:41.165'),(3676,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:41.165'),(3677,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:41.176'),(3678,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:42.332'),(3679,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:42.333'),(3680,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:27:42.337'),(3681,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:24.028'),(3682,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:24.035'),(3683,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:24.036'),(3684,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:24.043'),(3685,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:24.181'),(3686,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:24.182'),(3687,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:25.596'),(3688,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:25.662'),(3689,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:25.664'),(3690,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:25.774'),(3691,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:26.872'),(3692,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:26.871'),(3693,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:26.877'),(3694,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:35.901'),(3695,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:35.908'),(3696,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:35.909'),(3697,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:35.916'),(3698,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:36.056'),(3699,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:36.056'),(3700,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:36.158'),(3701,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:36.169'),(3702,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:36.171'),(3703,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:36.180'),(3704,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:37.332'),(3705,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:37.332'),(3706,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:37.337'),(3707,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:53.899'),(3708,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:53.907'),(3709,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:53.907'),(3710,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:53.915'),(3711,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:54.050'),(3712,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:54.051'),(3713,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:55.697'),(3714,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:55.706'),(3715,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:55.708'),(3716,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:55.717'),(3717,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:56.320'),(3718,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:56.321'),(3719,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:28:56.325'),(3720,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:03.606'),(3721,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:03.614'),(3722,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:03.615'),(3723,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:03.622'),(3724,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:03.759'),(3725,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:03.759'),(3726,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:06.699'),(3727,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:06.711'),(3728,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:06.712'),(3729,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:06.724'),(3730,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:07.328'),(3731,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:07.329'),(3732,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:07.334'),(3733,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:26.665'),(3734,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:26.672'),(3735,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:26.673'),(3736,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:26.680'),(3737,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:26.817'),(3738,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:26.818'),(3739,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:27.152'),(3740,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:27.164'),(3741,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:27.165'),(3742,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:27.177'),(3743,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:28.340'),(3744,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:28.341'),(3745,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:29:28.345'),(3746,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:36:45.680'),(3747,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:36:51.824'),(3748,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:36:51.825'),(3749,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:36:52.949'),(3750,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:36:54.968'),(3751,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:36:54.969'),(3752,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:36:57.206'),(3753,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:17.669'),(3754,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:17.676'),(3755,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:17.678'),(3756,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:17.685'),(3757,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:17.790'),(3758,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:19.977'),(3759,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:19.992'),(3760,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:20.249'),(3761,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:20.270'),(3762,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:21.942'),(3763,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:21.945'),(3764,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:38:21.952'),(3765,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:29.943'),(3766,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:29.944'),(3767,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:32.575'),(3768,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:32.577'),(3769,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:32.594'),(3770,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:32.606'),(3771,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:32.753'),(3772,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:32.753'),(3773,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:34.387'),(3774,8,'GET /api/contests/works/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:34.388'),(3775,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:34.388'),(3776,8,'GET /api/contests/works/3','{\"method\":\"GET\",\"url\":\"/api/contests/works/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:38.870'),(3777,8,'GET /api/contests/works/3','{\"method\":\"GET\",\"url\":\"/api/contests/works/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:38.887'),(3778,8,'GET /api/contests/reviews/work/3/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/3/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:38.894'),(3779,8,'GET /api/contests/reviews/work/3/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/3/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:38.900'),(3780,8,'GET /api/contests/judges/contest/4','{\"method\":\"GET\",\"url\":\"/api/contests/judges/contest/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:47.957'),(3781,8,'POST /api/contests/reviews/assign?contestId=4','{\"method\":\"POST\",\"url\":\"/api/contests/reviews/assign?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{\"workId\":3,\"judgeIds\":[17]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:39:54.385'),(3782,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:49.287'),(3783,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:49.288'),(3784,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:49.307'),(3785,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:49.321'),(3786,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:49.487'),(3787,8,'GET /api/contests/works/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:49.489'),(3788,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:49.498'),(3789,8,'GET /api/contests/judges/contest/4','{\"method\":\"GET\",\"url\":\"/api/contests/judges/contest/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:50.296'),(3790,8,'POST /api/contests/reviews/assign?contestId=4','{\"method\":\"POST\",\"url\":\"/api/contests/reviews/assign?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{\"workId\":3,\"judgeIds\":[17]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:52.718'),(3791,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:52.756'),(3792,8,'GET /api/contests/works/3','{\"method\":\"GET\",\"url\":\"/api/contests/works/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:56.485'),(3793,8,'GET /api/contests/works/3','{\"method\":\"GET\",\"url\":\"/api/contests/works/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:56.503'),(3794,8,'GET /api/contests/reviews/work/3/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/3/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:56.508'),(3795,8,'GET /api/contests/reviews/work/3/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/3/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:42:56.520'),(3796,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:43:01.326'),(3797,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:43:03.260'),(3798,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:43:04.583'),(3799,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4&username=dahua','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4&username=dahua\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\",\"username\":\"dahua\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:43:32.095'),(3800,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:43:36.004'),(3801,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:43:37.577'),(3802,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:43:38.433'),(3803,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:43:40.039'),(3804,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:44:16.731'),(3805,8,'GET /api/contests/works/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:44:16.732'),(3806,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:44:16.733'),(3807,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:18.880'),(3808,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:18.882'),(3809,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:18.900'),(3810,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:18.911'),(3811,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:19.084'),(3812,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:19.090'),(3813,8,'GET /api/contests/works/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:19.091'),(3814,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:33.495'),(3815,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4&assignStatus=unassigned','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4&assignStatus=unassigned\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\",\"assignStatus\":\"unassigned\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:37.329'),(3816,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4&assignStatus=assigned','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4&assignStatus=assigned\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\",\"assignStatus\":\"assigned\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:46:38.696'),(3817,8,'GET /api/contests/works/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:47:04.662'),(3818,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:47:04.663'),(3819,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:47:04.667'),(3820,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4&submitStartTime=2026-03-17&submitEndTime=2026-03-19','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4&submitStartTime=2026-03-17&submitEndTime=2026-03-19\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\",\"submitStartTime\":\"2026-03-17\",\"submitEndTime\":\"2026-03-19\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:48:09.675'),(3821,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:49:47.657'),(3822,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:49:50.123'),(3823,8,'GET /api/contests/works?page=1&pageSize=10&contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=5\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:43.571'),(3824,8,'GET /api/contests/5','{\"method\":\"GET\",\"url\":\"/api/contests/5\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:43.572'),(3825,8,'GET /api/contests/reviews/work/6/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/6/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:45.949'),(3826,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:53.453'),(3827,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:53.455'),(3828,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:53.474'),(3829,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:53.475'),(3830,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:53.482'),(3831,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:53.483'),(3832,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:53.484'),(3833,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:53.485'),(3834,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:55.419'),(3835,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:55.436'),(3836,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:55.437'),(3837,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:51:57.990'),(3838,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.312'),(3839,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.312'),(3840,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.335'),(3841,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.336'),(3842,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.337'),(3843,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.340'),(3844,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.344'),(3845,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.345'),(3846,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.830'),(3847,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:01.831'),(3848,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:02.530'),(3849,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:02.531'),(3850,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:02.550'),(3851,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:02.551'),(3852,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:02.554'),(3853,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:02.557'),(3854,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:02.560'),(3855,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:02.561'),(3856,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:03.911'),(3857,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:03.930'),(3858,8,'GET /api/contests/registrations?contestId=4&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&page=1&pageSize=10\",\"query\":{\"contestId\":\"4\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:03.931'),(3859,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:52:07.809'),(3860,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:53:08.166'),(3861,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:53:37.636'),(3862,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:53:47.446'),(3863,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:53:47.448'),(3864,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:21.550'),(3865,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:21.554'),(3866,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:27.259'),(3867,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:27.260'),(3868,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:28.016'),(3869,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:28.016'),(3870,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:28.843'),(3871,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:28.843'),(3872,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.183'),(3873,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.187'),(3874,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.208'),(3875,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.223'),(3876,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.399'),(3877,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.400'),(3878,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.765'),(3879,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.767'),(3880,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.784'),(3881,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.799'),(3882,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.924'),(3883,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:32.925'),(3884,8,'GET /api/contests?page=1&pageSize=10&contestType=team','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=team\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"team\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:36.123'),(3885,8,'GET /api/contests?page=1&pageSize=10&contestType=individual','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10&contestType=individual\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestType\":\"individual\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:37.287'),(3886,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:38.276'),(3887,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:55:38.278'),(3888,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:57:03.676'),(3889,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:57:03.689'),(3890,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:06.488'),(3891,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:06.489'),(3892,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:06.507'),(3893,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:06.521'),(3894,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:06.676'),(3895,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:06.676'),(3896,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:08.427'),(3897,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:09.178'),(3898,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:27.943'),(3899,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:27.944'),(3900,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:29.578'),(3901,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:29.580'),(3902,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:30.029'),(3903,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:30.030'),(3904,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:39.066'),(3905,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:39.067'),(3906,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:40.790'),(3907,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:40.793'),(3908,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:41.541'),(3909,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:41.541'),(3910,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:47.635'),(3911,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:47.636'),(3912,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:48.061'),(3913,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:48.064'),(3914,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:49.476'),(3915,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:49.476'),(3916,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:51.431'),(3917,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:51.431'),(3918,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:51.913'),(3919,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:58:51.913'),(3920,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:48.892'),(3921,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:48.898'),(3922,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:48.907'),(3923,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:48.914'),(3924,8,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:49.061'),(3925,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:49.142'),(3926,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:49.152'),(3927,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:49.163'),(3928,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:49.172'),(3929,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:50.415'),(3930,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:50.416'),(3931,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 09:59:50.421'),(3932,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:03:41.367'),(3933,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:03:41.369'),(3934,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:03:41.387'),(3935,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:03:41.401'),(3936,8,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:03:41.540'),(3937,8,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:26:48.821'),(3938,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:29:19.267'),(3939,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:29:19.270'),(3940,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:29:19.286'),(3941,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:29:19.302'),(3942,8,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:29:19.478'),(3943,8,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:30:18.703'),(3944,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:38:03.932'),(3945,8,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:38:05.240'),(3946,8,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:38:05.774'),(3947,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:40:50.023'),(3948,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:40:56.462'),(3949,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:40:56.462'),(3950,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:49.594'),(3951,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:49.596'),(3952,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:49.612'),(3953,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:49.626'),(3954,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:49.809'),(3955,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:49.812'),(3956,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:51.490'),(3957,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:52.118'),(3958,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:52.911'),(3959,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:43:55.798'),(3960,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:07.677'),(3961,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:07.677'),(3962,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:08.807'),(3963,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:09.567'),(3964,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:09.568'),(3965,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:13.773'),(3966,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:14.968'),(3967,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:14.969'),(3968,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:44:16.634'),(3969,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:47:55.933'),(3970,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:48:13.084'),(3971,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:48:20.887'),(3972,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:48:27.280'),(3973,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:48:49.835'),(3974,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:50:22.267'),(3975,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:50:22.268'),(3976,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:50:22.287'),(3977,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:50:22.302'),(3978,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:50:22.474'),(3979,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:51:43.398'),(3980,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:51:43.400'),(3981,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:51:43.416'),(3982,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:51:43.427'),(3983,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:51:43.573'),(3984,8,'GET /api/contests?page=1&pageSize=100&contestState=published','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100&contestState=published\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\",\"contestState\":\"published\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:51:55.336'),(3985,8,'GET /api/tenants/my-tenant','{\"method\":\"GET\",\"url\":\"/api/tenants/my-tenant\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:17.370'),(3986,8,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:18.663'),(3987,8,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:18.664'),(3988,8,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:23.097'),(3989,8,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:23.098'),(3990,8,'GET /api/logs/statistics?days=7','{\"method\":\"GET\",\"url\":\"/api/logs/statistics?days=7\",\"query\":{\"days\":\"7\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:23.715'),(3991,8,'GET /api/logs?page=1&pageSize=20','{\"method\":\"GET\",\"url\":\"/api/logs?page=1&pageSize=20\",\"query\":{\"page\":\"1\",\"pageSize\":\"20\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:23.716'),(3992,8,'GET /api/tenants/my-tenant','{\"method\":\"GET\",\"url\":\"/api/tenants/my-tenant\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:24.301'),(3993,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:39.622'),(3994,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:45.573'),(3995,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:45.576'),(3996,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:45.592'),(3997,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:45.606'),(3998,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:45.743'),(3999,8,'PATCH /api/contests/notices/4','{\"method\":\"PATCH\",\"url\":\"/api/contests/notices/4\",\"query\":{},\"body\":{\"publishTime\":null}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:49.696'),(4000,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:49.730'),(4001,8,'GET /api/contests/attachments/contest/5','{\"method\":\"GET\",\"url\":\"/api/contests/attachments/contest/5\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:51.347'),(4002,8,'PATCH /api/contests/notices/5','{\"method\":\"PATCH\",\"url\":\"/api/contests/notices/5\",\"query\":{},\"body\":{\"publishTime\":\"2026-03-31T10:53:54.967Z\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:54.982'),(4003,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:55.007'),(4004,8,'PATCH /api/contests/notices/3','{\"method\":\"PATCH\",\"url\":\"/api/contests/notices/3\",\"query\":{},\"body\":{\"publishTime\":\"2026-03-31T10:53:58.211Z\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:58.224'),(4005,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:53:58.252'),(4006,8,'PATCH /api/contests/notices/3','{\"method\":\"PATCH\",\"url\":\"/api/contests/notices/3\",\"query\":{},\"body\":{\"publishTime\":null}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:54:01.311'),(4007,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:54:01.334'),(4008,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:54:36.879'),(4009,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:45.701'),(4010,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:45.719'),(4011,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:45.720'),(4012,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:45.730'),(4013,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:45.877'),(4014,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:48.370'),(4015,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:48.372'),(4016,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:48.389'),(4017,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:48.404'),(4018,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:48.556'),(4019,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:54.007'),(4020,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:55.418'),(4021,8,'GET /api/contests/notices?page=1&pageSize=10&publishDate=2026-03-29','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10&publishDate=2026-03-29\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"publishDate\":\"2026-03-29\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:57.805'),(4022,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:55:59.972'),(4023,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:56:38.331'),(4024,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:56:47.168'),(4025,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:56:53.563'),(4026,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:13.564'),(4027,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:13.566'),(4028,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:13.581'),(4029,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:13.593'),(4030,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:13.748'),(4031,8,'GET /api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-29&publishEndDate=2026-03-31','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-29&publishEndDate=2026-03-31\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"publishStartDate\":\"2026-03-29\",\"publishEndDate\":\"2026-03-31\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:17.502'),(4032,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:29.384'),(4033,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:29.386'),(4034,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:29.403'),(4035,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:29.416'),(4036,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:29.565'),(4037,8,'GET /api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-29&publishEndDate=2026-03-31','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-29&publishEndDate=2026-03-31\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"publishStartDate\":\"2026-03-29\",\"publishEndDate\":\"2026-03-31\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 10:58:33.261'),(4038,8,'GET /api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-29&publishEndDate=2026-03-29','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-29&publishEndDate=2026-03-29\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"publishStartDate\":\"2026-03-29\",\"publishEndDate\":\"2026-03-29\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:03:12.759'),(4039,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:03:15.423'),(4040,8,'GET /api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-31&publishEndDate=2026-04-02','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-31&publishEndDate=2026-04-02\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"publishStartDate\":\"2026-03-31\",\"publishEndDate\":\"2026-04-02\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:03:22.845'),(4041,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:03:29.276'),(4042,8,'GET /api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-22&publishEndDate=2026-03-30','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10&publishStartDate=2026-03-22&publishEndDate=2026-03-30\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"publishStartDate\":\"2026-03-22\",\"publishEndDate\":\"2026-03-30\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:03:36.983'),(4043,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:03:41.138'),(4044,8,'GET /api/tenants/my-tenant','{\"method\":\"GET\",\"url\":\"/api/tenants/my-tenant\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:03:48.106'),(4045,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:04:00.120'),(4046,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:04:00.121'),(4047,8,'GET /api/contests/results/6?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/6?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:01.661'),(4048,8,'GET /api/contests/results/6/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/6/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:01.662'),(4049,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:04.349'),(4050,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:04.351'),(4051,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:17.311'),(4052,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:17.312'),(4053,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:17.330'),(4054,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:17.345'),(4055,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:17.520'),(4056,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:17.521'),(4057,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:18.853'),(4058,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:18.855'),(4059,8,'POST /api/contests/results/4/calculate-scores','{\"method\":\"POST\",\"url\":\"/api/contests/results/4/calculate-scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:21.316'),(4060,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:21.345'),(4061,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:11:21.345'),(4062,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:19.494'),(4063,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:19.495'),(4064,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:21.847'),(4065,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:21.849'),(4066,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:21.866'),(4067,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:21.881'),(4068,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:22.027'),(4069,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:22.028'),(4070,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:22.535'),(4071,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:22.537'),(4072,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:22.553'),(4073,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:22.569'),(4074,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:22.699'),(4075,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:22.700'),(4076,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:27.729'),(4077,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:27.729'),(4078,8,'GET /api/contests/works/1','{\"method\":\"GET\",\"url\":\"/api/contests/works/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:30.981'),(4079,8,'GET /api/contests/works/1','{\"method\":\"GET\",\"url\":\"/api/contests/works/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:30.998'),(4080,8,'GET /api/contests/reviews/work/1/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/1/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:31.006'),(4081,8,'GET /api/contests/reviews/work/1/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/1/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:31.017'),(4082,8,'POST /api/contests/results/4/calculate-scores','{\"method\":\"POST\",\"url\":\"/api/contests/results/4/calculate-scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:32.857'),(4083,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:32.895'),(4084,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:32.896'),(4085,8,'POST /api/contests/results/4/calculate-rankings','{\"method\":\"POST\",\"url\":\"/api/contests/results/4/calculate-rankings\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:38.073'),(4086,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:38.098'),(4087,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:38.099'),(4088,8,'POST /api/contests/results/4/auto-set-awards','{\"method\":\"POST\",\"url\":\"/api/contests/results/4/auto-set-awards\",\"query\":{},\"body\":{\"first\":1,\"second\":1,\"third\":1}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:58.248'),(4089,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:58.282'),(4090,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:15:58.283'),(4091,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:15.725'),(4092,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:15.726'),(4093,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:16.742'),(4094,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:16.745'),(4095,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:16.752'),(4096,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:25.304'),(4097,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:25.304'),(4098,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:26.399'),(4099,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:26.401'),(4100,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:18:26.406'),(4101,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:19:00.085'),(4102,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:19:00.086'),(4103,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:19:10.743'),(4104,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:19:10.743'),(4105,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:19:27.540'),(4106,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:19:27.541'),(4107,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:19:36.050'),(4108,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:19:36.050'),(4109,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:21.195'),(4110,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:21.197'),(4111,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:21.216'),(4112,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:21.230'),(4113,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:21.408'),(4114,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:21.409'),(4115,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:24.274'),(4116,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:24.275'),(4117,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:25.250'),(4118,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:21:25.251'),(4119,8,'GET /api/contests/works/3','{\"method\":\"GET\",\"url\":\"/api/contests/works/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:00.596'),(4120,8,'GET /api/contests/works/3','{\"method\":\"GET\",\"url\":\"/api/contests/works/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:00.614'),(4121,8,'GET /api/contests/reviews/work/3/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/3/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:00.620'),(4122,8,'GET /api/contests/reviews/work/3/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/3/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:00.630'),(4123,8,'PATCH /api/contests/results/work/3/award','{\"method\":\"PATCH\",\"url\":\"/api/contests/results/work/3/award\",\"query\":{},\"body\":{\"awardLevel\":\"三等奖\",\"awardName\":\"三等奖\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:14.474'),(4124,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:14.509'),(4125,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:14.510'),(4126,8,'PATCH /api/contests/results/work/2/award','{\"method\":\"PATCH\",\"url\":\"/api/contests/results/work/2/award\",\"query\":{},\"body\":{\"awardLevel\":\"一等奖\",\"awardName\":\"一等奖\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:22.422'),(4127,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:22.449'),(4128,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:22.450'),(4129,8,'PATCH /api/contests/results/work/1/award','{\"method\":\"PATCH\",\"url\":\"/api/contests/results/work/1/award\",\"query\":{},\"body\":{\"awardLevel\":\"三等奖\",\"awardName\":\"三等奖\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:27.264'),(4130,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:27.290'),(4131,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:22:27.291'),(4132,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:23:35.117'),(4133,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:23:35.117'),(4134,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:24:05.454'),(4135,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:24:05.455'),(4136,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:24:05.472'),(4137,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:24:05.488'),(4138,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:24:05.639'),(4139,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:24:05.639'),(4140,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:24:56.811'),(4141,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:24:56.811'),(4142,8,'PATCH /api/contests/results/work/1/award','{\"method\":\"PATCH\",\"url\":\"/api/contests/results/work/1/award\",\"query\":{},\"body\":{\"awardLevel\":\"一等奖\",\"awardName\":\"一等奖\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:39.300'),(4143,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:39.329'),(4144,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:39.330'),(4145,8,'PATCH /api/contests/results/work/3/award','{\"method\":\"PATCH\",\"url\":\"/api/contests/results/work/3/award\",\"query\":{},\"body\":{\"awardLevel\":\"二等奖\",\"awardName\":\"二等奖\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:42.898'),(4146,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:42.926'),(4147,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:42.927'),(4148,8,'PATCH /api/contests/results/work/2/award','{\"method\":\"PATCH\",\"url\":\"/api/contests/results/work/2/award\",\"query\":{},\"body\":{\"awardLevel\":\"三等奖\",\"awardName\":\"三等奖\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:46.632'),(4149,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:46.658'),(4150,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:46.658'),(4151,8,'POST /api/contests/results/4/publish','{\"method\":\"POST\",\"url\":\"/api/contests/results/4/publish\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:48.595'),(4152,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:48.620'),(4153,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:48.620'),(4154,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:55.878'),(4155,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:55.881'),(4156,8,'GET /api/contests/notices/contest/4','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:58.124'),(4157,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:58.125'),(4158,8,'GET /api/contests/registrations?contestId=4&userId=8&page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=4&userId=8&page=1&pageSize=1\",\"query\":{\"contestId\":\"4\",\"userId\":\"8\",\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:25:58.141'),(4159,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:26:00.021'),(4160,8,'GET /api/tenants/my-tenant','{\"method\":\"GET\",\"url\":\"/api/tenants/my-tenant\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:26:11.117'),(4161,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:38:51.157'),(4162,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:10.603'),(4163,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:10.616'),(4164,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:10.620'),(4165,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:10.630'),(4166,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:10.809'),(4167,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:10.811'),(4168,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:10.814'),(4169,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:15.081'),(4170,8,'GET /api/contests/notices/contest/2','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/2\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:26.805'),(4171,8,'GET /api/contests/2','{\"method\":\"GET\",\"url\":\"/api/contests/2\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:26.806'),(4172,8,'GET /api/contests/registrations?contestId=2&userId=8&page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=2&userId=8&page=1&pageSize=1\",\"query\":{\"contestId\":\"2\",\"userId\":\"8\",\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:26.818'),(4173,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:28.877'),(4174,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:28.878'),(4175,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:28.891'),(4176,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:28.901'),(4177,8,'GET /api/contests/2','{\"method\":\"GET\",\"url\":\"/api/contests/2\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:29.011'),(4178,8,'GET /api/contests/notices/contest/2','{\"method\":\"GET\",\"url\":\"/api/contests/notices/contest/2\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:29.011'),(4179,8,'GET /api/contests/registrations?contestId=2&userId=8&page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?contestId=2&userId=8&page=1&pageSize=1\",\"query\":{\"contestId\":\"2\",\"userId\":\"8\",\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:29.023'),(4180,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:39:30.695'),(4181,8,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:27.383'),(4182,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:27.387'),(4183,8,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:28.588'),(4184,8,'GET /api/contests?contestName=&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:29.460'),(4185,8,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:29.461'),(4186,8,'GET /api/contests/registrations/stats?contestId=3','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=3\",\"query\":{\"contestId\":\"3\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:29.482'),(4187,8,'GET /api/contests/registrations/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:29.482'),(4188,8,'GET /api/contests/registrations/stats?contestId=2','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=2\",\"query\":{\"contestId\":\"2\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:29.486'),(4189,8,'GET /api/contests/registrations/stats?contestId=5','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=5\",\"query\":{\"contestId\":\"5\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:29.490'),(4190,8,'GET /api/contests/registrations/stats?contestId=6','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=6\",\"query\":{\"contestId\":\"6\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:29.492'),(4191,8,'GET /api/contests/registrations/stats?contestId=1','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats?contestId=1\",\"query\":{\"contestId\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:29.493'),(4192,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:30.570'),(4193,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:30.571'),(4194,8,'GET /api/contests/works/stats?contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats?contestId=4\",\"query\":{\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:33.089'),(4195,8,'GET /api/contests/works?page=1&pageSize=10&contestId=4','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10&contestId=4\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"contestId\":\"4\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:33.091'),(4196,8,'GET /api/contests/4','{\"method\":\"GET\",\"url\":\"/api/contests/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:33.092'),(4197,8,'GET /api/contests/works/3','{\"method\":\"GET\",\"url\":\"/api/contests/works/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:35.168'),(4198,8,'GET /api/contests/works/3','{\"method\":\"GET\",\"url\":\"/api/contests/works/3\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:35.178'),(4199,8,'GET /api/contests/reviews/work/3/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/3/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:35.182'),(4200,8,'GET /api/contests/reviews/work/3/scores','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/work/3/scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:35.188'),(4201,8,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:39.830'),(4202,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:39.830'),(4203,8,'GET /api/contests/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:40.363'),(4204,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:41.500'),(4205,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:41.501'),(4206,8,'GET /api/contests/notices?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/notices?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:42.690'),(4207,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:45.116'),(4208,8,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:45.117'),(4209,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:46.630'),(4210,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:46.631'),(4211,8,'POST /api/contests/results/4/unpublish','{\"method\":\"POST\",\"url\":\"/api/contests/results/4/unpublish\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:51.343'),(4212,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:51.375'),(4213,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:51.376'),(4214,8,'POST /api/contests/results/4/calculate-scores','{\"method\":\"POST\",\"url\":\"/api/contests/results/4/calculate-scores\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:54.035'),(4215,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:54.069'),(4216,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:54.070'),(4217,8,'POST /api/contests/results/4/calculate-rankings','{\"method\":\"POST\",\"url\":\"/api/contests/results/4/calculate-rankings\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:55.390'),(4218,8,'GET /api/contests/results/4/summary','{\"method\":\"GET\",\"url\":\"/api/contests/results/4/summary\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:55.419'),(4219,8,'GET /api/contests/results/4?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/results/4?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:43:55.420'),(4220,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:04.384'),(4221,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:06.476'),(4222,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:06.629'),(4223,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:06.630'),(4224,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:06.631'),(4225,1,'GET /api/contests/registrations/stats','{\"method\":\"GET\",\"url\":\"/api/contests/registrations/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:08.712'),(4226,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:08.712'),(4227,1,'GET /api/contests/registrations?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/registrations?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:08.713'),(4228,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:09.088'),(4229,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:09.088'),(4230,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:09.088'),(4231,1,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:09.492'),(4232,1,'GET /api/contests/works?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests/works?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:09.493'),(4233,1,'GET /api/contests/works/stats','{\"method\":\"GET\",\"url\":\"/api/contests/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:09.495'),(4234,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:11.166'),(4235,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:11.168'),(4236,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:14.152'),(4237,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:14.153'),(4238,1,'GET /api/tags/categories','{\"method\":\"GET\",\"url\":\"/api/tags/categories\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:14.542'),(4239,1,'GET /api/tags','{\"method\":\"GET\",\"url\":\"/api/tags\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:14.542'),(4240,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:15.803'),(4241,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:15.801'),(4242,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:17.809'),(4243,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:17.810'),(4244,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:18.486'),(4245,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:18.486'),(4246,1,'GET /api/content-review/management/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/management/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:20.078'),(4247,1,'GET /api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=published,taken_down&sortBy=latest\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"published,taken_down\",\"sortBy\":\"latest\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:20.078'),(4248,1,'GET /api/content-review/works?page=1&pageSize=10&status=pending_review','{\"method\":\"GET\",\"url\":\"/api/content-review/works?page=1&pageSize=10&status=pending_review\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"status\":\"pending_review\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:20.613'),(4249,1,'GET /api/content-review/works/stats','{\"method\":\"GET\",\"url\":\"/api/content-review/works/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:20.614'),(4250,1,'GET /api/content-review/works/11','{\"method\":\"GET\",\"url\":\"/api/content-review/works/11\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:27.071'),(4251,1,'GET /api/content-review/logs?workId=11&pageSize=50','{\"method\":\"GET\",\"url\":\"/api/content-review/logs?workId=11&pageSize=50\",\"query\":{\"workId\":\"11\",\"pageSize\":\"50\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:27.073'),(4252,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:38.367'),(4253,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:44.038'),(4254,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:44:50.767'),(4255,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:06.729'),(4256,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:06.731'),(4257,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:15.906'),(4258,9,'GET /api/public/mine/children','{\"method\":\"GET\",\"url\":\"/api/public/mine/children\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:21.656'),(4259,9,'GET /api/public/activities/3/my-registration','{\"method\":\"GET\",\"url\":\"/api/public/activities/3/my-registration\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:21.659'),(4260,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:30.560'),(4261,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[4,2,5,7,6,1,3,9]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:34.712'),(4262,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:35.592'),(4263,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[4,2,5,7,6,1,3,9]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:36.201'),(4264,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:36.840'),(4265,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[4,2,5,7,6,1,3,9]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:37.351'),(4266,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:46.733'),(4267,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:52.488'),(4268,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:52.490'),(4269,9,'GET /api/public/mine/favorites?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/mine/favorites?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:55.056'),(4270,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:56.576'),(4271,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:45:56.577'),(4272,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:03.142'),(4273,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:04.418'),(4274,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:04.419'),(4275,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:08.772'),(4276,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:08.919'),(4277,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:08.920'),(4278,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:08.922'),(4279,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:11.056'),(4280,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:11.058'),(4281,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:11.062'),(4282,1,'GET /api/users?page=1&pageSize=10&userType=platform','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=platform\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"platform\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:13.404'),(4283,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:14.937'),(4284,1,'GET /api/users?page=1&pageSize=10&userType=judge','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=judge\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"judge\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:16.262'),(4285,1,'GET /api/users?page=1&pageSize=10&userType=public','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=public\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"public\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:17.361'),(4286,1,'GET /api/users/14','{\"method\":\"GET\",\"url\":\"/api/users/14\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:23.351'),(4287,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:23.571'),(4288,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:23.577'),(4289,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:23.589'),(4290,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:23.596'),(4291,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:23.736'),(4292,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:23.738'),(4293,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:23.742'),(4294,1,'GET /api/users/18','{\"method\":\"GET\",\"url\":\"/api/users/18\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:25.360'),(4295,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:46.705'),(4296,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:46.710'),(4297,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:48.963'),(4298,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:46:48.980'),(4299,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:02.812'),(4300,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:05.432'),(4301,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:05.538'),(4302,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:06.582'),(4303,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:07.059'),(4304,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:08.575'),(4305,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 11:47:20.533'),(4306,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:22.767'),(4307,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:22.932'),(4308,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:22.933'),(4309,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:22.934'),(4310,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:24.370'),(4311,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:47:24.372'),(4312,8,'GET /api/analytics/overview','{\"method\":\"GET\",\"url\":\"/api/analytics/overview\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 11:47:46.866'),(4313,8,'GET /api/analytics/review','{\"method\":\"GET\",\"url\":\"/api/analytics/review\",\"query\":{},\"body\":{}}','::1','curl/8.7.1','2026-03-31 11:48:13.487'),(4314,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:23.656'),(4315,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:33.703'),(4316,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:33.862'),(4317,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:33.863'),(4318,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:33.864'),(4319,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:35.316'),(4320,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:35.320'),(4321,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:36.582'),(4322,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:36.600'),(4323,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:42.827'),(4324,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:42.830'),(4325,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:42.836'),(4326,1,'GET /api/users?page=1&pageSize=10&userType=org','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10&userType=org\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\",\"userType\":\"org\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:44.401'),(4327,1,'GET /api/users/8','{\"method\":\"GET\",\"url\":\"/api/users/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:48:48.439'),(4328,1,'PATCH /api/users/8','{\"method\":\"PATCH\",\"url\":\"/api/users/8\",\"query\":{},\"body\":{\"password\":\"***\"}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:49:03.199'),(4329,1,'GET /api/users/8','{\"method\":\"GET\",\"url\":\"/api/users/8\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:49:08.109'),(4330,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:55:33.668'),(4331,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:26.074'),(4332,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:26.281'),(4333,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:26.287'),(4334,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:26.294'),(4335,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:31.581'),(4336,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:33.386'),(4337,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:33.499'),(4338,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:38.108'),(4339,8,'GET /api/analytics/overview','{\"method\":\"GET\",\"url\":\"/api/analytics/overview\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:38.134'),(4340,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:38.215'),(4341,8,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:38.222'),(4342,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:38.223'),(4343,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:38.231'),(4344,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:38.363'),(4345,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:40.150'),(4346,8,'GET /api/analytics/overview','{\"method\":\"GET\",\"url\":\"/api/analytics/overview\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:40.152'),(4347,8,'GET /api/analytics/review','{\"method\":\"GET\",\"url\":\"/api/analytics/review\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:41.308'),(4348,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:41.309'),(4349,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:43.058'),(4350,8,'GET /api/analytics/overview','{\"method\":\"GET\",\"url\":\"/api/analytics/overview\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:43.059'),(4351,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:50.216'),(4352,8,'GET /api/analytics/review','{\"method\":\"GET\",\"url\":\"/api/analytics/review\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:50.216'),(4353,8,'GET /api/analytics/overview','{\"method\":\"GET\",\"url\":\"/api/analytics/overview\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:55.372'),(4354,8,'GET /api/contests?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:57:55.373'),(4355,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 11:58:04.465'),(4356,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-03-31 12:01:31.655'),(4357,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:08.382'),(4358,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:09.063'),(4359,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:09.067'),(4360,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:09.073'),(4361,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:13.144'),(4362,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:13.147'),(4363,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:16.316'),(4364,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:18.290'),(4365,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:18.490'),(4366,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:26.458'),(4367,6,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:28.561'),(4368,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:28.723'),(4369,6,'GET /api/contests/preset-comments/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/preset-comments/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:32.527'),(4370,6,'GET /api/contests/reviews/judge/contests','{\"method\":\"GET\",\"url\":\"/api/contests/reviews/judge/contests\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:33.588'),(4371,6,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:35.452'),(4372,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:42.058'),(4373,9,'GET /api/public/works?page=1&pageSize=12','{\"method\":\"GET\",\"url\":\"/api/public/works?page=1&pageSize=12\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:43.961'),(4374,9,'POST /api/public/works/batch-interaction','{\"method\":\"POST\",\"url\":\"/api/public/works/batch-interaction\",\"query\":{},\"body\":{\"workIds\":[9,7,6,5,4,3,2,1]}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:39:45.325'),(4375,9,'GET /api/public/mine/profile','{\"method\":\"GET\",\"url\":\"/api/public/mine/profile\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:40:27.597'),(4376,9,'GET /api/public/mine/registrations?page=1&pageSize=1','{\"method\":\"GET\",\"url\":\"/api/public/mine/registrations?page=1&pageSize=1\",\"query\":{\"page\":\"1\",\"pageSize\":\"1\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:40:27.601'),(4377,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:44.900'),(4378,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:45.267'),(4379,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:45.271'),(4380,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:45.278'),(4381,1,'GET /api/permissions?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:49.028'),(4382,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:52.642'),(4383,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:52.648'),(4384,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:55.001'),(4385,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:41:55.042'),(4386,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:08.320'),(4387,1,'GET /api/menus/34','{\"method\":\"GET\",\"url\":\"/api/menus/34\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:11.356'),(4388,1,'GET /api/permissions?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:14.462'),(4389,1,'GET /api/permissions/466','{\"method\":\"GET\",\"url\":\"/api/permissions/466\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:19.411'),(4390,1,'GET /api/permissions/466','{\"method\":\"GET\",\"url\":\"/api/permissions/466\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:30.790'),(4391,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:37.572'),(4392,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:37.579'),(4393,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:39.410'),(4394,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:42:39.447'),(4395,1,'GET /api/users/stats','{\"method\":\"GET\",\"url\":\"/api/users/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:03.418'),(4396,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:03.419'),(4397,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:03.426'),(4398,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:04.940'),(4399,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:04.941'),(4400,1,'GET /api/roles/1','{\"method\":\"GET\",\"url\":\"/api/roles/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:06.748'),(4401,1,'GET /api/permissions?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:16.917'),(4402,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:25.746'),(4403,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:25.747'),(4404,1,'GET /api/roles/1','{\"method\":\"GET\",\"url\":\"/api/roles/1\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:43:27.902'),(4405,1,'GET /api/permissions?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:05.166'),(4406,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:20.347'),(4407,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:20.351'),(4408,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:24.944'),(4409,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:24.946'),(4410,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:26.395'),(4411,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:26.432'),(4412,1,'PATCH /api/tenants/9','{\"method\":\"PATCH\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{\"name\":\"广东省立中山图书馆\",\"code\":\"gdlib\",\"description\":\"广东省图少儿绘本创作活动主办方\",\"validState\":1,\"menuIds\":[50,52,53,54,9,10,23,11,12,25,26,24,27,14,51,15,16,20,47,48,49]}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:40.558'),(4413,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:40.704'),(4414,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:43.907'),(4415,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:45.697'),(4416,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:45.935'),(4417,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:53.305'),(4418,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:55.239'),(4419,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:55.542'),(4420,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:55.543'),(4421,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:44:55.549'),(4422,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:25.400'),(4423,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:25.405'),(4424,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:27.356'),(4425,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:27.399'),(4426,1,'PATCH /api/tenants/9','{\"method\":\"PATCH\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{\"name\":\"广东省立中山图书馆\",\"code\":\"gdlib\",\"description\":\"广东省图少儿绘本创作活动主办方\",\"validState\":1,\"menuIds\":[50,52,53,54,46,47,48,49,9,10,23,11,12,25,26,24,27,14,51,15,16,20,38,39,40,41,42,43,44,45]}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:34.053'),(4427,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:34.198'),(4428,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:36.515'),(4429,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:38.273'),(4430,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:38.467'),(4431,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:49.744'),(4432,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:51.544'),(4433,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:51.941'),(4434,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:51.941'),(4435,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:51.946'),(4436,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:54.382'),(4437,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:54.383'),(4438,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:56.399'),(4439,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:45:56.441'),(4440,1,'PATCH /api/tenants/9','{\"method\":\"PATCH\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{\"name\":\"广东省立中山图书馆\",\"code\":\"gdlib\",\"description\":\"广东省图少儿绘本创作活动主办方\",\"validState\":1,\"menuIds\":[50,37,52,53,54,46,9,10,23,11,12,25,26,24,27,14,51,15,16,20,35,36]}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:08.503'),(4441,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:08.647'),(4442,1,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:11.532'),(4443,8,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:13.490'),(4444,8,'GET /api/contests/dashboard','{\"method\":\"GET\",\"url\":\"/api/contests/dashboard\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:13.656'),(4445,8,'POST /api/auth/logout','{\"method\":\"POST\",\"url\":\"/api/auth/logout\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:41.863'),(4446,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:44.205'),(4447,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:44.573'),(4448,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:44.573'),(4449,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:44.578'),(4450,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:46.562'),(4451,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:46.566'),(4452,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:47.933'),(4453,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:46:48.021'),(4454,1,'GET /api/tenants/9','{\"method\":\"GET\",\"url\":\"/api/tenants/9\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:50:16.171'),(4455,1,'GET /api/tenants/9/menus','{\"method\":\"GET\",\"url\":\"/api/tenants/9/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:50:16.256'),(4456,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:52:38.736'),(4457,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 08:52:38.738'),(4458,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-04-01 09:07:56.945'),(4459,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-04-01 09:07:57.146'),(4460,1,'GET /api/contests/stats','{\"method\":\"GET\",\"url\":\"/api/contests/stats\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-04-01 09:07:57.147'),(4461,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-04-01 09:07:57.153'),(4462,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-04-01 09:08:01.253'),(4463,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-04-01 09:08:01.257'),(4464,1,'GET /api/permissions?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36','2026-04-01 09:48:11.104'),(4465,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 09:51:10.299'),(4466,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 09:51:11.659'),(4467,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36','2026-04-01 09:51:11.660'); -/*!40000 ALTER TABLE `logs` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `menus` --- - -DROP TABLE IF EXISTS `menus`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `menus` ( - `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `path` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `icon` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `component` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `parent_id` int DEFAULT NULL, - `permission` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `sort` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `menus_parent_id_fkey` (`parent_id`), - KEY `menus_creator_fkey` (`creator`), - KEY `menus_modifier_fkey` (`modifier`), - CONSTRAINT `menus_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `menus_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `menus_parent_id_fkey` FOREIGN KEY (`parent_id`) REFERENCES `menus` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `menus` --- - -LOCK TABLES `menus` WRITE; -/*!40000 ALTER TABLE `menus` DISABLE KEYS */; -INSERT INTO `menus` VALUES (1,'工作台','/workbench','DashboardOutlined','workbench/Index',NULL,NULL,1,1,NULL,NULL,'2026-03-23 06:14:42.082','2026-03-23 06:14:42.082'),(2,'学校管理','/school','BankOutlined',NULL,NULL,NULL,5,1,NULL,NULL,'2026-03-23 06:14:42.084','2026-03-23 06:14:42.084'),(3,'学校信息','/school/schools','BankOutlined','school/schools/Index',2,'school:read',1,1,NULL,NULL,'2026-03-23 06:14:42.086','2026-03-23 06:14:42.086'),(4,'部门管理','/school/departments','ApartmentOutlined','school/departments/Index',2,'department:read',2,1,NULL,NULL,'2026-03-23 06:14:42.088','2026-03-23 06:14:42.088'),(5,'年级管理','/school/grades','AppstoreOutlined','school/grades/Index',2,'grade:read',3,1,NULL,NULL,'2026-03-23 06:14:42.089','2026-03-23 06:14:42.089'),(6,'班级管理','/school/classes','TeamOutlined','school/classes/Index',2,'class:read',4,1,NULL,NULL,'2026-03-23 06:14:42.091','2026-03-23 06:14:42.091'),(7,'教师管理','/school/teachers','UserOutlined','school/teachers/Index',2,'teacher:read',5,1,NULL,NULL,'2026-03-23 06:14:42.092','2026-03-23 06:14:42.092'),(8,'学生管理','/school/students','UsergroupAddOutlined','school/students/Index',2,'student:read',6,1,NULL,NULL,'2026-03-23 06:14:42.093','2026-03-23 06:14:42.093'),(9,'活动管理','/contests','TrophyOutlined',NULL,NULL,NULL,6,1,NULL,NULL,'2026-03-23 06:14:42.094','2026-03-23 06:14:42.094'),(10,'活动列表','/contests/list','UnorderedListOutlined','contests/Index',9,'contest:read',1,1,NULL,NULL,'2026-03-23 06:14:42.095','2026-03-23 06:14:42.095'),(11,'报名管理','/contests/registrations','FormOutlined','contests/registrations/Index',9,'contest:registration:read',3,1,NULL,NULL,'2026-03-23 06:14:42.096','2026-03-23 06:14:42.096'),(12,'作品管理','/contests/works','FileTextOutlined','contests/works/Index',9,'contest:work:read',4,1,NULL,NULL,'2026-03-23 06:14:42.097','2026-03-23 06:14:42.097'),(14,'系统设置','/system','SettingOutlined',NULL,NULL,NULL,9,1,NULL,NULL,'2026-03-23 06:14:42.099','2026-03-23 06:14:42.099'),(15,'用户管理','/system/users','UserOutlined','system/users/Index',14,'user:read',1,1,NULL,NULL,'2026-03-23 06:14:42.100','2026-03-23 06:14:42.100'),(16,'角色管理','/system/roles','TeamOutlined','system/roles/Index',14,'role:read',2,1,NULL,NULL,'2026-03-23 06:14:42.101','2026-03-23 06:14:42.101'),(17,'菜单管理','/system/menus','MenuOutlined','system/menus/Index',14,'menu:read',3,1,NULL,NULL,'2026-03-23 06:14:42.102','2026-03-23 06:14:42.102'),(18,'数据字典','/system/dict','BookOutlined','system/dict/Index',14,'dict:read',4,1,NULL,NULL,'2026-03-23 06:14:42.103','2026-03-23 06:14:42.103'),(19,'系统配置','/system/config','ToolOutlined','system/config/Index',14,'config:read',5,1,NULL,NULL,'2026-03-23 06:14:42.104','2026-03-23 06:14:42.104'),(20,'日志记录','/system/logs','FileTextOutlined','system/logs/Index',14,'log:read',6,1,NULL,NULL,'2026-03-23 06:14:42.105','2026-03-23 06:14:42.105'),(21,'权限管理','/system/permissions','SafetyOutlined','system/permissions/Index',14,NULL,7,1,NULL,NULL,'2026-03-23 18:09:02.000','2026-03-23 18:09:02.000'),(22,'租户管理','/system/tenants','BankOutlined','system/tenants/Index',14,NULL,8,1,NULL,NULL,'2026-03-23 18:09:02.000','2026-03-23 18:09:02.000'),(23,'评委管理','/contests/judges','UserSwitchOutlined','contests/judges/Index',9,'judge:read',2,1,NULL,NULL,'2026-03-23 18:09:28.000','2026-03-23 18:09:28.000'),(24,'成果发布','/contests/results','TrophyOutlined','contests/results/Index',9,'result:read',7,1,NULL,NULL,'2026-03-23 18:09:28.000','2026-03-23 18:09:28.000'),(25,'评审进度','/contests/review-progress','DashboardOutlined','contests/reviews/Progress',9,'review:progress:read',5,1,NULL,NULL,'2026-03-23 19:36:05.000','2026-03-23 19:36:05.000'),(26,'评审规则','/contests/review-rules','SettingOutlined','contests/ReviewRules',9,'review:rule:read',6,1,NULL,NULL,'2026-03-23 19:36:05.000','2026-03-23 19:36:05.000'),(27,'活动公告','/contests/notices','NotificationOutlined','contests/notices/Index',9,'contest:notice:read',8,1,NULL,NULL,'2026-03-23 19:36:05.000','2026-03-27 13:07:49.305'),(28,'机构管理','/organization','BankOutlined',NULL,NULL,NULL,7,1,NULL,NULL,'2026-03-24 14:12:58.000','2026-03-24 14:12:58.000'),(29,'用户中心','/users-center','TeamOutlined',NULL,NULL,NULL,8,1,NULL,NULL,'2026-03-24 14:12:58.000','2026-03-24 14:12:58.000'),(30,'机构管理','/system/tenants','UnorderedListOutlined','system/tenants/Index',28,'tenant:read',1,1,NULL,NULL,'2026-03-24 14:12:58.000','2026-03-24 14:12:58.000'),(32,'平台用户','/system/users','UserSwitchOutlined','system/users/Index',29,'user:read',2,1,NULL,NULL,'2026-03-24 14:12:58.000','2026-03-24 14:12:58.000'),(33,'角色管理','/system/roles','SafetyOutlined','system/roles/Index',29,'role:read',3,1,NULL,NULL,'2026-03-24 14:12:58.000','2026-03-24 14:12:58.000'),(34,'我的评审','/activities','AuditOutlined',NULL,NULL,NULL,2,1,NULL,NULL,'2026-03-24 14:17:20.000','2026-03-24 14:17:20.000'),(35,'评审任务','/activities/review','FileSearchOutlined','activities/Review',34,'review:score',1,1,NULL,NULL,'2026-03-24 14:17:20.000','2026-03-24 14:17:20.000'),(36,'预设评语','/activities/preset-comments','MessageOutlined','activities/PresetComments',34,'review:score',2,1,NULL,NULL,'2026-03-24 14:17:20.000','2026-03-24 14:17:20.000'),(37,'活动监管','/contests','FundViewOutlined',NULL,NULL,NULL,3,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-24 14:28:32.000'),(38,'全部活动','/contests/list','UnorderedListOutlined','contests/Index',37,'contest:read',1,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-24 14:28:32.000'),(39,'报名数据','/contests/registrations','UserAddOutlined','contests/registrations/Index',37,'contest:registration:read',2,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-24 14:28:32.000'),(40,'作品数据','/contests/works','FileTextOutlined','contests/works/Index',37,'contest:work:read',3,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-24 14:28:32.000'),(41,'评审进度','/contests/review-progress','DashboardOutlined','contests/reviews/Progress',37,'review:progress:read',4,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-24 14:28:32.000'),(42,'评委管理','/contests/judges','SolutionOutlined','contests/judges/Index',37,'judge:read',5,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-24 14:28:32.000'),(43,'评审规则','/contests/review-rules','CheckCircleOutlined','contests/reviews/Index',37,'review:rule:read',6,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-24 14:28:32.000'),(44,'活动成果','/contests/results','TrophyOutlined','contests/results/Index',37,'result:read',7,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-27 13:05:22.735'),(45,'通知管理','/contests/notices','BellOutlined','contests/notices/Index',37,'contest:notice:read',8,1,NULL,NULL,'2026-03-24 14:28:32.000','2026-03-24 14:28:32.000'),(46,'内容管理','/content','PictureOutlined',NULL,NULL,NULL,5,1,NULL,NULL,'2026-03-27 14:12:28.373','2026-03-27 14:12:28.373'),(47,'作品审核','/content/review',NULL,'content/WorkReview',46,'content:review',1,1,NULL,NULL,'2026-03-27 14:12:28.374','2026-03-27 14:12:28.374'),(48,'作品管理','/content/management',NULL,'content/WorkManagement',46,'content:manage',2,1,NULL,NULL,'2026-03-27 14:12:28.375','2026-03-27 14:12:28.375'),(49,'标签管理','/content/tags',NULL,'content/TagManagement',46,'content:tags',3,1,NULL,NULL,'2026-03-27 14:12:28.376','2026-03-27 14:12:28.376'),(50,'工作台','/workbench','DashboardOutlined','workbench/TenantDashboard',NULL,'contest:read',0,1,NULL,NULL,'2026-03-31 15:51:02.257','2026-03-31 15:51:02.000'),(51,'机构信息','/system/tenant-info','BankOutlined','system/tenant-info/Index',14,'user:read',0,1,NULL,NULL,'2026-03-31 15:53:13.380','2026-03-31 15:53:13.000'),(52,'数据统计','/analytics','BarChartOutlined',NULL,NULL,NULL,4,1,NULL,NULL,'2026-03-31 19:46:36.891','2026-03-31 19:46:36.000'),(53,'运营概览','/analytics/overview','FundOutlined','analytics/Overview',52,'contest:read',1,1,NULL,NULL,'2026-03-31 19:46:36.892','2026-03-31 19:46:36.000'),(54,'评审分析','/analytics/review','PieChartOutlined','analytics/Review',52,'contest:read',2,1,NULL,NULL,'2026-03-31 19:46:36.892','2026-03-31 19:46:36.000'); -/*!40000 ALTER TABLE `menus` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `permissions` --- - -DROP TABLE IF EXISTS `permissions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `permissions` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `resource` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `action` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `permissions_tenant_id_resource_action_key` (`tenant_id`,`resource`,`action`), - UNIQUE KEY `permissions_tenant_id_code_key` (`tenant_id`,`code`), - KEY `permissions_creator_fkey` (`creator`), - KEY `permissions_modifier_fkey` (`modifier`), - CONSTRAINT `permissions_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `permissions_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `permissions_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=551 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `permissions` --- - -LOCK TABLES `permissions` WRITE; -/*!40000 ALTER TABLE `permissions` DISABLE KEYS */; -INSERT INTO `permissions` VALUES (143,4,'查看工作台','workbench:read','workbench','read','允许查看工作台',1,NULL,NULL,'2026-03-23 09:29:48.587','2026-03-23 09:29:48.587'),(144,4,'创建用户','user:create','user','create','允许创建新用户',1,NULL,NULL,'2026-03-23 09:29:48.588','2026-03-23 09:29:48.588'),(145,4,'查看用户','user:read','user','read','允许查看用户列表和详情',1,NULL,NULL,'2026-03-23 09:29:48.589','2026-03-23 09:29:48.589'),(146,4,'更新用户','user:update','user','update','允许更新用户信息',1,NULL,NULL,'2026-03-23 09:29:48.590','2026-03-23 09:29:48.590'),(147,4,'删除用户','user:delete','user','delete','允许删除用户',1,NULL,NULL,'2026-03-23 09:29:48.591','2026-03-23 09:29:48.591'),(148,4,'创建角色','role:create','role','create','允许创建新角色',1,NULL,NULL,'2026-03-23 09:29:48.592','2026-03-23 09:29:48.592'),(149,4,'查看角色','role:read','role','read','允许查看角色列表和详情',1,NULL,NULL,'2026-03-23 09:29:48.593','2026-03-23 09:29:48.593'),(150,4,'更新角色','role:update','role','update','允许更新角色信息',1,NULL,NULL,'2026-03-23 09:29:48.594','2026-03-23 09:29:48.594'),(151,4,'删除角色','role:delete','role','delete','允许删除角色',1,NULL,NULL,'2026-03-23 09:29:48.594','2026-03-23 09:29:48.594'),(152,4,'分配角色','role:assign','role','assign','允许给用户分配角色',1,NULL,NULL,'2026-03-23 09:29:48.595','2026-03-23 09:29:48.595'),(153,4,'查看权限','permission:read','permission','read','允许查看权限列表',1,NULL,NULL,'2026-03-23 09:29:48.596','2026-03-23 09:29:48.596'),(154,4,'创建学校','school:create','school','create','允许创建学校信息',1,NULL,NULL,'2026-03-23 09:29:48.597','2026-03-23 09:29:48.597'),(155,4,'查看学校','school:read','school','read','允许查看学校信息',1,NULL,NULL,'2026-03-23 09:29:48.598','2026-03-23 09:29:48.598'),(156,4,'更新学校','school:update','school','update','允许更新学校信息',1,NULL,NULL,'2026-03-23 09:29:48.599','2026-03-23 09:29:48.599'),(157,4,'删除学校','school:delete','school','delete','允许删除学校信息',1,NULL,NULL,'2026-03-23 09:29:48.599','2026-03-23 09:29:48.599'),(158,4,'创建部门','department:create','department','create','允许创建部门',1,NULL,NULL,'2026-03-23 09:29:48.601','2026-03-23 09:29:48.601'),(159,4,'查看部门','department:read','department','read','允许查看部门列表',1,NULL,NULL,'2026-03-23 09:29:48.601','2026-03-23 09:29:48.601'),(160,4,'更新部门','department:update','department','update','允许更新部门信息',1,NULL,NULL,'2026-03-23 09:29:48.602','2026-03-23 09:29:48.602'),(161,4,'删除部门','department:delete','department','delete','允许删除部门',1,NULL,NULL,'2026-03-23 09:29:48.603','2026-03-23 09:29:48.603'),(162,4,'创建年级','grade:create','grade','create','允许创建年级',1,NULL,NULL,'2026-03-23 09:29:48.604','2026-03-23 09:29:48.604'),(163,4,'查看年级','grade:read','grade','read','允许查看年级列表',1,NULL,NULL,'2026-03-23 09:29:48.604','2026-03-23 09:29:48.604'),(164,4,'更新年级','grade:update','grade','update','允许更新年级信息',1,NULL,NULL,'2026-03-23 09:29:48.605','2026-03-23 09:29:48.605'),(165,4,'删除年级','grade:delete','grade','delete','允许删除年级',1,NULL,NULL,'2026-03-23 09:29:48.606','2026-03-23 09:29:48.606'),(166,4,'创建班级','class:create','class','create','允许创建班级',1,NULL,NULL,'2026-03-23 09:29:48.607','2026-03-23 09:29:48.607'),(167,4,'查看班级','class:read','class','read','允许查看班级列表',1,NULL,NULL,'2026-03-23 09:29:48.608','2026-03-23 09:29:48.608'),(168,4,'更新班级','class:update','class','update','允许更新班级信息',1,NULL,NULL,'2026-03-23 09:29:48.608','2026-03-23 09:29:48.608'),(169,4,'删除班级','class:delete','class','delete','允许删除班级',1,NULL,NULL,'2026-03-23 09:29:48.609','2026-03-23 09:29:48.609'),(170,4,'创建教师','teacher:create','teacher','create','允许创建教师',1,NULL,NULL,'2026-03-23 09:29:48.610','2026-03-23 09:29:48.610'),(171,4,'查看教师','teacher:read','teacher','read','允许查看教师列表',1,NULL,NULL,'2026-03-23 09:29:48.611','2026-03-23 09:29:48.611'),(172,4,'更新教师','teacher:update','teacher','update','允许更新教师信息',1,NULL,NULL,'2026-03-23 09:29:48.611','2026-03-23 09:29:48.611'),(173,4,'删除教师','teacher:delete','teacher','delete','允许删除教师',1,NULL,NULL,'2026-03-23 09:29:48.612','2026-03-23 09:29:48.612'),(174,4,'创建学生','student:create','student','create','允许创建学生',1,NULL,NULL,'2026-03-23 09:29:48.613','2026-03-23 09:29:48.613'),(175,4,'查看学生','student:read','student','read','允许查看学生列表',1,NULL,NULL,'2026-03-23 09:29:48.614','2026-03-23 09:29:48.614'),(176,4,'更新学生','student:update','student','update','允许更新学生信息',1,NULL,NULL,'2026-03-23 09:29:48.614','2026-03-23 09:29:48.614'),(177,4,'删除学生','student:delete','student','delete','允许删除学生',1,NULL,NULL,'2026-03-23 09:29:48.615','2026-03-23 09:29:48.615'),(178,4,'查看活动','activity:read','activity','read','允许查看活动',1,NULL,NULL,'2026-03-23 09:29:48.615','2026-03-23 09:29:48.615'),(179,4,'指导学生','activity:guidance','activity','guidance','允许指导学生参赛',1,NULL,NULL,'2026-03-23 09:29:48.616','2026-03-23 09:29:48.616'),(180,4,'创建报名','registration:create','registration','create','允许报名活动',1,NULL,NULL,'2026-03-23 09:29:48.616','2026-03-23 09:29:48.616'),(181,4,'查看报名','registration:read','registration','read','允许查看报名记录',1,NULL,NULL,'2026-03-23 09:29:48.617','2026-03-23 09:29:48.617'),(182,4,'更新报名','registration:update','registration','update','允许更新报名信息',1,NULL,NULL,'2026-03-23 09:29:48.617','2026-03-23 09:29:48.617'),(183,4,'取消报名','registration:delete','registration','delete','允许取消报名',1,NULL,NULL,'2026-03-23 09:29:48.618','2026-03-23 09:29:48.618'),(184,4,'审核报名','registration:approve','registration','approve','允许审核报名',1,NULL,NULL,'2026-03-23 09:29:48.618','2026-03-23 09:29:48.618'),(185,4,'上传作品','work:create','work','create','允许上传参赛作品',1,NULL,NULL,'2026-03-23 09:29:48.619','2026-03-23 09:29:48.619'),(186,4,'查看作品','work:read','work','read','允许查看参赛作品',1,NULL,NULL,'2026-03-23 09:29:48.619','2026-03-23 09:29:48.619'),(187,4,'更新作品','work:update','work','update','允许更新作品信息',1,NULL,NULL,'2026-03-23 09:29:48.620','2026-03-23 09:29:48.620'),(188,4,'删除作品','work:delete','work','delete','允许删除作品',1,NULL,NULL,'2026-03-23 09:29:48.620','2026-03-23 09:29:48.620'),(189,4,'提交作品','work:submit','work','submit','允许提交作品',1,NULL,NULL,'2026-03-23 09:29:48.621','2026-03-23 09:29:48.621'),(190,4,'查看公告','notice:read','notice','read','允许查看活动公告',1,NULL,NULL,'2026-03-23 09:29:48.621','2026-03-23 09:29:48.621'),(191,4,'创建评委','judge:create','judge','create','允许创建评委',1,NULL,NULL,'2026-03-23 09:29:48.622','2026-03-23 09:29:48.622'),(192,4,'查看评委','judge:read','judge','read','允许查看评委',1,NULL,NULL,'2026-03-23 09:29:48.622','2026-03-23 09:29:48.622'),(193,4,'更新评委','judge:update','judge','update','允许更新评委',1,NULL,NULL,'2026-03-23 09:29:48.623','2026-03-23 09:29:48.623'),(194,4,'删除评委','judge:delete','judge','delete','允许删除评委',1,NULL,NULL,'2026-03-23 09:29:48.623','2026-03-23 09:29:48.623'),(195,4,'分配评委','judge:assign','judge','assign','允许分配评委',1,NULL,NULL,'2026-03-23 09:29:48.624','2026-03-23 09:29:48.624'),(196,4,'创建评审','review:create','review','create','允许创建评审',1,NULL,NULL,'2026-03-23 09:29:48.624','2026-03-23 09:29:48.624'),(197,4,'查看评审','review:read','review','read','允许查看评审',1,NULL,NULL,'2026-03-23 09:29:48.625','2026-03-23 09:29:48.625'),(198,4,'更新评审','review:update','review','update','允许更新评审',1,NULL,NULL,'2026-03-23 09:29:48.625','2026-03-23 09:29:48.625'),(199,4,'删除评审','review:delete','review','delete','允许删除评审',1,NULL,NULL,'2026-03-23 09:29:48.625','2026-03-23 09:29:48.625'),(200,4,'创建作业','homework:create','homework','create','允许创建作业',1,NULL,NULL,'2026-03-23 09:29:48.626','2026-03-23 09:29:48.626'),(201,4,'查看作业','homework:read','homework','read','允许查看作业列表',1,NULL,NULL,'2026-03-23 09:29:48.626','2026-03-23 09:29:48.626'),(202,4,'更新作业','homework:update','homework','update','允许更新作业信息',1,NULL,NULL,'2026-03-23 09:29:48.627','2026-03-23 09:29:48.627'),(203,4,'删除作业','homework:delete','homework','delete','允许删除作业',1,NULL,NULL,'2026-03-23 09:29:48.627','2026-03-23 09:29:48.627'),(204,4,'发布作业','homework:publish','homework','publish','允许发布作业',1,NULL,NULL,'2026-03-23 09:29:48.628','2026-03-23 09:29:48.628'),(205,4,'提交作业','homework-submission:create','homework-submission','create','允许提交作业',1,NULL,NULL,'2026-03-23 09:29:48.628','2026-03-23 09:29:48.628'),(206,4,'查看作业提交','homework-submission:read','homework-submission','read','允许查看作业提交记录',1,NULL,NULL,'2026-03-23 09:29:48.629','2026-03-23 09:29:48.629'),(207,4,'更新作业提交','homework-submission:update','homework-submission','update','允许更新提交的作业',1,NULL,NULL,'2026-03-23 09:29:48.629','2026-03-23 09:29:48.629'),(208,4,'创建作业评审规则','homework-review-rule:create','homework-review-rule','create','允许创建作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.630','2026-03-23 09:29:48.630'),(209,4,'查看作业评审规则','homework-review-rule:read','homework-review-rule','read','允许查看作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.630','2026-03-23 09:29:48.630'),(210,4,'更新作业评审规则','homework-review-rule:update','homework-review-rule','update','允许更新作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.631','2026-03-23 09:29:48.631'),(211,4,'删除作业评审规则','homework-review-rule:delete','homework-review-rule','delete','允许删除作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.631','2026-03-23 09:29:48.631'),(212,4,'作业评分','homework-score:create','homework-score','create','允许对作业评分',1,NULL,NULL,'2026-03-23 09:29:48.632','2026-03-23 09:29:48.632'),(213,4,'查看作业评分','homework-score:read','homework-score','read','允许查看作业评分',1,NULL,NULL,'2026-03-23 09:29:48.632','2026-03-23 09:29:48.632'),(214,5,'查看工作台','workbench:read','workbench','read','允许查看工作台',1,NULL,NULL,'2026-03-23 09:29:48.701','2026-03-23 09:29:48.701'),(215,5,'创建用户','user:create','user','create','允许创建新用户',1,NULL,NULL,'2026-03-23 09:29:48.702','2026-03-23 09:29:48.702'),(216,5,'查看用户','user:read','user','read','允许查看用户列表和详情',1,NULL,NULL,'2026-03-23 09:29:48.703','2026-03-23 09:29:48.703'),(217,5,'更新用户','user:update','user','update','允许更新用户信息',1,NULL,NULL,'2026-03-23 09:29:48.704','2026-03-23 09:29:48.704'),(218,5,'删除用户','user:delete','user','delete','允许删除用户',1,NULL,NULL,'2026-03-23 09:29:48.704','2026-03-23 09:29:48.704'),(219,5,'创建角色','role:create','role','create','允许创建新角色',1,NULL,NULL,'2026-03-23 09:29:48.705','2026-03-23 09:29:48.705'),(220,5,'查看角色','role:read','role','read','允许查看角色列表和详情',1,NULL,NULL,'2026-03-23 09:29:48.706','2026-03-23 09:29:48.706'),(221,5,'更新角色','role:update','role','update','允许更新角色信息',1,NULL,NULL,'2026-03-23 09:29:48.706','2026-03-23 09:29:48.706'),(222,5,'删除角色','role:delete','role','delete','允许删除角色',1,NULL,NULL,'2026-03-23 09:29:48.707','2026-03-23 09:29:48.707'),(223,5,'分配角色','role:assign','role','assign','允许给用户分配角色',1,NULL,NULL,'2026-03-23 09:29:48.707','2026-03-23 09:29:48.707'),(224,5,'查看权限','permission:read','permission','read','允许查看权限列表',1,NULL,NULL,'2026-03-23 09:29:48.708','2026-03-23 09:29:48.708'),(225,5,'创建学校','school:create','school','create','允许创建学校信息',1,NULL,NULL,'2026-03-23 09:29:48.708','2026-03-23 09:29:48.708'),(226,5,'查看学校','school:read','school','read','允许查看学校信息',1,NULL,NULL,'2026-03-23 09:29:48.709','2026-03-23 09:29:48.709'),(227,5,'更新学校','school:update','school','update','允许更新学校信息',1,NULL,NULL,'2026-03-23 09:29:48.709','2026-03-23 09:29:48.709'),(228,5,'删除学校','school:delete','school','delete','允许删除学校信息',1,NULL,NULL,'2026-03-23 09:29:48.710','2026-03-23 09:29:48.710'),(229,5,'创建部门','department:create','department','create','允许创建部门',1,NULL,NULL,'2026-03-23 09:29:48.711','2026-03-23 09:29:48.711'),(230,5,'查看部门','department:read','department','read','允许查看部门列表',1,NULL,NULL,'2026-03-23 09:29:48.716','2026-03-23 09:29:48.716'),(231,5,'更新部门','department:update','department','update','允许更新部门信息',1,NULL,NULL,'2026-03-23 09:29:48.717','2026-03-23 09:29:48.717'),(232,5,'删除部门','department:delete','department','delete','允许删除部门',1,NULL,NULL,'2026-03-23 09:29:48.717','2026-03-23 09:29:48.717'),(233,5,'创建年级','grade:create','grade','create','允许创建年级',1,NULL,NULL,'2026-03-23 09:29:48.718','2026-03-23 09:29:48.718'),(234,5,'查看年级','grade:read','grade','read','允许查看年级列表',1,NULL,NULL,'2026-03-23 09:29:48.718','2026-03-23 09:29:48.718'),(235,5,'更新年级','grade:update','grade','update','允许更新年级信息',1,NULL,NULL,'2026-03-23 09:29:48.719','2026-03-23 09:29:48.719'),(236,5,'删除年级','grade:delete','grade','delete','允许删除年级',1,NULL,NULL,'2026-03-23 09:29:48.719','2026-03-23 09:29:48.719'),(237,5,'创建班级','class:create','class','create','允许创建班级',1,NULL,NULL,'2026-03-23 09:29:48.720','2026-03-23 09:29:48.720'),(238,5,'查看班级','class:read','class','read','允许查看班级列表',1,NULL,NULL,'2026-03-23 09:29:48.720','2026-03-23 09:29:48.720'),(239,5,'更新班级','class:update','class','update','允许更新班级信息',1,NULL,NULL,'2026-03-23 09:29:48.721','2026-03-23 09:29:48.721'),(240,5,'删除班级','class:delete','class','delete','允许删除班级',1,NULL,NULL,'2026-03-23 09:29:48.721','2026-03-23 09:29:48.721'),(241,5,'创建教师','teacher:create','teacher','create','允许创建教师',1,NULL,NULL,'2026-03-23 09:29:48.722','2026-03-23 09:29:48.722'),(242,5,'查看教师','teacher:read','teacher','read','允许查看教师列表',1,NULL,NULL,'2026-03-23 09:29:48.722','2026-03-23 09:29:48.722'),(243,5,'更新教师','teacher:update','teacher','update','允许更新教师信息',1,NULL,NULL,'2026-03-23 09:29:48.723','2026-03-23 09:29:48.723'),(244,5,'删除教师','teacher:delete','teacher','delete','允许删除教师',1,NULL,NULL,'2026-03-23 09:29:48.723','2026-03-23 09:29:48.723'),(245,5,'创建学生','student:create','student','create','允许创建学生',1,NULL,NULL,'2026-03-23 09:29:48.723','2026-03-23 09:29:48.723'),(246,5,'查看学生','student:read','student','read','允许查看学生列表',1,NULL,NULL,'2026-03-23 09:29:48.724','2026-03-23 09:29:48.724'),(247,5,'更新学生','student:update','student','update','允许更新学生信息',1,NULL,NULL,'2026-03-23 09:29:48.724','2026-03-23 09:29:48.724'),(248,5,'删除学生','student:delete','student','delete','允许删除学生',1,NULL,NULL,'2026-03-23 09:29:48.725','2026-03-23 09:29:48.725'),(249,5,'查看活动','activity:read','activity','read','允许查看活动',1,NULL,NULL,'2026-03-23 09:29:48.725','2026-03-23 09:29:48.725'),(250,5,'指导学生','activity:guidance','activity','guidance','允许指导学生参赛',1,NULL,NULL,'2026-03-23 09:29:48.725','2026-03-23 09:29:48.725'),(251,5,'创建报名','registration:create','registration','create','允许报名活动',1,NULL,NULL,'2026-03-23 09:29:48.726','2026-03-23 09:29:48.726'),(252,5,'查看报名','registration:read','registration','read','允许查看报名记录',1,NULL,NULL,'2026-03-23 09:29:48.726','2026-03-23 09:29:48.726'),(253,5,'更新报名','registration:update','registration','update','允许更新报名信息',1,NULL,NULL,'2026-03-23 09:29:48.727','2026-03-23 09:29:48.727'),(254,5,'取消报名','registration:delete','registration','delete','允许取消报名',1,NULL,NULL,'2026-03-23 09:29:48.727','2026-03-23 09:29:48.727'),(255,5,'审核报名','registration:approve','registration','approve','允许审核报名',1,NULL,NULL,'2026-03-23 09:29:48.728','2026-03-23 09:29:48.728'),(256,5,'上传作品','work:create','work','create','允许上传参赛作品',1,NULL,NULL,'2026-03-23 09:29:48.728','2026-03-23 09:29:48.728'),(257,5,'查看作品','work:read','work','read','允许查看参赛作品',1,NULL,NULL,'2026-03-23 09:29:48.729','2026-03-23 09:29:48.729'),(258,5,'更新作品','work:update','work','update','允许更新作品信息',1,NULL,NULL,'2026-03-23 09:29:48.729','2026-03-23 09:29:48.729'),(259,5,'删除作品','work:delete','work','delete','允许删除作品',1,NULL,NULL,'2026-03-23 09:29:48.730','2026-03-23 09:29:48.730'),(260,5,'提交作品','work:submit','work','submit','允许提交作品',1,NULL,NULL,'2026-03-23 09:29:48.730','2026-03-23 09:29:48.730'),(261,5,'查看公告','notice:read','notice','read','允许查看活动公告',1,NULL,NULL,'2026-03-23 09:29:48.731','2026-03-23 09:29:48.731'),(262,5,'创建评委','judge:create','judge','create','允许创建评委',1,NULL,NULL,'2026-03-23 09:29:48.731','2026-03-23 09:29:48.731'),(263,5,'查看评委','judge:read','judge','read','允许查看评委',1,NULL,NULL,'2026-03-23 09:29:48.731','2026-03-23 09:29:48.731'),(264,5,'更新评委','judge:update','judge','update','允许更新评委',1,NULL,NULL,'2026-03-23 09:29:48.732','2026-03-23 09:29:48.732'),(265,5,'删除评委','judge:delete','judge','delete','允许删除评委',1,NULL,NULL,'2026-03-23 09:29:48.732','2026-03-23 09:29:48.732'),(266,5,'分配评委','judge:assign','judge','assign','允许分配评委',1,NULL,NULL,'2026-03-23 09:29:48.733','2026-03-23 09:29:48.733'),(267,5,'创建评审','review:create','review','create','允许创建评审',1,NULL,NULL,'2026-03-23 09:29:48.733','2026-03-23 09:29:48.733'),(268,5,'查看评审','review:read','review','read','允许查看评审',1,NULL,NULL,'2026-03-23 09:29:48.734','2026-03-23 09:29:48.734'),(269,5,'更新评审','review:update','review','update','允许更新评审',1,NULL,NULL,'2026-03-23 09:29:48.734','2026-03-23 09:29:48.734'),(270,5,'删除评审','review:delete','review','delete','允许删除评审',1,NULL,NULL,'2026-03-23 09:29:48.735','2026-03-23 09:29:48.735'),(271,5,'创建作业','homework:create','homework','create','允许创建作业',1,NULL,NULL,'2026-03-23 09:29:48.735','2026-03-23 09:29:48.735'),(272,5,'查看作业','homework:read','homework','read','允许查看作业列表',1,NULL,NULL,'2026-03-23 09:29:48.735','2026-03-23 09:29:48.735'),(273,5,'更新作业','homework:update','homework','update','允许更新作业信息',1,NULL,NULL,'2026-03-23 09:29:48.737','2026-03-23 09:29:48.737'),(274,5,'删除作业','homework:delete','homework','delete','允许删除作业',1,NULL,NULL,'2026-03-23 09:29:48.738','2026-03-23 09:29:48.738'),(275,5,'发布作业','homework:publish','homework','publish','允许发布作业',1,NULL,NULL,'2026-03-23 09:29:48.739','2026-03-23 09:29:48.739'),(276,5,'提交作业','homework-submission:create','homework-submission','create','允许提交作业',1,NULL,NULL,'2026-03-23 09:29:48.740','2026-03-23 09:29:48.740'),(277,5,'查看作业提交','homework-submission:read','homework-submission','read','允许查看作业提交记录',1,NULL,NULL,'2026-03-23 09:29:48.740','2026-03-23 09:29:48.740'),(278,5,'更新作业提交','homework-submission:update','homework-submission','update','允许更新提交的作业',1,NULL,NULL,'2026-03-23 09:29:48.741','2026-03-23 09:29:48.741'),(279,5,'创建作业评审规则','homework-review-rule:create','homework-review-rule','create','允许创建作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.745','2026-03-23 09:29:48.745'),(280,5,'查看作业评审规则','homework-review-rule:read','homework-review-rule','read','允许查看作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.746','2026-03-23 09:29:48.746'),(281,5,'更新作业评审规则','homework-review-rule:update','homework-review-rule','update','允许更新作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.752','2026-03-23 09:29:48.752'),(282,5,'删除作业评审规则','homework-review-rule:delete','homework-review-rule','delete','允许删除作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.752','2026-03-23 09:29:48.752'),(283,5,'作业评分','homework-score:create','homework-score','create','允许对作业评分',1,NULL,NULL,'2026-03-23 09:29:48.753','2026-03-23 09:29:48.753'),(284,5,'查看作业评分','homework-score:read','homework-score','read','允许查看作业评分',1,NULL,NULL,'2026-03-23 09:29:48.753','2026-03-23 09:29:48.753'),(285,6,'查看工作台','workbench:read','workbench','read','允许查看工作台',1,NULL,NULL,'2026-03-23 09:29:48.813','2026-03-23 09:29:48.813'),(286,6,'创建用户','user:create','user','create','允许创建新用户',1,NULL,NULL,'2026-03-23 09:29:48.814','2026-03-23 09:29:48.814'),(287,6,'查看用户','user:read','user','read','允许查看用户列表和详情',1,NULL,NULL,'2026-03-23 09:29:48.815','2026-03-23 09:29:48.815'),(288,6,'更新用户','user:update','user','update','允许更新用户信息',1,NULL,NULL,'2026-03-23 09:29:48.815','2026-03-23 09:29:48.815'),(289,6,'删除用户','user:delete','user','delete','允许删除用户',1,NULL,NULL,'2026-03-23 09:29:48.816','2026-03-23 09:29:48.816'),(290,6,'创建角色','role:create','role','create','允许创建新角色',1,NULL,NULL,'2026-03-23 09:29:48.817','2026-03-23 09:29:48.817'),(291,6,'查看角色','role:read','role','read','允许查看角色列表和详情',1,NULL,NULL,'2026-03-23 09:29:48.817','2026-03-23 09:29:48.817'),(292,6,'更新角色','role:update','role','update','允许更新角色信息',1,NULL,NULL,'2026-03-23 09:29:48.818','2026-03-23 09:29:48.818'),(293,6,'删除角色','role:delete','role','delete','允许删除角色',1,NULL,NULL,'2026-03-23 09:29:48.818','2026-03-23 09:29:48.818'),(294,6,'分配角色','role:assign','role','assign','允许给用户分配角色',1,NULL,NULL,'2026-03-23 09:29:48.819','2026-03-23 09:29:48.819'),(295,6,'查看权限','permission:read','permission','read','允许查看权限列表',1,NULL,NULL,'2026-03-23 09:29:48.819','2026-03-23 09:29:48.819'),(296,6,'创建学校','school:create','school','create','允许创建学校信息',1,NULL,NULL,'2026-03-23 09:29:48.820','2026-03-23 09:29:48.820'),(297,6,'查看学校','school:read','school','read','允许查看学校信息',1,NULL,NULL,'2026-03-23 09:29:48.820','2026-03-23 09:29:48.820'),(298,6,'更新学校','school:update','school','update','允许更新学校信息',1,NULL,NULL,'2026-03-23 09:29:48.821','2026-03-23 09:29:48.821'),(299,6,'删除学校','school:delete','school','delete','允许删除学校信息',1,NULL,NULL,'2026-03-23 09:29:48.821','2026-03-23 09:29:48.821'),(300,6,'创建部门','department:create','department','create','允许创建部门',1,NULL,NULL,'2026-03-23 09:29:48.822','2026-03-23 09:29:48.822'),(301,6,'查看部门','department:read','department','read','允许查看部门列表',1,NULL,NULL,'2026-03-23 09:29:48.822','2026-03-23 09:29:48.822'),(302,6,'更新部门','department:update','department','update','允许更新部门信息',1,NULL,NULL,'2026-03-23 09:29:48.823','2026-03-23 09:29:48.823'),(303,6,'删除部门','department:delete','department','delete','允许删除部门',1,NULL,NULL,'2026-03-23 09:29:48.823','2026-03-23 09:29:48.823'),(304,6,'创建年级','grade:create','grade','create','允许创建年级',1,NULL,NULL,'2026-03-23 09:29:48.823','2026-03-23 09:29:48.823'),(305,6,'查看年级','grade:read','grade','read','允许查看年级列表',1,NULL,NULL,'2026-03-23 09:29:48.824','2026-03-23 09:29:48.824'),(306,6,'更新年级','grade:update','grade','update','允许更新年级信息',1,NULL,NULL,'2026-03-23 09:29:48.824','2026-03-23 09:29:48.824'),(307,6,'删除年级','grade:delete','grade','delete','允许删除年级',1,NULL,NULL,'2026-03-23 09:29:48.825','2026-03-23 09:29:48.825'),(308,6,'创建班级','class:create','class','create','允许创建班级',1,NULL,NULL,'2026-03-23 09:29:48.825','2026-03-23 09:29:48.825'),(309,6,'查看班级','class:read','class','read','允许查看班级列表',1,NULL,NULL,'2026-03-23 09:29:48.826','2026-03-23 09:29:48.826'),(310,6,'更新班级','class:update','class','update','允许更新班级信息',1,NULL,NULL,'2026-03-23 09:29:48.826','2026-03-23 09:29:48.826'),(311,6,'删除班级','class:delete','class','delete','允许删除班级',1,NULL,NULL,'2026-03-23 09:29:48.827','2026-03-23 09:29:48.827'),(312,6,'创建教师','teacher:create','teacher','create','允许创建教师',1,NULL,NULL,'2026-03-23 09:29:48.827','2026-03-23 09:29:48.827'),(313,6,'查看教师','teacher:read','teacher','read','允许查看教师列表',1,NULL,NULL,'2026-03-23 09:29:48.828','2026-03-23 09:29:48.828'),(314,6,'更新教师','teacher:update','teacher','update','允许更新教师信息',1,NULL,NULL,'2026-03-23 09:29:48.828','2026-03-23 09:29:48.828'),(315,6,'删除教师','teacher:delete','teacher','delete','允许删除教师',1,NULL,NULL,'2026-03-23 09:29:48.829','2026-03-23 09:29:48.829'),(316,6,'创建学生','student:create','student','create','允许创建学生',1,NULL,NULL,'2026-03-23 09:29:48.829','2026-03-23 09:29:48.829'),(317,6,'查看学生','student:read','student','read','允许查看学生列表',1,NULL,NULL,'2026-03-23 09:29:48.829','2026-03-23 09:29:48.829'),(318,6,'更新学生','student:update','student','update','允许更新学生信息',1,NULL,NULL,'2026-03-23 09:29:48.830','2026-03-23 09:29:48.830'),(319,6,'删除学生','student:delete','student','delete','允许删除学生',1,NULL,NULL,'2026-03-23 09:29:48.830','2026-03-23 09:29:48.830'),(320,6,'查看活动','activity:read','activity','read','允许查看活动',1,NULL,NULL,'2026-03-23 09:29:48.831','2026-03-23 09:29:48.831'),(321,6,'指导学生','activity:guidance','activity','guidance','允许指导学生参赛',1,NULL,NULL,'2026-03-23 09:29:48.831','2026-03-23 09:29:48.831'),(322,6,'创建报名','registration:create','registration','create','允许报名活动',1,NULL,NULL,'2026-03-23 09:29:48.832','2026-03-23 09:29:48.832'),(323,6,'查看报名','registration:read','registration','read','允许查看报名记录',1,NULL,NULL,'2026-03-23 09:29:48.832','2026-03-23 09:29:48.832'),(324,6,'更新报名','registration:update','registration','update','允许更新报名信息',1,NULL,NULL,'2026-03-23 09:29:48.833','2026-03-23 09:29:48.833'),(325,6,'取消报名','registration:delete','registration','delete','允许取消报名',1,NULL,NULL,'2026-03-23 09:29:48.833','2026-03-23 09:29:48.833'),(326,6,'审核报名','registration:approve','registration','approve','允许审核报名',1,NULL,NULL,'2026-03-23 09:29:48.834','2026-03-23 09:29:48.834'),(327,6,'上传作品','work:create','work','create','允许上传参赛作品',1,NULL,NULL,'2026-03-23 09:29:48.834','2026-03-23 09:29:48.834'),(328,6,'查看作品','work:read','work','read','允许查看参赛作品',1,NULL,NULL,'2026-03-23 09:29:48.834','2026-03-23 09:29:48.834'),(329,6,'更新作品','work:update','work','update','允许更新作品信息',1,NULL,NULL,'2026-03-23 09:29:48.835','2026-03-23 09:29:48.835'),(330,6,'删除作品','work:delete','work','delete','允许删除作品',1,NULL,NULL,'2026-03-23 09:29:48.836','2026-03-23 09:29:48.836'),(331,6,'提交作品','work:submit','work','submit','允许提交作品',1,NULL,NULL,'2026-03-23 09:29:48.836','2026-03-23 09:29:48.836'),(332,6,'查看公告','notice:read','notice','read','允许查看活动公告',1,NULL,NULL,'2026-03-23 09:29:48.836','2026-03-23 09:29:48.836'),(333,6,'创建评委','judge:create','judge','create','允许创建评委',1,NULL,NULL,'2026-03-23 09:29:48.837','2026-03-23 09:29:48.837'),(334,6,'查看评委','judge:read','judge','read','允许查看评委',1,NULL,NULL,'2026-03-23 09:29:48.837','2026-03-23 09:29:48.837'),(335,6,'更新评委','judge:update','judge','update','允许更新评委',1,NULL,NULL,'2026-03-23 09:29:48.838','2026-03-23 09:29:48.838'),(336,6,'删除评委','judge:delete','judge','delete','允许删除评委',1,NULL,NULL,'2026-03-23 09:29:48.838','2026-03-23 09:29:48.838'),(337,6,'分配评委','judge:assign','judge','assign','允许分配评委',1,NULL,NULL,'2026-03-23 09:29:48.839','2026-03-23 09:29:48.839'),(338,6,'创建评审','review:create','review','create','允许创建评审',1,NULL,NULL,'2026-03-23 09:29:48.839','2026-03-23 09:29:48.839'),(339,6,'查看评审','review:read','review','read','允许查看评审',1,NULL,NULL,'2026-03-23 09:29:48.839','2026-03-23 09:29:48.839'),(340,6,'更新评审','review:update','review','update','允许更新评审',1,NULL,NULL,'2026-03-23 09:29:48.840','2026-03-23 09:29:48.840'),(341,6,'删除评审','review:delete','review','delete','允许删除评审',1,NULL,NULL,'2026-03-23 09:29:48.840','2026-03-23 09:29:48.840'),(342,6,'创建作业','homework:create','homework','create','允许创建作业',1,NULL,NULL,'2026-03-23 09:29:48.841','2026-03-23 09:29:48.841'),(343,6,'查看作业','homework:read','homework','read','允许查看作业列表',1,NULL,NULL,'2026-03-23 09:29:48.841','2026-03-23 09:29:48.841'),(344,6,'更新作业','homework:update','homework','update','允许更新作业信息',1,NULL,NULL,'2026-03-23 09:29:48.842','2026-03-23 09:29:48.842'),(345,6,'删除作业','homework:delete','homework','delete','允许删除作业',1,NULL,NULL,'2026-03-23 09:29:48.842','2026-03-23 09:29:48.842'),(346,6,'发布作业','homework:publish','homework','publish','允许发布作业',1,NULL,NULL,'2026-03-23 09:29:48.843','2026-03-23 09:29:48.843'),(347,6,'提交作业','homework-submission:create','homework-submission','create','允许提交作业',1,NULL,NULL,'2026-03-23 09:29:48.843','2026-03-23 09:29:48.843'),(348,6,'查看作业提交','homework-submission:read','homework-submission','read','允许查看作业提交记录',1,NULL,NULL,'2026-03-23 09:29:48.844','2026-03-23 09:29:48.844'),(349,6,'更新作业提交','homework-submission:update','homework-submission','update','允许更新提交的作业',1,NULL,NULL,'2026-03-23 09:29:48.844','2026-03-23 09:29:48.844'),(350,6,'创建作业评审规则','homework-review-rule:create','homework-review-rule','create','允许创建作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.845','2026-03-23 09:29:48.845'),(351,6,'查看作业评审规则','homework-review-rule:read','homework-review-rule','read','允许查看作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.845','2026-03-23 09:29:48.845'),(352,6,'更新作业评审规则','homework-review-rule:update','homework-review-rule','update','允许更新作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.846','2026-03-23 09:29:48.846'),(353,6,'删除作业评审规则','homework-review-rule:delete','homework-review-rule','delete','允许删除作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.846','2026-03-23 09:29:48.846'),(354,6,'作业评分','homework-score:create','homework-score','create','允许对作业评分',1,NULL,NULL,'2026-03-23 09:29:48.847','2026-03-23 09:29:48.847'),(355,6,'查看作业评分','homework-score:read','homework-score','read','允许查看作业评分',1,NULL,NULL,'2026-03-23 09:29:48.847','2026-03-23 09:29:48.847'),(356,7,'查看工作台','workbench:read','workbench','read','允许查看工作台',1,NULL,NULL,'2026-03-23 09:29:48.902','2026-03-23 09:29:48.902'),(357,7,'创建用户','user:create','user','create','允许创建新用户',1,NULL,NULL,'2026-03-23 09:29:48.902','2026-03-23 09:29:48.902'),(358,7,'查看用户','user:read','user','read','允许查看用户列表和详情',1,NULL,NULL,'2026-03-23 09:29:48.903','2026-03-23 09:29:48.903'),(359,7,'更新用户','user:update','user','update','允许更新用户信息',1,NULL,NULL,'2026-03-23 09:29:48.903','2026-03-23 09:29:48.903'),(360,7,'删除用户','user:delete','user','delete','允许删除用户',1,NULL,NULL,'2026-03-23 09:29:48.904','2026-03-23 09:29:48.904'),(361,7,'创建角色','role:create','role','create','允许创建新角色',1,NULL,NULL,'2026-03-23 09:29:48.904','2026-03-23 09:29:48.904'),(362,7,'查看角色','role:read','role','read','允许查看角色列表和详情',1,NULL,NULL,'2026-03-23 09:29:48.905','2026-03-23 09:29:48.905'),(363,7,'更新角色','role:update','role','update','允许更新角色信息',1,NULL,NULL,'2026-03-23 09:29:48.905','2026-03-23 09:29:48.905'),(364,7,'删除角色','role:delete','role','delete','允许删除角色',1,NULL,NULL,'2026-03-23 09:29:48.905','2026-03-23 09:29:48.905'),(365,7,'分配角色','role:assign','role','assign','允许给用户分配角色',1,NULL,NULL,'2026-03-23 09:29:48.906','2026-03-23 09:29:48.906'),(366,7,'查看权限','permission:read','permission','read','允许查看权限列表',1,NULL,NULL,'2026-03-23 09:29:48.906','2026-03-23 09:29:48.906'),(367,7,'创建学校','school:create','school','create','允许创建学校信息',1,NULL,NULL,'2026-03-23 09:29:48.907','2026-03-23 09:29:48.907'),(368,7,'查看学校','school:read','school','read','允许查看学校信息',1,NULL,NULL,'2026-03-23 09:29:48.907','2026-03-23 09:29:48.907'),(369,7,'更新学校','school:update','school','update','允许更新学校信息',1,NULL,NULL,'2026-03-23 09:29:48.908','2026-03-23 09:29:48.908'),(370,7,'删除学校','school:delete','school','delete','允许删除学校信息',1,NULL,NULL,'2026-03-23 09:29:48.908','2026-03-23 09:29:48.908'),(371,7,'创建部门','department:create','department','create','允许创建部门',1,NULL,NULL,'2026-03-23 09:29:48.909','2026-03-23 09:29:48.909'),(372,7,'查看部门','department:read','department','read','允许查看部门列表',1,NULL,NULL,'2026-03-23 09:29:48.909','2026-03-23 09:29:48.909'),(373,7,'更新部门','department:update','department','update','允许更新部门信息',1,NULL,NULL,'2026-03-23 09:29:48.910','2026-03-23 09:29:48.910'),(374,7,'删除部门','department:delete','department','delete','允许删除部门',1,NULL,NULL,'2026-03-23 09:29:48.911','2026-03-23 09:29:48.911'),(375,7,'创建年级','grade:create','grade','create','允许创建年级',1,NULL,NULL,'2026-03-23 09:29:48.911','2026-03-23 09:29:48.911'),(376,7,'查看年级','grade:read','grade','read','允许查看年级列表',1,NULL,NULL,'2026-03-23 09:29:48.912','2026-03-23 09:29:48.912'),(377,7,'更新年级','grade:update','grade','update','允许更新年级信息',1,NULL,NULL,'2026-03-23 09:29:48.912','2026-03-23 09:29:48.912'),(378,7,'删除年级','grade:delete','grade','delete','允许删除年级',1,NULL,NULL,'2026-03-23 09:29:48.912','2026-03-23 09:29:48.912'),(379,7,'创建班级','class:create','class','create','允许创建班级',1,NULL,NULL,'2026-03-23 09:29:48.913','2026-03-23 09:29:48.913'),(380,7,'查看班级','class:read','class','read','允许查看班级列表',1,NULL,NULL,'2026-03-23 09:29:48.913','2026-03-23 09:29:48.913'),(381,7,'更新班级','class:update','class','update','允许更新班级信息',1,NULL,NULL,'2026-03-23 09:29:48.914','2026-03-23 09:29:48.914'),(382,7,'删除班级','class:delete','class','delete','允许删除班级',1,NULL,NULL,'2026-03-23 09:29:48.914','2026-03-23 09:29:48.914'),(383,7,'创建教师','teacher:create','teacher','create','允许创建教师',1,NULL,NULL,'2026-03-23 09:29:48.915','2026-03-23 09:29:48.915'),(384,7,'查看教师','teacher:read','teacher','read','允许查看教师列表',1,NULL,NULL,'2026-03-23 09:29:48.915','2026-03-23 09:29:48.915'),(385,7,'更新教师','teacher:update','teacher','update','允许更新教师信息',1,NULL,NULL,'2026-03-23 09:29:48.916','2026-03-23 09:29:48.916'),(386,7,'删除教师','teacher:delete','teacher','delete','允许删除教师',1,NULL,NULL,'2026-03-23 09:29:48.916','2026-03-23 09:29:48.916'),(387,7,'创建学生','student:create','student','create','允许创建学生',1,NULL,NULL,'2026-03-23 09:29:48.917','2026-03-23 09:29:48.917'),(388,7,'查看学生','student:read','student','read','允许查看学生列表',1,NULL,NULL,'2026-03-23 09:29:48.917','2026-03-23 09:29:48.917'),(389,7,'更新学生','student:update','student','update','允许更新学生信息',1,NULL,NULL,'2026-03-23 09:29:48.917','2026-03-23 09:29:48.917'),(390,7,'删除学生','student:delete','student','delete','允许删除学生',1,NULL,NULL,'2026-03-23 09:29:48.918','2026-03-23 09:29:48.918'),(391,7,'查看活动','activity:read','activity','read','允许查看活动',1,NULL,NULL,'2026-03-23 09:29:48.918','2026-03-23 09:29:48.918'),(392,7,'指导学生','activity:guidance','activity','guidance','允许指导学生参赛',1,NULL,NULL,'2026-03-23 09:29:48.919','2026-03-23 09:29:48.919'),(393,7,'创建报名','registration:create','registration','create','允许报名活动',1,NULL,NULL,'2026-03-23 09:29:48.919','2026-03-23 09:29:48.919'),(394,7,'查看报名','registration:read','registration','read','允许查看报名记录',1,NULL,NULL,'2026-03-23 09:29:48.920','2026-03-23 09:29:48.920'),(395,7,'更新报名','registration:update','registration','update','允许更新报名信息',1,NULL,NULL,'2026-03-23 09:29:48.925','2026-03-23 09:29:48.925'),(396,7,'取消报名','registration:delete','registration','delete','允许取消报名',1,NULL,NULL,'2026-03-23 09:29:48.926','2026-03-23 09:29:48.926'),(397,7,'审核报名','registration:approve','registration','approve','允许审核报名',1,NULL,NULL,'2026-03-23 09:29:48.927','2026-03-23 09:29:48.927'),(398,7,'上传作品','work:create','work','create','允许上传参赛作品',1,NULL,NULL,'2026-03-23 09:29:48.927','2026-03-23 09:29:48.927'),(399,7,'查看作品','work:read','work','read','允许查看参赛作品',1,NULL,NULL,'2026-03-23 09:29:48.928','2026-03-23 09:29:48.928'),(400,7,'更新作品','work:update','work','update','允许更新作品信息',1,NULL,NULL,'2026-03-23 09:29:48.928','2026-03-23 09:29:48.928'),(401,7,'删除作品','work:delete','work','delete','允许删除作品',1,NULL,NULL,'2026-03-23 09:29:48.929','2026-03-23 09:29:48.929'),(402,7,'提交作品','work:submit','work','submit','允许提交作品',1,NULL,NULL,'2026-03-23 09:29:48.929','2026-03-23 09:29:48.929'),(403,7,'查看公告','notice:read','notice','read','允许查看活动公告',1,NULL,NULL,'2026-03-23 09:29:48.930','2026-03-23 09:29:48.930'),(404,7,'创建评委','judge:create','judge','create','允许创建评委',1,NULL,NULL,'2026-03-23 09:29:48.930','2026-03-23 09:29:48.930'),(405,7,'查看评委','judge:read','judge','read','允许查看评委',1,NULL,NULL,'2026-03-23 09:29:48.930','2026-03-23 09:29:48.930'),(406,7,'更新评委','judge:update','judge','update','允许更新评委',1,NULL,NULL,'2026-03-23 09:29:48.931','2026-03-23 09:29:48.931'),(407,7,'删除评委','judge:delete','judge','delete','允许删除评委',1,NULL,NULL,'2026-03-23 09:29:48.931','2026-03-23 09:29:48.931'),(408,7,'分配评委','judge:assign','judge','assign','允许分配评委',1,NULL,NULL,'2026-03-23 09:29:48.932','2026-03-23 09:29:48.932'),(409,7,'创建评审','review:create','review','create','允许创建评审',1,NULL,NULL,'2026-03-23 09:29:48.932','2026-03-23 09:29:48.932'),(410,7,'查看评审','review:read','review','read','允许查看评审',1,NULL,NULL,'2026-03-23 09:29:48.933','2026-03-23 09:29:48.933'),(411,7,'更新评审','review:update','review','update','允许更新评审',1,NULL,NULL,'2026-03-23 09:29:48.933','2026-03-23 09:29:48.933'),(412,7,'删除评审','review:delete','review','delete','允许删除评审',1,NULL,NULL,'2026-03-23 09:29:48.934','2026-03-23 09:29:48.934'),(413,7,'创建作业','homework:create','homework','create','允许创建作业',1,NULL,NULL,'2026-03-23 09:29:48.934','2026-03-23 09:29:48.934'),(414,7,'查看作业','homework:read','homework','read','允许查看作业列表',1,NULL,NULL,'2026-03-23 09:29:48.935','2026-03-23 09:29:48.935'),(415,7,'更新作业','homework:update','homework','update','允许更新作业信息',1,NULL,NULL,'2026-03-23 09:29:48.935','2026-03-23 09:29:48.935'),(416,7,'删除作业','homework:delete','homework','delete','允许删除作业',1,NULL,NULL,'2026-03-23 09:29:48.936','2026-03-23 09:29:48.936'),(417,7,'发布作业','homework:publish','homework','publish','允许发布作业',1,NULL,NULL,'2026-03-23 09:29:48.936','2026-03-23 09:29:48.936'),(418,7,'提交作业','homework-submission:create','homework-submission','create','允许提交作业',1,NULL,NULL,'2026-03-23 09:29:48.936','2026-03-23 09:29:48.936'),(419,7,'查看作业提交','homework-submission:read','homework-submission','read','允许查看作业提交记录',1,NULL,NULL,'2026-03-23 09:29:48.937','2026-03-23 09:29:48.937'),(420,7,'更新作业提交','homework-submission:update','homework-submission','update','允许更新提交的作业',1,NULL,NULL,'2026-03-23 09:29:48.937','2026-03-23 09:29:48.937'),(421,7,'创建作业评审规则','homework-review-rule:create','homework-review-rule','create','允许创建作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.938','2026-03-23 09:29:48.938'),(422,7,'查看作业评审规则','homework-review-rule:read','homework-review-rule','read','允许查看作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.938','2026-03-23 09:29:48.938'),(423,7,'更新作业评审规则','homework-review-rule:update','homework-review-rule','update','允许更新作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.939','2026-03-23 09:29:48.939'),(424,7,'删除作业评审规则','homework-review-rule:delete','homework-review-rule','delete','允许删除作业评审规则',1,NULL,NULL,'2026-03-23 09:29:48.939','2026-03-23 09:29:48.939'),(425,7,'作业评分','homework-score:create','homework-score','create','允许对作业评分',1,NULL,NULL,'2026-03-23 09:29:48.940','2026-03-23 09:29:48.940'),(426,7,'查看作业评分','homework-score:read','homework-score','read','允许查看作业评分',1,NULL,NULL,'2026-03-23 09:29:48.940','2026-03-23 09:29:48.940'),(427,8,'查看活动','activity:read','activity','read','允许查看公开活动',1,NULL,NULL,'2026-03-24 11:28:35.000','2026-03-24 11:28:35.000'),(428,8,'创建报名','registration:create','registration','create','允许报名活动',1,NULL,NULL,'2026-03-24 11:28:35.000','2026-03-24 11:28:35.000'),(429,8,'提交作品','work:create','work','create','允许提交作品',1,NULL,NULL,'2026-03-24 11:28:35.000','2026-03-24 11:28:35.000'),(430,8,'管理子女','child:manage','child','manage','允许管理子女信息',1,NULL,NULL,'2026-03-24 11:28:35.000','2026-03-24 11:28:35.000'),(431,9,'创建活动','contest:create','contest','create','允许创建活动',1,NULL,NULL,'2026-03-24 05:37:50.807','2026-03-24 05:37:50.807'),(432,9,'查看活动','contest:read','contest','read','允许查看活动',1,NULL,NULL,'2026-03-24 05:37:50.808','2026-03-24 05:37:50.808'),(433,9,'更新活动','contest:update','contest','update','允许更新活动',1,NULL,NULL,'2026-03-24 05:37:50.810','2026-03-24 05:37:50.810'),(434,9,'删除活动','contest:delete','contest','delete','允许删除活动',1,NULL,NULL,'2026-03-24 05:37:50.811','2026-03-24 05:37:50.811'),(435,9,'发布活动','contest:publish','contest','publish','允许发布活动',1,NULL,NULL,'2026-03-24 05:37:50.812','2026-03-24 05:37:50.812'),(436,9,'结束活动','contest:finish','contest','finish','允许结束活动',1,NULL,NULL,'2026-03-24 05:37:50.813','2026-03-24 05:37:50.813'),(437,9,'审核报名','registration:approve','registration','approve','允许审核报名',1,NULL,NULL,'2026-03-24 05:37:50.814','2026-03-24 05:37:50.814'),(438,9,'查看报名','registration:read','registration','read','允许查看报名记录',1,NULL,NULL,'2026-03-24 05:37:50.815','2026-03-24 05:37:50.815'),(439,9,'查看评委','judge:read','judge','read','允许查看评委',1,NULL,NULL,'2026-03-24 05:37:50.816','2026-03-24 05:37:50.816'),(440,9,'添加评委','judge:create','judge','create','允许添加评委',1,NULL,NULL,'2026-03-24 05:37:50.817','2026-03-24 05:37:50.817'),(441,9,'分配评委','judge:assign','judge','assign','允许分配评委',1,NULL,NULL,'2026-03-24 05:37:50.818','2026-03-24 05:37:50.818'),(442,9,'查看评审规则','review-rule:read','review-rule','read','允许查看评审规则',1,NULL,NULL,'2026-03-24 05:37:50.819','2026-03-24 05:37:50.819'),(443,9,'创建评审规则','review-rule:create','review-rule','create','允许创建评审规则',1,NULL,NULL,'2026-03-24 05:37:50.820','2026-03-24 05:37:50.820'),(444,9,'查看成果','result:read','result','read','允许查看活动成果',1,NULL,NULL,'2026-03-24 05:37:50.821','2026-03-24 05:37:50.821'),(445,9,'发布成果','result:publish','result','publish','允许发布活动成果',1,NULL,NULL,'2026-03-24 05:37:50.822','2026-03-24 05:37:50.822'),(446,9,'创建公告','notice:create','notice','create','允许创建活动公告',1,NULL,NULL,'2026-03-24 05:37:50.822','2026-03-24 05:37:50.822'),(447,9,'查看公告','notice:read','notice','read','允许查看活动公告',1,NULL,NULL,'2026-03-24 05:37:50.823','2026-03-24 05:37:50.823'),(448,9,'查看用户','user:read','user','read','允许查看用户',1,NULL,NULL,'2026-03-24 05:37:50.824','2026-03-24 05:37:50.824'),(449,9,'创建用户','user:create','user','create','允许创建用户',1,NULL,NULL,'2026-03-24 05:37:50.825','2026-03-24 05:37:50.825'),(450,9,'查看角色','role:read','role','read','允许查看角色',1,NULL,NULL,'2026-03-24 05:37:50.826','2026-03-24 05:37:50.826'),(451,9,'查看菜单','menu:read','menu','read','允许查看菜单',1,NULL,NULL,'2026-03-24 05:37:50.826','2026-03-24 05:37:50.826'),(457,9,'查看报名管理','contest:registration:read','contest-registration','read','允许查看报名管理页面',1,NULL,NULL,'2026-03-24 13:48:11.000','2026-03-24 13:48:11.000'),(458,9,'查看作品管理','contest:work:read','contest-work','read','允许查看作品管理页面',1,NULL,NULL,'2026-03-24 13:48:11.000','2026-03-24 13:48:11.000'),(459,9,'查看评审进度','review:progress:read','review-progress','read','允许查看评审进度',1,NULL,NULL,'2026-03-24 13:48:11.000','2026-03-24 13:48:11.000'),(460,9,'查看评审规则页','review:rule:read','review-rule-page','read','允许查看评审规则页面',1,NULL,NULL,'2026-03-24 13:48:11.000','2026-03-24 13:48:11.000'),(461,9,'查看通知管理','contest:notice:read','contest-notice','read','允许查看通知管理页面',1,NULL,NULL,'2026-03-24 13:48:11.000','2026-03-24 13:48:11.000'),(462,1,'查看公众用户','public-user:read','public-user','read','允许查看公众自注册用户',1,NULL,NULL,'2026-03-24 14:13:36.000','2026-03-24 14:13:36.000'),(463,1,'查看机构','tenant:read','tenant','read','允许查看机构列表',1,NULL,NULL,'2026-03-24 14:13:36.000','2026-03-24 14:13:36.000'),(464,7,'评审打分','review:score','review','score','允许评委评审打分',1,NULL,NULL,'2026-03-24 14:17:50.000','2026-03-24 14:17:50.000'),(465,1,'查看活动','contest:read','contest','read','允许查看活动',1,NULL,NULL,'2026-03-24 14:28:52.000','2026-03-24 14:28:52.000'),(466,1,'查看报名数据','contest:registration:read','contest-registration','read','允许查看报名数据',1,NULL,NULL,'2026-03-24 14:28:52.000','2026-03-24 14:28:52.000'),(467,1,'查看作品数据','contest:work:read','contest-work','read','允许查看作品数据',1,NULL,NULL,'2026-03-24 14:28:52.000','2026-03-24 14:28:52.000'),(468,1,'查看评审进度','review:progress:read','review-progress','read','允许查看评审进度',1,NULL,NULL,'2026-03-24 14:28:52.000','2026-03-24 14:28:52.000'),(469,1,'查看评委','judge:read','judge','read','允许查看评委',1,NULL,NULL,'2026-03-24 14:28:52.000','2026-03-24 14:28:52.000'),(470,1,'查看评审规则','review:rule:read','review-rule-page','read','允许查看评审规则',1,NULL,NULL,'2026-03-24 14:28:52.000','2026-03-24 14:28:52.000'),(471,1,'查看成果','result:read','result','read','允许查看成果',1,NULL,NULL,'2026-03-24 14:28:52.000','2026-03-24 14:28:52.000'),(472,1,'查看通知','contest:notice:read','contest-notice','read','允许查看通知',1,NULL,NULL,'2026-03-24 14:28:52.000','2026-03-24 14:28:52.000'),(473,9,'查看日志','log:read','log','read',NULL,1,NULL,NULL,'2026-03-31 15:48:32.456','2026-03-31 15:48:32.000'),(474,9,'更新公告','notice:update','notice','update',NULL,1,NULL,NULL,'2026-03-31 18:52:58.152','2026-03-31 18:52:58.000'),(475,9,'删除公告','notice:delete','notice','delete',NULL,1,NULL,NULL,'2026-03-31 18:52:58.152','2026-03-31 18:52:58.000'),(476,1,'报名活动','contest:register','contest','register',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(477,1,'创建团队','team:create','team','create',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(478,1,'查看团队','team:read','team','read',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(479,1,'更新团队','team:update','team','update',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(480,1,'删除团队','team:delete','team','delete',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(481,1,'分配评审','review:assign','review','assign',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(482,9,'报名活动','contest:register','contest','register',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(483,9,'创建团队','team:create','team','create',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(484,9,'查看团队','team:read','team','read',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(485,9,'更新团队','team:update','team','update',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(486,9,'删除团队','team:delete','team','delete',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(487,9,'分配评审','review:assign','review','assign',NULL,1,NULL,NULL,'2026-04-02 14:18:38.000','2026-04-02 14:18:38.000'),(488,9,'指导学生','activity:guidance','activity','guidance',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(489,9,'查看活动','activity:read','activity','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(490,9,'创建班级','class:create','class','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(491,9,'删除班级','class:delete','class','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(492,9,'查看班级','class:read','class','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(493,9,'更新班级','class:update','class','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(494,9,'创建部门','department:create','department','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(495,9,'删除部门','department:delete','department','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(496,9,'查看部门','department:read','department','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(497,9,'更新部门','department:update','department','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(498,9,'创建年级','grade:create','grade','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(499,9,'删除年级','grade:delete','grade','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(500,9,'查看年级','grade:read','grade','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(501,9,'更新年级','grade:update','grade','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(502,9,'创建作业','homework:create','homework','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(503,9,'删除作业','homework:delete','homework','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(504,9,'发布作业','homework:publish','homework','publish',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(505,9,'查看作业','homework:read','homework','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(506,9,'更新作业','homework:update','homework','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(507,9,'创建作业评审规则','homework-review-rule:create','homework-review-rule','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(508,9,'删除作业评审规则','homework-review-rule:delete','homework-review-rule','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(509,9,'查看作业评审规则','homework-review-rule:read','homework-review-rule','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(510,9,'更新作业评审规则','homework-review-rule:update','homework-review-rule','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(511,9,'作业评分','homework-score:create','homework-score','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(512,9,'查看作业评分','homework-score:read','homework-score','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(513,9,'提交作业','homework-submission:create','homework-submission','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(514,9,'查看作业提交','homework-submission:read','homework-submission','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(515,9,'更新作业提交','homework-submission:update','homework-submission','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(516,9,'删除评委','judge:delete','judge','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(517,9,'更新评委','judge:update','judge','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(518,9,'查看权限','permission:read','permission','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(519,9,'创建报名','registration:create','registration','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(520,9,'取消报名','registration:delete','registration','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(521,9,'更新报名','registration:update','registration','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(522,9,'创建评审','review:create','review','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(523,9,'删除评审','review:delete','review','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(524,9,'查看评审','review:read','review','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(525,9,'更新评审','review:update','review','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(526,9,'分配角色','role:assign','role','assign',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(527,9,'创建角色','role:create','role','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(528,9,'删除角色','role:delete','role','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(529,9,'更新角色','role:update','role','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(530,9,'创建学校','school:create','school','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(531,9,'删除学校','school:delete','school','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(532,9,'查看学校','school:read','school','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(533,9,'更新学校','school:update','school','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(534,9,'创建学生','student:create','student','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(535,9,'删除学生','student:delete','student','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(536,9,'查看学生','student:read','student','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(537,9,'更新学生','student:update','student','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(538,9,'创建教师','teacher:create','teacher','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(539,9,'删除教师','teacher:delete','teacher','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(540,9,'查看教师','teacher:read','teacher','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(541,9,'更新教师','teacher:update','teacher','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(542,9,'删除用户','user:delete','user','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(543,9,'更新用户','user:update','user','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(544,9,'上传作品','work:create','work','create',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(545,9,'删除作品','work:delete','work','delete',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(546,9,'查看作品','work:read','work','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(547,9,'提交作品','work:submit','work','submit',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(548,9,'更新作品','work:update','work','update',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'),(549,9,'查看工作台','workbench:read','workbench','read',NULL,1,NULL,NULL,'2026-04-02 14:19:49.000','2026-04-02 14:19:49.000'); -/*!40000 ALTER TABLE `permissions` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `role_permissions` --- - -DROP TABLE IF EXISTS `role_permissions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `role_permissions` ( - `id` int NOT NULL AUTO_INCREMENT, - `role_id` int NOT NULL, - `permission_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `role_permissions_role_id_permission_id_key` (`role_id`,`permission_id`), - KEY `role_permissions_permission_id_fkey` (`permission_id`), - CONSTRAINT `role_permissions_permission_id_fkey` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `role_permissions_role_id_fkey` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=374 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `role_permissions` --- - -LOCK TABLES `role_permissions` WRITE; -/*!40000 ALTER TABLE `role_permissions` DISABLE KEYS */; -INSERT INTO `role_permissions` VALUES (220,1,462),(221,1,463),(225,1,465),(226,1,466),(227,1,467),(230,1,468),(228,1,469),(231,1,470),(229,1,471),(224,1,472),(91,4,143),(92,4,144),(93,4,145),(94,4,146),(95,4,147),(96,4,149),(97,4,153),(98,4,154),(99,4,155),(100,4,156),(101,4,158),(102,4,159),(103,4,160),(104,4,161),(105,4,162),(106,4,163),(107,4,164),(108,4,165),(109,4,166),(110,4,167),(111,4,168),(112,4,169),(113,4,170),(114,4,171),(115,4,172),(116,4,173),(117,4,174),(118,4,175),(119,4,176),(120,4,177),(121,4,178),(123,4,181),(124,4,186),(122,4,190),(125,4,200),(126,4,201),(127,4,202),(128,4,203),(129,4,204),(130,4,206),(131,4,208),(132,4,209),(133,4,210),(134,4,211),(135,4,213),(136,5,214),(137,5,234),(138,5,238),(139,5,246),(140,5,249),(141,5,250),(143,5,251),(144,5,252),(145,5,253),(146,5,254),(147,5,256),(148,5,257),(149,5,258),(150,5,260),(142,5,261),(151,5,271),(152,5,272),(153,5,273),(154,5,274),(155,5,275),(156,5,277),(157,5,279),(158,5,280),(159,5,281),(160,5,282),(161,5,283),(162,5,284),(163,6,285),(164,6,320),(166,6,323),(167,6,327),(168,6,328),(169,6,329),(170,6,331),(165,6,332),(171,6,343),(172,6,347),(173,6,348),(174,6,349),(175,6,355),(176,7,356),(177,7,391),(179,7,399),(178,7,403),(180,7,405),(181,7,408),(183,7,409),(182,7,410),(184,7,411),(223,7,464),(185,8,427),(187,8,428),(188,8,429),(186,8,430),(253,9,431),(258,9,432),(261,9,433),(254,9,434),(257,9,435),(255,9,436),(297,9,437),(300,9,438),(288,9,439),(286,9,440),(285,9,441),(305,9,442),(304,9,443),(303,9,444),(302,9,445),(292,9,446),(294,9,447),(336,9,448),(334,9,449),(316,9,450),(291,9,451),(260,9,457),(262,9,458),(309,9,459),(311,9,460),(256,9,461),(290,9,473),(295,9,474),(293,9,475),(259,9,482),(330,9,483),(332,9,484),(333,9,485),(331,9,486),(306,9,487),(247,9,488),(248,9,489),(249,9,490),(250,9,491),(251,9,492),(252,9,493),(263,9,494),(264,9,495),(265,9,496),(266,9,497),(267,9,498),(268,9,499),(269,9,500),(270,9,501),(280,9,502),(281,9,503),(282,9,504),(283,9,505),(284,9,506),(271,9,507),(272,9,508),(273,9,509),(274,9,510),(275,9,511),(276,9,512),(277,9,513),(278,9,514),(279,9,515),(287,9,516),(289,9,517),(296,9,518),(298,9,519),(299,9,520),(301,9,521),(307,9,522),(308,9,523),(310,9,524),(312,9,525),(313,9,526),(314,9,527),(315,9,528),(317,9,529),(318,9,530),(319,9,531),(320,9,532),(321,9,533),(322,9,534),(323,9,535),(324,9,536),(325,9,537),(326,9,538),(327,9,539),(328,9,540),(329,9,541),(335,9,542),(337,9,543),(338,9,544),(339,9,545),(340,9,546),(341,9,547),(342,9,548),(343,9,549); -/*!40000 ALTER TABLE `role_permissions` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `roles` --- - -DROP TABLE IF EXISTS `roles`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `roles` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `roles_tenant_id_name_key` (`tenant_id`,`name`), - UNIQUE KEY `roles_tenant_id_code_key` (`tenant_id`,`code`), - KEY `roles_creator_fkey` (`creator`), - KEY `roles_modifier_fkey` (`modifier`), - CONSTRAINT `roles_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `roles_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `roles_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `roles` --- - -LOCK TABLES `roles` WRITE; -/*!40000 ALTER TABLE `roles` DISABLE KEYS */; -INSERT INTO `roles` VALUES (1,1,'超级管理员','super_admin','超级管理员角色,拥有所有权限',1,NULL,NULL,'2026-03-23 06:14:18.644','2026-03-23 06:14:18.644'),(4,4,'学校管理员','school_admin','学校管理员',1,NULL,NULL,'2026-03-23 09:29:48.633','2026-03-23 09:29:48.633'),(5,5,'教师','teacher','教师角色',1,NULL,NULL,'2026-03-23 09:29:48.753','2026-03-23 09:29:48.753'),(6,6,'学生','student','学生角色',1,NULL,NULL,'2026-03-23 09:29:48.847','2026-03-23 09:29:48.847'),(7,7,'评委','judge','评委角色',1,NULL,NULL,'2026-03-23 09:29:48.940','2026-03-23 09:29:48.940'),(8,8,'公众用户','public_user','公众自注册用户默认角色',1,NULL,NULL,'2026-03-24 11:28:27.000','2026-03-24 11:28:27.000'),(9,9,'机构管理员','tenant_admin','广东省图机构管理员,管理活动和报名',1,NULL,NULL,'2026-03-24 05:37:50.827','2026-03-24 05:37:50.827'); -/*!40000 ALTER TABLE `roles` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `schools` --- - -DROP TABLE IF EXISTS `schools`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `schools` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `address` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `principal` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `established` datetime(3) DEFAULT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `logo` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `website` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `schools_tenant_id_key` (`tenant_id`), - KEY `schools_creator_fkey` (`creator`), - KEY `schools_modifier_fkey` (`modifier`), - CONSTRAINT `schools_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `schools_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `schools_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `schools` --- - -LOCK TABLES `schools` WRITE; -/*!40000 ALTER TABLE `schools` DISABLE KEYS */; -/*!40000 ALTER TABLE `schools` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `student_interest_classes` --- - -DROP TABLE IF EXISTS `student_interest_classes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `student_interest_classes` ( - `id` int NOT NULL AUTO_INCREMENT, - `student_id` int NOT NULL, - `class_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `student_interest_classes_student_id_class_id_key` (`student_id`,`class_id`), - KEY `student_interest_classes_class_id_fkey` (`class_id`), - CONSTRAINT `student_interest_classes_class_id_fkey` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `student_interest_classes_student_id_fkey` FOREIGN KEY (`student_id`) REFERENCES `students` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `student_interest_classes` --- - -LOCK TABLES `student_interest_classes` WRITE; -/*!40000 ALTER TABLE `student_interest_classes` DISABLE KEYS */; -/*!40000 ALTER TABLE `student_interest_classes` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `students` --- - -DROP TABLE IF EXISTS `students`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `students` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `tenant_id` int NOT NULL, - `class_id` int NOT NULL, - `student_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `id_card` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `gender` int DEFAULT NULL, - `birth_date` datetime(3) DEFAULT NULL, - `enrollment_date` datetime(3) DEFAULT NULL, - `parent_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `parent_phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `address` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `students_user_id_key` (`user_id`), - UNIQUE KEY `students_tenant_id_student_no_key` (`tenant_id`,`student_no`), - KEY `students_class_id_fkey` (`class_id`), - KEY `students_creator_fkey` (`creator`), - KEY `students_modifier_fkey` (`modifier`), - CONSTRAINT `students_class_id_fkey` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `students_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `students_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `students_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `students_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `students` --- - -LOCK TABLES `students` WRITE; -/*!40000 ALTER TABLE `students` DISABLE KEYS */; -/*!40000 ALTER TABLE `students` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_ai_3d_task` --- - -DROP TABLE IF EXISTS `t_ai_3d_task`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_ai_3d_task` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `user_id` int NOT NULL, - `input_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `input_content` text COLLATE utf8mb4_unicode_ci NOT NULL, - `generate_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Normal', - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', - `result_url` text COLLATE utf8mb4_unicode_ci, - `preview_url` text COLLATE utf8mb4_unicode_ci, - `result_urls` json DEFAULT NULL, - `preview_urls` json DEFAULT NULL, - `error_message` text COLLATE utf8mb4_unicode_ci, - `external_task_id` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `retry_count` int NOT NULL DEFAULT '0', - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `complete_time` datetime(3) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `t_ai_3d_task_user_id_idx` (`user_id`), - KEY `t_ai_3d_task_tenant_id_idx` (`tenant_id`), - KEY `t_ai_3d_task_status_idx` (`status`), - KEY `t_ai_3d_task_create_time_idx` (`create_time`), - CONSTRAINT `t_ai_3d_task_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_ai_3d_task_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_ai_3d_task` --- - -LOCK TABLES `t_ai_3d_task` WRITE; -/*!40000 ALTER TABLE `t_ai_3d_task` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_ai_3d_task` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest` --- - -DROP TABLE IF EXISTS `t_contest`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `contest_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `contest_state` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'unpublished', - `start_time` datetime(3) NOT NULL, - `end_time` datetime(3) NOT NULL, - `address` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `content` text COLLATE utf8mb4_unicode_ci, - `contest_tenants` json DEFAULT NULL, - `cover_url` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `poster_url` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `contact_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `contact_phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `contact_qrcode` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `organizers` json DEFAULT NULL, - `co_organizers` json DEFAULT NULL, - `sponsors` json DEFAULT NULL, - `register_start_time` datetime(3) NOT NULL, - `register_end_time` datetime(3) NOT NULL, - `register_state` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `submit_rule` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'once', - `submit_start_time` datetime(3) NOT NULL, - `submit_end_time` datetime(3) NOT NULL, - `review_rule_id` int DEFAULT NULL, - `review_start_time` datetime(3) NOT NULL, - `review_end_time` datetime(3) NOT NULL, - `result_publish_time` datetime(3) DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - `allowed_classes` json DEFAULT NULL, - `allowed_grades` json DEFAULT NULL, - `require_audit` tinyint(1) NOT NULL DEFAULT '1', - `result_state` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'unpublished', - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'ongoing', - `team_max_members` int DEFAULT NULL, - `team_min_members` int DEFAULT NULL, - `work_requirement` text COLLATE utf8mb4_unicode_ci, - `work_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `visibility` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'designated', - `age_max` int DEFAULT NULL, - `age_min` int DEFAULT NULL, - `target_cities` json DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_contest_name_key` (`contest_name`), - KEY `t_contest_contest_state_idx` (`contest_state`), - KEY `t_contest_start_time_end_time_idx` (`start_time`,`end_time`), - KEY `t_contest_review_rule_id_idx` (`review_rule_id`), - KEY `t_contest_creator_fkey` (`creator`), - KEY `t_contest_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_review_rule_id_fkey` FOREIGN KEY (`review_rule_id`) REFERENCES `t_contest_review_rule` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest` --- - -LOCK TABLES `t_contest` WRITE; -/*!40000 ALTER TABLE `t_contest` DISABLE KEYS */; -INSERT INTO `t_contest` VALUES (1,'全国少儿绘本创作大赛','individual','published','2026-03-01 00:00:00.000','2026-06-30 00:00:00.000',NULL,'

面向全国3-16岁少儿的绘本创作活动

','null',NULL,NULL,NULL,NULL,NULL,'[\"广东省立中山图书馆\"]','null','null','2026-03-01 00:00:00.000','2026-04-15 00:00:00.000',NULL,'once','2026-04-16 00:00:00.000','2026-05-30 00:00:00.000',NULL,'2026-06-01 00:00:00.000','2026-06-25 00:00:00.000',NULL,8,8,'2026-03-24 08:06:30.159','2026-03-24 08:07:34.785',1,'null','null',1,'unpublished','ongoing',NULL,NULL,NULL,NULL,'public',16,3,NULL),(2,'内部测试活动','individual','published','2026-03-01 00:00:00.000','2026-06-30 00:00:00.000',NULL,'

内部测试

','null',NULL,NULL,NULL,NULL,NULL,'[\"内部\"]','null','null','2026-03-01 00:00:00.000','2026-04-15 00:00:00.000',NULL,'once','2026-04-16 00:00:00.000','2026-05-30 00:00:00.000',NULL,'2026-06-01 00:00:00.000','2026-06-25 00:00:00.000',NULL,8,8,'2026-03-24 08:06:30.197','2026-03-24 08:07:34.805',1,'null','null',1,'unpublished','ongoing',NULL,NULL,NULL,NULL,'internal',NULL,NULL,NULL),(3,'广州绘本工作坊','individual','published','2026-03-01 00:00:00.000','2026-06-30 00:00:00.000',NULL,'

广深地区6-12岁

','null',NULL,NULL,NULL,NULL,NULL,'[\"广东省立中山图书馆\"]','null','null','2026-03-01 00:00:00.000','2026-04-15 00:00:00.000',NULL,'once','2026-04-16 00:00:00.000','2026-05-30 00:00:00.000',NULL,'2026-06-01 00:00:00.000','2026-06-25 00:00:00.000',NULL,8,8,'2026-03-24 08:07:08.176','2026-03-24 08:07:34.824',1,'null','null',1,'unpublished','ongoing',NULL,NULL,NULL,NULL,'targeted',12,6,'[\"广州\", \"深圳\"]'),(4,'2026年少儿绘本创作大赛','individual','published','2026-03-01 00:00:00.000','2026-05-31 23:59:59.000',NULL,'面向全省少年儿童的原创绘本创作比赛,鼓励孩子们用画笔描绘美好世界。','[9]','https://picsum.photos/seed/contest1/800/400',NULL,'张老师','020-12345678',NULL,NULL,NULL,NULL,'2026-03-01 00:00:00.000','2026-04-15 23:59:59.000',NULL,'once','2026-03-15 00:00:00.000','2026-04-05 23:59:59.000',1,'2026-04-10 00:00:00.000','2026-04-30 23:59:59.000',NULL,8,NULL,'2026-03-31 16:23:06.000','2026-03-31 11:43:51.345',1,NULL,NULL,1,'unpublished','finished',NULL,NULL,NULL,NULL,'designated',NULL,NULL,NULL),(5,'第三届亲子阅读绘画展','individual','published','2026-02-15 00:00:00.000','2026-04-10 23:59:59.000',NULL,'以\"我和爸爸妈妈的故事\"为主题,展现亲子间的温暖瞬间。','[9]','https://picsum.photos/seed/contest2/800/400',NULL,'李主任','020-87654321',NULL,NULL,NULL,NULL,'2026-02-15 00:00:00.000','2026-03-15 23:59:59.000',NULL,'once','2026-02-20 00:00:00.000','2026-03-20 23:59:59.000',NULL,'2026-03-25 00:00:00.000','2026-04-05 23:59:59.000',NULL,8,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,NULL,1,'unpublished','ongoing',NULL,NULL,NULL,NULL,'designated',NULL,NULL,NULL),(6,'寒假绘本阅读打卡活动','individual','published','2026-01-15 00:00:00.000','2026-02-28 23:59:59.000',NULL,'寒假期间每天阅读一本绘本并画出读后感,养成良好阅读习惯。','[9]','https://picsum.photos/seed/contest3/800/400',NULL,'王老师','020-11112222',NULL,NULL,NULL,NULL,'2026-01-15 00:00:00.000','2026-01-31 23:59:59.000',NULL,'once','2026-01-20 00:00:00.000','2026-02-20 23:59:59.000',NULL,'2026-02-21 00:00:00.000','2026-02-28 23:59:59.000',NULL,8,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,NULL,1,'published','finished',NULL,NULL,NULL,NULL,'designated',NULL,NULL,NULL); -/*!40000 ALTER TABLE `t_contest` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_attachment` --- - -DROP TABLE IF EXISTS `t_contest_attachment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_attachment` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `file_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `file_url` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `format` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `file_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `size` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_contest_attachment_contest_id_idx` (`contest_id`), - KEY `t_contest_attachment_creator_fkey` (`creator`), - KEY `t_contest_attachment_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_attachment_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_attachment_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_attachment_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_attachment` --- - -LOCK TABLES `t_contest_attachment` WRITE; -/*!40000 ALTER TABLE `t_contest_attachment` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_attachment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_judge` --- - -DROP TABLE IF EXISTS `t_contest_judge`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_judge` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `judge_id` int NOT NULL, - `specialty` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `weight` decimal(3,2) DEFAULT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_judge_contest_id_judge_id_key` (`contest_id`,`judge_id`), - KEY `t_contest_judge_contest_id_idx` (`contest_id`), - KEY `t_contest_judge_judge_id_idx` (`judge_id`), - KEY `t_contest_judge_creator_fkey` (`creator`), - KEY `t_contest_judge_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_judge_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_judge_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_judge_judge_id_fkey` FOREIGN KEY (`judge_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_judge_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_judge` --- - -LOCK TABLES `t_contest_judge` WRITE; -/*!40000 ALTER TABLE `t_contest_judge` DISABLE KEYS */; -INSERT INTO `t_contest_judge` VALUES (2,5,17,NULL,NULL,NULL,8,NULL,'2026-03-31 16:23:21.111','2026-03-31 16:23:21.000',1),(5,4,17,NULL,NULL,NULL,8,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000',1),(6,4,18,NULL,NULL,NULL,8,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000',1),(7,4,19,NULL,NULL,NULL,8,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000',1); -/*!40000 ALTER TABLE `t_contest_judge` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_notice` --- - -DROP TABLE IF EXISTS `t_contest_notice`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_notice` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `content` text COLLATE utf8mb4_unicode_ci NOT NULL, - `notice_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'manual', - `priority` int NOT NULL DEFAULT '0', - `publish_time` datetime(3) DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_contest_notice_contest_id_idx` (`contest_id`), - KEY `t_contest_notice_publish_time_idx` (`publish_time`), - KEY `t_contest_notice_notice_type_idx` (`notice_type`), - KEY `t_contest_notice_creator_fkey` (`creator`), - KEY `t_contest_notice_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_notice_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_notice_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_notice_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_notice` --- - -LOCK TABLES `t_contest_notice` WRITE; -/*!40000 ALTER TABLE `t_contest_notice` DISABLE KEYS */; -INSERT INTO `t_contest_notice` VALUES (1,4,'2026年少儿绘本创作大赛报名通知','

各位家长和小朋友:

2026年少儿绘本创作大赛现已开放报名!本次大赛面向全省6-14岁少年儿童,鼓励原创绘本创作。

报名时间:2026年3月1日 - 4月15日

作品提交:2026年3月15日 - 4月5日

参赛要求:

  • 作品须为原创,不得抄袭他人作品
  • 每人限提交一份作品
  • 作品页数不少于8页

期待每一位小画家的精彩作品!

','manual',1,'2026-03-05 10:00:00.000',8,NULL,'2026-03-31 18:51:12.686','2026-03-31 18:51:12.000',1),(2,4,'关于延长作品提交截止时间的通知','

各位参赛选手:

应广大参赛者要求,经组委会研究决定,本次大赛作品提交截止时间延长至4月10日

请尚未提交作品的选手抓紧时间完成创作。已提交的作品如需修改,可在截止时间前重新上传。

如有疑问请联系组委会:020-12345678

','manual',2,'2026-03-28 14:00:00.000',8,NULL,'2026-03-31 18:51:12.686','2026-03-31 18:51:12.000',1),(3,4,'评审阶段即将开始','

各位参赛选手及家长:

本次大赛作品征集已圆满结束,共收到参赛作品百余份。评审工作将于4月10日正式启动。

评审安排:

  • 评审时间:4月10日 - 4月30日
  • 评审方式:由专业评委从创意、画面、故事、完整性四个维度综合评分
  • 结果公布:预计5月中旬

感谢大家的参与和支持!

','manual',0,NULL,8,NULL,'2026-03-31 18:51:12.686','2026-03-31 10:54:01.313',1),(4,5,'第三届亲子阅读绘画展征稿启事','

亲爱的家长朋友们:

第三届亲子阅读绘画展现面向全市家庭征集亲子共创作品。以\"我和爸爸妈妈的故事\"为主题,用绘画记录亲子间的温暖时光。

参展要求:

  • 由家长和孩子共同完成
  • 画面需包含亲子互动场景
  • 作品尺寸不限,格式支持JPG/PNG
','manual',1,NULL,8,NULL,'2026-03-31 18:51:12.686','2026-03-31 10:53:49.698',1),(5,5,'亲子绘画展评审结果即将揭晓','

各位参展家庭:

本届亲子阅读绘画展共收到参展作品数十幅,评审工作已接近尾声。

最终结果将于近日公布,届时获奖作品将在图书馆一楼大厅展出一个月。

敬请期待!

','manual',0,'2026-03-31 10:53:54.967',8,NULL,'2026-03-31 18:51:12.686','2026-03-31 10:53:54.984',1),(6,6,'寒假阅读打卡活动圆满结束','

各位参与者:

2026年寒假绘本阅读打卡活动已圆满结束!本次活动共有数十位小朋友坚持完成了30天阅读打卡,表现非常棒!

获奖名单:

  • 最佳阅读之星:小明同学
  • 最佳读后感:小红姐姐

证书将于近日通过快递寄出,请注意查收。

感谢所有参与者,让我们一起爱上阅读!

','manual',1,'2026-03-01 10:00:00.000',8,NULL,'2026-03-31 18:51:12.686','2026-03-31 18:51:12.000',1); -/*!40000 ALTER TABLE `t_contest_notice` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_registration` --- - -DROP TABLE IF EXISTS `t_contest_registration`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_registration` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `tenant_id` int NOT NULL, - `registration_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `team_id` int DEFAULT NULL, - `team_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `user_id` int NOT NULL, - `account_no` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `account_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `role` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `registration_state` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', - `registrant` int DEFAULT NULL, - `registration_time` datetime(3) NOT NULL, - `reason` varchar(1023) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `operator` int DEFAULT NULL, - `operation_date` datetime(3) DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - `child_id` int DEFAULT NULL, - `participant_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'self', - PRIMARY KEY (`id`), - KEY `t_contest_registration_contest_id_tenant_id_idx` (`contest_id`,`tenant_id`), - KEY `t_contest_registration_user_id_contest_id_idx` (`user_id`,`contest_id`), - KEY `t_contest_registration_team_id_idx` (`team_id`), - KEY `t_contest_registration_registration_state_idx` (`registration_state`), - KEY `t_contest_registration_tenant_id_fkey` (`tenant_id`), - KEY `t_contest_registration_creator_fkey` (`creator`), - KEY `t_contest_registration_modifier_fkey` (`modifier`), - KEY `t_contest_registration_participant_type_idx` (`participant_type`), - KEY `t_contest_registration_child_id_idx` (`child_id`), - CONSTRAINT `t_contest_registration_child_id_fkey` FOREIGN KEY (`child_id`) REFERENCES `children` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_team_id_fkey` FOREIGN KEY (`team_id`) REFERENCES `t_contest_team` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_registration` --- - -LOCK TABLES `t_contest_registration` WRITE; -/*!40000 ALTER TABLE `t_contest_registration` DISABLE KEYS */; -INSERT INTO `t_contest_registration` VALUES (1,1,8,'individual',NULL,NULL,10,'testuser01','测试01',NULL,'pending',10,'2026-03-24 08:10:06.291',NULL,NULL,NULL,NULL,NULL,'2026-03-24 08:10:06.293','2026-03-24 08:10:06.293',1,NULL,'self'),(2,1,8,'individual',NULL,NULL,10,'testuser01','测试小明',NULL,'pending',10,'2026-03-24 08:10:06.348',NULL,NULL,NULL,NULL,NULL,'2026-03-24 08:10:06.351','2026-03-24 08:10:06.351',1,3,'child'),(3,3,8,'individual',NULL,NULL,10,'testuser01','测试小明',NULL,'pending',10,'2026-03-24 08:11:22.720',NULL,NULL,NULL,NULL,NULL,'2026-03-24 08:11:22.722','2026-03-24 08:11:22.722',1,3,'child'),(4,4,9,NULL,NULL,NULL,12,'xiaoming','小明同学',NULL,'passed',NULL,'2026-03-10 10:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'),(5,4,9,NULL,NULL,NULL,13,'xiaohong','小红姐姐',NULL,'passed',NULL,'2026-03-11 14:30:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'),(6,4,9,NULL,NULL,NULL,14,'dahua','大画家',NULL,'passed',NULL,'2026-03-12 09:15:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'),(7,4,9,NULL,NULL,NULL,15,'mengmeng','萌萌妈妈',NULL,'pending',NULL,'2026-03-30 16:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'child'),(8,4,9,NULL,NULL,NULL,16,'xiaoliu','小刘老师',NULL,'pending',NULL,'2026-03-31 08:30:00.000',NULL,8,'2026-03-31 09:22:54.287',NULL,8,'2026-03-31 16:23:06.000','2026-03-31 09:22:54.288',1,NULL,'self'),(9,5,9,NULL,NULL,NULL,12,'xiaoming','小明同学',NULL,'passed',NULL,'2026-02-20 10:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'),(10,5,9,NULL,NULL,NULL,13,'xiaohong','小红姐姐',NULL,'passed',NULL,'2026-02-22 11:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'),(11,5,9,NULL,NULL,NULL,14,'dahua','大画家',NULL,'passed',NULL,'2026-02-25 14:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'),(12,5,9,NULL,NULL,NULL,15,'mengmeng','萌萌妈妈',NULL,'passed',NULL,'2026-03-01 09:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'child'),(13,6,9,NULL,NULL,NULL,12,'xiaoming','小明同学',NULL,'passed',NULL,'2026-01-18 10:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'),(14,6,9,NULL,NULL,NULL,13,'xiaohong','小红姐姐',NULL,'passed',NULL,'2026-01-20 15:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'),(15,6,9,NULL,NULL,NULL,16,'xiaoliu','小刘老师',NULL,'passed',NULL,'2026-01-22 11:00:00.000',NULL,NULL,NULL,NULL,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,'self'); -/*!40000 ALTER TABLE `t_contest_registration` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_registration_teacher` --- - -DROP TABLE IF EXISTS `t_contest_registration_teacher`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_registration_teacher` ( - `id` int NOT NULL AUTO_INCREMENT, - `registration_id` int NOT NULL, - `tenant_id` int NOT NULL, - `user_id` int NOT NULL, - `is_default` tinyint(1) NOT NULL DEFAULT '0', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_registration_teacher_tenant_id_registration_id_use_key` (`tenant_id`,`registration_id`,`user_id`), - KEY `t_contest_registration_teacher_registration_id_idx` (`registration_id`), - KEY `t_contest_registration_teacher_user_id_idx` (`user_id`), - KEY `t_contest_registration_teacher_creator_fkey` (`creator`), - KEY `t_contest_registration_teacher_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_registration_teacher_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_teacher_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_teacher_registration_id_fkey` FOREIGN KEY (`registration_id`) REFERENCES `t_contest_registration` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_teacher_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_teacher_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_registration_teacher` --- - -LOCK TABLES `t_contest_registration_teacher` WRITE; -/*!40000 ALTER TABLE `t_contest_registration_teacher` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_registration_teacher` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_review_rule` --- - -DROP TABLE IF EXISTS `t_contest_review_rule`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_review_rule` ( - `id` int NOT NULL AUTO_INCREMENT, - `rule_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `dimensions` json NOT NULL, - `calculation_rule` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'average', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - `judge_count` int DEFAULT NULL, - `rule_description` text COLLATE utf8mb4_unicode_ci, - `tenant_id` int NOT NULL, - PRIMARY KEY (`id`), - KEY `t_contest_review_rule_creator_fkey` (`creator`), - KEY `t_contest_review_rule_modifier_fkey` (`modifier`), - KEY `t_contest_review_rule_tenant_id_idx` (`tenant_id`), - CONSTRAINT `t_contest_review_rule_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_review_rule_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_review_rule_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_review_rule` --- - -LOCK TABLES `t_contest_review_rule` WRITE; -/*!40000 ALTER TABLE `t_contest_review_rule` DISABLE KEYS */; -INSERT INTO `t_contest_review_rule` VALUES (1,'绘本创作评审标准(百分制)','[{\"name\": \"创意构思\", \"maxScore\": 30, \"description\": \"主题新颖性、想象力丰富程度\"}, {\"name\": \"画面表现\", \"maxScore\": 30, \"description\": \"色彩运用、构图布局、绘画技巧\"}, {\"name\": \"故事叙述\", \"maxScore\": 25, \"description\": \"故事完整性、情节连贯性、文字表达\"}, {\"name\": \"作品完整性\", \"maxScore\": 15, \"description\": \"页面数量、封面设计、整体完成度\"}]','average',8,NULL,'2026-03-31 18:02:35.317','2026-03-31 18:02:35.000',1,3,'适用于少儿绘本创作类活动,从创意、画面、故事、完整性四个维度综合评分',9),(2,'阅读感悟评审标准','[{\"name\": \"阅读理解\", \"maxScore\": 40, \"description\": \"对原著内容的理解深度\"}, {\"name\": \"个人感悟\", \"maxScore\": 35, \"description\": \"结合自身经历的感悟表达\"}, {\"name\": \"表达能力\", \"maxScore\": 25, \"description\": \"语言组织、逻辑清晰度\"}]','average',8,NULL,'2026-03-31 18:02:35.317','2026-03-31 18:02:35.000',1,2,'适用于阅读打卡、读后感类活动,侧重阅读理解和个人感悟',9),(3,'亲子互动评审标准','[{\"name\": \"亲子互动\", \"maxScore\": 35, \"description\": \"亲子合作程度、互动过程记录\"}, {\"name\": \"情感表达\", \"maxScore\": 35, \"description\": \"亲子感情的真实表达\"}, {\"name\": \"作品呈现\", \"maxScore\": 30, \"description\": \"作品整体完成度和美感\"}]','average',8,NULL,'2026-03-31 18:02:35.317','2026-03-31 18:02:35.000',1,2,'适用于亲子主题活动,评估亲子互动质量和作品呈现',9); -/*!40000 ALTER TABLE `t_contest_review_rule` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_team` --- - -DROP TABLE IF EXISTS `t_contest_team`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_team` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `contest_id` int NOT NULL, - `team_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `leader_user_id` int NOT NULL, - `max_members` int DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_team_tenant_id_contest_id_team_name_key` (`tenant_id`,`contest_id`,`team_name`), - KEY `t_contest_team_contest_id_idx` (`contest_id`), - KEY `t_contest_team_leader_user_id_idx` (`leader_user_id`), - KEY `t_contest_team_creator_fkey` (`creator`), - KEY `t_contest_team_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_team_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_leader_user_id_fkey` FOREIGN KEY (`leader_user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_team` --- - -LOCK TABLES `t_contest_team` WRITE; -/*!40000 ALTER TABLE `t_contest_team` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_team` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_team_member` --- - -DROP TABLE IF EXISTS `t_contest_team_member`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_team_member` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `team_id` int NOT NULL, - `user_id` int NOT NULL, - `role` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'member', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_team_member_tenant_id_team_id_user_id_key` (`tenant_id`,`team_id`,`user_id`), - KEY `t_contest_team_member_team_id_idx` (`team_id`), - KEY `t_contest_team_member_user_id_idx` (`user_id`), - KEY `t_contest_team_member_creator_fkey` (`creator`), - KEY `t_contest_team_member_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_team_member_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_member_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_member_team_id_fkey` FOREIGN KEY (`team_id`) REFERENCES `t_contest_team` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_member_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_member_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_team_member` --- - -LOCK TABLES `t_contest_team_member` WRITE; -/*!40000 ALTER TABLE `t_contest_team_member` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_team_member` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_work` --- - -DROP TABLE IF EXISTS `t_contest_work`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_work` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `contest_id` int NOT NULL, - `registration_id` int NOT NULL, - `work_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `files` json DEFAULT NULL, - `version` int NOT NULL DEFAULT '1', - `is_latest` tinyint(1) NOT NULL DEFAULT '1', - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'submitted', - `submit_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `submitter_user_id` int DEFAULT NULL, - `submitter_account_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `submit_source` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'teacher', - `preview_url` text COLLATE utf8mb4_unicode_ci, - `ai_model_meta` json DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - `award_level` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `award_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `certificate_url` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `final_score` decimal(10,2) DEFAULT NULL, - `preview_urls` json DEFAULT NULL, - `rank` int DEFAULT NULL, - `user_work_id` int DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_work_work_no_key` (`work_no`), - KEY `t_contest_work_tenant_id_contest_id_is_latest_idx` (`tenant_id`,`contest_id`,`is_latest`), - KEY `t_contest_work_registration_id_idx` (`registration_id`), - KEY `t_contest_work_tenant_id_contest_id_submit_time_status_idx` (`tenant_id`,`contest_id`,`submit_time`,`status`), - KEY `t_contest_work_contest_id_status_idx` (`contest_id`,`status`), - KEY `t_contest_work_creator_fkey` (`creator`), - KEY `t_contest_work_modifier_fkey` (`modifier`), - KEY `t_contest_work_user_work_id_fkey` (`user_work_id`), - CONSTRAINT `t_contest_work_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_registration_id_fkey` FOREIGN KEY (`registration_id`) REFERENCES `t_contest_registration` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_user_work_id_fkey` FOREIGN KEY (`user_work_id`) REFERENCES `user_works` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_work` --- - -LOCK TABLES `t_contest_work` WRITE; -/*!40000 ALTER TABLE `t_contest_work` DISABLE KEYS */; -INSERT INTO `t_contest_work` VALUES (1,9,4,4,NULL,'森林里的音乐会','小动物们在森林里举办了一场盛大的音乐会',NULL,1,1,'awarded','2026-03-18 10:00:00.000',12,NULL,'student','https://picsum.photos/seed/work-c1-1/400/533',NULL,12,NULL,'2026-03-31 16:23:06.000','2026-03-31 11:43:55.394',1,'一等奖','一等奖',NULL,90.33,NULL,1,NULL),(2,9,4,5,NULL,'海边的贝壳梦','小女孩在海边捡到了一个会说话的贝壳',NULL,1,1,'awarded','2026-03-20 14:00:00.000',13,NULL,'student','https://picsum.photos/seed/work-c1-2/400/533',NULL,13,NULL,'2026-03-31 16:23:06.000','2026-03-31 11:43:55.401',1,'三等奖','三等奖',NULL,79.00,NULL,3,NULL),(3,9,4,6,NULL,'云端上的图书馆','一座建在云朵上的神奇图书馆',NULL,1,1,'awarded','2026-03-22 16:30:00.000',14,NULL,'student','https://picsum.photos/seed/work-c1-3/400/533',NULL,14,NULL,'2026-03-31 16:23:06.000','2026-03-31 11:43:55.398',1,'二等奖','二等奖',NULL,85.33,NULL,2,NULL),(4,9,5,9,NULL,'和妈妈一起画星星','记录了和妈妈一起画画的温馨夜晚',NULL,1,1,'submitted','2026-03-05 10:00:00.000',12,NULL,'student','https://picsum.photos/seed/work-c2-1/400/533',NULL,12,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(5,9,5,10,NULL,'爸爸的大手','用绘画记录爸爸温暖的大手牵着我的小手',NULL,1,1,'submitted','2026-03-08 11:30:00.000',13,NULL,'student','https://picsum.photos/seed/work-c2-2/400/533',NULL,13,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(6,9,5,11,NULL,'全家福的故事','一幅全家福背后的温暖故事',NULL,1,1,'submitted','2026-03-10 09:00:00.000',14,NULL,'student','https://picsum.photos/seed/work-c2-3/400/533',NULL,14,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(7,9,6,13,NULL,'我的寒假阅读日记','记录了寒假30天的阅读旅程',NULL,1,1,'accepted','2026-02-10 10:00:00.000',12,NULL,'student','https://picsum.photos/seed/work-c3-1/400/533',NULL,12,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(8,9,6,14,NULL,'绘本里的四季','用绘画展现四季的变化',NULL,1,1,'accepted','2026-02-12 15:00:00.000',13,NULL,'student','https://picsum.photos/seed/work-c3-2/400/533',NULL,13,NULL,'2026-03-31 16:23:06.000','2026-03-31 16:23:06.000',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL); -/*!40000 ALTER TABLE `t_contest_work` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_work_attachment` --- - -DROP TABLE IF EXISTS `t_contest_work_attachment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_work_attachment` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `contest_id` int NOT NULL, - `work_id` int NOT NULL, - `file_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `file_url` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `format` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `file_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `size` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `t_contest_work_attachment_tenant_id_contest_id_work_id_idx` (`tenant_id`,`contest_id`,`work_id`), - KEY `t_contest_work_attachment_work_id_fkey` (`work_id`), - KEY `t_contest_work_attachment_creator_fkey` (`creator`), - KEY `t_contest_work_attachment_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_work_attachment_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_attachment_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_attachment_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_attachment_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `t_contest_work` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_work_attachment` --- - -LOCK TABLES `t_contest_work_attachment` WRITE; -/*!40000 ALTER TABLE `t_contest_work_attachment` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_work_attachment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_work_judge_assignment` --- - -DROP TABLE IF EXISTS `t_contest_work_judge_assignment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_work_judge_assignment` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `work_id` int NOT NULL, - `judge_id` int NOT NULL, - `assignment_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'assigned', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_work_judge_assignment_work_id_judge_id_key` (`work_id`,`judge_id`), - KEY `t_contest_work_judge_assignment_contest_id_judge_id_idx` (`contest_id`,`judge_id`), - KEY `t_contest_work_judge_assignment_work_id_idx` (`work_id`), - KEY `t_contest_work_judge_assignment_status_idx` (`status`), - KEY `t_contest_work_judge_assignment_judge_id_fkey` (`judge_id`), - KEY `t_contest_work_judge_assignment_creator_fkey` (`creator`), - KEY `t_contest_work_judge_assignment_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_work_judge_assignment_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_judge_assignment_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_judge_assignment_judge_id_fkey` FOREIGN KEY (`judge_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_judge_assignment_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_judge_assignment_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `t_contest_work` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_work_judge_assignment` --- - -LOCK TABLES `t_contest_work_judge_assignment` WRITE; -/*!40000 ALTER TABLE `t_contest_work_judge_assignment` DISABLE KEYS */; -INSERT INTO `t_contest_work_judge_assignment` VALUES (11,4,1,17,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'),(12,4,1,18,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'),(13,4,1,19,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'),(14,4,2,17,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'),(15,4,2,18,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'),(16,4,2,19,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'),(17,4,3,17,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'),(18,4,3,18,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'),(19,4,3,19,'2026-03-31 19:13:43.581','completed',NULL,NULL,'2026-03-31 19:13:43.581','2026-03-31 19:13:43.000'); -/*!40000 ALTER TABLE `t_contest_work_judge_assignment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_work_score` --- - -DROP TABLE IF EXISTS `t_contest_work_score`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_work_score` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `contest_id` int NOT NULL, - `work_id` int NOT NULL, - `assignment_id` int NOT NULL, - `judge_id` int NOT NULL, - `judge_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `dimension_scores` json NOT NULL, - `total_score` decimal(10,2) NOT NULL, - `comments` text COLLATE utf8mb4_unicode_ci, - `score_time` datetime(3) NOT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_contest_work_score_contest_id_work_id_judge_id_idx` (`contest_id`,`work_id`,`judge_id`), - KEY `t_contest_work_score_work_id_idx` (`work_id`), - KEY `t_contest_work_score_assignment_id_idx` (`assignment_id`), - KEY `t_contest_work_score_tenant_id_fkey` (`tenant_id`), - KEY `t_contest_work_score_judge_id_fkey` (`judge_id`), - KEY `t_contest_work_score_creator_fkey` (`creator`), - KEY `t_contest_work_score_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_work_score_assignment_id_fkey` FOREIGN KEY (`assignment_id`) REFERENCES `t_contest_work_judge_assignment` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_judge_id_fkey` FOREIGN KEY (`judge_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `t_contest_work` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_work_score` --- - -LOCK TABLES `t_contest_work_score` WRITE; -/*!40000 ALTER TABLE `t_contest_work_score` DISABLE KEYS */; -INSERT INTO `t_contest_work_score` VALUES (1,9,4,1,11,17,'陈评委','[{\"name\": \"创意构思\", \"score\": 28}, {\"name\": \"画面表现\", \"score\": 27}, {\"name\": \"故事叙述\", \"score\": 23}, {\"name\": \"完整性\", \"score\": 14}]',92.00,'创意非常好,画面精美,故事完整流畅','2026-03-25 10:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1),(2,9,4,1,12,18,'李评委','[{\"name\": \"创意构思\", \"score\": 26}, {\"name\": \"画面表现\", \"score\": 28}, {\"name\": \"故事叙述\", \"score\": 22}, {\"name\": \"完整性\", \"score\": 13}]',89.00,'画面表现突出,主题明确','2026-03-25 14:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1),(3,9,4,1,13,19,'王评委','[{\"name\": \"创意构思\", \"score\": 27}, {\"name\": \"画面表现\", \"score\": 26}, {\"name\": \"故事叙述\", \"score\": 24}, {\"name\": \"完整性\", \"score\": 13}]',90.00,'整体水平很高,推荐获奖','2026-03-26 09:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1),(4,9,4,2,14,17,'陈评委','[{\"name\": \"创意构思\", \"score\": 24}, {\"name\": \"画面表现\", \"score\": 22}, {\"name\": \"故事叙述\", \"score\": 20}, {\"name\": \"完整性\", \"score\": 12}]',78.00,'创意不错,画面可以再精细一些','2026-03-25 11:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1),(5,9,4,2,15,18,'李评委','[{\"name\": \"创意构思\", \"score\": 22}, {\"name\": \"画面表现\", \"score\": 25}, {\"name\": \"故事叙述\", \"score\": 18}, {\"name\": \"完整性\", \"score\": 12}]',77.00,'故事情节可以更丰富','2026-03-25 15:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1),(6,9,4,2,16,19,'王评委','[{\"name\": \"创意构思\", \"score\": 23}, {\"name\": \"画面表现\", \"score\": 24}, {\"name\": \"故事叙述\", \"score\": 21}, {\"name\": \"完整性\", \"score\": 14}]',82.00,'整体表现良好','2026-03-26 10:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1),(7,9,4,3,17,17,'陈评委','[{\"name\": \"创意构思\", \"score\": 27}, {\"name\": \"画面表现\", \"score\": 25}, {\"name\": \"故事叙述\", \"score\": 22}, {\"name\": \"完整性\", \"score\": 13}]',87.00,'想象力丰富,构思独特','2026-03-25 12:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1),(8,9,4,3,18,18,'李评委','[{\"name\": \"创意构思\", \"score\": 25}, {\"name\": \"画面表现\", \"score\": 24}, {\"name\": \"故事叙述\", \"score\": 21}, {\"name\": \"完整性\", \"score\": 13}]',83.00,'创意独特,但完整度还能提升','2026-03-25 16:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1),(9,9,4,3,19,19,'王评委','[{\"name\": \"创意构思\", \"score\": 26}, {\"name\": \"画面表现\", \"score\": 25}, {\"name\": \"故事叙述\", \"score\": 23}, {\"name\": \"完整性\", \"score\": 12}]',86.00,'优秀作品,值得推荐','2026-03-26 11:00:00.000',NULL,NULL,'2026-03-31 19:13:43.583','2026-03-31 19:13:43.000',1); -/*!40000 ALTER TABLE `t_contest_work_score` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_homework` --- - -DROP TABLE IF EXISTS `t_homework`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_homework` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `content` text COLLATE utf8mb4_unicode_ci, - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'unpublished', - `publish_time` datetime(3) DEFAULT NULL, - `submit_start_time` datetime(3) NOT NULL, - `submit_end_time` datetime(3) NOT NULL, - `attachments` json DEFAULT NULL, - `publish_scope` json DEFAULT NULL, - `review_rule_id` int DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_homework_tenant_id_status_idx` (`tenant_id`,`status`), - KEY `t_homework_tenant_id_submit_start_time_submit_end_time_idx` (`tenant_id`,`submit_start_time`,`submit_end_time`), - KEY `t_homework_review_rule_id_fkey` (`review_rule_id`), - KEY `t_homework_creator_fkey` (`creator`), - KEY `t_homework_modifier_fkey` (`modifier`), - CONSTRAINT `t_homework_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_review_rule_id_fkey` FOREIGN KEY (`review_rule_id`) REFERENCES `t_homework_review_rule` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_homework` --- - -LOCK TABLES `t_homework` WRITE; -/*!40000 ALTER TABLE `t_homework` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_homework` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_homework_review_rule` --- - -DROP TABLE IF EXISTS `t_homework_review_rule`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_homework_review_rule` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `criteria` json NOT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_homework_review_rule_tenant_id_idx` (`tenant_id`), - KEY `t_homework_review_rule_creator_fkey` (`creator`), - KEY `t_homework_review_rule_modifier_fkey` (`modifier`), - CONSTRAINT `t_homework_review_rule_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_review_rule_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_review_rule_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_homework_review_rule` --- - -LOCK TABLES `t_homework_review_rule` WRITE; -/*!40000 ALTER TABLE `t_homework_review_rule` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_homework_review_rule` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_homework_score` --- - -DROP TABLE IF EXISTS `t_homework_score`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_homework_score` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `submission_id` int NOT NULL, - `reviewer_id` int NOT NULL, - `dimension_scores` json NOT NULL, - `total_score` decimal(10,2) NOT NULL, - `comments` text COLLATE utf8mb4_unicode_ci, - `score_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_homework_score_submission_id_reviewer_id_key` (`submission_id`,`reviewer_id`), - KEY `t_homework_score_tenant_id_submission_id_idx` (`tenant_id`,`submission_id`), - KEY `t_homework_score_reviewer_id_idx` (`reviewer_id`), - KEY `t_homework_score_creator_fkey` (`creator`), - KEY `t_homework_score_modifier_fkey` (`modifier`), - CONSTRAINT `t_homework_score_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_score_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_score_reviewer_id_fkey` FOREIGN KEY (`reviewer_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_homework_score_submission_id_fkey` FOREIGN KEY (`submission_id`) REFERENCES `t_homework_submission` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_homework_score_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_homework_score` --- - -LOCK TABLES `t_homework_score` WRITE; -/*!40000 ALTER TABLE `t_homework_score` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_homework_score` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_homework_submission` --- - -DROP TABLE IF EXISTS `t_homework_submission`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_homework_submission` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `homework_id` int NOT NULL, - `student_id` int NOT NULL, - `work_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `work_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `work_description` text COLLATE utf8mb4_unicode_ci, - `files` json DEFAULT NULL, - `attachments` json DEFAULT NULL, - `submit_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', - `total_score` decimal(10,2) DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_homework_submission_homework_id_student_id_key` (`homework_id`,`student_id`), - KEY `t_homework_submission_tenant_id_homework_id_idx` (`tenant_id`,`homework_id`), - KEY `t_homework_submission_student_id_idx` (`student_id`), - KEY `t_homework_submission_status_idx` (`status`), - KEY `t_homework_submission_creator_fkey` (`creator`), - KEY `t_homework_submission_modifier_fkey` (`modifier`), - CONSTRAINT `t_homework_submission_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_submission_homework_id_fkey` FOREIGN KEY (`homework_id`) REFERENCES `t_homework` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_homework_submission_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_submission_student_id_fkey` FOREIGN KEY (`student_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_homework_submission_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_homework_submission` --- - -LOCK TABLES `t_homework_submission` WRITE; -/*!40000 ALTER TABLE `t_homework_submission` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_homework_submission` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_preset_comment` --- - -DROP TABLE IF EXISTS `t_preset_comment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_preset_comment` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `judge_id` int NOT NULL, - `content` text COLLATE utf8mb4_unicode_ci NOT NULL, - `score` decimal(10,2) DEFAULT NULL, - `sort_order` int NOT NULL DEFAULT '0', - `use_count` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `t_preset_comment_contest_id_judge_id_idx` (`contest_id`,`judge_id`), - KEY `t_preset_comment_judge_id_fkey` (`judge_id`), - CONSTRAINT `t_preset_comment_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_preset_comment_judge_id_fkey` FOREIGN KEY (`judge_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_preset_comment` --- - -LOCK TABLES `t_preset_comment` WRITE; -/*!40000 ALTER TABLE `t_preset_comment` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_preset_comment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `teachers` --- - -DROP TABLE IF EXISTS `teachers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `teachers` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `tenant_id` int NOT NULL, - `department_id` int NOT NULL, - `employee_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `id_card` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `gender` int DEFAULT NULL, - `birth_date` datetime(3) DEFAULT NULL, - `hire_date` datetime(3) DEFAULT NULL, - `subject` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `title` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `teachers_user_id_key` (`user_id`), - UNIQUE KEY `teachers_tenant_id_employee_no_key` (`tenant_id`,`employee_no`), - KEY `teachers_department_id_fkey` (`department_id`), - KEY `teachers_creator_fkey` (`creator`), - KEY `teachers_modifier_fkey` (`modifier`), - CONSTRAINT `teachers_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `teachers_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `departments` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `teachers_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `teachers_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `teachers_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `teachers` --- - -LOCK TABLES `teachers` WRITE; -/*!40000 ALTER TABLE `teachers` DISABLE KEYS */; -/*!40000 ALTER TABLE `teachers` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `tenant_menus` --- - -DROP TABLE IF EXISTS `tenant_menus`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `tenant_menus` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `menu_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `tenant_menus_tenant_id_menu_id_key` (`tenant_id`,`menu_id`), - KEY `tenant_menus_menu_id_fkey` (`menu_id`), - CONSTRAINT `tenant_menus_menu_id_fkey` FOREIGN KEY (`menu_id`) REFERENCES `menus` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `tenant_menus_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `tenant_menus` --- - -LOCK TABLES `tenant_menus` WRITE; -/*!40000 ALTER TABLE `tenant_menus` DISABLE KEYS */; -INSERT INTO `tenant_menus` VALUES (159,1,14),(160,1,17),(161,1,18),(162,1,19),(163,1,20),(164,1,21),(165,1,28),(156,1,29),(166,1,30),(157,1,32),(158,1,33),(150,1,37),(151,1,38),(152,1,39),(153,1,40),(154,1,41),(155,1,44),(167,1,46),(168,1,47),(169,1,48),(170,1,49),(32,4,1),(37,4,2),(33,4,3),(34,4,4),(35,4,5),(36,4,6),(38,4,7),(39,4,8),(40,5,1),(41,6,1),(89,7,34),(90,7,35),(91,7,36),(236,9,9),(237,9,10),(239,9,11),(240,9,12),(245,9,14),(247,9,15),(248,9,16),(249,9,20),(238,9,23),(243,9,24),(241,9,25),(242,9,26),(244,9,27),(250,9,35),(251,9,36),(231,9,37),(235,9,46),(230,9,50),(246,9,51),(232,9,52),(233,9,53),(234,9,54); -/*!40000 ALTER TABLE `tenant_menus` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `tenants` --- - -DROP TABLE IF EXISTS `tenants`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `tenants` ( - `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `domain` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `is_super` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `tenant_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'other', - PRIMARY KEY (`id`), - UNIQUE KEY `tenants_code_key` (`code`), - UNIQUE KEY `tenants_domain_key` (`domain`), - KEY `tenants_creator_fkey` (`creator`), - KEY `tenants_modifier_fkey` (`modifier`), - KEY `tenants_tenant_type_idx` (`tenant_type`), - CONSTRAINT `tenants_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `tenants_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `tenants` --- - -LOCK TABLES `tenants` WRITE; -/*!40000 ALTER TABLE `tenants` DISABLE KEYS */; -INSERT INTO `tenants` VALUES (1,'超级租户','super','super','系统超级租户,拥有所有权限',1,1,NULL,1,'2026-03-23 06:14:18.566','2026-03-27 13:07:55.499','platform'),(4,'学校管理端','school',NULL,'学校管理员端,管理学校信息、教师、学生等',0,1,NULL,NULL,'2026-03-23 09:29:48.584','2026-03-23 09:29:48.584','school'),(5,'教师端','teacher',NULL,'教师端,可以报名赛事、指导学生、管理作业',0,1,NULL,NULL,'2026-03-23 09:29:48.701','2026-03-23 09:29:48.701','other'),(6,'学生端','student',NULL,'学生端,可以查看赛事、上传作品、提交作业',0,1,NULL,NULL,'2026-03-23 09:29:48.812','2026-03-23 09:29:48.812','other'),(7,'评委端','judge',NULL,'评委端,可以评审作品、打分',0,1,NULL,NULL,'2026-03-23 09:29:48.901','2026-03-23 09:29:48.901','other'),(8,'公众用户','public',NULL,'公众自注册用户所属的系统租户',0,1,NULL,NULL,'2026-03-24 11:28:19.000','2026-03-24 11:28:19.000','platform'),(9,'广东省立中山图书馆','gdlib',NULL,'广东省图少儿绘本创作活动主办方',0,1,NULL,1,'2026-03-24 05:37:50.804','2026-04-01 08:46:08.509','library'); -/*!40000 ALTER TABLE `tenants` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_parent_child` --- - -DROP TABLE IF EXISTS `user_parent_child`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_parent_child` ( - `id` int NOT NULL AUTO_INCREMENT, - `parent_user_id` int NOT NULL, - `child_user_id` int NOT NULL, - `relationship` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `control_mode` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'open', - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `user_parent_child_parent_user_id_child_user_id_key` (`parent_user_id`,`child_user_id`), - KEY `user_parent_child_child_user_id_idx` (`child_user_id`), - CONSTRAINT `user_parent_child_child_user_id_fkey` FOREIGN KEY (`child_user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `user_parent_child_parent_user_id_fkey` FOREIGN KEY (`parent_user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_parent_child` --- - -LOCK TABLES `user_parent_child` WRITE; -/*!40000 ALTER TABLE `user_parent_child` DISABLE KEYS */; -/*!40000 ALTER TABLE `user_parent_child` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_roles` --- - -DROP TABLE IF EXISTS `user_roles`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_roles` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `role_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `user_roles_user_id_role_id_key` (`user_id`,`role_id`), - KEY `user_roles_role_id_fkey` (`role_id`), - CONSTRAINT `user_roles_role_id_fkey` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `user_roles_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_roles` --- - -LOCK TABLES `user_roles` WRITE; -/*!40000 ALTER TABLE `user_roles` DISABLE KEYS */; -INSERT INTO `user_roles` VALUES (1,1,1),(2,3,4),(3,4,5),(4,5,6),(5,6,7),(6,7,8),(7,8,9),(8,9,8),(9,10,8),(10,11,8),(11,12,8),(12,13,8),(13,14,8),(14,15,8),(15,16,8),(19,25,8),(20,26,8),(21,27,8),(22,28,8); -/*!40000 ALTER TABLE `user_roles` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_work_comments` --- - -DROP TABLE IF EXISTS `user_work_comments`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_work_comments` ( - `id` int NOT NULL AUTO_INCREMENT, - `work_id` int NOT NULL, - `user_id` int NOT NULL, - `parent_id` int DEFAULT NULL, - `content` text COLLATE utf8mb4_unicode_ci NOT NULL, - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `user_work_comments_work_id_status_create_time_idx` (`work_id`,`status`,`create_time`), - KEY `user_work_comments_user_id_fkey` (`user_id`), - KEY `user_work_comments_parent_id_fkey` (`parent_id`), - CONSTRAINT `user_work_comments_parent_id_fkey` FOREIGN KEY (`parent_id`) REFERENCES `user_work_comments` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `user_work_comments_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `user_work_comments_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `user_works` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_work_comments` --- - -LOCK TABLES `user_work_comments` WRITE; -/*!40000 ALTER TABLE `user_work_comments` DISABLE KEYS */; -/*!40000 ALTER TABLE `user_work_comments` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_work_favorites` --- - -DROP TABLE IF EXISTS `user_work_favorites`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_work_favorites` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `work_id` int NOT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `user_work_favorites_user_id_work_id_key` (`user_id`,`work_id`), - KEY `user_work_favorites_work_id_fkey` (`work_id`), - CONSTRAINT `user_work_favorites_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `user_work_favorites_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `user_works` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_work_favorites` --- - -LOCK TABLES `user_work_favorites` WRITE; -/*!40000 ALTER TABLE `user_work_favorites` DISABLE KEYS */; -INSERT INTO `user_work_favorites` VALUES (2,9,8,'2026-03-31 03:42:57.805'); -/*!40000 ALTER TABLE `user_work_favorites` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_work_likes` --- - -DROP TABLE IF EXISTS `user_work_likes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_work_likes` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `work_id` int NOT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - UNIQUE KEY `user_work_likes_user_id_work_id_key` (`user_id`,`work_id`), - KEY `user_work_likes_work_id_fkey` (`work_id`), - CONSTRAINT `user_work_likes_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `user_work_likes_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `user_works` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_work_likes` --- - -LOCK TABLES `user_work_likes` WRITE; -/*!40000 ALTER TABLE `user_work_likes` DISABLE KEYS */; -INSERT INTO `user_work_likes` VALUES (2,9,8,'2026-03-31 03:42:57.149'); -/*!40000 ALTER TABLE `user_work_likes` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_work_pages` --- - -DROP TABLE IF EXISTS `user_work_pages`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_work_pages` ( - `id` int NOT NULL AUTO_INCREMENT, - `work_id` int NOT NULL, - `page_no` int NOT NULL, - `image_url` text COLLATE utf8mb4_unicode_ci, - `text` text COLLATE utf8mb4_unicode_ci, - `audio_url` text COLLATE utf8mb4_unicode_ci, - PRIMARY KEY (`id`), - UNIQUE KEY `user_work_pages_work_id_page_no_key` (`work_id`,`page_no`), - CONSTRAINT `user_work_pages_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `user_works` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_work_pages` --- - -LOCK TABLES `user_work_pages` WRITE; -/*!40000 ALTER TABLE `user_work_pages` DISABLE KEYS */; -INSERT INTO `user_work_pages` VALUES (1,1,1,'https://picsum.photos/seed/rabbit1/600/800','从前有一只小白兔,它每天晚上都望着天上的星星发呆。',NULL),(2,1,2,'https://picsum.photos/seed/rabbit2/600/800','\"我要去星星上看看!\"小兔子跳上了弯弯的月亮船。',NULL),(3,1,3,'https://picsum.photos/seed/rabbit3/600/800','月亮船载着小兔子飞过了银河,星星们都向它眨眼问好。',NULL),(4,1,4,'https://picsum.photos/seed/rabbit4/600/800','小兔子回到家,把星星的故事讲给妈妈听。妈妈说:\"勇敢的孩子最棒!\"',NULL),(5,2,1,'https://picsum.photos/seed/ocean1/600/800','小美在海边捡到了一个发光的贝壳,贝壳里传来了奇妙的歌声。',NULL),(6,2,2,'https://picsum.photos/seed/ocean2/600/800','贝壳带着小美潜入大海深处,鱼群在她身边跳起了欢快的舞蹈。',NULL),(7,2,3,'https://picsum.photos/seed/ocean3/600/800','海底有一座闪闪发光的水晶城堡,城堡里住着一条会说话的金龙鱼。',NULL),(8,2,4,'https://picsum.photos/seed/ocean4/600/800','金龙鱼送给小美一颗海之珍珠:\"只要心存善良,大海永远是你的朋友。\"',NULL),(9,3,1,'https://picsum.photos/seed/dino1/600/800','很久很久以前,地球上生活着各种各样的恐龙。',NULL),(10,3,2,'https://picsum.photos/seed/dino2/600/800','有一天,一颗巨大的陨石撞向了地球,天空变得灰蒙蒙的。',NULL),(11,3,3,'https://picsum.photos/seed/dino3/600/800','恐龙们渐渐消失了,但它们的骨骼变成了化石,藏在地下。',NULL),(12,4,1,'https://picsum.photos/seed/spring1/600/800','冬天过去了,冰雪开始融化,小溪唱起了叮咚的歌。',NULL),(13,4,2,'https://picsum.photos/seed/spring2/600/800','小熊从树洞里醒来,揉揉眼睛说:\"春天来了吗?\"',NULL),(14,4,3,'https://picsum.photos/seed/spring3/600/800','桃花开了,燕子飞回来了,小伙伴们在草地上快乐地玩耍。',NULL),(15,4,4,'https://picsum.photos/seed/spring4/600/800','大家手拉手围成一个圆圈,一起唱:\"春天真美好!\"',NULL),(16,5,1,'https://picsum.photos/seed/cake1/600/800','今天是妈妈的生日,小熊想给妈妈一个惊喜。',NULL),(17,5,2,'https://picsum.photos/seed/cake2/600/800','小熊和爸爸一起搅面粉、打鸡蛋,厨房变得乱糟糟的。',NULL),(18,5,3,'https://picsum.photos/seed/cake3/600/800','虽然蛋糕歪歪扭扭的,但妈妈说:\"这是我收到的最好的礼物!\"',NULL),(19,6,1,'https://picsum.photos/seed/eco1/600/800','地球妈妈生病了,到处都是乱丢的垃圾。',NULL),(20,6,2,'https://picsum.photos/seed/eco2/600/800','小明学会了垃圾分类:蓝色桶放可回收物,红色桶放有害垃圾。',NULL),(21,6,3,'https://picsum.photos/seed/eco3/600/800','大家都学会了分类,地球妈妈开心地笑了。',NULL),(22,7,1,'https://picsum.photos/seed/fire1/600/800','小狗旺旺的梦想是成为一名消防员,它每天都在练习跑步和攀爬。',NULL),(23,7,2,'https://picsum.photos/seed/fire2/600/800','有一天森林着火了,旺旺勇敢地跑去帮忙,用水桶泼水灭火。',NULL),(24,7,3,'https://picsum.photos/seed/fire3/600/800','大家都夸旺旺是最勇敢的小消防员,旺旺的脸红了。',NULL),(25,7,4,'https://picsum.photos/seed/fire4/600/800','消防队长送给旺旺一顶红色的小帽子:\"欢迎加入消防队!\"',NULL),(26,8,1,'https://picsum.photos/seed/rain1/600/800','下过雨后,天空出现了一道美丽的彩虹。',NULL),(27,8,2,'https://picsum.photos/seed/rain2/600/800','小猫和小兔爬上了彩虹桥,在桥的最高处相遇了。',NULL),(28,8,3,'https://picsum.photos/seed/rain3/600/800','它们拉着手说:\"我们约定,不管在哪里,都要做最好的朋友。\"',NULL),(29,8,4,'https://picsum.photos/seed/rain4/600/800','彩虹慢慢消散了,但它们的友谊会一直在。',NULL),(30,9,1,'https://picsum.photos/seed/moon1/600/800','夜深了,小明趴在窗台上,看着又大又圆的月亮。',NULL),(31,9,2,'https://picsum.photos/seed/moon2/600/800','月亮姐姐,你一个人在天上不孤单吗?',NULL),(32,9,3,'https://picsum.photos/seed/moon3/600/800','月亮笑了笑说:不孤单呀,每天晚上都有像你一样的小朋友和我说话呢。',NULL),(33,10,1,'https://picsum.photos/seed/seed1/600/800','秋天,一粒小种子被风吹离了田野。',NULL),(34,10,2,'https://picsum.photos/seed/seed2/600/800','它飞过了小河,飞过了山坡,飞到了一座大城市。',NULL),(35,10,3,'https://picsum.photos/seed/seed3/600/800','最后它落在一个小女孩阳台的花盆里,春天来了,它开出了一朵金色的小花。',NULL),(36,11,1,'https://picsum.photos/seed/cloud1/600/800','在天空最高的地方,有一座云朵工厂。',NULL),(37,11,2,'https://picsum.photos/seed/cloud2/600/800','工人们每天用棉花糖制作各种形状的云:小狗云、大象云、棉花糖云。',NULL),(38,11,3,'https://picsum.photos/seed/cloud3/600/800','今天厂长说:来做一朵爱心云,送给地上所有想妈妈的小朋友。',NULL),(39,12,1,'https://picsum.photos/seed/garden1/600/800','周末,妞妞去乡下看爷爷。爷爷的菜园里种满了蔬菜。',NULL),(40,12,2,'https://picsum.photos/seed/garden2/600/800','这是西红柿先生,那是黄瓜小姐,还有茄子大叔。爷爷笑着介绍。',NULL),(41,12,3,'https://picsum.photos/seed/garden3/600/800','妞妞亲手种下一棵小苗,说:等它长大了,我再来看它!',NULL),(42,13,1,'https://picsum.photos/seed/snow1/600/800','冬天过去了,所有雪人都化成了水。但有一个雪人许了个愿。',NULL),(43,13,2,'https://picsum.photos/seed/snow2/600/800','我想看看夏天!于是魔法把它变成了一朵白白的云。',NULL),(44,13,3,'https://picsum.photos/seed/snow3/600/800','夏天的天空真蓝,雪人云开心地飘来飘去,它终于看到了夏天的样子。',NULL); -/*!40000 ALTER TABLE `user_work_pages` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_work_reports` --- - -DROP TABLE IF EXISTS `user_work_reports`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_work_reports` ( - `id` int NOT NULL AUTO_INCREMENT, - `reporter_id` int NOT NULL, - `target_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `target_id` int NOT NULL, - `target_user_id` int DEFAULT NULL, - `reason` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', - `handle_action` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `handle_note` text COLLATE utf8mb4_unicode_ci, - `handler_id` int DEFAULT NULL, - `handle_time` datetime(3) DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `user_work_reports_status_create_time_idx` (`status`,`create_time`), - KEY `user_work_reports_target_type_target_id_idx` (`target_type`,`target_id`), - KEY `user_work_reports_reporter_id_fkey` (`reporter_id`), - KEY `user_work_reports_target_user_id_fkey` (`target_user_id`), - KEY `user_work_reports_target_id_fkey` (`target_id`), - CONSTRAINT `user_work_reports_reporter_id_fkey` FOREIGN KEY (`reporter_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `user_work_reports_target_id_fkey` FOREIGN KEY (`target_id`) REFERENCES `user_works` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `user_work_reports_target_user_id_fkey` FOREIGN KEY (`target_user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_work_reports` --- - -LOCK TABLES `user_work_reports` WRITE; -/*!40000 ALTER TABLE `user_work_reports` DISABLE KEYS */; -/*!40000 ALTER TABLE `user_work_reports` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_works` --- - -DROP TABLE IF EXISTS `user_works`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_works` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `title` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL, - `cover_url` text COLLATE utf8mb4_unicode_ci, - `description` text COLLATE utf8mb4_unicode_ci, - `visibility` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'private', - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'draft', - `review_note` text COLLATE utf8mb4_unicode_ci, - `review_time` datetime(3) DEFAULT NULL, - `reviewer_id` int DEFAULT NULL, - `machine_review_result` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `machine_review_note` text COLLATE utf8mb4_unicode_ci, - `is_recommended` tinyint(1) NOT NULL DEFAULT '0', - `view_count` int NOT NULL DEFAULT '0', - `like_count` int NOT NULL DEFAULT '0', - `favorite_count` int NOT NULL DEFAULT '0', - `comment_count` int NOT NULL DEFAULT '0', - `share_count` int NOT NULL DEFAULT '0', - `original_image_url` text COLLATE utf8mb4_unicode_ci, - `voice_input_url` text COLLATE utf8mb4_unicode_ci, - `text_input` text COLLATE utf8mb4_unicode_ci, - `ai_meta` json DEFAULT NULL, - `publish_time` datetime(3) DEFAULT NULL, - `is_deleted` int NOT NULL DEFAULT '0', - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `user_works_user_id_status_idx` (`user_id`,`status`), - KEY `user_works_status_publish_time_idx` (`status`,`publish_time`), - KEY `user_works_is_recommended_publish_time_idx` (`is_recommended`,`publish_time`), - CONSTRAINT `user_works_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_works` --- - -LOCK TABLES `user_works` WRITE; -/*!40000 ALTER TABLE `user_works` DISABLE KEYS */; -INSERT INTO `user_works` VALUES (1,12,'小兔子的星空之旅','https://picsum.photos/seed/rabbit-star/400/533','小兔子乘坐月亮船去探索星空的奇妙冒险','public','published','Java后端审核通过','2026-04-02 13:47:32.120',1,NULL,NULL,0,128,23,8,2,0,NULL,NULL,NULL,NULL,'2026-04-02 13:47:32.120',0,'2026-03-31 11:32:11.384','2026-04-02 13:47:32.120'),(2,13,'海底城堡的秘密','https://picsum.photos/seed/ocean-castle/400/533','一个小女孩潜入海底发现了一座神秘的水晶城堡','public','published','回归审核','2026-04-02 13:48:55.953',1,NULL,NULL,1,256,45,15,5,0,NULL,NULL,NULL,NULL,'2026-04-02 13:48:55.953',0,'2026-03-31 11:32:11.384','2026-04-02 13:48:55.953'),(3,14,'恐龙去哪了','https://picsum.photos/seed/dinosaur/400/533','一本科普绘本讲述恐龙灭绝和化石的故事','public','published',NULL,NULL,NULL,NULL,NULL,0,89,12,4,1,0,NULL,NULL,NULL,NULL,'2026-03-28 11:32:11.000',0,'2026-03-31 11:32:11.384','2026-03-31 11:32:11.000'),(4,12,'春天来了','https://picsum.photos/seed/spring-comes/400/533','小动物们迎接春天的温馨故事','public','published',NULL,NULL,NULL,NULL,NULL,1,313,67,22,8,0,NULL,NULL,NULL,NULL,'2026-03-28 11:32:11.000',0,'2026-03-31 11:32:11.384','2026-03-31 03:39:45.145'),(5,15,'妈妈的生日蛋糕','https://picsum.photos/seed/birthday-cake/400/533','小熊和爸爸一起为妈妈做了一个特别的蛋糕','public','published',NULL,NULL,NULL,NULL,NULL,0,198,38,11,3,0,NULL,NULL,NULL,NULL,'2026-03-29 11:32:11.000',0,'2026-03-31 11:32:11.384','2026-03-31 11:32:11.000'),(6,16,'垃圾分类小能手','https://picsum.photos/seed/recycle/400/533','教小朋友学会垃圾分类保护地球环境','public','published',NULL,NULL,NULL,NULL,NULL,0,145,28,9,2,0,NULL,NULL,NULL,NULL,'2026-03-29 11:32:11.000',0,'2026-03-31 11:32:11.384','2026-03-31 11:32:11.000'),(7,14,'勇敢的小消防员','https://picsum.photos/seed/firefighter/400/533','小狗立志成为消防员的励志故事','public','published',NULL,NULL,NULL,NULL,NULL,0,177,34,13,4,0,NULL,NULL,NULL,NULL,'2026-03-30 11:32:11.000',0,'2026-03-31 11:32:11.384','2026-03-31 06:20:05.879'),(8,13,'彩虹桥上的约定','https://picsum.photos/seed/rainbow-bridge/400/533','两个好朋友在彩虹桥上许下了美好的约定','public','taken_down','用户投诉/举报',NULL,NULL,NULL,NULL,1,223,53,19,6,0,NULL,NULL,NULL,NULL,'2026-03-30 23:32:11.000',0,'2026-03-31 11:32:11.384','2026-03-31 07:03:34.051'),(9,12,'我和月亮的对话','https://picsum.photos/seed/moon-talk/400/533','小朋友在窗前和月亮聊天的温馨故事','public','published',NULL,'2026-03-31 06:42:45.462',1,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,'2026-03-31 06:42:45.462',0,'2026-03-31 14:21:04.554','2026-03-31 06:42:45.463'),(10,13,'一粒种子的旅行','https://picsum.photos/seed/seed-travel/400/533','一粒小种子从田野飘到城市最后在花盆里发芽','public','taken_down','违反平台规范','2026-03-31 06:42:48.313',1,NULL,NULL,0,1,0,0,0,0,NULL,NULL,NULL,NULL,'2026-03-31 06:42:48.313',0,'2026-03-31 14:21:04.554','2026-03-31 06:56:27.911'),(11,14,'云朵工厂','https://picsum.photos/seed/cloud-factory/400/533','天上有一座工厂专门制造各种形状的云朵','public','pending_review',NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,0,'2026-03-31 14:21:04.554','2026-03-31 06:42:34.459'),(12,15,'爷爷的菜园','https://picsum.photos/seed/grandpa-garden/400/533','小女孩跟爷爷学种菜认识了各种蔬菜朋友','public','pending_review',NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,0,'2026-03-31 14:21:04.554','2026-03-31 06:42:36.439'),(13,12,'雪人的夏天','https://picsum.photos/seed/snowman-summer/400/533','一个雪人想看看夏天是什么样子的','public','pending_review',NULL,NULL,NULL,NULL,NULL,0,0,0,0,0,0,NULL,NULL,NULL,NULL,NULL,0,'2026-03-31 14:21:04.554','2026-03-31 06:42:39.418'); -/*!40000 ALTER TABLE `user_works` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `users` --- - -DROP TABLE IF EXISTS `users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `users` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `username` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `nickname` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `email` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `avatar` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'enabled', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `gender` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `organization` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `birthday` date DEFAULT NULL, - `city` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `user_source` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'admin_created', - `wx_openid` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `wx_unionid` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `user_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'adult', - PRIMARY KEY (`id`), - UNIQUE KEY `users_tenant_id_username_key` (`tenant_id`,`username`), - UNIQUE KEY `users_tenant_id_email_key` (`tenant_id`,`email`), - UNIQUE KEY `users_phone_key` (`phone`), - UNIQUE KEY `users_wx_openid_key` (`wx_openid`), - KEY `users_creator_fkey` (`creator`), - KEY `users_modifier_fkey` (`modifier`), - CONSTRAINT `users_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `users_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `users_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `users` --- - -LOCK TABLES `users` WRITE; -/*!40000 ALTER TABLE `users` DISABLE KEYS */; -INSERT INTO `users` VALUES (1,1,'admin','$2b$10$1KOaalBqBmXgdM6PiCzjNOYkqrqBcNF7Z2sK0IP9.9EbOAxlYd.qK','超级管理员','admin@super.com',NULL,'enabled',1,NULL,NULL,'2026-03-23 06:14:18.640','2026-03-23 06:14:18.640',NULL,NULL,NULL,NULL,NULL,'admin_created',NULL,NULL,'adult'),(3,4,'admin','$2b$10$1KOaalBqBmXgdM6PiCzjNOYkqrqBcNF7Z2sK0IP9.9EbOAxlYd.qK','学校管理端管理员',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-23 09:29:48.695','2026-03-23 09:29:48.695',NULL,NULL,NULL,NULL,NULL,'admin_created',NULL,NULL,'adult'),(4,5,'admin','$2b$10$1KOaalBqBmXgdM6PiCzjNOYkqrqBcNF7Z2sK0IP9.9EbOAxlYd.qK','教师端管理员',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-23 09:29:48.810','2026-03-23 09:29:48.810',NULL,NULL,NULL,NULL,NULL,'admin_created',NULL,NULL,'adult'),(5,6,'admin','$2b$10$1KOaalBqBmXgdM6PiCzjNOYkqrqBcNF7Z2sK0IP9.9EbOAxlYd.qK','学生端管理员',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-23 09:29:48.900','2026-03-23 09:29:48.900',NULL,NULL,NULL,NULL,NULL,'admin_created',NULL,NULL,'adult'),(6,7,'admin','$2b$10$1KOaalBqBmXgdM6PiCzjNOYkqrqBcNF7Z2sK0IP9.9EbOAxlYd.qK','评委端管理员',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-23 09:29:48.992','2026-03-23 09:29:48.992',NULL,NULL,NULL,NULL,NULL,'admin_created',NULL,NULL,'adult'),(7,8,'testparent','$2b$10$HClRMpp32yCk3WlE.GUfxeA/XCej0Q1PCYd5GJvWYY53/fyI5w1xy','测试家长',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-24 03:31:16.511','2026-03-24 03:31:16.511',NULL,NULL,NULL,NULL,NULL,'self_registered',NULL,NULL,'adult'),(8,9,'admin','$2b$10$1KOaalBqBmXgdM6PiCzjNOYkqrqBcNF7Z2sK0IP9.9EbOAxlYd.qK','广东省图管理员',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-24 05:37:50.889','2026-03-24 05:37:50.889',NULL,NULL,NULL,NULL,NULL,'admin_created',NULL,NULL,'adult'),(9,8,'demo','$2b$10$6QduGSwVwZQCnmcstqpT6.vBrB9UBtm8d7L0gJkdlccZnsPtY7j9C','体验用户',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-24 07:06:05.463','2026-03-24 07:06:05.463',NULL,NULL,NULL,NULL,'广州','self_registered',NULL,NULL,'adult'),(10,8,'testuser01','$2b$10$OWYXSAx6V.8pgEtCtpE.auawDDHnBM6Lnx/1ssCAYD9cSWob3.yZS','测试01',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-24 08:05:17.577','2026-03-24 08:05:17.577',NULL,NULL,NULL,NULL,NULL,'self_registered',NULL,NULL,'adult'),(11,8,'beijing_user','$2b$10$dOGyhUQQzvgnVX4ZbAzDS.ayncxPSggY0POFAR/qoV3aA6FZXaCY.','北京用户',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-24 08:07:56.240','2026-03-24 08:07:56.240',NULL,NULL,NULL,NULL,'北京','self_registered',NULL,NULL,'adult'),(12,8,'xiaoming','$2b$10$RYzsiO98aFUTSrGBRsKjiuRPvU93TZzBBoKX6LvsOWAEX4xgaa6/u','小明同学',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-31 11:32:11.374','2026-03-31 11:32:11.000',NULL,NULL,'13800000001',NULL,'广州','self_registered',NULL,NULL,'adult'),(13,8,'xiaohong','$2b$10$RYzsiO98aFUTSrGBRsKjiuRPvU93TZzBBoKX6LvsOWAEX4xgaa6/u','小红姐姐',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-31 11:32:11.374','2026-03-31 11:32:11.000',NULL,NULL,'13800000002',NULL,'深圳','self_registered',NULL,NULL,'adult'),(14,8,'dahua','$2b$10$RYzsiO98aFUTSrGBRsKjiuRPvU93TZzBBoKX6LvsOWAEX4xgaa6/u','大画家',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-31 11:32:11.374','2026-03-31 11:32:11.000',NULL,NULL,'13800000003',NULL,'北京','self_registered',NULL,NULL,'adult'),(15,8,'mengmeng','$2b$10$RYzsiO98aFUTSrGBRsKjiuRPvU93TZzBBoKX6LvsOWAEX4xgaa6/u','萌萌妈妈',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-31 11:32:11.374','2026-03-31 11:32:11.000',NULL,NULL,'13800000004',NULL,'上海','self_registered',NULL,NULL,'adult'),(16,8,'xiaoliu','$2b$10$RYzsiO98aFUTSrGBRsKjiuRPvU93TZzBBoKX6LvsOWAEX4xgaa6/u','小刘老师',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-31 11:32:11.374','2026-03-31 11:32:11.000',NULL,NULL,'13800000005',NULL,'杭州','self_registered',NULL,NULL,'adult'),(17,9,'judge1','$2b$10$RYzsiO98aFUTSrGBRsKjiuRPvU93TZzBBoKX6LvsOWAEX4xgaa6/u','陈评委',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-31 16:23:06.914','2026-03-31 16:23:06.000',NULL,NULL,'13900000001',NULL,NULL,'admin_created',NULL,NULL,'adult'),(18,9,'judge2','$2b$10$RYzsiO98aFUTSrGBRsKjiuRPvU93TZzBBoKX6LvsOWAEX4xgaa6/u','李评委',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-31 19:13:03.209','2026-03-31 19:13:03.000',NULL,NULL,'13900000002',NULL,NULL,'admin_created',NULL,NULL,'adult'),(19,9,'judge3','$2b$10$RYzsiO98aFUTSrGBRsKjiuRPvU93TZzBBoKX6LvsOWAEX4xgaa6/u','王评委',NULL,NULL,'enabled',1,NULL,NULL,'2026-03-31 19:13:03.209','2026-03-31 19:13:03.000',NULL,NULL,'13900000003',NULL,NULL,'admin_created',NULL,NULL,'adult'); -/*!40000 ALTER TABLE `users` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `work_tag_relations` --- - -DROP TABLE IF EXISTS `work_tag_relations`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `work_tag_relations` ( - `id` int NOT NULL AUTO_INCREMENT, - `work_id` int NOT NULL, - `tag_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `work_tag_relations_work_id_tag_id_key` (`work_id`,`tag_id`), - KEY `work_tag_relations_tag_id_fkey` (`tag_id`), - CONSTRAINT `work_tag_relations_tag_id_fkey` FOREIGN KEY (`tag_id`) REFERENCES `work_tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `work_tag_relations_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `user_works` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `work_tag_relations` --- - -LOCK TABLES `work_tag_relations` WRITE; -/*!40000 ALTER TABLE `work_tag_relations` DISABLE KEYS */; -INSERT INTO `work_tag_relations` VALUES (1,1,1),(2,1,4),(3,1,6),(4,2,1),(5,2,4),(6,2,6),(7,3,2),(8,3,8),(9,4,1),(10,4,3),(11,4,7),(12,5,3),(13,5,7),(14,6,2),(15,6,5),(16,6,8),(17,7,1),(18,7,4),(19,7,7),(20,8,1),(21,8,3),(22,8,6); -/*!40000 ALTER TABLE `work_tag_relations` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `work_tags` --- - -DROP TABLE IF EXISTS `work_tags`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `work_tags` ( - `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, - `category` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `sort` int NOT NULL DEFAULT '0', - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'enabled', - `usage_count` int NOT NULL DEFAULT '0', - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `color` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `work_tags_name_key` (`name`), - KEY `work_tags_category_sort_idx` (`category`,`sort`) -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `work_tags` --- - -LOCK TABLES `work_tags` WRITE; -/*!40000 ALTER TABLE `work_tags` DISABLE KEYS */; -INSERT INTO `work_tags` VALUES (1,'童话故事','主题',2,'enabled',5,'2026-03-31 11:32:11.382','2026-03-31 07:16:52.462','#6366f1'),(2,'科普知识','主题',1,'enabled',2,'2026-03-31 11:32:11.382','2026-03-31 07:16:52.462','#6366f1'),(3,'亲子互动','主题',3,'enabled',3,'2026-03-31 11:32:11.382','2026-03-31 11:32:11.000','#6366f1'),(4,'冒险旅程','主题',4,'enabled',3,'2026-03-31 11:32:11.382','2026-03-31 11:32:11.000','#6366f1'),(5,'环保地球','主题',5,'enabled',1,'2026-03-31 11:32:11.382','2026-03-31 11:32:11.000','#6366f1'),(6,'水彩风','风格',1,'enabled',3,'2026-03-31 11:32:11.382','2026-03-31 11:32:11.000','#ec4899'),(7,'卡通Q版','风格',2,'enabled',3,'2026-03-31 11:32:11.382','2026-03-31 11:32:11.000','#ec4899'),(8,'简笔画','风格',3,'enabled',2,'2026-03-31 11:32:11.382','2026-03-31 11:32:11.000','#ec4899'); -/*!40000 ALTER TABLE `work_tags` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Dumping routines for database 'competition_management' --- -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2026-04-02 14:47:43 diff --git a/backend/data/menus.json b/backend/data/menus.json deleted file mode 100644 index babbc45..0000000 --- a/backend/data/menus.json +++ /dev/null @@ -1,372 +0,0 @@ -[ - { - "name": "工作台", - "path": "/workbench", - "icon": "DashboardOutlined", - "component": "workbench/Index", - "sort": 1 - }, - { - "name": "我的评审", - "path": "/activities", - "icon": "AuditOutlined", - "sort": 2, - "children": [ - { - "name": "评审任务", - "path": "/activities/review", - "icon": "FileSearchOutlined", - "component": "activities/Review", - "sort": 1, - "permission": "review:score" - }, - { - "name": "预设评语", - "path": "/activities/preset-comments", - "icon": "MessageOutlined", - "component": "activities/PresetComments", - "sort": 2, - "permission": "review:score" - } - ] - }, - { - "name": "活动监管", - "path": "/contests", - "icon": "FundViewOutlined", - "sort": 3, - "children": [ - { - "name": "全部活动", - "path": "/contests/list", - "icon": "UnorderedListOutlined", - "component": "contests/Index", - "sort": 1, - "permission": "contest:read" - }, - { - "name": "报名数据", - "path": "/contests/registrations", - "icon": "UserAddOutlined", - "component": "contests/registrations/Index", - "sort": 2, - "permission": "contest:registration:read" - }, - { - "name": "作品数据", - "path": "/contests/works", - "icon": "FileTextOutlined", - "component": "contests/works/Index", - "sort": 3, - "permission": "contest:work:read" - }, - { - "name": "评审进度", - "path": "/contests/review-progress", - "icon": "DashboardOutlined", - "component": "contests/reviews/Progress", - "sort": 4, - "permission": "review:progress:read" - }, - { - "name": "评委管理", - "path": "/contests/judges", - "icon": "SolutionOutlined", - "component": "contests/judges/Index", - "sort": 5, - "permission": "judge:read" - }, - { - "name": "评审规则", - "path": "/contests/review-rules", - "icon": "CheckCircleOutlined", - "component": "contests/reviews/Index", - "sort": 6, - "permission": "review:rule:read" - }, - { - "name": "活动成果", - "path": "/contests/results", - "icon": "TrophyOutlined", - "component": "contests/results/Index", - "sort": 7, - "permission": "result:read" - }, - { - "name": "通知管理", - "path": "/contests/notices", - "icon": "BellOutlined", - "component": "contests/notices/Index", - "sort": 8, - "permission": "contest:notice:read" - } - ] - }, - { - "name": "内容管理", - "path": "/content", - "icon": "PictureOutlined", - "sort": 4, - "children": [ - { - "name": "作品审核", - "path": "/content/review", - "component": "content/WorkReview", - "sort": 1, - "permission": "content:review" - }, - { - "name": "作品管理", - "path": "/content/management", - "component": "content/WorkManagement", - "sort": 2, - "permission": "content:manage" - }, - { - "name": "标签管理", - "path": "/content/tags", - "component": "content/TagManagement", - "sort": 3, - "permission": "content:tags" - } - ] - }, - { - "name": "学校管理", - "path": "/school", - "icon": "BankOutlined", - "sort": 5, - "children": [ - { - "name": "学校信息", - "path": "/school/schools", - "icon": "BankOutlined", - "component": "school/schools/Index", - "sort": 1, - "permission": "school:read" - }, - { - "name": "部门管理", - "path": "/school/departments", - "icon": "ApartmentOutlined", - "component": "school/departments/Index", - "sort": 2, - "permission": "department:read" - }, - { - "name": "年级管理", - "path": "/school/grades", - "icon": "AppstoreOutlined", - "component": "school/grades/Index", - "sort": 3, - "permission": "grade:read" - }, - { - "name": "班级管理", - "path": "/school/classes", - "icon": "TeamOutlined", - "component": "school/classes/Index", - "sort": 4, - "permission": "class:read" - }, - { - "name": "教师管理", - "path": "/school/teachers", - "icon": "UserOutlined", - "component": "school/teachers/Index", - "sort": 5, - "permission": "teacher:read" - }, - { - "name": "学生管理", - "path": "/school/students", - "icon": "UsergroupAddOutlined", - "component": "school/students/Index", - "sort": 6, - "permission": "student:read" - } - ] - }, - { - "name": "活动管理", - "path": "/contests", - "icon": "TrophyOutlined", - "sort": 6, - "children": [ - { - "name": "活动列表", - "path": "/contests/list", - "icon": "UnorderedListOutlined", - "component": "contests/Index", - "sort": 1, - "permission": "contest:read" - }, - { - "name": "评委管理", - "path": "/contests/judges", - "icon": "UserSwitchOutlined", - "component": "contests/judges/Index", - "sort": 2, - "permission": "judge:read" - }, - { - "name": "报名管理", - "path": "/contests/registrations", - "icon": "FormOutlined", - "component": "contests/registrations/Index", - "sort": 3, - "permission": "contest:registration:read" - }, - { - "name": "作品管理", - "path": "/contests/works", - "icon": "FileTextOutlined", - "component": "contests/works/Index", - "sort": 4, - "permission": "contest:work:read" - }, - { - "name": "评审进度", - "path": "/contests/review-progress", - "icon": "DashboardOutlined", - "component": "contests/reviews/Progress", - "sort": 5, - "permission": "review:progress:read" - }, - { - "name": "评审规则", - "path": "/contests/review-rules", - "icon": "SettingOutlined", - "component": "contests/ReviewRules", - "sort": 6, - "permission": "review:rule:read" - }, - { - "name": "成果发布", - "path": "/contests/results", - "icon": "TrophyOutlined", - "component": "contests/results/Index", - "sort": 7, - "permission": "result:read" - }, - { - "name": "活动公告", - "path": "/contests/notices", - "icon": "NotificationOutlined", - "component": "contests/notices/Index", - "sort": 8, - "permission": "contest:notice:read" - } - ] - }, - { - "name": "机构管理", - "path": "/organization", - "icon": "BankOutlined", - "sort": 7, - "children": [ - { - "name": "机构管理", - "path": "/system/tenants", - "icon": "UnorderedListOutlined", - "component": "system/tenants/Index", - "sort": 1, - "permission": "tenant:read" - } - ] - }, - { - "name": "用户中心", - "path": "/users-center", - "icon": "TeamOutlined", - "sort": 8, - "children": [ - { - "name": "平台用户", - "path": "/system/users", - "icon": "UserSwitchOutlined", - "component": "system/users/Index", - "sort": 2, - "permission": "user:read" - }, - { - "name": "角色管理", - "path": "/system/roles", - "icon": "SafetyOutlined", - "component": "system/roles/Index", - "sort": 3, - "permission": "role:read" - } - ] - }, - { - "name": "系统设置", - "path": "/system", - "icon": "SettingOutlined", - "sort": 9, - "children": [ - { - "name": "用户管理", - "path": "/system/users", - "icon": "UserOutlined", - "component": "system/users/Index", - "sort": 1, - "permission": "user:read" - }, - { - "name": "角色管理", - "path": "/system/roles", - "icon": "TeamOutlined", - "component": "system/roles/Index", - "sort": 2, - "permission": "role:read" - }, - { - "name": "菜单管理", - "path": "/system/menus", - "icon": "MenuOutlined", - "component": "system/menus/Index", - "sort": 3, - "permission": "menu:read" - }, - { - "name": "数据字典", - "path": "/system/dict", - "icon": "BookOutlined", - "component": "system/dict/Index", - "sort": 4, - "permission": "dict:read" - }, - { - "name": "系统配置", - "path": "/system/config", - "icon": "ToolOutlined", - "component": "system/config/Index", - "sort": 5, - "permission": "config:read" - }, - { - "name": "日志记录", - "path": "/system/logs", - "icon": "FileTextOutlined", - "component": "system/logs/Index", - "sort": 6, - "permission": "log:read" - }, - { - "name": "权限管理", - "path": "/system/permissions", - "icon": "SafetyOutlined", - "component": "system/permissions/Index", - "sort": 7 - }, - { - "name": "租户管理", - "path": "/system/tenants", - "icon": "BankOutlined", - "component": "system/tenants/Index", - "sort": 8 - } - ] - } -] diff --git a/backend/data/permissions.json b/backend/data/permissions.json deleted file mode 100644 index c851f68..0000000 --- a/backend/data/permissions.json +++ /dev/null @@ -1,737 +0,0 @@ -[ - { - "code": "ai-3d:read", - "resource": "ai-3d", - "action": "read", - "name": "使用3D建模实验室", - "description": "允许使用AI 3D建模实验室" - }, - { - "code": "ai-3d:create", - "resource": "ai-3d", - "action": "create", - "name": "创建3D模型任务", - "description": "允许创建AI 3D模型生成任务" - }, - { - "code": "user:create", - "resource": "user", - "action": "create", - "name": "创建用户", - "description": "允许创建新用户" - }, - { - "code": "user:read", - "resource": "user", - "action": "read", - "name": "查看用户", - "description": "允许查看用户列表和详情" - }, - { - "code": "user:update", - "resource": "user", - "action": "update", - "name": "更新用户", - "description": "允许更新用户信息" - }, - { - "code": "user:delete", - "resource": "user", - "action": "delete", - "name": "删除用户", - "description": "允许删除用户" - }, - { - "code": "user:password:update", - "resource": "user", - "action": "password:update", - "name": "修改用户密码", - "description": "允许修改用户密码" - }, - { - "code": "role:create", - "resource": "role", - "action": "create", - "name": "创建角色", - "description": "允许创建新角色" - }, - { - "code": "role:read", - "resource": "role", - "action": "read", - "name": "查看角色", - "description": "允许查看角色列表和详情" - }, - { - "code": "role:update", - "resource": "role", - "action": "update", - "name": "更新角色", - "description": "允许更新角色信息" - }, - { - "code": "role:delete", - "resource": "role", - "action": "delete", - "name": "删除角色", - "description": "允许删除角色" - }, - { - "code": "role:assign", - "resource": "role", - "action": "assign", - "name": "分配角色", - "description": "允许给用户分配角色" - }, - { - "code": "permission:create", - "resource": "permission", - "action": "create", - "name": "创建权限", - "description": "允许创建新权限" - }, - { - "code": "permission:read", - "resource": "permission", - "action": "read", - "name": "查看权限", - "description": "允许查看权限列表和详情" - }, - { - "code": "permission:update", - "resource": "permission", - "action": "update", - "name": "更新权限", - "description": "允许更新权限信息" - }, - { - "code": "permission:delete", - "resource": "permission", - "action": "delete", - "name": "删除权限", - "description": "允许删除权限" - }, - { - "code": "menu:create", - "resource": "menu", - "action": "create", - "name": "创建菜单", - "description": "允许创建新菜单" - }, - { - "code": "menu:read", - "resource": "menu", - "action": "read", - "name": "查看菜单", - "description": "允许查看菜单列表和详情" - }, - { - "code": "menu:update", - "resource": "menu", - "action": "update", - "name": "更新菜单", - "description": "允许更新菜单信息" - }, - { - "code": "menu:delete", - "resource": "menu", - "action": "delete", - "name": "删除菜单", - "description": "允许删除菜单" - }, - { - "code": "tenant:create", - "resource": "tenant", - "action": "create", - "name": "创建租户", - "description": "允许创建租户" - }, - { - "code": "tenant:read", - "resource": "tenant", - "action": "read", - "name": "查看租户", - "description": "允许查看租户列表" - }, - { - "code": "tenant:update", - "resource": "tenant", - "action": "update", - "name": "更新租户", - "description": "允许更新租户信息" - }, - { - "code": "tenant:delete", - "resource": "tenant", - "action": "delete", - "name": "删除租户", - "description": "允许删除租户" - }, - { - "code": "school:create", - "resource": "school", - "action": "create", - "name": "创建学校", - "description": "允许创建学校信息" - }, - { - "code": "school:read", - "resource": "school", - "action": "read", - "name": "查看学校", - "description": "允许查看学校信息" - }, - { - "code": "school:update", - "resource": "school", - "action": "update", - "name": "更新学校", - "description": "允许更新学校信息" - }, - { - "code": "school:delete", - "resource": "school", - "action": "delete", - "name": "删除学校", - "description": "允许删除学校信息" - }, - { - "code": "department:create", - "resource": "department", - "action": "create", - "name": "创建部门", - "description": "允许创建部门" - }, - { - "code": "department:read", - "resource": "department", - "action": "read", - "name": "查看部门", - "description": "允许查看部门列表和详情" - }, - { - "code": "department:update", - "resource": "department", - "action": "update", - "name": "更新部门", - "description": "允许更新部门信息" - }, - { - "code": "department:delete", - "resource": "department", - "action": "delete", - "name": "删除部门", - "description": "允许删除部门" - }, - { - "code": "grade:create", - "resource": "grade", - "action": "create", - "name": "创建年级", - "description": "允许创建年级" - }, - { - "code": "grade:read", - "resource": "grade", - "action": "read", - "name": "查看年级", - "description": "允许查看年级列表和详情" - }, - { - "code": "grade:update", - "resource": "grade", - "action": "update", - "name": "更新年级", - "description": "允许更新年级信息" - }, - { - "code": "grade:delete", - "resource": "grade", - "action": "delete", - "name": "删除年级", - "description": "允许删除年级" - }, - { - "code": "class:create", - "resource": "class", - "action": "create", - "name": "创建班级", - "description": "允许创建班级" - }, - { - "code": "class:read", - "resource": "class", - "action": "read", - "name": "查看班级", - "description": "允许查看班级列表和详情" - }, - { - "code": "class:update", - "resource": "class", - "action": "update", - "name": "更新班级", - "description": "允许更新班级信息" - }, - { - "code": "class:delete", - "resource": "class", - "action": "delete", - "name": "删除班级", - "description": "允许删除班级" - }, - { - "code": "teacher:create", - "resource": "teacher", - "action": "create", - "name": "创建教师", - "description": "允许创建教师" - }, - { - "code": "teacher:read", - "resource": "teacher", - "action": "read", - "name": "查看教师", - "description": "允许查看教师列表和详情" - }, - { - "code": "teacher:update", - "resource": "teacher", - "action": "update", - "name": "更新教师", - "description": "允许更新教师信息" - }, - { - "code": "teacher:delete", - "resource": "teacher", - "action": "delete", - "name": "删除教师", - "description": "允许删除教师" - }, - { - "code": "student:create", - "resource": "student", - "action": "create", - "name": "创建学生", - "description": "允许创建学生" - }, - { - "code": "student:read", - "resource": "student", - "action": "read", - "name": "查看学生", - "description": "允许查看学生列表和详情" - }, - { - "code": "student:update", - "resource": "student", - "action": "update", - "name": "更新学生", - "description": "允许更新学生信息" - }, - { - "code": "student:delete", - "resource": "student", - "action": "delete", - "name": "删除学生", - "description": "允许删除学生" - }, - { - "code": "contest:create", - "resource": "contest", - "action": "create", - "name": "创建活动", - "description": "允许创建活动" - }, - { - "code": "contest:read", - "resource": "contest", - "action": "read", - "name": "查看活动", - "description": "允许查看活动列表和详情" - }, - { - "code": "contest:update", - "resource": "contest", - "action": "update", - "name": "更新活动", - "description": "允许更新活动信息" - }, - { - "code": "contest:delete", - "resource": "contest", - "action": "delete", - "name": "删除活动", - "description": "允许删除活动" - }, - { - "code": "contest:publish", - "resource": "contest", - "action": "publish", - "name": "发布活动", - "description": "允许发布/取消发布活动" - }, - { - "code": "contest:finish", - "resource": "contest", - "action": "finish", - "name": "结束活动", - "description": "允许结束活动" - }, - { - "code": "review-rule:create", - "resource": "review-rule", - "action": "create", - "name": "创建评审规则", - "description": "允许创建评审规则" - }, - { - "code": "review-rule:read", - "resource": "review-rule", - "action": "read", - "name": "查看评审规则", - "description": "允许查看评审规则" - }, - { - "code": "review-rule:update", - "resource": "review-rule", - "action": "update", - "name": "更新评审规则", - "description": "允许更新评审规则" - }, - { - "code": "review-rule:delete", - "resource": "review-rule", - "action": "delete", - "name": "删除评审规则", - "description": "允许删除评审规则" - }, - { - "code": "judge:create", - "resource": "judge", - "action": "create", - "name": "添加评委", - "description": "允许添加评委" - }, - { - "code": "judge:read", - "resource": "judge", - "action": "read", - "name": "查看评委", - "description": "允许查看评委列表" - }, - { - "code": "judge:update", - "resource": "judge", - "action": "update", - "name": "更新评委", - "description": "允许更新评委信息" - }, - { - "code": "judge:delete", - "resource": "judge", - "action": "delete", - "name": "删除评委", - "description": "允许删除评委" - }, - { - "code": "judge:assign", - "resource": "judge", - "action": "assign", - "name": "分配评委", - "description": "允许为活动分配评委" - }, - { - "code": "registration:create", - "resource": "registration", - "action": "create", - "name": "创建报名", - "description": "允许报名活动" - }, - { - "code": "registration:read", - "resource": "registration", - "action": "read", - "name": "查看报名", - "description": "允许查看报名记录" - }, - { - "code": "registration:update", - "resource": "registration", - "action": "update", - "name": "更新报名", - "description": "允许更新报名信息" - }, - { - "code": "registration:delete", - "resource": "registration", - "action": "delete", - "name": "取消报名", - "description": "允许取消报名" - }, - { - "code": "registration:approve", - "resource": "registration", - "action": "approve", - "name": "审核报名", - "description": "允许审核报名" - }, - { - "code": "work:create", - "resource": "work", - "action": "create", - "name": "上传作品", - "description": "允许上传参赛作品" - }, - { - "code": "work:read", - "resource": "work", - "action": "read", - "name": "查看作品", - "description": "允许查看参赛作品" - }, - { - "code": "work:update", - "resource": "work", - "action": "update", - "name": "更新作品", - "description": "允许更新作品信息" - }, - { - "code": "work:delete", - "resource": "work", - "action": "delete", - "name": "删除作品", - "description": "允许删除作品" - }, - { - "code": "work:submit", - "resource": "work", - "action": "submit", - "name": "提交作品", - "description": "允许提交作品" - }, - { - "code": "review:read", - "resource": "review", - "action": "read", - "name": "查看评审任务", - "description": "允许查看待评审作品" - }, - { - "code": "review:score", - "resource": "review", - "action": "score", - "name": "评审打分", - "description": "允许对作品打分" - }, - { - "code": "notice:create", - "resource": "notice", - "action": "create", - "name": "创建公告", - "description": "允许创建活动公告" - }, - { - "code": "notice:read", - "resource": "notice", - "action": "read", - "name": "查看公告", - "description": "允许查看活动公告" - }, - { - "code": "notice:update", - "resource": "notice", - "action": "update", - "name": "更新公告", - "description": "允许更新公告信息" - }, - { - "code": "notice:delete", - "resource": "notice", - "action": "delete", - "name": "删除公告", - "description": "允许删除公告" - }, - { - "code": "homework:create", - "resource": "homework", - "action": "create", - "name": "创建作业", - "description": "允许创建作业" - }, - { - "code": "homework:read", - "resource": "homework", - "action": "read", - "name": "查看作业", - "description": "允许查看作业列表" - }, - { - "code": "homework:update", - "resource": "homework", - "action": "update", - "name": "更新作业", - "description": "允许更新作业信息" - }, - { - "code": "homework:delete", - "resource": "homework", - "action": "delete", - "name": "删除作业", - "description": "允许删除作业" - }, - { - "code": "homework:publish", - "resource": "homework", - "action": "publish", - "name": "发布作业", - "description": "允许发布作业" - }, - { - "code": "homework-submission:create", - "resource": "homework-submission", - "action": "create", - "name": "提交作业", - "description": "允许提交作业" - }, - { - "code": "homework-submission:read", - "resource": "homework-submission", - "action": "read", - "name": "查看作业提交", - "description": "允许查看作业提交记录" - }, - { - "code": "homework-submission:update", - "resource": "homework-submission", - "action": "update", - "name": "更新作业提交", - "description": "允许更新提交的作业" - }, - { - "code": "homework-review-rule:create", - "resource": "homework-review-rule", - "action": "create", - "name": "创建作业评审规则", - "description": "允许创建作业评审规则" - }, - { - "code": "homework-review-rule:read", - "resource": "homework-review-rule", - "action": "read", - "name": "查看作业评审规则", - "description": "允许查看作业评审规则" - }, - { - "code": "homework-review-rule:update", - "resource": "homework-review-rule", - "action": "update", - "name": "更新作业评审规则", - "description": "允许更新作业评审规则" - }, - { - "code": "homework-review-rule:delete", - "resource": "homework-review-rule", - "action": "delete", - "name": "删除作业评审规则", - "description": "允许删除作业评审规则" - }, - { - "code": "homework-score:create", - "resource": "homework-score", - "action": "create", - "name": "作业评分", - "description": "允许对作业评分" - }, - { - "code": "homework-score:read", - "resource": "homework-score", - "action": "read", - "name": "查看作业评分", - "description": "允许查看作业评分" - }, - { - "code": "dict:create", - "resource": "dict", - "action": "create", - "name": "创建字典", - "description": "允许创建新字典" - }, - { - "code": "dict:read", - "resource": "dict", - "action": "read", - "name": "查看字典", - "description": "允许查看字典列表和详情" - }, - { - "code": "dict:update", - "resource": "dict", - "action": "update", - "name": "更新字典", - "description": "允许更新字典信息" - }, - { - "code": "dict:delete", - "resource": "dict", - "action": "delete", - "name": "删除字典", - "description": "允许删除字典" - }, - { - "code": "config:create", - "resource": "config", - "action": "create", - "name": "创建配置", - "description": "允许创建新配置" - }, - { - "code": "config:read", - "resource": "config", - "action": "read", - "name": "查看配置", - "description": "允许查看配置列表和详情" - }, - { - "code": "config:update", - "resource": "config", - "action": "update", - "name": "更新配置", - "description": "允许更新配置信息" - }, - { - "code": "config:delete", - "resource": "config", - "action": "delete", - "name": "删除配置", - "description": "允许删除配置" - }, - { - "code": "log:read", - "resource": "log", - "action": "read", - "name": "查看日志", - "description": "允许查看系统日志" - }, - { - "code": "log:delete", - "resource": "log", - "action": "delete", - "name": "删除日志", - "description": "允许删除系统日志" - }, - { - "code": "activity:read", - "resource": "activity", - "action": "read", - "name": "查看我的评审", - "description": "允许查看已发布的我的评审" - }, - { - "code": "activity:guidance", - "resource": "activity", - "action": "guidance", - "name": "指导学生", - "description": "允许指导学生参赛" - } -] diff --git a/backend/docs/ADMIN_ACCOUNT.md b/backend/docs/ADMIN_ACCOUNT.md deleted file mode 100644 index 577bf24..0000000 --- a/backend/docs/ADMIN_ACCOUNT.md +++ /dev/null @@ -1,184 +0,0 @@ -# 超级管理员账号说明 - -## 📋 账号信息 - -### 登录凭据 - -- **用户名**: `admin` -- **密码**: `cms@admin` -- **昵称**: 超级管理员 -- **邮箱**: admin@example.com -- **角色**: super_admin (超级管理员) - -## 🔐 权限说明 - -超级管理员拥有系统所有权限,共 **27 个权限**: - -### 用户管理权限 - -- `user:create` - 创建用户 -- `user:read` - 查看用户 -- `user:update` - 更新用户 -- `user:delete` - 删除用户 - -### 角色管理权限 - -- `role:create` - 创建角色 -- `role:read` - 查看角色 -- `role:update` - 更新角色 -- `role:delete` - 删除角色 -- `role:assign` - 分配角色 - -### 权限管理权限 - -- `permission:create` - 创建权限 -- `permission:read` - 查看权限 -- `permission:update` - 更新权限 -- `permission:delete` - 删除权限 - -### 菜单管理权限 - -- `menu:create` - 创建菜单 -- `menu:read` - 查看菜单 -- `menu:update` - 更新菜单 -- `menu:delete` - 删除菜单 - -### 数据字典权限 - -- `dict:create` - 创建字典 -- `dict:read` - 查看字典 -- `dict:update` - 更新字典 -- `dict:delete` - 删除字典 - -### 系统配置权限 - -- `config:create` - 创建配置 -- `config:read` - 查看配置 -- `config:update` - 更新配置 -- `config:delete` - 删除配置 - -### 日志管理权限 - -- `log:read` - 查看日志 -- `log:delete` - 删除日志 - -## 🚀 使用方法 - -### 1. 登录系统 - -使用以下 API 登录: - -```bash -POST /api/auth/login -Content-Type: application/json - -{ - "username": "admin", - "password": "cms@admin" -} -``` - -### 2. 响应示例 - -```json -{ - "code": 200, - "message": "success", - "data": { - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", - "user": { - "id": 1, - "username": "admin", - "nickname": "超级管理员", - "email": "admin@example.com", - "avatar": null, - "roles": ["super_admin"], - "permissions": [ - "user:create", - "user:read", - "user:update", - "user:delete" - // ... 所有 27 个权限 - ] - } - } -} -``` - -### 3. 使用 Token 访问 API - -```bash -GET /api/users -Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... -``` - -## 🔄 重新初始化 - -如果需要重新初始化超级管理员账号,可以运行: - -```bash -cd backend -pnpm init:admin -``` - -脚本会: - -- ✅ 创建/更新所有基础权限(27个) -- ✅ 创建/更新超级管理员角色 -- ✅ 创建/更新 admin 用户 -- ✅ 分配角色给用户 - -**注意**: 如果用户已存在,密码会被重置为 `cms@admin` - -## 🔍 验证账号 - -验证超级管理员账号是否创建成功: - -```bash -cd backend -node scripts/verify-admin.js -``` - -## ⚠️ 安全建议 - -1. **首次登录后立即修改密码** -2. **生产环境使用强密码** -3. **定期更换密码** -4. **不要将密码提交到版本控制** - -## 📝 修改密码 - -可以通过以下方式修改密码: - -### 方式一:通过 API - -```bash -PATCH /api/users/1 -Authorization: Bearer -Content-Type: application/json - -{ - "password": "new_strong_password" -} -``` - -### 方式二:通过数据库 - -```sql --- 需要先使用 bcrypt 加密密码 -UPDATE users -SET password = '' -WHERE username = 'admin'; -``` - -### 方式三:通过脚本 - -可以修改 `scripts/init-admin.ts` 中的密码,然后重新运行脚本。 - -## 🎯 下一步 - -1. ✅ 使用 admin 账号登录系统 -2. ✅ 创建其他角色(如:编辑、查看者等) -3. ✅ 创建其他用户并分配角色 -4. ✅ 配置菜单权限 -5. ✅ 开始使用系统 diff --git a/backend/docs/CONTEST_JUDGE_DESIGN.md b/backend/docs/CONTEST_JUDGE_DESIGN.md deleted file mode 100644 index 00d4f91..0000000 --- a/backend/docs/CONTEST_JUDGE_DESIGN.md +++ /dev/null @@ -1,271 +0,0 @@ -# 比赛评委存储设计说明 - -## 📋 设计决策 - -### 问题:是否需要专门的评委表? - -**结论:需要创建 `ContestJudge` 关联表,但不需要单独的评委信息表。** - -## 🎯 设计分析 - -### 1. 为什么需要 `ContestJudge` 关联表? - -#### 1.1 业务需求 - -1. **比赛与评委的多对多关系** - - 一个比赛可以有多个评委 - - 一个评委可以评审多个比赛 - - 需要管理这种多对多关系 - -2. **评委管理功能** - - 查询某个比赛的所有评委列表 - - 批量添加/删除比赛的评委 - - 管理评委在特定比赛中的特殊信息 - -3. **评委特殊属性** - - 评审专业领域(specialty):如"创意设计"、"技术实现"等 - - 评审权重(weight):用于加权平均计算最终得分 - - 评委说明(description):在该比赛中的特殊说明 - -#### 1.2 当前设计的不足 - -**之前的设计**: -- 评委信息只存储在 `ContestWorkJudgeAssignment` 表中 -- 无法直接查询某个比赛有哪些评委 -- 无法批量管理比赛的评委列表 -- 无法存储评委在特定比赛中的特殊信息 - -**问题场景**: -```typescript -// ❌ 无法直接查询比赛的评委列表 -// 需要从作品分配表中去重查询,效率低且不准确 - -// ✅ 有了 ContestJudge 表后 -const judges = await prisma.contestJudge.findMany({ - where: { contestId: contestId } -}); -``` - -### 2. 为什么不需要单独的评委信息表? - -#### 2.1 评委就是用户 - -- 评委本身就是系统中的 `User` -- 基本信息(姓名、账号等)存储在 `User` 表 -- 如果是教师,详细信息存储在 `Teacher` 表 -- 如果是外部专家,可以创建普通 `User` 账号 - -#### 2.2 统一用户体系 - -- 系统采用统一的用户体系 -- 通过角色和权限区分用户身份 -- 评委通过角色(如 `judge`)和权限(如 `review:score`)控制 - -## 📊 数据模型设计 - -### 1. 表结构 - -```prisma -model ContestJudge { - id Int @id @default(autoincrement()) - contestId Int @map("contest_id") /// 比赛id - judgeId Int @map("judge_id") /// 评委用户id - specialty String? /// 评审专业领域(可选) - weight Decimal? @db.Decimal(3, 2) /// 评审权重(可选) - description String? @db.Text /// 评委在该比赛中的说明 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") - modifyTime DateTime @updatedAt @map("modify_time") - validState Int @default(1) @map("valid_state") - - contest Contest @relation(fields: [contestId], references: [id]) - judge User @relation(fields: [judgeId], references: [id]) - - @@unique([contestId, judgeId]) - @@index([contestId]) - @@index([judgeId]) -} -``` - -### 2. 数据关系 - -``` -Contest (比赛) - ↓ (1:N) -ContestJudge (比赛评委关联) - ↓ (N:1) -User (用户/评委) - ↓ (1:1, 可选) -Teacher (教师信息,如果是教师评委) -``` - -### 3. 与其他表的关系 - -``` -ContestJudge (比赛评委) - ↓ -ContestWorkJudgeAssignment (作品分配) - ↓ -ContestWorkScore (作品评分) -``` - -**关系说明**: -- `ContestJudge`:定义哪些评委可以评审某个比赛 -- `ContestWorkJudgeAssignment`:将具体作品分配给评委 -- `ContestWorkScore`:记录评委的评分结果 - -## 🔄 业务流程 - -### 1. 添加评委到比赛 - -```typescript -// 1. 创建比赛评委关联 -const contestJudge = await prisma.contestJudge.create({ - data: { - contestId: contestId, - judgeId: userId, - specialty: "创意设计", - weight: 1.2, // 权重1.2倍 - description: "专业设计领域评委" - } -}); -``` - -### 2. 查询比赛的评委列表 - -```typescript -// 查询某个比赛的所有评委 -const judges = await prisma.contestJudge.findMany({ - where: { - contestId: contestId, - validState: 1 - }, - include: { - judge: { - include: { - teacher: true // 如果是教师,获取教师信息 - } - } - } -}); -``` - -### 3. 分配作品给评委 - -```typescript -// 分配作品时,验证评委是否属于该比赛 -const contestJudge = await prisma.contestJudge.findFirst({ - where: { - contestId: contestId, - judgeId: judgeId, - validState: 1 - } -}); - -if (!contestJudge) { - throw new Error('该评委不属于此比赛'); -} - -// 创建作品分配记录 -const assignment = await prisma.contestWorkJudgeAssignment.create({ - data: { - contestId: contestId, - workId: workId, - judgeId: judgeId - } -}); -``` - -### 4. 计算加权平均分 - -```typescript -// 获取所有评委的评分和权重 -const scores = await prisma.contestWorkScore.findMany({ - where: { workId: workId }, - include: { - judge: { - include: { - contestJudges: { - where: { contestId: contestId } - } - } - } - } -}); - -// 计算加权平均分 -let totalWeightedScore = 0; -let totalWeight = 0; - -for (const score of scores) { - const contestJudge = score.judge.contestJudges[0]; - const weight = contestJudge?.weight || 1.0; - totalWeightedScore += score.totalScore * weight; - totalWeight += weight; -} - -const finalScore = totalWeightedScore / totalWeight; -``` - -## ✅ 设计优势 - -### 1. 清晰的业务逻辑 - -- **比赛评委管理**:通过 `ContestJudge` 表统一管理 -- **作品分配**:通过 `ContestWorkJudgeAssignment` 表管理 -- **评分记录**:通过 `ContestWorkScore` 表记录 - -### 2. 灵活的扩展性 - -- 支持评委专业领域分类 -- 支持评审权重设置 -- 支持评委说明信息 - -### 3. 高效的查询 - -- 直接查询比赛的评委列表 -- 支持评委维度的统计分析 -- 支持权重计算 - -### 4. 数据一致性 - -- 通过外键约束保证数据完整性 -- 删除比赛时,级联删除评委关联 -- 删除用户时,级联删除评委关联 - -## 📝 使用建议 - -### 1. 评委添加流程 - -``` -1. 确保用户已创建(User 表) -2. 为用户分配评委角色和权限 -3. 创建 ContestJudge 记录,关联比赛和用户 -4. 可选:设置专业领域、权重等信息 -``` - -### 2. 评委验证 - -在分配作品给评委时,应该验证: -- 该评委是否属于该比赛(查询 `ContestJudge` 表) -- 该评委是否有效(`validState = 1`) - -### 3. 权限控制 - -- 只有比赛管理员可以添加/删除评委 -- 评委只能查看和评分分配给自己的作品 -- 通过 RBAC 权限系统控制访问 - -## 🔍 总结 - -**评委存储方案**: -- ✅ **需要** `ContestJudge` 关联表:管理比赛与评委的多对多关系 -- ❌ **不需要** 单独的评委信息表:评委信息通过 `User` 和 `Teacher` 表存储 - -**核心设计原则**: -1. 评委就是用户,统一用户体系 -2. 通过关联表管理比赛与评委的关系 -3. 支持评委在特定比赛中的特殊属性 -4. 保证数据一致性和查询效率 - diff --git a/backend/docs/DATABASE_SETUP.md b/backend/docs/DATABASE_SETUP.md deleted file mode 100644 index 54a861b..0000000 --- a/backend/docs/DATABASE_SETUP.md +++ /dev/null @@ -1,183 +0,0 @@ -# 数据库配置指南 - -## 1. 创建数据库 - -首先需要在 MySQL 中创建数据库: - -```sql -CREATE DATABASE db_competition_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -``` - -## 2. 配置环境变量 - -### 方式一:复制示例文件 - -```bash -cd backend -cp .env.example .env -``` - -### 方式二:手动创建 .env 文件 - -在 `backend` 目录下创建 `.env` 文件,内容如下: - -```env -DATABASE_URL="mysql://root:password@localhost:3306/competition_management?schema=public" -JWT_SECRET="your-secret-key-change-in-production" -PORT=3001 -NODE_ENV=development -``` - -## 3. 配置说明 - -### DATABASE_URL 格式 - -``` -mysql://用户名:密码@主机:端口/数据库名?参数 -``` - -**示例:** - -- 本地 MySQL,默认端口: - - ``` - DATABASE_URL="mysql://root:password@localhost:3306/competition_management?schema=public" - ``` - -- 远程 MySQL: - - ``` - DATABASE_URL="mysql://user:password@192.168.1.100:3306/competition_management?schema=public" - ``` - -- 使用 SSL: - - ``` - DATABASE_URL="mysql://user:password@localhost:3306/competition_management?schema=public&sslmode=require" - ``` - -- 包含特殊字符的密码(需要 URL 编码): - ``` - DATABASE_URL="mysql://user:p%40ssw0rd@localhost:3306/competition_management?schema=public" - ``` - -### JWT_SECRET - -用于 JWT token 签名的密钥,生产环境必须使用强随机字符串。 - -**生成方式:** - -```bash -# 使用 Node.js -node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" - -# 或使用 openssl -openssl rand -hex 32 -``` - -## 4. 初始化数据库 - -配置好 `.env` 文件后,执行以下命令初始化数据库: - -```bash -# 生成 Prisma Client -pnpm prisma:generate - -# 运行数据库迁移(创建表结构) -pnpm prisma:migrate - -# 或使用开发模式(会提示输入迁移名称) -pnpm prisma:migrate dev -``` - -## 5. 验证连接 - -### 方式一:使用 Prisma Studio - -```bash -pnpm prisma:studio -``` - -这会打开一个可视化界面,可以在浏览器中查看和管理数据库。 - -### 方式二:测试连接 - -启动后端服务: - -```bash -pnpm start:dev -``` - -如果连接成功,服务会正常启动;如果失败,会显示具体的错误信息。 - -## 6. 常见问题 - -### 问题 1: 连接被拒绝 - -**错误信息:** `Can't reach database server` - -**解决方案:** - -- 检查 MySQL 服务是否启动 -- 检查主机和端口是否正确 -- 检查防火墙设置 - -### 问题 2: 认证失败 - -**错误信息:** `Access denied for user` - -**解决方案:** - -- 检查用户名和密码是否正确 -- 确认用户有访问该数据库的权限 -- 如果密码包含特殊字符,需要进行 URL 编码 - -### 问题 3: 数据库不存在 - -**错误信息:** `Unknown database` - -**解决方案:** - -- 先创建数据库(见步骤 1) -- 检查数据库名称是否正确 - -### 问题 4: 字符集问题 - -**解决方案:** -创建数据库时指定字符集: - -```sql -CREATE DATABASE competition_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -``` - -## 7. 生产环境配置 - -生产环境建议: - -1. **使用环境变量管理工具**(如 AWS Secrets Manager、Azure Key Vault) -2. **使用连接池**(Prisma 默认已配置) -3. **启用 SSL 连接** -4. **定期备份数据库** -5. **使用强密码和 JWT_SECRET** - -## 8. 数据库迁移 - -### 创建新迁移 - -```bash -pnpm prisma:migrate dev --name migration_name -``` - -### 应用迁移(生产环境) - -```bash -pnpm prisma:migrate deploy -``` - -### 重置数据库(开发环境) - -```bash -pnpm prisma:migrate reset -``` - -**注意:** 这会删除所有数据,仅用于开发环境! diff --git a/backend/docs/DATABASE_URL_SOURCE.md b/backend/docs/DATABASE_URL_SOURCE.md deleted file mode 100644 index 3e281b0..0000000 --- a/backend/docs/DATABASE_URL_SOURCE.md +++ /dev/null @@ -1,165 +0,0 @@ -# DATABASE_URL 来源说明 - -## 📍 定义位置 - -`DATABASE_URL` 在 `schema.prisma` 中定义: - -```prisma -datasource db { - provider = "mysql" - url = env("DATABASE_URL") // ← 从这里读取环境变量 -} -``` - -## 🔄 加载流程 - -### 1. 配置文件定义 - -`DATABASE_URL` 定义在环境配置文件中: - -**当前配置**:`.development.env` 文件 -```env -DATABASE_URL="mysql://root:woshimima@localhost:3306/db_competition_management?schema=public" -``` - -### 2. NestJS ConfigModule 加载 - -在 `app.module.ts` 中配置: - -```typescript -ConfigModule.forRoot({ - isGlobal: true, - envFilePath: ['.development.env'], // ← 从这里加载环境变量 -}) -``` - -**加载顺序**: -1. NestJS ConfigModule 读取 `.development.env` 文件 -2. 将文件中的 `DATABASE_URL` 加载到 `process.env.DATABASE_URL` -3. 应用启动时,所有模块都可以通过 `ConfigService` 访问 - -### 3. Prisma 读取 - -Prisma 在以下时机读取 `DATABASE_URL`: - -1. **生成 Prisma Client 时**: - ```bash - npx prisma generate - ``` - - 读取 `process.env.DATABASE_URL` - - 生成类型定义(不连接数据库) - -2. **运行迁移时**: - ```bash - npx prisma migrate dev - npx prisma migrate deploy - ``` - - 读取 `process.env.DATABASE_URL` - - 连接到数据库执行迁移 - -3. **应用运行时**: - - `PrismaService` 初始化时读取 `process.env.DATABASE_URL` - - 建立数据库连接 - -## 📂 配置文件优先级 - -根据 `app.module.ts` 的配置: - -```typescript -envFilePath: ['.development.env'] -``` - -**当前配置**: -- ✅ 优先加载:`.development.env` -- ⚠️ 注意:如果设置了 `ignoreEnvFile: true`,则不会加载文件,只使用系统环境变量 - -## 🔍 验证 DATABASE_URL 来源 - -### 方法 1:查看环境变量(应用运行时) - -```bash -# 启动应用后,访问配置验证接口 -curl http://localhost:3001/api/config-verification/env-info -``` - -### 方法 2:查看启动日志 - -应用启动时会在控制台显示: -``` -=== 环境配置验证 === -DATABASE_URL: 已设置 mysql://root:woshimima@localhost:3306/db_competition_management?schema=public -``` - -### 方法 3:检查配置文件 - -```bash -cd backend -cat .development.env | grep DATABASE_URL -``` - -### 方法 4:在代码中验证 - -```typescript -// 在任何服务中 -constructor(private configService: ConfigService) {} - -const dbUrl = this.configService.get('DATABASE_URL'); -console.log('DATABASE_URL:', dbUrl); -``` - -## 🔐 环境变量来源优先级 - -Prisma 读取 `DATABASE_URL` 的优先级: - -1. **系统环境变量**(最高优先级) - ```bash - export DATABASE_URL="mysql://..." - ``` - -2. **.env 文件**(通过 ConfigModule 加载) - - `.development.env` - - `.env` - -3. **默认值**(如果都没有设置,Prisma 会报错) - -## 📝 DATABASE_URL 格式 - -``` -mysql://用户名:密码@主机:端口/数据库名?参数 -``` - -**示例**: -```env -# 本地数据库 -DATABASE_URL="mysql://root:password@localhost:3306/db_competition_management?schema=public" - -# 远程数据库 -DATABASE_URL="mysql://user:pass@192.168.1.100:3306/db_name?schema=public" - -# 带 SSL -DATABASE_URL="mysql://user:pass@host:3306/db_name?schema=public&sslmode=require" -``` - -## ⚠️ 注意事项 - -1. **密码包含特殊字符**:需要进行 URL 编码 - ```env - # 密码: p@ssw0rd - DATABASE_URL="mysql://user:p%40ssw0rd@localhost:3306/db" - ``` - -2. **配置文件安全**: - - `.development.env` 不应提交到 Git - - 生产环境使用环境变量或密钥管理服务 - -3. **Prisma 读取时机**: - - Prisma 直接读取 `process.env.DATABASE_URL` - - 不依赖 NestJS ConfigModule(但 ConfigModule 会将文件内容加载到 `process.env`) - -## 🔧 当前配置总结 - -- **配置文件**:`.development.env` -- **配置项**:`DATABASE_URL="mysql://root:woshimima@localhost:3306/db_competition_management?schema=public"` -- **加载方式**:NestJS ConfigModule → `process.env` → Prisma -- **验证方式**:启动日志或 `/api/config-verification/env-info` 接口 - diff --git a/backend/docs/ENVIRONMENT_CONFIG.md b/backend/docs/ENVIRONMENT_CONFIG.md deleted file mode 100644 index a6156bc..0000000 --- a/backend/docs/ENVIRONMENT_CONFIG.md +++ /dev/null @@ -1,290 +0,0 @@ -# 环境配置指南 - -## 环境区分方案 - -项目支持通过 `NODE_ENV` 环境变量和不同的 `.env` 文件来区分开发和生产环境。 - -## 配置文件结构 - -``` -backend/ -├── .env # 默认配置(可选,作为后备) -├── .env.development # 开发环境配置 -├── .env.production # 生产环境配置 -└── .env.test # 测试环境配置(可选) -``` - -## 配置优先级 - -配置文件按以下优先级加载: - -1. `.env.${NODE_ENV}` - 根据当前环境加载(最高优先级) -2. `.env` - 默认配置文件(后备) - -例如: -- `NODE_ENV=development` → 加载 `.env.development` -- `NODE_ENV=production` → 加载 `.env.production` -- 未设置 `NODE_ENV` → 默认加载 `.env.development`,然后 `.env` - -## 开发环境配置 - -### 创建 `.env.development` 文件 - -```env -# 开发环境配置 -NODE_ENV=development - -# 开发数据库(本地数据库) -DATABASE_URL="mysql://root:password@localhost:3306/competition_management_dev?schema=public" - -# JWT 密钥(开发环境可以使用简单密钥) -JWT_SECRET="dev-secret-key-not-for-production" - -# 服务器端口 -PORT=3001 - -# 日志级别 -LOG_LEVEL=debug - -# CORS 配置(开发环境允许所有来源) -CORS_ORIGIN=* -``` - -### 开发环境数据库命名建议 - -- 数据库名:`competition_management_dev` -- 便于区分:开发和生产使用不同的数据库 -- 安全:避免误操作生产数据 - -## 生产环境配置 - -### 创建 `.env.production` 文件 - -```env -# 生产环境配置 -NODE_ENV=production - -# 生产数据库(远程或云数据库) -DATABASE_URL="mysql://prod_user:strong_password@prod-db-host:3306/competition_management?schema=public&sslmode=require" - -# JWT 密钥(必须使用强随机字符串) -# 生成方式: openssl rand -hex 32 -JWT_SECRET="your-production-secret-key-must-be-strong-and-random-64-chars" - -# 服务器端口 -PORT=3001 - -# 日志级别 -LOG_LEVEL=error - -# CORS 配置(生产环境指定具体域名) -CORS_ORIGIN=https://yourdomain.com - -# 数据库连接池配置 -DB_POOL_MIN=2 -DB_POOL_MAX=10 - -# SSL/TLS 配置 -SSL_ENABLED=true -``` - -### 生产环境数据库配置要点 - -1. **使用独立的数据库服务器** -2. **启用 SSL 连接**(`sslmode=require`) -3. **使用强密码** -4. **限制数据库用户权限**(最小权限原则) -5. **定期备份** - -## 使用方法 - -### 开发环境 - -```bash -# 方式 1: 设置环境变量后启动 -NODE_ENV=development pnpm start:dev - -# 方式 2: 在 package.json 中配置(推荐) -# 已自动配置,直接运行: -pnpm start:dev -``` - -### 生产环境 - -```bash -# 方式 1: 设置环境变量后启动 -NODE_ENV=production pnpm start:prod - -# 方式 2: 在部署脚本中设置 -export NODE_ENV=production -pnpm start:prod -``` - -### 测试环境(可选) - -```bash -# 创建 .env.test 文件 -NODE_ENV=test -DATABASE_URL="mysql://root:password@localhost:3306/competition_management_test?schema=public" -JWT_SECRET="test-secret-key" -PORT=3002 - -# 运行测试 -NODE_ENV=test pnpm test -``` - -## 数据库命名规范 - -建议使用以下命名规范来区分不同环境的数据库: - -| 环境 | 数据库名 | 说明 | -|------|---------|------| -| 开发 | `competition_management_dev` | 开发环境数据库 | -| 测试 | `competition_management_test` | 测试环境数据库 | -| 生产 | `competition_management` | 生产环境数据库 | -| 预发布 | `competition_management_staging` | 预发布环境数据库 | - -## 创建不同环境的数据库 - -### 开发环境数据库 - -```sql -CREATE DATABASE competition_management_dev -CHARACTER SET utf8mb4 -COLLATE utf8mb4_unicode_ci; -``` - -### 生产环境数据库 - -```sql -CREATE DATABASE competition_management -CHARACTER SET utf8mb4 -COLLATE utf8mb4_unicode_ci; -``` - -## 环境变量管理最佳实践 - -### 1. 使用 .gitignore - -确保 `.env*` 文件不被提交到版本控制: - -```gitignore -# .env files -.env -.env.local -.env.*.local -.env.development -.env.production -.env.test -``` - -### 2. 提供示例文件 - -创建 `.env.example` 或 `.env.*.example` 文件作为模板: - -```bash -# 开发环境示例 -cp .env.development.example .env.development - -# 生产环境示例 -cp .env.production.example .env.production -``` - -### 3. 使用环境变量管理工具(生产环境) - -- **Docker**: 使用 `docker-compose.yml` 中的 `env_file` -- **Kubernetes**: 使用 `ConfigMap` 和 `Secret` -- **云平台**: - - AWS: Secrets Manager - - Azure: Key Vault - - GCP: Secret Manager - -### 4. 验证配置 - -在应用启动时验证必要的环境变量: - -```typescript -// 可以在 main.ts 中添加验证 -if (!process.env.DATABASE_URL) { - throw new Error('DATABASE_URL is required'); -} -``` - -## 快速开始 - -### 1. 创建开发环境配置 - -```bash -cd backend - -# 创建开发环境配置文件 -cat > .env.development << EOF -NODE_ENV=development -DATABASE_URL="mysql://root:password@localhost:3306/competition_management_dev?schema=public" -JWT_SECRET="dev-secret-key" -PORT=3001 -EOF -``` - -### 2. 创建生产环境配置 - -```bash -# 创建生产环境配置文件(不要提交到 Git) -cat > .env.production << EOF -NODE_ENV=production -DATABASE_URL="mysql://prod_user:password@prod-host:3306/competition_management?schema=public&sslmode=require" -JWT_SECRET="$(openssl rand -hex 32)" -PORT=3001 -EOF -``` - -### 3. 初始化数据库 - -```bash -# 开发环境 -NODE_ENV=development pnpm prisma:migrate dev - -# 生产环境(部署时) -NODE_ENV=production pnpm prisma:migrate deploy -``` - -## 常见问题 - -### Q: 如何确保使用正确的环境配置? - -A: 在启动应用前检查 `NODE_ENV` 环境变量: -```bash -echo $NODE_ENV # 应该显示 development 或 production -``` - -### Q: 生产环境配置应该存储在哪里? - -A: -- **不要提交到 Git** -- 使用环境变量管理工具(如 Docker secrets、K8s secrets) -- 或使用云平台提供的密钥管理服务 - -### Q: 如何在不同环境间切换? - -A: 通过设置 `NODE_ENV` 环境变量: -```bash -# 开发环境 -export NODE_ENV=development -pnpm start:dev - -# 生产环境 -export NODE_ENV=production -pnpm start:prod -``` - -### Q: 数据库迁移如何区分环境? - -A: Prisma 会根据 `DATABASE_URL` 环境变量自动使用对应的数据库: -```bash -# 开发环境迁移 -NODE_ENV=development pnpm prisma:migrate dev - -# 生产环境迁移 -NODE_ENV=production pnpm prisma:migrate deploy -``` - diff --git a/backend/docs/ENV_CHANGE_GUIDE.md b/backend/docs/ENV_CHANGE_GUIDE.md deleted file mode 100644 index a9b006f..0000000 --- a/backend/docs/ENV_CHANGE_GUIDE.md +++ /dev/null @@ -1,254 +0,0 @@ -# 修改 DATABASE_URL 后的操作指南 - -## 📋 操作决策树 - -``` -修改 DATABASE_URL - │ - ├─ 只改了连接信息(地址/端口/用户名/密码/数据库名) - │ └─ schema.prisma 未修改 - │ ├─ 目标数据库已有表结构 → ✅ 只需重启应用 - │ └─ 目标数据库是空的 → ⚠️ 需要运行迁移 - │ - └─ 同时修改了 schema.prisma - └─ ✅ 必须执行:生成 Client + 运行迁移 -``` - -## 🔄 场景 1:只修改连接信息(最常见) - -### 情况 A:目标数据库已有表结构 - -**示例**:从本地数据库切换到远程数据库,但表结构已存在 - -```bash -# 1. 修改 .development.env 文件 -DATABASE_URL="mysql://user:pass@new-host:3306/db_name?schema=public" - -# 2. 重启应用即可(无需执行 Prisma 命令) -npm run start:dev -``` - -**原因**: - -- Prisma Client 在应用启动时读取 `process.env.DATABASE_URL` -- 如果目标数据库已有表结构,直接连接即可 -- 不需要重新生成 Client(类型定义没变) -- 不需要运行迁移(表结构没变) - ---- - -### 情况 B:目标数据库是空的(新数据库) - -**示例**:切换到全新的数据库,还没有表结构 - -```bash -# 1. 修改 .development.env 文件 -DATABASE_URL="mysql://user:pass@new-host:3306/new_db?schema=public" - -# 2. 运行迁移创建表结构 -npm run prisma:migrate - -# 或使用部署模式(生产环境) -npm run prisma:migrate:deploy - -# 3. 重启应用 -npm run start:dev -``` - -**原因**: - -- 新数据库没有表结构 -- 需要运行迁移来创建表 -- 迁移会读取 `process.env.DATABASE_URL` 连接到新数据库 - ---- - -## 🔄 场景 2:同时修改了 schema.prisma - -**示例**:修改了数据库模型(添加/删除字段、表等) - -```bash -# 1. 修改 schema.prisma(添加字段、表等) - -# 2. 生成 Prisma Client(必须) -npm run prisma:generate - -# 3. 创建并运行迁移(必须) -npm run prisma:migrate -# 会提示输入迁移名称,如:add_user_email_field - -# 4. 重启应用 -npm run start:dev -``` - -**原因**: - -- schema.prisma 改变 → TypeScript 类型定义改变 → 需要重新生成 Client -- 数据库结构改变 → 需要创建迁移并应用到数据库 - ---- - -## 📝 完整操作流程 - -### 开发环境(推荐流程) - -```bash -cd backend - -# 1. 修改 .development.env 中的 DATABASE_URL -vim .development.env - -# 2. 检查目标数据库是否有表结构 -# 方式 A:使用 Prisma Studio 查看 -npm run prisma:studio - -# 方式 B:直接连接数据库查看 -mysql -h host -u user -p database -e "SHOW TABLES;" - -# 3. 根据情况选择操作: - -# 情况 1:数据库已有表结构 → 只需重启 -npm run start:dev - -# 情况 2:数据库是空的 → 运行迁移 -npm run prisma:migrate -npm run start:dev - -# 情况 3:修改了 schema.prisma → 生成 + 迁移 -npm run prisma:generate -npm run prisma:migrate -npm run start:dev -``` - -### 生产环境(部署流程) - -```bash -cd backend - -# 1. 修改生产环境配置文件或环境变量 -# 注意:生产环境通常使用环境变量,而不是文件 - -# 2. 生成 Prisma Client -npm run prisma:generate - -# 3. 运行迁移(生产环境使用 deploy,不会创建新迁移) -NODE_ENV=production npm run prisma:migrate:deploy - -# 4. 重启应用 -npm run start:prod -``` - ---- - -## ✅ 快速检查清单 - -修改 `DATABASE_URL` 后,按以下顺序检查: - -- [ ] **只改了连接信息?** - - [ ] 目标数据库有表 → ✅ 重启应用 - - [ ] 目标数据库为空 → ⚠️ 运行迁移 - -- [ ] **修改了 schema.prisma?** - - [ ] 是 → ✅ 生成 Client + 运行迁移 - - [ ] 否 → 跳过 - -- [ ] **应用启动后验证** - - [ ] 检查启动日志中的 DATABASE_URL - - [ ] 访问 `/api/config-verification/env-info` 验证 - - [ ] 测试数据库操作是否正常 - ---- - -## 🔍 验证方法 - -### 1. 验证 DATABASE_URL 是否生效 - -```bash -# 启动应用后查看日志 -npm run start:dev - -# 应该看到: -# DATABASE_URL: 已设置 mysql://... -``` - -### 2. 验证数据库连接 - -```bash -# 使用 Prisma Studio 连接 -npm run prisma:studio - -# 如果能打开并看到表,说明连接成功 -``` - -### 3. 验证表结构 - -```bash -# 检查迁移状态 -npx prisma migrate status - -# 应该显示:All migrations have been successfully applied -``` - ---- - -## ⚠️ 常见错误 - -### 错误 1:连接失败 - -``` -Error: Can't reach database server -``` - -**解决**: - -- 检查 DATABASE_URL 格式是否正确 -- 检查数据库服务是否运行 -- 检查网络连接和防火墙 - -### 错误 2:表不存在 - -``` -Error: Table 'xxx' doesn't exist -``` - -**解决**: - -- 运行迁移:`npm run prisma:migrate` -- 或使用:`npx prisma db push`(仅开发环境) - -### 错误 3:迁移状态不一致 - -``` -Error: The migration failed to apply -``` - -**解决**: - -- 检查迁移历史:`npx prisma migrate status` -- 重置数据库(仅开发环境):`npx prisma migrate reset` -- 或手动修复迁移文件 - ---- - -## 📚 相关命令速查 - -| 操作 | 命令 | 说明 | -| ----------- | ------------------------------- | ------------------------- | -| 生成 Client | `npm run prisma:generate` | 根据 schema 生成类型 | -| 创建迁移 | `npm run prisma:migrate` | 开发环境,会创建新迁移 | -| 应用迁移 | `npm run prisma:migrate:deploy` | 生产环境,只应用已有迁移 | -| 查看状态 | `npx prisma migrate status` | 查看迁移状态 | -| 打开 Studio | `npm run prisma:studio` | 可视化数据库 | -| 推送结构 | `npx prisma db push` | 直接同步 schema(仅开发) | - ---- - -## 🎯 总结 - -**修改 DATABASE_URL 后的最小操作**: - -1. **只改连接信息 + 数据库有表** → ✅ **重启应用** -2. **只改连接信息 + 数据库为空** → ⚠️ **运行迁移** -3. **修改了 schema.prisma** → ✅ **生成 Client + 运行迁移** - -**记住**:Prisma Client 在应用启动时读取 `process.env.DATABASE_URL`,所以修改后必须重启应用才能生效! diff --git a/backend/docs/MENU_INIT.md b/backend/docs/MENU_INIT.md deleted file mode 100644 index b4f9fcf..0000000 --- a/backend/docs/MENU_INIT.md +++ /dev/null @@ -1,219 +0,0 @@ -# 菜单初始化指南 - -## 📋 概述 - -菜单初始化脚本会根据项目的前端路由配置,自动创建菜单数据到数据库中。脚本会创建树形结构的菜单,包括顶级菜单和子菜单。 - -## 🚀 使用方法 - -### 1. 执行初始化脚本 - -在 `backend` 目录下执行: - -```bash -pnpm init:menus -``` - -或者使用 npm: - -```bash -npm run init:menus -``` - -### 2. 脚本功能 - -脚本会根据 `frontend/src/router/index.ts` 中的路由配置,自动创建以下菜单结构: - -``` -仪表盘 (/dashboard) -系统管理 (/system) -├── 用户管理 (/system/users) -├── 角色管理 (/system/roles) -├── 菜单管理 (/system/menus) -├── 数据字典 (/system/dict) -├── 系统配置 (/system/config) -└── 日志记录 (/system/logs) -``` - -## 📝 菜单数据结构 - -### 顶级菜单 - -1. **仪表盘** - - 路径: `/dashboard` - - 图标: `DashboardOutlined` - - 组件: `dashboard/Index` - - 排序: 1 - -2. **系统管理** - - 路径: `/system` - - 图标: `SettingOutlined` - - 组件: `null` (父菜单) - - 排序: 10 - -### 系统管理子菜单 - -1. **用户管理** - - 路径: `/system/users` - - 图标: `UserOutlined` - - 组件: `system/users/Index` - - 排序: 1 - -2. **角色管理** - - 路径: `/system/roles` - - 图标: `TeamOutlined` - - 组件: `system/roles/Index` - - 排序: 2 - -3. **菜单管理** - - 路径: `/system/menus` - - 图标: `MenuOutlined` - - 组件: `system/menus/Index` - - 排序: 3 - -4. **数据字典** - - 路径: `/system/dict` - - 图标: `BookOutlined` - - 组件: `system/dict/Index` - - 排序: 4 - -5. **系统配置** - - 路径: `/system/config` - - 图标: `ToolOutlined` - - 组件: `system/config/Index` - - 排序: 5 - -6. **日志记录** - - 路径: `/system/logs` - - 图标: `FileTextOutlined` - - 组件: `system/logs/Index` - - 排序: 6 - -## 🔄 脚本特性 - -### 1. 幂等性 - -- 脚本支持重复执行 -- 如果菜单已存在(相同名称和父菜单),会更新现有菜单 -- 如果菜单不存在,会创建新菜单 - -### 2. 树形结构 - -- 自动处理父子菜单关系 -- 递归创建子菜单 -- 保持菜单层级结构 - -### 3. 数据更新 - -- 如果菜单已存在,会更新以下字段: - - 路径 (path) - - 图标 (icon) - - 组件路径 (component) - - 排序 (sort) - - 有效状态 (validState) - -## ⚙️ 自定义菜单数据 - -如果需要修改菜单数据,可以编辑 `backend/scripts/init-menus.ts` 文件中的 `menus` 数组: - -```typescript -const menus = [ - { - name: '菜单名称', - path: '/路由路径', - icon: 'IconOutlined', // Ant Design Icons 图标名称 - component: '组件路径', // 相对于 views 目录的路径 - parentId: null, // null 表示顶级菜单 - sort: 1, // 排序值,越小越靠前 - children: [ - // 子菜单数组(可选) - // ... - ], - }, -]; -``` - -## 🗑️ 清空现有菜单(可选) - -如果需要清空所有现有菜单后重新创建,可以取消注释脚本中的以下代码: - -```typescript -// 清空现有菜单 -console.log('🗑️ 清空现有菜单...'); -await prisma.menu.deleteMany({}); -console.log('✅ 已清空现有菜单\n'); -``` - -**注意**: 清空菜单会删除所有现有菜单数据,请谨慎操作! - -## 📊 执行结果示例 - -脚本执行成功后会显示: - -``` -🚀 开始初始化菜单数据... - -📝 创建菜单... - - ✓ 仪表盘 (/dashboard) - ✓ 系统管理 (/system) - ✓ 用户管理 (/system/users) - ✓ 角色管理 (/system/roles) - ✓ 菜单管理 (/system/menus) - ✓ 数据字典 (/system/dict) - ✓ 系统配置 (/system/config) - ✓ 日志记录 (/system/logs) - -🔍 验证结果... - -📊 初始化结果: - 顶级菜单数量: 2 - 总菜单数量: 8 - -📋 菜单结构: -├─ 仪表盘 (/dashboard) -├─ 系统管理 (/system) -│ ├─ 用户管理 (/system/users) -│ ├─ 角色管理 (/system/roles) -│ ├─ 菜单管理 (/system/menus) -│ ├─ 数据字典 (/system/dict) -│ ├─ 系统配置 (/system/config) -│ └─ 日志记录 (/system/logs) - -✅ 菜单初始化完成! - -🎉 菜单初始化脚本执行完成! -``` - -## 🔍 验证菜单数据 - -初始化完成后,可以通过以下方式验证: - -### 方式一:使用 Prisma Studio - -```bash -pnpm prisma:studio -``` - -在浏览器中打开 Prisma Studio,查看 `menus` 表的数据。 - -### 方式二:通过菜单管理页面 - -1. 登录系统 -2. 访问"系统管理" -> "菜单管理" -3. 查看菜单列表,确认菜单已正确创建 - -## ⚠️ 注意事项 - -1. **数据库连接**: 确保 `.env` 文件中的 `DATABASE_URL` 配置正确 -2. **Prisma Client**: 确保已运行 `pnpm prisma:generate` 生成 Prisma Client -3. **数据库迁移**: 确保已运行 `pnpm prisma:migrate` 创建数据库表结构 -4. **图标名称**: 图标名称必须是有效的 Ant Design Icons 组件名称 -5. **路径格式**: 路由路径必须以 `/` 开头 -6. **组件路径**: 组件路径是相对于 `frontend/src/views/` 目录的路径 - -## 🔗 相关文档 - -- [数据库配置指南](./DATABASE_SETUP.md) -- [管理员账户初始化](./ADMIN_ACCOUNT.md) -- [路由配置说明](../frontend/src/router/index.ts) diff --git a/backend/docs/MIGRATION_INCREMENTAL_GUIDE.md b/backend/docs/MIGRATION_INCREMENTAL_GUIDE.md deleted file mode 100644 index 4dc4f0d..0000000 --- a/backend/docs/MIGRATION_INCREMENTAL_GUIDE.md +++ /dev/null @@ -1,312 +0,0 @@ -# Prisma 增量迁移指南 - -## 📋 概述 - -Prisma 的迁移机制**已经内置了增量执行功能**。当你运行迁移命令时,Prisma 会自动: - -- ✅ 只执行**新增的、未应用的**迁移 -- ✅ **跳过**已经执行过的迁移 -- ✅ 通过 `_prisma_migrations` 表跟踪迁移状态 - ---- - -## 🔍 Prisma 如何跟踪迁移状态 - -Prisma 在数据库中维护一个特殊的表 `_prisma_migrations`,用于记录: - -- 迁移名称(migration_name) -- 应用时间(applied_at) -- 迁移文件内容(checksum) -- 其他元数据 - -每次迁移执行后,Prisma 会在这个表中记录一条记录,确保不会重复执行。 - ---- - -## 🚀 迁移命令对比 - -### 1. `prisma migrate deploy`(生产环境推荐) - -**特点**: - -- ✅ **只执行未应用的迁移** -- ✅ 不会创建新迁移 -- ✅ 不会重置数据库 -- ✅ 适合生产环境 - -**使用场景**: - -- 生产环境部署 -- CI/CD 流程 -- 多环境同步 - -**示例**: - -```bash -# 生产环境 -npm run prisma:migrate:deploy - -# 或直接使用 -NODE_ENV=production prisma migrate deploy -``` - -**执行逻辑**: - -1. 读取 `prisma/migrations` 目录中的所有迁移文件 -2. 查询数据库中的 `_prisma_migrations` 表 -3. 对比找出未应用的迁移 -4. **只执行未应用的迁移** -5. 在 `_prisma_migrations` 表中记录新应用的迁移 - ---- - -### 2. `prisma migrate dev`(开发环境推荐) - -**特点**: - -- ✅ 创建新迁移(如果有 schema 变更) -- ✅ **只执行未应用的迁移** -- ✅ 可能会重置开发数据库(如果使用 shadow database) -- ✅ 适合开发环境 - -**使用场景**: - -- 本地开发 -- Schema 变更后创建迁移 - -**示例**: - -```bash -# 开发环境 -npm run prisma:migrate - -# 或直接使用 -prisma migrate dev -``` - -**执行逻辑**: - -1. 检查 schema.prisma 是否有变更 -2. 如果有变更,创建新迁移文件 -3. 查询 `_prisma_migrations` 表找出未应用的迁移 -4. **只执行未应用的迁移**(包括新创建的) -5. 记录到 `_prisma_migrations` 表 - ---- - -## 📊 查看迁移状态 - -### 检查哪些迁移已应用 - -```bash -# 查看迁移状态 -npx prisma migrate status - -# 输出示例: -# ✅ Database schema is up to date! -# -# The following migrations have been applied: -# - 20251118035205_init -# - 20251118041000_add_comments -# - 20251118211424_change_log_content_to_text -``` - -### 直接查询数据库 - -```sql --- 查看所有已应用的迁移 -SELECT * FROM _prisma_migrations ORDER BY applied_at DESC; - --- 查看迁移名称和状态 -SELECT migration_name, applied_at, finished_at -FROM _prisma_migrations -ORDER BY applied_at DESC; -``` - ---- - -## 🎯 实际使用场景 - -### 场景 1:生产环境部署 - -**情况**:生产数据库已经有部分迁移,现在要部署新版本 - -```bash -# 1. 部署新代码(包含新的迁移文件) - -# 2. 运行迁移(只会执行新增的迁移) -npm run prisma:migrate:deploy - -# Prisma 会自动: -# - 检查 _prisma_migrations 表 -# - 找出未应用的迁移(如:20251120000000_new_feature) -# - 只执行这个新迁移 -# - 跳过已执行的迁移(如:20251118035205_init) -``` - -**结果**: - -- ✅ 已执行的迁移不会重复执行 -- ✅ 只执行新增的迁移 -- ✅ 数据库结构同步到最新状态 - ---- - -### 场景 2:多环境同步 - -**情况**:开发环境有 3 个迁移,生产环境只有 2 个 - -```bash -# 开发环境迁移: -# - 20251118035205_init ✅ -# - 20251118041000_add_comments ✅ -# - 20251118211424_change_log_content_to_text ✅ - -# 生产环境迁移: -# - 20251118035205_init ✅ -# - 20251118041000_add_comments ✅ -# - 20251118211424_change_log_content_to_text ❌(未应用) - -# 在生产环境运行: -npm run prisma:migrate:deploy - -# Prisma 会: -# - 跳过前两个已应用的迁移 -# - 只执行最后一个未应用的迁移 -``` - ---- - -### 场景 3:回滚和修复 - -**情况**:某个迁移执行失败,需要修复 - -```bash -# 1. 检查迁移状态 -npx prisma migrate status - -# 2. 如果迁移失败,_prisma_migrations 表中不会有记录 -# 3. 修复迁移文件后,重新运行 -npm run prisma:migrate:deploy - -# Prisma 会: -# - 检查失败的迁移是否已记录 -# - 如果没有记录,会重新执行 -# - 如果已记录,会跳过 -``` - ---- - -## ⚠️ 注意事项 - -### 1. 不要手动修改 `_prisma_migrations` 表 - -这个表由 Prisma 自动管理,手动修改可能导致迁移状态不一致。 - -### 2. 迁移文件不要删除 - -即使迁移已执行,也不要删除 `prisma/migrations` 目录中的迁移文件。这些文件是迁移历史的一部分。 - -### 3. 生产环境使用 `migrate deploy` - -```bash -# ✅ 正确:生产环境 -prisma migrate deploy - -# ❌ 错误:生产环境不要使用 -prisma migrate dev # 可能会重置数据库 -``` - -### 4. 迁移文件顺序很重要 - -Prisma 按照迁移文件名(时间戳)的顺序执行迁移。确保迁移文件名的时间戳顺序正确。 - ---- - -## 🔧 故障排查 - -### 问题 1:迁移状态不一致 - -**症状**:`prisma migrate status` 显示状态不一致 - -**解决**: - -```bash -# 1. 检查 _prisma_migrations 表 -SELECT * FROM _prisma_migrations; - -# 2. 检查迁移文件 -ls -la prisma/migrations/ - -# 3. 如果迁移文件存在但未记录,手动标记(谨慎操作) -# 或者重新运行迁移 -prisma migrate deploy -``` - -### 问题 2:迁移重复执行 - -**症状**:迁移被重复执行 - -**原因**:`_prisma_migrations` 表中没有记录 - -**解决**: - -```bash -# 检查迁移记录 -npx prisma migrate status - -# 如果显示迁移未应用,但数据库结构已存在 -# 可能需要手动标记迁移为已应用(谨慎操作) -``` - -### 问题 3:迁移文件丢失 - -**症状**:迁移文件被删除,但数据库中有记录 - -**解决**: - -```bash -# 1. 从版本控制恢复迁移文件 -git checkout prisma/migrations/ - -# 2. 重新运行迁移检查 -npx prisma migrate status -``` - ---- - -## 📚 相关命令速查 - -| 命令 | 说明 | 使用场景 | -| ----------------------- | ---------------------- | -------- | -| `prisma migrate deploy` | 只执行未应用的迁移 | 生产环境 | -| `prisma migrate dev` | 创建并执行迁移 | 开发环境 | -| `prisma migrate status` | 查看迁移状态 | 所有环境 | -| `prisma migrate reset` | 重置数据库(开发环境) | 开发环境 | -| `prisma db push` | 直接同步 schema | 快速原型 | - ---- - -## ✅ 总结 - -**Prisma 迁移机制的核心特点**: - -1. ✅ **自动增量执行**:只执行未应用的迁移 -2. ✅ **状态跟踪**:通过 `_prisma_migrations` 表跟踪 -3. ✅ **安全可靠**:不会重复执行已应用的迁移 -4. ✅ **环境区分**:`migrate deploy` 用于生产,`migrate dev` 用于开发 - -**最佳实践**: - -- 🎯 生产环境:使用 `prisma migrate deploy` -- 🎯 开发环境:使用 `prisma migrate dev` -- 🎯 定期检查:使用 `prisma migrate status` 查看状态 -- 🎯 版本控制:提交所有迁移文件到 Git - ---- - -## 🔗 相关文档 - -- [Prisma 官方迁移文档](https://www.prisma.io/docs/concepts/components/prisma-migrate) -- [SCHEMA_CHANGE_GUIDE.md](./SCHEMA_CHANGE_GUIDE.md) - Schema 修改指南 -- [DATABASE_SETUP.md](./DATABASE_SETUP.md) - 数据库设置指南 diff --git a/backend/docs/QUICK_START_ENV.md b/backend/docs/QUICK_START_ENV.md deleted file mode 100644 index 5c79837..0000000 --- a/backend/docs/QUICK_START_ENV.md +++ /dev/null @@ -1,131 +0,0 @@ -# 环境配置快速参考 - -## 🚀 快速开始 - -### 1. 创建开发环境配置 - -```bash -cd backend - -# 创建开发环境配置文件 -cat > .env.development << 'EOF' -NODE_ENV=development -DATABASE_URL="mysql://root:password@localhost:3306/competition_management_dev?schema=public" -JWT_SECRET="dev-secret-key" -PORT=3001 -EOF -``` - -### 2. 创建生产环境配置 - -```bash -# 创建生产环境配置文件(不要提交到 Git) -cat > .env.production << 'EOF' -NODE_ENV=production -DATABASE_URL="mysql://prod_user:strong_password@prod-host:3306/competition_management?schema=public&sslmode=require" -JWT_SECRET="$(openssl rand -hex 32)" -PORT=3001 -EOF -``` - -### 3. 创建数据库 - -```sql --- 开发环境数据库 -CREATE DATABASE competition_management_dev -CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - --- 生产环境数据库 -CREATE DATABASE competition_management -CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -``` - -### 4. 初始化数据库 - -```bash -# 开发环境 -pnpm prisma:generate -pnpm prisma:migrate - -# 生产环境(部署时) -NODE_ENV=production pnpm prisma:migrate:deploy -``` - -## 📋 环境区分总结 - -| 项目 | 开发环境 | 生产环境 | -|------|---------|---------| -| **配置文件** | `.env.development` | `.env.production` | -| **数据库名** | `competition_management_dev` | `competition_management` | -| **启动命令** | `pnpm start:dev` | `pnpm start:prod` | -| **迁移命令** | `pnpm prisma:migrate` | `pnpm prisma:migrate:deploy` | -| **Prisma Studio** | `pnpm prisma:studio:dev` | `pnpm prisma:studio:prod` | -| **日志级别** | `debug` | `error` | -| **CORS** | `*` (所有来源) | 指定域名 | -| **SSL** | 可选 | 必须启用 | - -## 🔑 关键区别 - -### 开发环境 -- ✅ 使用本地数据库 -- ✅ 简单的 JWT 密钥(便于开发) -- ✅ 详细的日志输出 -- ✅ 允许所有 CORS 来源 -- ✅ 热重载支持 - -### 生产环境 -- ✅ 独立的数据库服务器 -- ✅ 强随机 JWT 密钥 -- ✅ 最小化日志输出 -- ✅ 限制 CORS 来源 -- ✅ 启用 SSL/TLS -- ✅ 连接池优化 - -## 📝 配置文件示例 - -### `.env.development` -```env -NODE_ENV=development -DATABASE_URL="mysql://root:password@localhost:3306/competition_management_dev?schema=public" -JWT_SECRET="dev-secret-key" -PORT=3001 -LOG_LEVEL=debug -CORS_ORIGIN=* -``` - -### `.env.production` -```env -NODE_ENV=production -DATABASE_URL="mysql://prod_user:strong_password@prod-host:3306/competition_management?schema=public&sslmode=require" -JWT_SECRET="your-production-secret-key-must-be-strong-and-random" -PORT=3001 -LOG_LEVEL=error -CORS_ORIGIN=https://yourdomain.com -SSL_ENABLED=true -DB_POOL_MIN=2 -DB_POOL_MAX=10 -``` - -## ⚠️ 注意事项 - -1. **不要提交 `.env` 文件到 Git** -2. **生产环境必须使用强密码和 JWT_SECRET** -3. **生产环境建议启用 SSL 连接** -4. **定期备份生产数据库** -5. **使用不同的数据库名称区分环境** - -## 🔍 验证配置 - -```bash -# 检查当前环境 -echo $NODE_ENV - -# 验证数据库连接(开发环境) -NODE_ENV=development pnpm prisma:studio - -# 验证数据库连接(生产环境) -NODE_ENV=production pnpm prisma:studio:prod -``` - -更多详细信息请查看 [ENVIRONMENT_CONFIG.md](./ENVIRONMENT_CONFIG.md) - diff --git a/backend/docs/RBAC_EXAMPLES.md b/backend/docs/RBAC_EXAMPLES.md deleted file mode 100644 index 284ff2c..0000000 --- a/backend/docs/RBAC_EXAMPLES.md +++ /dev/null @@ -1,444 +0,0 @@ -# RBAC 权限控制使用示例 - -## 📋 目录 -1. [基础使用](#基础使用) -2. [角色控制示例](#角色控制示例) -3. [权限控制示例](#权限控制示例) -4. [完整示例](#完整示例) - -## 🔧 基础使用 - -### 1. 创建权限 - -```typescript -// 在数据库中创建权限 -const permissions = [ - { code: 'user:create', resource: 'user', action: 'create', name: '创建用户' }, - { code: 'user:read', resource: 'user', action: 'read', name: '查看用户' }, - { code: 'user:update', resource: 'user', action: 'update', name: '更新用户' }, - { code: 'user:delete', resource: 'user', action: 'delete', name: '删除用户' }, - { code: 'role:create', resource: 'role', action: 'create', name: '创建角色' }, - { code: 'role:read', resource: 'role', action: 'read', name: '查看角色' }, -]; - -for (const perm of permissions) { - await prisma.permission.create({ data: perm }); -} -``` - -### 2. 创建角色并分配权限 - -```typescript -// 创建管理员角色 -const adminRole = await prisma.role.create({ - data: { - name: '管理员', - code: 'admin', - permissions: { - create: [ - { permission: { connect: { code: 'user:create' } } }, - { permission: { connect: { code: 'user:read' } } }, - { permission: { connect: { code: 'user:update' } } }, - { permission: { connect: { code: 'user:delete' } } }, - { permission: { connect: { code: 'role:create' } } }, - { permission: { connect: { code: 'role:read' } } }, - ] - } - } -}); - -// 创建编辑角色(只有查看和更新权限) -const editorRole = await prisma.role.create({ - data: { - name: '编辑', - code: 'editor', - permissions: { - create: [ - { permission: { connect: { code: 'user:read' } } }, - { permission: { connect: { code: 'user:update' } } }, - ] - } - } -}); -``` - -### 3. 给用户分配角色 - -```typescript -// 给用户分配管理员角色 -await prisma.userRole.create({ - data: { - user: { connect: { id: 1 } }, - role: { connect: { code: 'admin' } } - } -}); - -// 用户可以有多个角色 -await prisma.userRole.create({ - data: { - user: { connect: { id: 1 } }, - role: { connect: { code: 'editor' } } - } -}); -``` - -## 🎯 角色控制示例 - -### 在控制器中使用角色装饰器 - -```typescript -import { Controller, Get, Post, Delete, UseGuards } from '@nestjs/common'; -import { Roles } from '../auth/decorators/roles.decorator'; -import { RolesGuard } from '../auth/guards/roles.guard'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; - -@Controller('users') -@UseGuards(JwtAuthGuard, RolesGuard) // 先验证 JWT,再验证角色 -export class UsersController { - - // 所有已登录用户都可以查看 - @Get() - findAll() { - return this.usersService.findAll(); - } - - // 只有管理员和编辑可以创建用户 - @Post() - @Roles('admin', 'editor') - create(@Body() createUserDto: CreateUserDto) { - return this.usersService.create(createUserDto); - } - - // 只有管理员可以删除用户 - @Delete(':id') - @Roles('admin') - remove(@Param('id') id: string) { - return this.usersService.remove(+id); - } -} -``` - -## 🔐 权限控制示例 - -### 创建权限守卫(可选扩展) - -```typescript -// src/auth/guards/permissions.guard.ts -import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; -import { Reflector } from '@nestjs/core'; - -@Injectable() -export class PermissionsGuard implements CanActivate { - constructor(private reflector: Reflector) {} - - canActivate(context: ExecutionContext): boolean { - const requiredPermissions = this.reflector.getAllAndOverride( - 'permissions', - [context.getHandler(), context.getClass()], - ); - - if (!requiredPermissions) { - return true; // 没有权限要求,允许访问 - } - - const { user } = context.switchToHttp().getRequest(); - const userPermissions = user.permissions || []; - - // 检查用户是否拥有任一所需权限 - return requiredPermissions.some((permission) => - userPermissions.includes(permission), - ); - } -} -``` - -### 创建权限装饰器 - -```typescript -// src/auth/decorators/permissions.decorator.ts -import { SetMetadata } from '@nestjs/common'; - -export const PERMISSIONS_KEY = 'permissions'; -export const Permissions = (...permissions: string[]) => - SetMetadata(PERMISSIONS_KEY, permissions); -``` - -### 使用权限控制 - -```typescript -import { Controller, Get, Post, Delete, UseGuards } from '@nestjs/common'; -import { Permissions } from '../auth/decorators/permissions.decorator'; -import { PermissionsGuard } from '../auth/guards/permissions.guard'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; - -@Controller('users') -@UseGuards(JwtAuthGuard, PermissionsGuard) -export class UsersController { - - @Get() - @Permissions('user:read') // 需要 user:read 权限 - findAll() { - return this.usersService.findAll(); - } - - @Post() - @Permissions('user:create') // 需要 user:create 权限 - create(@Body() createUserDto: CreateUserDto) { - return this.usersService.create(createUserDto); - } - - @Delete(':id') - @Permissions('user:delete') // 需要 user:delete 权限 - remove(@Param('id') id: string) { - return this.usersService.remove(+id); - } -} -``` - -## 📚 完整示例 - -### 完整的用户管理控制器 - -```typescript -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, -} from '@nestjs/common'; -import { UsersService } from './users.service'; -import { CreateUserDto } from './dto/create-user.dto'; -import { UpdateUserDto } from './dto/update-user.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; -import { RolesGuard } from '../auth/guards/roles.guard'; -import { Roles } from '../auth/decorators/roles.decorator'; - -@Controller('users') -@UseGuards(JwtAuthGuard) // 所有接口都需要登录 -export class UsersController { - constructor(private readonly usersService: UsersService) {} - - // 查看用户列表 - 所有已登录用户都可以访问 - @Get() - findAll(@Query('page') page?: string, @Query('pageSize') pageSize?: string) { - return this.usersService.findAll( - page ? parseInt(page) : 1, - pageSize ? parseInt(pageSize) : 10, - ); - } - - // 查看用户详情 - 所有已登录用户都可以访问 - @Get(':id') - findOne(@Param('id') id: string) { - return this.usersService.findOne(+id); - } - - // 创建用户 - 需要 admin 或 editor 角色 - @Post() - @UseGuards(RolesGuard) - @Roles('admin', 'editor') - create(@Body() createUserDto: CreateUserDto, @Request() req) { - // req.user 包含当前用户信息(从 JWT 中提取) - return this.usersService.create(createUserDto); - } - - // 更新用户 - 需要 admin 角色,或者用户自己更新自己 - @Patch(':id') - @UseGuards(RolesGuard) - async update( - @Param('id') id: string, - @Body() updateUserDto: UpdateUserDto, - @Request() req, - ) { - const userId = parseInt(id); - const currentUserId = req.user.userId; - - // 管理员可以更新任何人,普通用户只能更新自己 - if (req.user.roles?.includes('admin') || userId === currentUserId) { - return this.usersService.update(userId, updateUserDto); - } - - throw new ForbiddenException('无权更新此用户'); - } - - // 删除用户 - 只有管理员可以删除 - @Delete(':id') - @UseGuards(RolesGuard) - @Roles('admin') - remove(@Param('id') id: string) { - return this.usersService.remove(+id); - } -} -``` - -## 🔍 权限检查流程 - -### 1. 用户登录 - -```typescript -// POST /api/auth/login -{ - "username": "admin", - "password": "password123" -} - -// 返回 -{ - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", - "user": { - "id": 1, - "username": "admin", - "nickname": "管理员", - "roles": ["admin"], // 用户的角色列表 - "permissions": [ // 用户的所有权限(从角色中聚合) - "user:create", - "user:read", - "user:update", - "user:delete", - "role:create", - "role:read" - ] - } -} -``` - -### 2. 访问受保护的接口 - -```typescript -// 请求头 -Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... - -// 流程 -1. JwtAuthGuard 验证 Token - └─> 提取用户信息,添加到 req.user - -2. RolesGuard 检查角色 - └─> 从 req.user.roles 中检查是否包含所需角色 - └─> 如果包含,允许访问;否则返回 403 Forbidden -``` - -## 🎨 前端权限控制示例 - -### Vue 3 中使用权限 - -```typescript -// stores/auth.ts -export const useAuthStore = defineStore('auth', () => { - const user = ref(null); - - // 检查是否有指定角色 - const hasRole = (role: string) => { - return user.value?.roles?.includes(role) ?? false; - }; - - // 检查是否有指定权限 - const hasPermission = (permission: string) => { - return user.value?.permissions?.includes(permission) ?? false; - }; - - // 检查是否有任一角色 - const hasAnyRole = (roles: string[]) => { - return roles.some(role => hasRole(role)); - }; - - // 检查是否有任一权限 - const hasAnyPermission = (permissions: string[]) => { - return permissions.some(perm => hasPermission(perm)); - }; - - return { - user, - hasRole, - hasPermission, - hasAnyRole, - hasAnyPermission, - }; -}); -``` - -### 在组件中使用 - -```vue - - - -``` - -### 路由守卫 - -```typescript -// router/index.ts -router.beforeEach((to, from, next) => { - const authStore = useAuthStore(); - - // 检查是否需要认证 - if (to.meta.requiresAuth && !authStore.isAuthenticated) { - next({ name: 'Login' }); - return; - } - - // 检查角色 - if (to.meta.roles && !authStore.hasAnyRole(to.meta.roles)) { - next({ name: 'Forbidden' }); - return; - } - - // 检查权限 - if (to.meta.permissions && !authStore.hasAnyPermission(to.meta.permissions)) { - next({ name: 'Forbidden' }); - return; - } - - next(); -}); -``` - -## 📊 权限矩阵示例 - -| 角色 | user:create | user:read | user:update | user:delete | role:create | role:read | -|------|-------------|-----------|-------------|------------|-------------|-----------| -| admin | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| editor | ✅ | ✅ | ✅ | ❌ | ❌ | ✅ | -| viewer | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | - -## 🎯 总结 - -RBAC 权限控制的核心是: - -1. **用户** ←→ **角色** ←→ **权限** -2. 通过 `@Roles()` 装饰器控制接口访问 -3. 前端根据返回的 `roles` 和 `permissions` 控制 UI 显示 -4. 权限由 `resource:action` 组成,如 `user:create` - -这样的设计既保证了安全性,又提供了良好的灵活性和可维护性! - diff --git a/backend/docs/RBAC_GUIDE.md b/backend/docs/RBAC_GUIDE.md deleted file mode 100644 index c3b99f9..0000000 --- a/backend/docs/RBAC_GUIDE.md +++ /dev/null @@ -1,397 +0,0 @@ -# RBAC 权限控制详解 - -## 📚 什么是 RBAC? - -**RBAC(Role-Based Access Control)** 即**基于角色的访问控制**,是一种权限管理模型。它的核心思想是: - -> **用户 → 角色 → 权限** - -通过给用户分配角色,角色拥有权限,从而间接地给用户授予权限。 - -## 🎯 RBAC 的核心概念 - -### 1. **用户(User)** - -系统中的实际使用者,如:张三、李四 - -### 2. **角色(Role)** - -一组权限的集合,如:管理员、编辑、访客 - -### 3. **权限(Permission)** - -对资源的操作能力,如:创建用户、删除文章、查看报表 - -### 4. **资源(Resource)** - -系统中的实体对象,如:用户、文章、订单 - -### 5. **操作(Action)** - -对资源的操作类型,如:create(创建)、read(查看)、update(更新)、delete(删除) - -## 🏗️ 项目中的 RBAC 架构 - -### 数据模型关系 - -``` -User (用户) - ↓ (多对多) -UserRole (用户角色关联) - ↓ -Role (角色) - ↓ (多对多) -RolePermission (角色权限关联) - ↓ -Permission (权限) - ├─ resource: 资源名称 (如: user, role, menu) - └─ action: 操作类型 (如: create, read, update, delete) -``` - -### 数据库表结构 - -#### 1. **users** - 用户表 - -存储系统用户的基本信息 - -#### 2. **roles** - 角色表 - -存储角色信息,如: - -- `admin` - 管理员 -- `editor` - 编辑 -- `viewer` - 查看者 - -#### 3. **permissions** - 权限表 - -存储权限信息,权限由 `resource` + `action` 组成,如: - -- `user:create` - 创建用户 -- `user:read` - 查看用户 -- `user:update` - 更新用户 -- `user:delete` - 删除用户 -- `role:create` - 创建角色 -- `menu:read` - 查看菜单 - -#### 4. **user_roles** - 用户角色关联表 - -用户和角色的多对多关系 - -#### 5. **role_permissions** - 角色权限关联表 - -角色和权限的多对多关系 - -## 🔄 RBAC 工作流程 - -### 1. **权限分配流程** - -``` -1. 创建权限 - └─> 定义资源(resource)和操作(action) - └─> 例如:user:create, user:read - -2. 创建角色 - └─> 给角色分配权限 - └─> 例如:管理员角色 = [user:create, user:read, user:update, user:delete] - -3. 给用户分配角色 - └─> 用户继承角色的所有权限 - └─> 例如:张三 = 管理员角色 -``` - -### 2. **权限验证流程** - -``` -用户请求 API - ↓ -JWT 认证(验证用户身份) - ↓ -提取用户信息(包含 roles 和 permissions) - ↓ -RolesGuard 检查(检查用户是否有指定角色) - ↓ -PermissionGuard 检查(检查用户是否有指定权限) - ↓ -允许/拒绝访问 -``` - -## 💻 代码实现示例 - -### 1. **定义权限** - -权限由 `resource` + `action` 组成: - -```typescript -// 权限示例 -{ - code: 'user:create', // 权限编码 - resource: 'user', // 资源:用户 - action: 'create', // 操作:创建 - name: '创建用户', - description: '允许创建新用户' -} - -{ - code: 'user:read', - resource: 'user', - action: 'read', - name: '查看用户', - description: '允许查看用户列表和详情' -} -``` - -### 2. **创建角色并分配权限** - -```typescript -// 创建管理员角色 -const adminRole = await prisma.role.create({ - data: { - name: '管理员', - code: 'admin', - permissions: { - create: [ - { permission: { connect: { code: 'user:create' } } }, - { permission: { connect: { code: 'user:read' } } }, - { permission: { connect: { code: 'user:update' } } }, - { permission: { connect: { code: 'user:delete' } } }, - { permission: { connect: { code: 'role:create' } } }, - // ... 更多权限 - ], - }, - }, -}); -``` - -### 3. **给用户分配角色** - -```typescript -// 给用户分配管理员角色 -await prisma.userRole.create({ - data: { - user: { connect: { id: userId } }, - role: { connect: { code: 'admin' } }, - }, -}); -``` - -### 4. **在控制器中使用权限控制** - -#### 方式一:使用角色装饰器 - -```typescript -import { Controller, Get, UseGuards } from '@nestjs/common'; -import { Roles } from '../auth/decorators/roles.decorator'; -import { RolesGuard } from '../auth/guards/roles.guard'; - -@Controller('users') -@UseGuards(RolesGuard) -export class UsersController { - @Get() - @Roles('admin', 'editor') // 需要 admin 或 editor 角色 - findAll() { - // 只有拥有 admin 或 editor 角色的用户才能访问 - } - - @Delete(':id') - @Roles('admin') // 只有 admin 角色可以删除 - remove() { - // 只有管理员可以删除用户 - } -} -``` - -#### 方式二:使用权限装饰器(可扩展) - -```typescript -// 可以创建 PermissionGuard 和 @Permissions() 装饰器 -@Get() -@Permissions('user:read') // 需要 user:read 权限 -findAll() { - // 只有拥有 user:read 权限的用户才能访问 -} -``` - -### 5. **获取用户权限** - -```typescript -// 在 AuthService 中 -private async getUserPermissions(userId: number): Promise { - const user = await this.usersService.findOne(userId); - if (!user) return []; - - const permissions = new Set(); - - // 遍历用户的所有角色 - user.roles?.forEach((ur: any) => { - // 遍历角色的所有权限 - ur.role.permissions?.forEach((rp: any) => { - permissions.add(rp.permission.code); - }); - }); - - return Array.from(permissions); - // 返回: ['user:create', 'user:read', 'user:update', 'role:create', ...] -} -``` - -## 📊 RBAC 的优势 - -### 1. **灵活性** - -- ✅ 一个用户可以有多个角色 -- ✅ 一个角色可以有多个权限 -- ✅ 权限可以动态分配和回收 - -### 2. **可维护性** - -- ✅ 权限变更只需修改角色,不需要逐个修改用户 -- ✅ 角色可以复用,减少重复配置 - -### 3. **可扩展性** - -- ✅ 新增资源只需添加新的权限 -- ✅ 新增角色只需组合现有权限 - -### 4. **安全性** - -- ✅ 最小权限原则:用户只获得必要的权限 -- ✅ 权限集中管理,便于审计 - -## 🎨 实际应用场景 - -### 场景 1:内容管理系统 - -``` -角色定义: -- 超级管理员:所有权限 -- 内容管理员:文章 CRUD、评论管理 -- 编辑:文章创建、编辑 -- 作者:文章创建 -- 访客:文章查看 - -权限示例: -- article:create -- article:read -- article:update -- article:delete -- comment:moderate -``` - -### 场景 2:电商系统 - -``` -角色定义: -- 平台管理员:所有权限 -- 店铺管理员:店铺管理、订单管理 -- 客服:订单查看、退款处理 -- 财务:订单查看、财务报表 - -权限示例: -- order:create -- order:read -- order:update -- order:refund -- report:financial -``` - -## 🔐 项目中的权限控制实现 - -### 1. **JWT 认证** - -用户登录后获得 JWT Token,Token 中包含用户 ID - -### 2. **JwtAuthGuard** - -验证 JWT Token,提取用户信息 - -### 3. **RolesGuard** - -检查用户是否拥有指定的角色 - -### 4. **权限获取** - -登录时,系统会: - -1. 查询用户的所有角色 -2. 查询角色关联的所有权限 -3. 合并所有权限并返回给前端 - -### 5. **前端权限控制** - -前端可以根据返回的 `roles` 和 `permissions` 数组: - -- 控制菜单显示 -- 控制按钮显示 -- 控制路由访问 - -## 📝 最佳实践 - -### 1. **权限命名规范** - -``` -格式:resource:action -示例: -- user:create -- user:read -- user:update -- user:delete -- role:assign -- menu:manage -``` - -### 2. **角色命名规范** - -``` -使用有意义的英文代码: -- admin: 管理员 -- editor: 编辑 -- viewer: 查看者 -- guest: 访客 -``` - -### 3. **权限粒度** - -- ✅ 不要过粗:避免一个权限包含太多操作 -- ✅ 不要过细:避免权限过多难以管理 -- ✅ 按业务模块划分:user、role、menu、dict 等 - -### 4. **默认角色** - -建议创建以下默认角色: - -- **超级管理员**:拥有所有权限 -- **普通用户**:基础查看权限 -- **访客**:只读权限 - -## 🚀 扩展功能 - -### 1. **权限继承** - -可以实现角色继承,子角色继承父角色的权限 - -### 2. **动态权限** - -可以根据数据范围动态控制权限,如: - -- 用户只能管理自己创建的订单 -- 部门管理员只能管理本部门的用户 - -### 3. **权限缓存** - -将用户权限缓存到 Redis,提高性能 - -### 4. **权限审计** - -记录权限变更日志,便于追溯 - -## 📖 总结 - -RBAC 权限控制通过 **用户 → 角色 → 权限** 的三层关系,实现了灵活、可维护的权限管理系统。在你的项目中: - -1. ✅ **用户** 通过 `user_roles` 表关联 **角色** -2. ✅ **角色** 通过 `role_permissions` 表关联 **权限** -3. ✅ **权限** 由 `resource` + `action` 组成 -4. ✅ 使用 `@Roles()` 装饰器控制接口访问 -5. ✅ 登录时返回用户的角色和权限列表 - -这样的设计既保证了安全性,又提供了良好的扩展性和可维护性! diff --git a/backend/docs/README.md b/backend/docs/README.md deleted file mode 100644 index 577f7f6..0000000 --- a/backend/docs/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# 项目文档索引 - -本目录包含项目后端的所有指南和文档。 - -## 📚 文档分类 - -### 🚀 快速开始 - -- **[QUICK_START_ENV.md](./QUICK_START_ENV.md)** - 环境配置快速参考 - - 快速创建开发和生产环境配置 - - 环境区分总结表 - - 关键区别说明 - -### 🗄️ 数据库相关 - -- **[DATABASE_SETUP.md](./DATABASE_SETUP.md)** - 数据库配置指南 - - 创建数据库 - - DATABASE_URL 格式说明 - - 初始化数据库步骤 - - 验证连接方法 - -- **[DATABASE_URL_SOURCE.md](./DATABASE_URL_SOURCE.md)** - DATABASE_URL 来源说明 - - DATABASE_URL 的定义位置 - - 加载流程详解 - - 配置文件优先级 - - 验证方法 - -- **[SCHEMA_CHANGE_GUIDE.md](./SCHEMA_CHANGE_GUIDE.md)** - Prisma Schema 修改指南 - - 修改 schema.prisma 后的操作步骤 - - 生成 Prisma Client - - 应用数据库迁移 - - 验证迁移是否成功 - -- **[ENV_CHANGE_GUIDE.md](./ENV_CHANGE_GUIDE.md)** - 修改 DATABASE_URL 后的操作指南 - - 操作决策树 - - 不同场景的处理方法 - - 完整操作流程 - - 常见错误解决 - -### ⚙️ 环境配置 - -- **[ENVIRONMENT_CONFIG.md](./ENVIRONMENT_CONFIG.md)** - 环境配置指南 - - 环境区分方案 - - 配置文件结构 - - 配置优先级 - - 开发/生产环境配置示例 - - 安全注意事项 - -### 🔐 权限管理 - -- **[RBAC_GUIDE.md](./RBAC_GUIDE.md)** - RBAC 权限系统指南 - - 权限系统架构 - - 权限模型说明 - - 使用示例 - - 最佳实践 - -- **[RBAC_EXAMPLES.md](./RBAC_EXAMPLES.md)** - RBAC 使用示例 - - 完整的权限配置示例 - - 常见场景实现 - - 代码示例 - -### 👤 账户管理 - -- **[ADMIN_ACCOUNT.md](./ADMIN_ACCOUNT.md)** - 管理员账户指南 - - 初始化管理员账户 - - 验证管理员账户 - - 账户管理说明 - -## 📖 文档使用建议 - -### 新项目设置流程 - -1. **环境配置** → [QUICK_START_ENV.md](./QUICK_START_ENV.md) -2. **数据库设置** → [DATABASE_SETUP.md](./DATABASE_SETUP.md) -3. **初始化管理员** → [ADMIN_ACCOUNT.md](./ADMIN_ACCOUNT.md) -4. **权限配置** → [RBAC_GUIDE.md](./RBAC_GUIDE.md) - -### 日常开发流程 - -- **修改数据库结构** → [SCHEMA_CHANGE_GUIDE.md](./SCHEMA_CHANGE_GUIDE.md) -- **修改环境变量** → [ENV_CHANGE_GUIDE.md](./ENV_CHANGE_GUIDE.md) -- **配置权限** → [RBAC_EXAMPLES.md](./RBAC_EXAMPLES.md) - -### 问题排查 - -- **数据库连接问题** → [DATABASE_URL_SOURCE.md](./DATABASE_URL_SOURCE.md) -- **环境配置问题** → [ENVIRONMENT_CONFIG.md](./ENVIRONMENT_CONFIG.md) -- **迁移问题** → [SCHEMA_CHANGE_GUIDE.md](./SCHEMA_CHANGE_GUIDE.md) - -## 🔍 快速查找 - -| 需求 | 文档 | -|------|------| -| 如何设置开发环境? | [QUICK_START_ENV.md](./QUICK_START_ENV.md) | -| 如何配置数据库? | [DATABASE_SETUP.md](./DATABASE_SETUP.md) | -| DATABASE_URL 从哪里来? | [DATABASE_URL_SOURCE.md](./DATABASE_URL_SOURCE.md) | -| 修改 schema 后做什么? | [SCHEMA_CHANGE_GUIDE.md](./SCHEMA_CHANGE_GUIDE.md) | -| 修改环境变量后做什么? | [ENV_CHANGE_GUIDE.md](./ENV_CHANGE_GUIDE.md) | -| 如何配置权限? | [RBAC_GUIDE.md](./RBAC_GUIDE.md) | -| 如何创建管理员? | [ADMIN_ACCOUNT.md](./ADMIN_ACCOUNT.md) | - -## 📝 文档更新记录 - -- 2024-11-19: 创建文档索引,归档所有指南文件 - diff --git a/backend/docs/SCHEMA_CHANGE_GUIDE.md b/backend/docs/SCHEMA_CHANGE_GUIDE.md deleted file mode 100644 index 8bec46e..0000000 --- a/backend/docs/SCHEMA_CHANGE_GUIDE.md +++ /dev/null @@ -1,128 +0,0 @@ -# Prisma Schema 修改后的操作指南 - -## 修改 schema.prisma 后需要执行的步骤 - -### 1. 生成 Prisma Client(必须) - -```bash -cd backend -npx prisma generate -# 或使用 npm script -npm run prisma:generate -``` - -**作用**:根据最新的 schema 重新生成 Prisma Client,使 TypeScript 类型和代码与数据库结构同步。 - ---- - -### 2. 应用数据库迁移(必须) - -根据环境选择不同的方式: - -#### 开发环境(推荐) - -```bash -cd backend -npx prisma migrate dev -# 或使用 npm script -npm run prisma:migrate -``` - -**作用**: - -- 应用待执行的迁移到数据库 -- 如果有新的迁移,会自动创建并应用 -- 会重置开发数据库(如果使用 shadow database) - -#### 生产环境 - -```bash -cd backend -npx prisma migrate deploy -# 或使用 npm script -npm run prisma:migrate:deploy -``` - -**作用**: - -- 仅应用待执行的迁移,不会创建新迁移 -- 不会重置数据库 -- 适合生产环境使用 - -#### 快速同步(仅开发环境,不推荐用于生产) - -```bash -cd backend -npx prisma db push -``` - -**作用**: - -- 直接将 schema 变更推送到数据库 -- 不创建迁移文件 -- 适合快速原型开发 - ---- - -### 3. 重启应用(如果正在运行) - -应用迁移后,需要重启 NestJS 应用以加载新的 Prisma Client: - -```bash -# 如果使用 npm run start:dev,会自动重启 -# 如果使用其他方式启动,需要手动重启 -``` - ---- - -## 当前状态 - -✅ **已完成**: - -- schema.prisma 已修改(content 字段改为 TEXT) -- 迁移文件已创建:`20251118211424_change_log_content_to_text` - -⏳ **待执行**: - -1. 生成 Prisma Client -2. 应用数据库迁移 -3. 重启应用(如果正在运行) - ---- - -## 执行顺序 - -```bash -# 1. 生成 Prisma Client -cd backend -npx prisma generate - -# 2. 应用迁移(开发环境) -npx prisma migrate dev -# 或生产环境 -npx prisma migrate deploy - -# 3. 重启应用(如果需要) -# 如果使用 start:dev,会自动重启 -``` - ---- - -## 验证迁移是否成功 - -```bash -# 检查迁移状态 -npx prisma migrate status - -# 查看数据库结构 -npx prisma studio -``` - ---- - -## 注意事项 - -1. **生产环境**:务必使用 `prisma migrate deploy`,不要使用 `prisma migrate dev` -2. **备份数据**:在生产环境应用迁移前,建议先备份数据库 -3. **迁移冲突**:如果迁移失败,检查错误信息并解决后再继续 -4. **类型同步**:每次修改 schema 后都要运行 `prisma generate` 更新类型 diff --git a/backend/docs/SCHOOL_MODULE_SCHEMA.md b/backend/docs/SCHOOL_MODULE_SCHEMA.md deleted file mode 100644 index 1f48419..0000000 --- a/backend/docs/SCHOOL_MODULE_SCHEMA.md +++ /dev/null @@ -1,301 +0,0 @@ -# 学校模块数据库设计文档 - -## 概述 - -本文档描述了学校管理系统的数据库表设计,包括学校信息、年级、班级、部门、教师和学生等核心实体。 - -## 设计原则 - -1. **租户隔离**:所有表都通过 `tenantId` 关联到 `Tenant` 表,实现多租户数据隔离 -2. **用户统一**:教师和学生都基于 `User` 表,通过一对一关系扩展特定信息 -3. **数据完整性**:使用外键约束和级联删除保证数据一致性 -4. **审计追踪**:所有表都包含创建人、修改人、创建时间、修改时间字段 - -## 表结构设计 - -### 1. 学校信息表 (School) - -**说明**:扩展租户信息,存储学校的详细资料。与 `Tenant` 表一对一关系。 - -**字段说明**: -- `id`: 主键 -- `tenantId`: 租户ID(唯一,一对一关联Tenant) -- `address`: 学校地址 -- `phone`: 联系电话 -- `principal`: 校长姓名 -- `established`: 建校时间 -- `description`: 学校描述 -- `logo`: 学校Logo URL -- `website`: 学校网站 -- `creator/modifier`: 创建人/修改人ID -- `createTime/modifyTime`: 创建/修改时间 - -**关系**: -- 一对一关联 `Tenant` -- 多对一关联 `User` (创建人/修改人) - ---- - -### 2. 年级表 (Grade) - -**说明**:管理学校的年级信息,如一年级、二年级等。 - -**字段说明**: -- `id`: 主键 -- `tenantId`: 租户ID -- `name`: 年级名称(如:一年级、二年级) -- `code`: 年级编码(在租户内唯一,如:grade_1, grade_2) -- `level`: 年级级别(用于排序,如:1, 2, 3) -- `description`: 年级描述 -- `validState`: 有效状态(1-有效,2-失效) -- `creator/modifier`: 创建人/修改人ID -- `createTime/modifyTime`: 创建/修改时间 - -**唯一约束**: -- `[tenantId, code]`: 租户内年级编码唯一 -- `[tenantId, level]`: 租户内年级级别唯一 - -**关系**: -- 多对一关联 `Tenant` -- 一对多关联 `Class` (班级) -- 多对一关联 `User` (创建人/修改人) - ---- - -### 3. 部门表 (Department) - -**说明**:管理学校的部门信息,支持树形结构(如:教务处 > 语文组)。 - -**字段说明**: -- `id`: 主键 -- `tenantId`: 租户ID -- `name`: 部门名称 -- `code`: 部门编码(在租户内唯一) -- `parentId`: 父部门ID(支持树形结构) -- `description`: 部门描述 -- `sort`: 排序 -- `validState`: 有效状态(1-有效,2-失效) -- `creator/modifier`: 创建人/修改人ID -- `createTime/modifyTime`: 创建/修改时间 - -**唯一约束**: -- `[tenantId, code]`: 租户内部门编码唯一 - -**关系**: -- 多对一关联 `Tenant` -- 自关联(树形结构):`parent` 和 `children` -- 一对多关联 `Teacher` (教师) -- 多对一关联 `User` (创建人/修改人) - ---- - -### 4. 班级表 (Class) - -**说明**:管理班级信息,支持行政班级(教学班级)和兴趣班两种类型。 - -**字段说明**: -- `id`: 主键 -- `tenantId`: 租户ID -- `gradeId`: 年级ID -- `name`: 班级名称(如:一年级1班、二年级2班) -- `code`: 班级编码(在租户内唯一) -- `type`: 班级类型(1-行政班级/教学班级,2-兴趣班) -- `capacity`: 班级容量(可选) -- `description`: 班级描述 -- `validState`: 有效状态(1-有效,2-失效) -- `creator/modifier`: 创建人/修改人ID -- `createTime/modifyTime`: 创建/修改时间 - -**唯一约束**: -- `[tenantId, code]`: 租户内班级编码唯一 - -**关系**: -- 多对一关联 `Tenant` -- 多对一关联 `Grade` (年级) -- 一对多关联 `Student` (学生,仅行政班级) -- 一对多关联 `StudentInterestClass` (学生兴趣班关联) -- 多对一关联 `User` (创建人/修改人) - -**注意事项**: -- `students` 关系仅用于行政班级(type=1),需要在应用层验证 -- 兴趣班通过 `StudentInterestClass` 表关联学生 - ---- - -### 5. 教师表 (Teacher) - -**说明**:存储教师的详细信息,与 `User` 表一对一关系。 - -**字段说明**: -- `id`: 主键 -- `userId`: 用户ID(唯一,一对一关联User) -- `tenantId`: 租户ID -- `departmentId`: 部门ID -- `employeeNo`: 工号(在租户内唯一) -- `phone`: 联系电话 -- `idCard`: 身份证号 -- `gender`: 性别(1-男,2-女) -- `birthDate`: 出生日期 -- `hireDate`: 入职日期 -- `subject`: 任教科目(可选,如:语文、数学) -- `title`: 职称(可选,如:高级教师、一级教师) -- `description`: 教师描述 -- `validState`: 有效状态(1-有效,2-失效) -- `creator/modifier`: 创建人/修改人ID -- `createTime/modifyTime`: 创建/修改时间 - -**唯一约束**: -- `userId`: 用户ID唯一(一对一) -- `[tenantId, employeeNo]`: 租户内工号唯一 - -**关系**: -- 一对一关联 `User` -- 多对一关联 `Tenant` -- 多对一关联 `Department` (部门) -- 多对一关联 `User` (创建人/修改人) - ---- - -### 6. 学生表 (Student) - -**说明**:存储学生的详细信息,与 `User` 表一对一关系。 - -**字段说明**: -- `id`: 主键 -- `userId`: 用户ID(唯一,一对一关联User) -- `tenantId`: 租户ID -- `classId`: 行政班级ID -- `studentNo`: 学号(在租户内唯一) -- `phone`: 联系电话 -- `idCard`: 身份证号 -- `gender`: 性别(1-男,2-女) -- `birthDate`: 出生日期 -- `enrollmentDate`: 入学日期 -- `parentName`: 家长姓名 -- `parentPhone`: 家长电话 -- `address`: 家庭地址 -- `description`: 学生描述 -- `validState`: 有效状态(1-有效,2-失效) -- `creator/modifier`: 创建人/修改人ID -- `createTime/modifyTime`: 创建/修改时间 - -**唯一约束**: -- `userId`: 用户ID唯一(一对一) -- `[tenantId, studentNo]`: 租户内学号唯一 - -**关系**: -- 一对一关联 `User` -- 多对一关联 `Tenant` -- 多对一关联 `Class` (行政班级) -- 一对多关联 `StudentInterestClass` (兴趣班关联) -- 多对一关联 `User` (创建人/修改人) - -**注意事项**: -- `classId` 必须关联行政班级(type=1),需要在应用层验证 -- 兴趣班通过 `StudentInterestClass` 表关联 - ---- - -### 7. 学生兴趣班关联表 (StudentInterestClass) - -**说明**:学生和兴趣班的多对多关联表。 - -**字段说明**: -- `id`: 主键 -- `studentId`: 学生ID -- `classId`: 兴趣班ID(type=2的Class) - -**唯一约束**: -- `[studentId, classId]`: 学生和兴趣班组合唯一 - -**关系**: -- 多对一关联 `Student` -- 多对一关联 `Class` (兴趣班) - -**注意事项**: -- `classId` 必须关联兴趣班(type=2),需要在应用层验证 - ---- - -## 数据关系图 - -``` -Tenant (租户/学校) -├── School (学校信息) [1:1] -├── Grade (年级) [1:N] -│ └── Class (班级) [1:N] -│ ├── Student (学生) [1:N, 仅行政班级] -│ └── StudentInterestClass [N:M, 仅兴趣班] -├── Department (部门) [1:N, 树形结构] -│ └── Teacher (教师) [1:N] -└── User (用户) [1:N] - ├── Teacher [1:1] - └── Student [1:1] -``` - -## 业务规则 - -1. **学校与租户**:每个租户对应一个学校,通过 `School` 表扩展学校信息 -2. **年级管理**:年级按 `level` 排序,每个租户内级别唯一 -3. **班级类型**: - - 行政班级(type=1):学生必须属于一个行政班级 - - 兴趣班(type=2):学生可以加入多个兴趣班 -4. **部门树形结构**:部门支持多级嵌套,通过 `parentId` 实现 -5. **教师归属**:教师必须归属于一个部门 -6. **学生归属**:学生必须属于一个行政班级,可以加入多个兴趣班 - -## 数据完整性约束 - -1. **级联删除**: - - 删除租户时,级联删除所有相关数据 - - 删除年级时,级联删除所有班级 - - 删除用户时,级联删除教师/学生信息 - - 删除班级时,级联删除学生兴趣班关联 - -2. **限制删除**: - - 删除部门时,如果存在教师,不允许删除(Restrict) - - 删除班级时,如果存在学生,不允许删除(Restrict) - -3. **唯一性约束**: - - 租户内年级编码唯一 - - 租户内年级级别唯一 - - 租户内部门编码唯一 - - 租户内班级编码唯一 - - 租户内教师工号唯一 - - 租户内学生学号唯一 - -## 应用层验证建议 - -1. **班级类型验证**: - - 创建学生时,`classId` 必须关联 `type=1` 的班级 - - 创建学生兴趣班关联时,`classId` 必须关联 `type=2` 的班级 - -2. **数据一致性**: - - 教师/学生的 `tenantId` 必须与关联的 `User.tenantId` 一致 - - 班级的 `tenantId` 必须与关联的 `Grade.tenantId` 一致 - -3. **业务逻辑**: - - 删除部门前,需要先转移或删除该部门下的所有教师 - - 删除班级前,需要先转移或删除该班级下的所有学生 - -## 迁移建议 - -1. 运行 Prisma 迁移生成 SQL: - ```bash - npx prisma migrate dev --name add_school_module - ``` - -2. 数据初始化: - - 为现有租户创建对应的 `School` 记录 - - 根据业务需求初始化年级数据 - -3. 数据迁移(如需要): - - 如果已有教师/学生数据,需要创建对应的 `User` 记录并关联 - -## 后续扩展建议 - -1. **课程管理**:可以添加课程表、课程安排等 -2. **成绩管理**:可以添加成绩表、考试表等 -3. **考勤管理**:可以添加考勤记录表 -4. **通知公告**:可以添加通知表、公告表等 - diff --git a/backend/docs/TENANT_GUIDE.md b/backend/docs/TENANT_GUIDE.md deleted file mode 100644 index 3441de6..0000000 --- a/backend/docs/TENANT_GUIDE.md +++ /dev/null @@ -1,270 +0,0 @@ -# 多租户系统实现指南 - -## 概述 - -本系统实现了完整的多租户架构,支持: -- 每个租户独立的数据隔离(用户、角色、权限、菜单等) -- 每个租户独立的访问链接(通过租户编码或域名) -- 超级租户可以创建和管理其他租户 -- 超级租户可以为租户分配菜单 - -## 数据库设计 - -### 核心表结构 - -1. **Tenant(租户表)** - - `id`: 租户ID - - `name`: 租户名称 - - `code`: 租户编码(唯一,用于访问链接) - - `domain`: 租户域名(可选,用于子域名访问) - - `isSuper`: 是否为超级租户(0-否,1-是) - - `validState`: 有效状态(1-有效,2-失效) - -2. **TenantMenu(租户菜单关联表)** - - `tenantId`: 租户ID - - `menuId`: 菜单ID - - 用于关联租户和菜单,实现菜单分配 - -3. **其他表添加租户字段** - - `User`: 添加 `tenantId` 字段 - - `Role`: 添加 `tenantId` 字段 - - `Permission`: 添加 `tenantId` 字段 - - `Dict`: 添加 `tenantId` 字段 - - `Config`: 添加 `tenantId` 字段 - -### 唯一性约束调整 - -- `User.username`: 从全局唯一改为 `(tenantId, username)` 唯一 -- `User.email`: 从全局唯一改为 `(tenantId, email)` 唯一 -- `Role.name/code`: 从全局唯一改为 `(tenantId, name/code)` 唯一 -- `Permission.code`: 从全局唯一改为 `(tenantId, code)` 唯一 -- 其他类似字段也做了相应调整 - -## 租户识别机制 - -系统支持多种方式识别租户: - -1. **请求头方式**(推荐) - - `X-Tenant-Code`: 租户编码 - - `X-Tenant-Id`: 租户ID - -2. **子域名方式** - - 从 `Host` 请求头提取子域名 - - 匹配租户的 `code` 或 `domain` 字段 - -3. **JWT Token方式** - - Token中包含 `tenantId` 字段 - - 登录时自动关联租户 - -4. **登录参数方式** - - 登录接口支持 `tenantCode` 参数 - -## 使用流程 - -### 1. 数据库迁移 - -首先需要生成并执行数据库迁移: - -```bash -# 生成迁移文件 -npm run prisma:migrate:dev -- --name add_tenant_support - -# 执行迁移 -npm run prisma:migrate -``` - -### 2. 初始化超级租户 - -运行初始化脚本创建超级租户: - -```bash -npm run init:super-tenant -``` - -这将创建: -- 超级租户(code: `super`) -- 超级管理员用户(username: `admin`, password: `admin123`) -- 超级管理员角色 -- 基础权限 - -### 3. 创建普通租户 - -使用超级租户的管理员账号登录后,通过租户管理接口创建新租户: - -```bash -POST /api/tenants -Headers: - Authorization: Bearer - X-Tenant-Code: super -Body: -{ - "name": "租户A", - "code": "tenant-a", - "domain": "tenant-a.example.com", - "description": "租户A的描述", - "menuIds": [1, 2, 3] // 分配的菜单ID列表 -} -``` - -### 4. 为租户分配菜单 - -超级租户可以为租户分配菜单: - -```bash -PATCH /api/tenants/:id -Headers: - Authorization: Bearer - X-Tenant-Code: super -Body: -{ - "menuIds": [1, 2, 3, 4, 5] -} -``` - -### 5. 租户用户登录 - -租户用户登录时需要指定租户: - -```bash -POST /api/auth/login -Body: -{ - "username": "user1", - "password": "password123", - "tenantCode": "tenant-a" // 可选,也可以从请求头获取 -} -``` - -或者在请求头中指定: - -```bash -POST /api/auth/login -Headers: - X-Tenant-Code: tenant-a -Body: -{ - "username": "user1", - "password": "password123" -} -``` - -### 6. 访问租户数据 - -所有API请求都会自动根据租户ID过滤数据: - -```bash -GET /api/users -Headers: - Authorization: Bearer - X-Tenant-Code: tenant-a -``` - -返回的数据只会包含该租户的用户。 - -## API接口 - -### 租户管理接口 - -- `POST /api/tenants` - 创建租户(需要 `tenant:create` 权限) -- `GET /api/tenants` - 获取租户列表(需要 `tenant:read` 权限) -- `GET /api/tenants/:id` - 获取租户详情(需要 `tenant:read` 权限) -- `PATCH /api/tenants/:id` - 更新租户(需要 `tenant:update` 权限) -- `DELETE /api/tenants/:id` - 删除租户(需要 `tenant:delete` 权限) -- `GET /api/tenants/:id/menus` - 获取租户的菜单树(需要 `tenant:read` 权限) - -### 其他接口 - -所有其他接口(用户、角色、权限等)都支持租户隔离,会自动根据请求中的租户信息过滤数据。 - -## 前端集成 - -### 1. 请求拦截器 - -在前端请求拦截器中添加租户信息: - -```typescript -// utils/request.ts -service.interceptors.request.use( - (config: InternalAxiosRequestConfig) => { - const token = getToken(); - const tenantCode = getTenantCode(); // 从localStorage或store获取 - - if (token && config.headers) { - config.headers.Authorization = `Bearer ${token}`; - } - - if (tenantCode && config.headers) { - config.headers['X-Tenant-Code'] = tenantCode; - } - - return config; - }, - (error) => { - return Promise.reject(error); - } -); -``` - -### 2. 登录时保存租户信息 - -```typescript -// 登录成功后 -localStorage.setItem('tenantCode', response.data.user.tenantCode); -localStorage.setItem('tenantId', response.data.user.tenantId); -``` - -### 3. 租户切换 - -如果需要支持租户切换,可以在前端实现租户选择器,切换时更新localStorage中的租户信息并重新加载数据。 - -## 权限控制 - -### 超级租户权限 - -超级租户的用户拥有所有权限,包括: -- 创建、查看、更新、删除租户 -- 为租户分配菜单 -- 管理所有租户的数据(如果需要在超级租户中查看所有租户数据) - -### 普通租户权限 - -普通租户的用户只能: -- 管理自己租户内的数据 -- 查看分配给租户的菜单 -- 无法访问其他租户的数据 - -## 注意事项 - -1. **数据隔离**: 所有查询都会自动添加租户过滤条件,确保数据隔离 -2. **唯一性**: 用户名、邮箱等在租户内唯一,不同租户可以有相同的用户名 -3. **菜单管理**: 菜单是全局的(由超级租户管理),但通过 `TenantMenu` 表分配给各个租户 -4. **超级租户**: 超级租户不能被删除,且拥有所有权限 -5. **迁移数据**: 如果现有系统已有数据,需要编写迁移脚本将现有数据关联到超级租户 - -## 迁移现有数据 - -如果系统已有数据,需要将现有数据迁移到超级租户: - -```sql --- 假设超级租户ID为1 -UPDATE users SET tenant_id = 1 WHERE tenant_id IS NULL; -UPDATE roles SET tenant_id = 1 WHERE tenant_id IS NULL; -UPDATE permissions SET tenant_id = 1 WHERE tenant_id IS NULL; --- 其他表类似 -``` - -## 故障排查 - -1. **租户识别失败**: 检查请求头是否正确设置,或检查JWT token中是否包含tenantId -2. **数据查询为空**: 确认租户ID正确,且数据确实属于该租户 -3. **权限不足**: 确认用户角色有相应权限,且角色属于正确的租户 - -## 扩展功能 - -未来可以考虑的扩展: -1. 租户级别的配置(每个租户可以有自己的系统配置) -2. 租户级别的主题和品牌定制 -3. 租户级别的功能开关 -4. 租户使用统计和监控 -5. 租户数据导出和备份 - diff --git a/backend/docs/TENANT_LOGIN_GUIDE.md b/backend/docs/TENANT_LOGIN_GUIDE.md deleted file mode 100644 index 0ca2d95..0000000 --- a/backend/docs/TENANT_LOGIN_GUIDE.md +++ /dev/null @@ -1,226 +0,0 @@ -# 租户登录使用指南 - -## 概述 - -系统已完整支持多租户登录功能,每个租户可以独立访问系统,数据完全隔离。 - -## 租户识别方式 - -系统支持以下方式识别租户: - -### 1. URL参数方式(推荐) - -在登录页面URL中添加 `tenant` 参数: - -``` -http://your-domain.com/login?tenant=tenant-a -``` - -登录页面会自动识别租户编码,并在登录时自动发送。 - -### 2. 登录表单输入 - -如果URL中没有租户参数,登录页面会显示租户编码输入框,用户可以手动输入。 - -### 3. 请求头方式 - -前端会自动将租户信息添加到所有API请求的请求头中: -- `X-Tenant-Code`: 租户编码 -- `X-Tenant-Id`: 租户ID - -## 使用流程 - -### 方式一:通过URL参数访问(推荐) - -1. **访问租户登录页面** - ``` - http://your-domain.com/login?tenant=tenant-a - ``` - -2. **输入用户名和密码** - - 用户名:租户内的用户名 - - 密码:用户密码 - - 租户编码:已自动填充(从URL参数) - -3. **登录成功** - - 系统自动保存租户信息到 localStorage - - 后续所有API请求都会自动携带租户信息 - - 用户只能看到和操作自己租户的数据 - -### 方式二:手动输入租户编码 - -1. **访问登录页面** - ``` - http://your-domain.com/login - ``` - -2. **输入租户信息** - - 租户编码:输入租户编码(如:`tenant-a`) - - 用户名:租户内的用户名 - - 密码:用户密码 - -3. **登录成功** - - 系统保存租户信息 - - 后续请求自动携带租户信息 - -## 后端API使用 - -### 登录接口 - -**请求:** -```bash -POST /api/auth/login -Content-Type: application/json - -{ - "username": "user1", - "password": "password123", - "tenantCode": "tenant-a" // 可选,也可以从请求头获取 -} -``` - -**或者通过请求头:** -```bash -POST /api/auth/login -X-Tenant-Code: tenant-a -Content-Type: application/json - -{ - "username": "user1", - "password": "password123" -} -``` - -**响应:** -```json -{ - "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", - "user": { - "id": 1, - "username": "user1", - "nickname": "用户1", - "email": "user1@example.com", - "tenantId": 2, - "tenantCode": "tenant-a", - "roles": ["admin"], - "permissions": ["user:read", "user:create", ...] - } -} -``` - -### 其他API请求 - -登录后,所有API请求都会自动携带租户信息(通过JWT Token或请求头),后端会自动过滤数据: - -```bash -GET /api/users -Authorization: Bearer -X-Tenant-Code: tenant-a # 自动添加 -``` - -返回的数据只会包含该租户的用户。 - -## 前端实现细节 - -### 1. 登录页面自动识别租户 - -登录页面 (`Login.vue`) 会: -- 从URL参数 `?tenant=xxx` 获取租户编码 -- 如果URL中没有,从 localStorage 读取之前保存的租户编码 -- 如果都没有,显示租户输入框 - -### 2. 请求拦截器自动添加租户信息 - -所有API请求都会自动添加租户信息到请求头: - -```typescript -// utils/request.ts -service.interceptors.request.use((config) => { - const tenantCode = getTenantCode(); - const tenantId = getTenantId(); - - if (tenantCode) { - config.headers['X-Tenant-Code'] = tenantCode; - } - if (tenantId) { - config.headers['X-Tenant-Id'] = tenantId; - } - - return config; -}); -``` - -### 3. 登录后保存租户信息 - -登录成功后,系统会自动保存: -- Token -- 租户编码 (tenantCode) -- 租户ID (tenantId) - -这些信息保存在 localStorage 中,页面刷新后仍然有效。 - -## 示例场景 - -### 场景1:租户A的用户登录 - -1. 访问:`http://your-domain.com/login?tenant=tenant-a` -2. 输入用户名和密码 -3. 登录后只能看到租户A的数据 - -### 场景2:租户B的用户登录 - -1. 访问:`http://your-domain.com/login?tenant=tenant-b` -2. 输入用户名和密码 -3. 登录后只能看到租户B的数据 -4. 租户A的数据完全不可见 - -### 场景3:超级租户管理员登录 - -1. 访问:`http://your-domain.com/login?tenant=super` -2. 使用超级管理员账号登录 -3. 可以管理所有租户 - -## 注意事项 - -1. **租户编码必须唯一**:每个租户都有唯一的编码(code) -2. **用户属于特定租户**:用户只能登录到自己所属的租户 -3. **数据完全隔离**:不同租户的数据完全隔离,无法互相访问 -4. **租户信息持久化**:登录后租户信息保存在 localStorage,刷新页面不会丢失 -5. **切换租户**:如果需要切换租户,需要先登出,然后使用新的租户编码登录 - -## 故障排查 - -### 问题1:登录时提示"无法确定租户信息" - -**原因**:没有提供租户编码或租户ID - -**解决**: -- 在URL中添加 `?tenant=xxx` 参数 -- 或者在登录表单中输入租户编码 -- 或者通过请求头 `X-Tenant-Code` 提供 - -### 问题2:登录时提示"用户不属于该租户" - -**原因**:用户不属于指定的租户 - -**解决**: -- 确认租户编码是否正确 -- 确认用户是否属于该租户 -- 联系管理员检查用户和租户的关联关系 - -### 问题3:登录后看不到数据 - -**原因**:可能是租户信息没有正确传递 - -**解决**: -- 检查浏览器控制台的网络请求,确认请求头中是否包含 `X-Tenant-Code` -- 检查 localStorage 中是否保存了租户信息 -- 确认后端是否正确识别了租户 - -## 开发建议 - -1. **使用URL参数方式**:这是最用户友好的方式,用户只需要记住租户的访问链接 -2. **提供租户选择器**:如果系统需要支持租户切换,可以在前端添加租户选择器 -3. **错误提示优化**:当租户信息缺失时,提供清晰的错误提示 -4. **租户信息显示**:在用户界面显示当前租户信息,让用户知道自己在哪个租户下操作 - diff --git a/backend/docs/功能描述.md b/backend/docs/功能描述.md deleted file mode 100644 index 7999f10..0000000 --- a/backend/docs/功能描述.md +++ /dev/null @@ -1 +0,0 @@ -## diff --git a/backend/ecosystem.config.js b/backend/ecosystem.config.js deleted file mode 100644 index 764bb3a..0000000 --- a/backend/ecosystem.config.js +++ /dev/null @@ -1,123 +0,0 @@ -/** - * PM2 进程管理器配置文件 - * - * 环境区分说明: - * 1. 通过 --env 参数指定环境:pm2 start ecosystem.config.js --env <环境名> - * 2. 环境配置会自动合并:基础配置(env) + 环境特定配置(env_<环境名>) - * 3. 测试环境: --env test (端口 3001, 2个实例) - * 4. 生产环境: --env production (端口 3000, 最大实例数) - */ - -const baseAppConfig = { - script: './dist/src/main.js', - - // 日志文件路径 - error_file: './logs/pm2-error.log', - out_file: './logs/pm2-out.log', - log_file: './logs/pm2-combined.log', - - // 日志日期格式 - log_date_format: 'YYYY-MM-DD HH:mm:ss Z', - - // 合并日志(所有实例的日志合并到一个文件) - merge_logs: true, - - // 自动重启配置 - autorestart: true, - - // 监听文件变化(生产环境建议关闭) - watch: false, - - // 忽略监听的文件/目录 - ignore_watch: ['node_modules', 'logs', 'dist', '.git', '*.log'], - - // 最大内存限制(超过后自动重启) - max_memory_restart: '1G', - - // 最小正常运行时间(秒),小于此时间重启不计入重启次数 - min_uptime: '10s', - - // 最大重启次数(在 min_uptime 时间内) - max_restarts: 10, - - // 重启延迟(毫秒) - restart_delay: 4000, - - // 等待就绪信号的时间(毫秒) - wait_ready: true, - listen_timeout: 10000, - - // 优雅关闭超时时间(毫秒) - kill_timeout: 5000, - - // 应用启动后的等待时间(毫秒) - shutdown_with_message: true, - - // 源代码映射支持 - source_map_support: true, - - // 实例间负载均衡策略 - instance_var: 'INSTANCE_ID', -}; - -module.exports = { - apps: [ - { - ...baseAppConfig, - - // 生产环境应用 - name: 'competition-api', - instances: 2, - exec_mode: 'cluster', - - env_file: '.env.production', - env: { - NODE_ENV: 'production', - PORT: 3234, - }, - }, - { - ...baseAppConfig, - - // 测试环境应用 - name: 'competition-api-test', - instances: 2, - exec_mode: 'cluster', - - env_file: '.env.test', - env: { - NODE_ENV: 'test', - PORT: 3234, - }, - }, - ], - - // ============================================ - // 部署配置(用于 PM2 自动化部署) - // 使用方式: pm2 deploy ecosystem.config.js <环境名> - // ============================================ - deploy: { - // 测试环境部署配置 - test: { - user: 'deploy', - host: ['119.29.229.174'], - ref: 'origin/develop', - repo: 'git@github.com:your-username/competition-management-system.git', - path: '/var/www/competition-management-test', - 'post-deploy': - 'cd backend && pnpm install && pnpm run build && pm2 reload ecosystem.config.js --only competition-api-test', - 'pre-setup': 'apt-get update && apt-get install -y git', - }, - // 生产环境部署配置 - production: { - user: 'deploy', - host: ['your-prod-server-ip'], - ref: 'origin/master', - repo: 'git@github.com:your-username/competition-management-system.git', - path: '/var/www/competition-management', - 'post-deploy': - 'cd backend && pnpm install && pnpm run build && pm2 reload ecosystem.config.js --only competition-api', - 'pre-setup': 'apt-get update && apt-get install -y git', - }, - }, -}; diff --git a/backend/nest-cli.json b/backend/nest-cli.json deleted file mode 100644 index 84a110c..0000000 --- a/backend/nest-cli.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/nest-cli", - "collection": "@nestjs/schematics", - "sourceRoot": "src", - "compilerOptions": { - "deleteOutDir": true - } -} - diff --git a/backend/package-lock.json b/backend/package-lock.json deleted file mode 100644 index b91d7ab..0000000 --- a/backend/package-lock.json +++ /dev/null @@ -1,10990 +0,0 @@ -{ - "name": "competition-management-backend", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "competition-management-backend", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@nestjs/common": "^10.3.3", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.3", - "@nestjs/jwt": "^10.2.0", - "@nestjs/mapped-types": "^2.1.0", - "@nestjs/passport": "^10.0.3", - "@nestjs/platform-express": "^10.3.3", - "@prisma/client": "^6.19.0", - "adm-zip": "^0.5.16", - "axios": "^1.6.7", - "bcrypt": "^6.0.0", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.1", - "cos-nodejs-sdk-v5": "^2.15.4", - "passport": "^0.7.0", - "passport-jwt": "^4.0.1", - "passport-local": "^1.0.0", - "reflect-metadata": "^0.2.1", - "rxjs": "^7.8.1", - "uuid": "^8.3.2" - }, - "devDependencies": { - "@nestjs/cli": "^10.3.2", - "@nestjs/schematics": "^10.1.0", - "@nestjs/testing": "^10.3.3", - "@types/adm-zip": "^0.5.5", - "@types/bcrypt": "^5.0.2", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.11", - "@types/node": "^20.11.5", - "@types/passport-jwt": "^4.0.1", - "@types/passport-local": "^1.0.36", - "@types/uuid": "^10.0.0", - "@typescript-eslint/eslint-plugin": "^6.19.1", - "@typescript-eslint/parser": "^6.19.1", - "dotenv": "^17.2.3", - "dotenv-cli": "^11.0.0", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "jest": "^29.7.0", - "prettier": "^3.2.4", - "prisma": "^6.19.0", - "source-map-support": "^0.5.21", - "ts-jest": "^29.1.2", - "ts-loader": "^9.5.1", - "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.3.3" - } - }, - "node_modules/@angular-devkit/core": { - "version": "17.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.11.tgz", - "integrity": "sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.1", - "picomatch": "4.0.1", - "rxjs": "7.8.1", - "source-map": "0.7.4" - }, - "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/core/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular-devkit/schematics": { - "version": "17.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.11.tgz", - "integrity": "sha512-I5wviiIqiFwar9Pdk30Lujk8FczEEc18i22A5c6Z9lbmhPQdTroDnEQdsfXjy404wPe8H62s0I15o4pmMGfTYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "17.3.11", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.8", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics-cli": { - "version": "17.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.3.11.tgz", - "integrity": "sha512-kcOMqp+PHAKkqRad7Zd7PbpqJ0LqLaNZdY1+k66lLWmkEBozgq8v4ASn/puPWf9Bo0HpCiK+EzLf0VHE8Z/y6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "17.3.11", - "@angular-devkit/schematics": "17.3.11", - "ansi-colors": "4.1.3", - "inquirer": "9.2.15", - "symbol-observable": "4.0.0", - "yargs-parser": "21.1.1" - }, - "bin": { - "schematics": "bin/schematics.js" - }, - "engines": { - "node": "^18.13.0 || >=20.9.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular-devkit/schematics-cli/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@angular-devkit/schematics-cli/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer": { - "version": "9.2.15", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", - "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ljharb/through": "^2.3.12", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "figures": "^3.2.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@angular-devkit/schematics-cli/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@angular-devkit/schematics-cli/node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@borewit/text-codec": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", - "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@ljharb/through": { - "version": "2.3.14", - "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.14.tgz", - "integrity": "sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nestjs/cli": { - "version": "10.4.9", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.9.tgz", - "integrity": "sha512-s8qYd97bggqeK7Op3iD49X2MpFtW4LVNLAwXFkfbRxKME6IYT7X0muNTJ2+QfI8hpbNx9isWkrLWIp+g5FOhiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "17.3.11", - "@angular-devkit/schematics": "17.3.11", - "@angular-devkit/schematics-cli": "17.3.11", - "@nestjs/schematics": "^10.0.1", - "chalk": "4.1.2", - "chokidar": "3.6.0", - "cli-table3": "0.6.5", - "commander": "4.1.1", - "fork-ts-checker-webpack-plugin": "9.0.2", - "glob": "10.4.5", - "inquirer": "8.2.6", - "node-emoji": "1.11.0", - "ora": "5.4.1", - "tree-kill": "1.2.2", - "tsconfig-paths": "4.2.0", - "tsconfig-paths-webpack-plugin": "4.2.0", - "typescript": "5.7.2", - "webpack": "5.97.1", - "webpack-node-externals": "3.0.0" - }, - "bin": { - "nest": "bin/nest.js" - }, - "engines": { - "node": ">= 16.14" - }, - "peerDependencies": { - "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0", - "@swc/core": "^1.3.62" - }, - "peerDependenciesMeta": { - "@swc/cli": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@nestjs/cli/node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nestjs/cli/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nestjs/cli/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@nestjs/cli/node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@nestjs/cli/node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@nestjs/common": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.20.tgz", - "integrity": "sha512-hxJxZF7jcKGuUzM9EYbuES80Z/36piJbiqmPy86mk8qOn5gglFebBTvcx7PWVbRNSb4gngASYnefBj/Y2HAzpQ==", - "license": "MIT", - "dependencies": { - "file-type": "20.4.1", - "iterare": "1.2.1", - "tslib": "2.8.1", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/config": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.3.0.tgz", - "integrity": "sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA==", - "license": "MIT", - "dependencies": { - "dotenv": "16.4.5", - "dotenv-expand": "10.0.0", - "lodash": "4.17.21" - }, - "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "rxjs": "^7.1.0" - } - }, - "node_modules/@nestjs/config/node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/@nestjs/core": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.20.tgz", - "integrity": "sha512-kRdtyKA3+Tu70N3RQ4JgmO1E3LzAMs/eppj7SfjabC7TgqNWoS4RLhWl4BqmsNVmjj6D5jgfPVtHtgYkU3AfpQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "3.3.0", - "tslib": "2.8.1", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } - } - }, - "node_modules/@nestjs/jwt": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-10.2.0.tgz", - "integrity": "sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==", - "license": "MIT", - "dependencies": { - "@types/jsonwebtoken": "9.0.5", - "jsonwebtoken": "9.0.2" - }, - "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/@nestjs/mapped-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", - "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", - "license": "MIT", - "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "class-transformer": "^0.4.0 || ^0.5.0", - "class-validator": "^0.13.0 || ^0.14.0", - "reflect-metadata": "^0.1.12 || ^0.2.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/passport": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-10.0.3.tgz", - "integrity": "sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==", - "license": "MIT", - "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "passport": "^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0" - } - }, - "node_modules/@nestjs/platform-express": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.20.tgz", - "integrity": "sha512-rh97mX3rimyf4xLMLHuTOBKe6UD8LOJ14VlJ1F/PTd6C6ZK9Ak6EHuJvdaGcSFQhd3ZMBh3I6CuujKGW9pNdIg==", - "license": "MIT", - "dependencies": { - "body-parser": "1.20.3", - "cors": "2.8.5", - "express": "4.21.2", - "multer": "2.0.2", - "tslib": "2.8.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" - } - }, - "node_modules/@nestjs/schematics": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.2.3.tgz", - "integrity": "sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "17.3.11", - "@angular-devkit/schematics": "17.3.11", - "comment-json": "4.2.5", - "jsonc-parser": "3.3.1", - "pluralize": "8.0.0" - }, - "peerDependencies": { - "typescript": ">=4.8.2" - } - }, - "node_modules/@nestjs/schematics/node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nestjs/testing": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.20.tgz", - "integrity": "sha512-nMkRDukDKskdPruM6EsgMq7yJua+CPZM6I6FrLP8yXw8BiVSPv9Nm0CtcGGwt3kgZF9hfxKjGqLjsvVBsv6Vfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - } - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "bin": { - "opencollective": "bin/opencollective.js" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@prisma/client": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", - "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "prisma": "*", - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@prisma/config": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.1.tgz", - "integrity": "sha512-bUL/aYkGXLwxVGhJmQMtslLT7KPEfUqmRa919fKI4wQFX4bIFUKiY8Jmio/2waAjjPYrtuDHa7EsNCnJTXxiOw==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "c12": "3.1.0", - "deepmerge-ts": "7.1.5", - "effect": "3.18.4", - "empathic": "2.0.0" - } - }, - "node_modules/@prisma/debug": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.1.tgz", - "integrity": "sha512-h1JImhlAd/s5nhY/e9qkAzausWldbeT+e4nZF7A4zjDYBF4BZmKDt4y0jK7EZapqOm1kW7V0e9agV/iFDy3fWw==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/engines": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.1.tgz", - "integrity": "sha512-xy95dNJ7DiPf9IJ3oaVfX785nbFl7oNDzclUF+DIiJw6WdWCvPl0LPU0YqQLsrwv8N64uOQkH391ujo3wSo+Nw==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.1", - "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "@prisma/fetch-engine": "6.19.1", - "@prisma/get-platform": "6.19.1" - } - }, - "node_modules/@prisma/engines-version": { - "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", - "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", - "devOptional": true, - "license": "Apache-2.0" - }, - "node_modules/@prisma/fetch-engine": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.1.tgz", - "integrity": "sha512-mmgcotdaq4VtAHO6keov3db+hqlBzQS6X7tR7dFCbvXjLVTxBYdSJFRWz+dq7F9p6dvWyy1X0v8BlfRixyQK6g==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.1", - "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "@prisma/get-platform": "6.19.1" - } - }, - "node_modules/@prisma/get-platform": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.1.tgz", - "integrity": "sha512-zsg44QUiQAnFUyh6Fbt7c9HjMXHwFTqtrgcX7DAZmRgnkPyYT7Sh8Mn8D5PuuDYNtMOYcpLGg576MLfIORsBYw==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.1" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tokenizer/inflate": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", - "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "fflate": "^0.8.2", - "token-types": "^6.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/adm-zip": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.7.tgz", - "integrity": "sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/bcrypt": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz", - "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", - "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.5.tgz", - "integrity": "sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", - "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/passport": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", - "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/passport-jwt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz", - "integrity": "sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" - } - }, - "node_modules/@types/passport-local": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/passport-local/-/passport-local-1.0.38.tgz", - "integrity": "sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/passport": "*", - "@types/passport-strategy": "*" - } - }, - "node_modules/@types/passport-strategy": { - "version": "0.2.38", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", - "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/passport": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/validator": { - "version": "13.15.10", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", - "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", - "license": "MIT", - "engines": { - "node": ">=12.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array-timsort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "license": "MIT", - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.11", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", - "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c12": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", - "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.3", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^16.6.1", - "exsolve": "^1.0.7", - "giget": "^2.0.0", - "jiti": "^2.4.2", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/c12/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/c12/node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/c12/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001762", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz", - "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "consola": "^3.2.3" - } - }, - "node_modules/citty/node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/class-transformer": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", - "license": "MIT" - }, - "node_modules/class-validator": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", - "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", - "license": "MIT", - "dependencies": { - "@types/validator": "^13.15.3", - "libphonenumber-js": "^1.11.1", - "validator": "^13.15.20" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/comment-json": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.5.tgz", - "integrity": "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-timsort": "^1.0.3", - "core-util-is": "^1.0.3", - "esprima": "^4.0.1", - "has-own-prop": "^2.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/conf": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/conf/-/conf-9.0.2.tgz", - "integrity": "sha512-rLSiilO85qHgaTBIIHQpsv8z+NnVfZq3cKuYNCXN1AOqPzced0GWZEe/A517VldRLyQYXUMyV+vszavE2jSAqw==", - "license": "MIT", - "dependencies": { - "ajv": "^7.0.3", - "ajv-formats": "^1.5.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.0", - "json-schema-typed": "^7.0.3", - "make-dir": "^3.1.0", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/ajv": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.4.tgz", - "integrity": "sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/conf/node_modules/ajv-formats": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-1.6.1.tgz", - "integrity": "sha512-4CjkH20If1lhR5CGtqkrVg3bbOtFEG80X9v6jDOIUhbzzbB+UzPBGy8GQhUNVZ0yvMHdMpawCOcy5ydGMsagGQ==", - "license": "MIT", - "dependencies": { - "ajv": "^7.0.0" - }, - "peerDependencies": { - "ajv": "^7.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/conf/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/conf/node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cos-nodejs-sdk-v5": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/cos-nodejs-sdk-v5/-/cos-nodejs-sdk-v5-2.15.4.tgz", - "integrity": "sha512-TP/iYTvKKKhRK89on9SRfSMGEw/9SFAAU8EC1kdT5Fmpx7dAwaCNM2+R2H1TSYoQt+03rwOs8QEfNkX8GOHjHQ==", - "license": "ISC", - "dependencies": { - "conf": "^9.0.0", - "fast-xml-parser": "4.2.5", - "mime-types": "^2.1.24", - "request": "^2.88.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deepmerge-ts": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-cli": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-11.0.0.tgz", - "integrity": "sha512-r5pA8idbk7GFWuHEU7trSTflWcdBpQEK+Aw17UrSHjS6CReuhrrPcyC3zcQBPQvhArRHnBo/h6eLH1fkCvNlww==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.6", - "dotenv": "^17.1.0", - "dotenv-expand": "^12.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "dotenv": "cli.js" - } - }, - "node_modules/dotenv-cli/node_modules/dotenv-expand": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.3.tgz", - "integrity": "sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-cli/node_modules/dotenv-expand/node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/effect": { - "version": "3.18.4", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", - "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "fast-check": "^3.23.1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/empathic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", - "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", - "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", - "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-check": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", - "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT", - "dependencies": { - "pure-rand": "^6.1.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", - "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", - "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "license": "MIT" - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-type": { - "version": "20.4.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", - "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", - "license": "MIT", - "dependencies": { - "@tokenizer/inflate": "^0.2.6", - "strtok3": "^10.2.0", - "token-types": "^6.0.0", - "uint8array-extras": "^1.4.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.0.2.tgz", - "integrity": "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^8.2.0", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "typescript": ">3.6.0", - "webpack": "^5.11.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz", - "integrity": "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/giget": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.6.0", - "pathe": "^2.0.3" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/giget/node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-own-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", - "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterare": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", - "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", - "license": "ISC", - "engines": { - "node": ">=6" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "devOptional": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "license": "MIT" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==", - "license": "BSD-2-Clause" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", - "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.2", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libphonenumber-js": { - "version": "1.12.33", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.33.tgz", - "integrity": "sha512-r9kw4OA6oDO4dPXkOrXTkArQAafIKAU71hChInV4FxZ69dxCfbwQGDPzqR5/vea94wU705/3AZroEbSoeVWrQw==", - "license": "MIT" - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/loader-runner": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", - "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nypm": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", - "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.2", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "tinyexec": "^1.0.1" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/nypm/node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/passport": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", - "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", - "license": "MIT", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-jwt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", - "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", - "license": "MIT", - "dependencies": { - "jsonwebtoken": "^9.0.0", - "passport-strategy": "^1.0.0" - } - }, - "node_modules/passport-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", - "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", - "dependencies": { - "passport-strategy": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", - "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", - "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prisma": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", - "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", - "devOptional": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/config": "6.19.1", - "@prisma/engines": "6.19.1" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/strtok3": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", - "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", - "license": "MIT", - "dependencies": { - "@tokenizer/token": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser": { - "version": "5.44.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", - "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-types": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", - "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", - "license": "MIT", - "dependencies": { - "@borewit/text-codec": "^0.2.1", - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-jest": { - "version": "29.4.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", - "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.3", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-loader": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", - "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tapable": "^2.2.1", - "tsconfig-paths": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "license": "Unlicense" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uid": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", - "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", - "license": "MIT", - "dependencies": { - "@lukeed/csprng": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/uint8array-extras": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", - "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validator": { - "version": "13.15.26", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.26.tgz", - "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT" - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.0.tgz", - "integrity": "sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/webpack": { - "version": "5.104.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", - "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.4", - "es-module-lexer": "^2.0.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.3.1", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", - "watchpack": "^2.4.4", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-node-externals": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/backend/package.json b/backend/package.json deleted file mode 100644 index 1b21ead..0000000 --- a/backend/package.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "name": "competition-management-backend", - "version": "1.0.0", - "description": "活动管理系统后端", - "author": "", - "private": true, - "license": "MIT", - "scripts": { - "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", - "start": "nest start", - "start:dev": "set NODE_ENV=development&&nest start --watch", - "start:debug": "NODE_ENV=development nest start --debug --watch", - "start:prod": "NODE_ENV=production node dist/main", - "start:pm2:test": "pm2 start ecosystem.config.js --env test --only competition-api-test", - "start:pm2:prod": "pm2 start ecosystem.config.js --env production --only competition-api", - "stop:pm2:test": "pm2 stop competition-api-test", - "stop:pm2:prod": "pm2 stop competition-api", - "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", - "test": "NODE_ENV=test jest", - "test:watch": "NODE_ENV=test jest --watch", - "test:cov": "NODE_ENV=test jest --coverage", - "test:debug": "NODE_ENV=test node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "NODE_ENV=test jest --config ./test/jest-e2e.json", - "prisma:status:dev": "dotenv -e .env.development -- prisma migrate status", - "prisma:generate": "prisma generate", - "prisma:generate:dev": "dotenv -e .env.development -- prisma generate", - "prisma:migrate": "prisma migrate dev", - "prisma:migrate:dev": "dotenv -e .env.development -- prisma migrate dev --create-only --name add_contest_module", - "prisma:migrate:deploy": "NODE_ENV=production prisma migrate deploy", - "prisma:studio": "prisma studio", - "prisma:studio:dev": "NODE_ENV=development prisma studio", - "prisma:studio:prod": "NODE_ENV=production prisma studio", - "init:admin": "ts-node scripts/init-admin.ts", - "init:admin:permissions": "ts-node scripts/init-admin-permissions.ts", - "init:menus": "ts-node scripts/init-menus.ts", - "init:super-tenant": "ts-node scripts/init-super-tenant.ts", - "init:linksea-tenant": "ts-node scripts/init-linksea-tenant.ts", - "init:tenant-admin": "ts-node scripts/init-tenant-admin.ts", - "init:tenant-admin:permissions": "ts-node scripts/init-tenant-admin.ts --permissions-only", - "init:tenant-permissions": "ts-node scripts/init-tenant-permissions.ts", - "init:tenant-menu-permissions": "ts-node scripts/init-tenant-menu-permissions.ts", - "update:password": "ts-node scripts/update-password.ts", - "fix:invalid-datetime": "ts-node scripts/fix-invalid-datetime.ts", - "cleanup:tenant-permissions": "ts-node scripts/cleanup-tenant-permissions.ts", - "init:roles:super": "ts-node scripts/init-roles-permissions.ts --super", - "init:roles": "ts-node scripts/init-roles-permissions.ts", - "init:roles:all": "ts-node scripts/init-roles-permissions.ts --all", - "init:tenant": "ts-node scripts/init-tenant.ts", - "compress:tgz:prod:win": "node -p \"require('./package.json').version\" | xargs -I {} bash scripts/compress.sh --env production --version {}", - "compress:tgz:test:win": "node -p \"require('./package.json').version\" | xargs -I {} bash scripts/compress.sh --env test --version {}" - }, - "dependencies": { - "@nestjs/common": "^10.3.3", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.3.3", - "@nestjs/jwt": "^10.2.0", - "@nestjs/mapped-types": "^2.1.0", - "@nestjs/passport": "^10.0.3", - "@nestjs/platform-express": "^10.3.3", - "@prisma/client": "^6.19.0", - "adm-zip": "^0.5.16", - "axios": "^1.6.7", - "bcrypt": "^6.0.0", - "class-transformer": "^0.5.1", - "class-validator": "^0.14.1", - "cos-nodejs-sdk-v5": "^2.15.4", - "passport": "^0.7.0", - "passport-jwt": "^4.0.1", - "passport-local": "^1.0.0", - "reflect-metadata": "^0.2.1", - "rxjs": "^7.8.1", - "uuid": "^8.3.2" - }, - "devDependencies": { - "@nestjs/cli": "^10.3.2", - "@nestjs/schematics": "^10.1.0", - "@nestjs/testing": "^10.3.3", - "@types/adm-zip": "^0.5.5", - "@types/bcrypt": "^5.0.2", - "@types/express": "^4.17.21", - "@types/jest": "^29.5.11", - "@types/multer": "^2.0.0", - "@types/node": "^20.11.5", - "@types/passport-jwt": "^4.0.1", - "@types/passport-local": "^1.0.36", - "@types/uuid": "^10.0.0", - "@typescript-eslint/eslint-plugin": "^6.19.1", - "@typescript-eslint/parser": "^6.19.1", - "dotenv": "^17.2.3", - "dotenv-cli": "^11.0.0", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "jest": "^29.7.0", - "prettier": "^3.2.4", - "prisma": "^6.19.0", - "source-map-support": "^0.5.21", - "ts-jest": "^29.1.2", - "ts-loader": "^9.5.1", - "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.3.3" - }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - }, - "collectCoverageFrom": [ - "**/*.(t|j)s" - ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" - } -} diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma deleted file mode 100644 index 3bf375c..0000000 --- a/backend/prisma/schema.prisma +++ /dev/null @@ -1,1164 +0,0 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -generator client { - provider = "prisma-client-js" -} - -datasource db { - provider = "mysql" - url = env("DATABASE_URL") -} - -/// 租户表 -model Tenant { - id Int @id @default(autoincrement()) - name String /// 租户名称 - code String @unique /// 租户编码(唯一,用于访问链接) - domain String? @unique /// 租户域名(可选,用于子域名访问) - description String? /// 租户描述 - isSuper Int @default(0) @map("is_super") /// 是否为超级租户:0-否,1-是 - tenantType String @default("other") @map("tenant_type") /// 租户类型:platform/library/kindergarten/school/institution/other - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - creator Int? /// 创建人ID(超级租户的用户ID) - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - users User[] - roles Role[] - menus TenantMenu[] - permissions Permission[] - dicts Dict[] - configs Config[] - contestTeams ContestTeam[] /// 赛事团队 - contestTeamMembers ContestTeamMember[] /// 团队成员 - contestRegistrations ContestRegistration[] /// 赛事报名 - contestRegistrationTeachers ContestRegistrationTeacher[] /// 报名指导老师关联 - contestWorks ContestWork[] /// 参赛作品 - contestWorkAttachments ContestWorkAttachment[] /// 作品附件 - contestWorkScores ContestWorkScore[] /// 作品评分 - contestReviewRules ContestReviewRule[] /// 评审规则 - // 作业管理关联 - homeworks Homework[] /// 作业 - homeworkSubmissions HomeworkSubmission[] /// 作业提交记录 - homeworkReviewRules HomeworkReviewRule[] /// 作业评审规则 - homeworkScores HomeworkScore[] /// 作业评分 - creatorUser User? @relation("TenantCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("TenantModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([tenantType]) - @@map("tenants") -} - -/// 用户表 -model User { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - username String /// 用户名(在租户内唯一) - password String /// 密码(加密存储) - nickname String /// 昵称 - email String? /// 邮箱(在租户内唯一,可选) - phone String? @unique /// 手机号(全局唯一,用于手机号登录) - wxOpenid String? @unique @map("wx_openid") /// 微信OpenID - wxUnionid String? @map("wx_unionid") /// 微信UnionID - userSource String @default("admin_created") @map("user_source") /// 用户来源:admin_created/self_registered/child_migrated - userType String @default("adult") @map("user_type") /// 用户类型:adult/child - city String? /// 所在城市 - birthday DateTime? @db.Date /// 出生日期 - gender String? /// 性别:male-男,female-女 - avatar String? /// 头像URL - organization String? /// 所属单位(用于评委等独立用户) - status String @default("enabled") /// 账号状态:enabled-启用,disabled-停用 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - creator Int? @map("creator") /// 创建人ID - modifier Int? @map("modifier") /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - roles UserRole[] - logs Log[] - createdBy User? @relation("UserCreator", fields: [creator], references: [id], onDelete: SetNull) - modifiedBy User? @relation("UserModifier", fields: [modifier], references: [id], onDelete: SetNull) - createdUsers User[] @relation("UserCreator") - modifiedUsers User[] @relation("UserModifier") - createdRoles Role[] @relation("RoleCreator") - modifiedRoles Role[] @relation("RoleModifier") - createdPermissions Permission[] @relation("PermissionCreator") - modifiedPermissions Permission[] @relation("PermissionModifier") - createdMenus Menu[] @relation("MenuCreator") - modifiedMenus Menu[] @relation("MenuModifier") - createdDicts Dict[] @relation("DictCreator") - modifiedDicts Dict[] @relation("DictModifier") - createdDictItems DictItem[] @relation("DictItemCreator") - modifiedDictItems DictItem[] @relation("DictItemModifier") - createdConfigs Config[] @relation("ConfigCreator") - modifiedConfigs Config[] @relation("ConfigModifier") - createdTenants Tenant[] @relation("TenantCreator") - modifiedTenants Tenant[] @relation("TenantModifier") - // 赛事相关关联 - createdContests Contest[] @relation("ContestCreator") - modifiedContests Contest[] @relation("ContestModifier") - createdContestAttachments ContestAttachment[] @relation("ContestAttachmentCreator") - modifiedContestAttachments ContestAttachment[] @relation("ContestAttachmentModifier") - createdContestReviewRules ContestReviewRule[] @relation("ContestReviewRuleCreator") - modifiedContestReviewRules ContestReviewRule[] @relation("ContestReviewRuleModifier") - createdContestTeams ContestTeam[] @relation("ContestTeamCreator") - modifiedContestTeams ContestTeam[] @relation("ContestTeamModifier") - ledContestTeams ContestTeam[] @relation("ContestTeamLeader") - createdContestTeamMembers ContestTeamMember[] @relation("ContestTeamMemberCreator") - modifiedContestTeamMembers ContestTeamMember[] @relation("ContestTeamMemberModifier") - contestTeamMembers ContestTeamMember[] @relation("ContestTeamMemberUser") - createdContestRegistrations ContestRegistration[] @relation("ContestRegistrationCreator") - modifiedContestRegistrations ContestRegistration[] @relation("ContestRegistrationModifier") - contestRegistrations ContestRegistration[] @relation("ContestRegistrationUser") - createdContestWorks ContestWork[] @relation("ContestWorkCreator") - modifiedContestWorks ContestWork[] @relation("ContestWorkModifier") - createdContestWorkAttachments ContestWorkAttachment[] @relation("ContestWorkAttachmentCreator") - modifiedContestWorkAttachments ContestWorkAttachment[] @relation("ContestWorkAttachmentModifier") - createdContestWorkJudgeAssignments ContestWorkJudgeAssignment[] @relation("ContestWorkJudgeAssignmentCreator") - modifiedContestWorkJudgeAssignments ContestWorkJudgeAssignment[] @relation("ContestWorkJudgeAssignmentModifier") - assignedContestWorks ContestWorkJudgeAssignment[] @relation("ContestWorkJudgeAssignmentJudge") - createdContestWorkScores ContestWorkScore[] @relation("ContestWorkScoreCreator") - modifiedContestWorkScores ContestWorkScore[] @relation("ContestWorkScoreModifier") - scoredContestWorks ContestWorkScore[] @relation("ContestWorkScoreJudge") - createdContestNotices ContestNotice[] @relation("ContestNoticeCreator") - modifiedContestNotices ContestNotice[] @relation("ContestNoticeModifier") - contestJudges ContestJudge[] @relation("ContestJudgeUser") - createdContestJudges ContestJudge[] @relation("ContestJudgeCreator") - modifiedContestJudges ContestJudge[] @relation("ContestJudgeModifier") - contestRegistrationTeachers ContestRegistrationTeacher[] @relation("ContestRegistrationTeacherUser") - createdContestRegistrationTeachers ContestRegistrationTeacher[] @relation("ContestRegistrationTeacherCreator") - modifiedContestRegistrationTeachers ContestRegistrationTeacher[] @relation("ContestRegistrationTeacherModifier") - // 作业管理关联 - createdHomeworks Homework[] @relation("HomeworkCreator") - modifiedHomeworks Homework[] @relation("HomeworkModifier") - homeworkSubmissions HomeworkSubmission[] @relation("HomeworkSubmissionStudent") - createdHomeworkSubmissions HomeworkSubmission[] @relation("HomeworkSubmissionCreator") - modifiedHomeworkSubmissions HomeworkSubmission[] @relation("HomeworkSubmissionModifier") - createdHomeworkReviewRules HomeworkReviewRule[] @relation("HomeworkReviewRuleCreator") - modifiedHomeworkReviewRules HomeworkReviewRule[] @relation("HomeworkReviewRuleModifier") - homeworkScoresAsReviewer HomeworkScore[] @relation("HomeworkScoreReviewer") - createdHomeworkScores HomeworkScore[] @relation("HomeworkScoreCreator") - modifiedHomeworkScores HomeworkScore[] @relation("HomeworkScoreModifier") - // 预设评语关联 - presetComments PresetComment[] @relation("PresetCommentJudge") /// 评委的预设评语 - // 子女关联 - children Child[] @relation("ChildParent") /// 子女信息 - // 家长-子女账号关系 - parentRelations UserParentChild[] @relation("ParentUser") /// 作为家长关联的子女 - childRelations UserParentChild[] @relation("ChildUser") /// 作为子女关联的家长 - // UGC 作品关联 - userWorks UserWork[] @relation("UserWorkCreator") /// 用户创作的作品 - userWorkLikes UserWorkLike[] @relation("UserWorkLikeUser") - userWorkFavorites UserWorkFavorite[] @relation("UserWorkFavoriteUser") - userWorkComments UserWorkComment[] @relation("UserWorkCommentUser") - contentReviewLogs ContentReviewLog[] @relation("ContentReviewLogOperator") - // 举报关联 - reportsMade UserWorkReport[] @relation("UserWorkReportReporter") - reportsReceived UserWorkReport[] @relation("UserWorkReportTarget") - - @@unique([tenantId, username]) - @@unique([tenantId, email]) - @@map("users") -} - -/// 角色表 -model Role { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - name String /// 角色名称(在租户内唯一) - code String /// 角色编码(在租户内唯一) - description String? /// 角色描述 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - users UserRole[] - permissions RolePermission[] - creatorUser User? @relation("RoleCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("RoleModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([tenantId, name]) - @@unique([tenantId, code]) - @@map("roles") -} - -/// 用户角色关联表 -model UserRole { - id Int @id @default(autoincrement()) - userId Int @map("user_id") /// 用户ID - roleId Int @map("role_id") /// 角色ID - - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) - - @@unique([userId, roleId]) - @@map("user_roles") -} - -/// 权限表 -model Permission { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - name String /// 权限名称 - code String /// 权限编码(在租户内唯一) - resource String /// 资源名称,如 user, role, menu - action String /// 操作类型,如 create, read, update, delete - description String? /// 权限描述 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - roles RolePermission[] - creatorUser User? @relation("PermissionCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("PermissionModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([tenantId, resource, action]) - @@unique([tenantId, code]) - @@map("permissions") -} - -/// 角色权限关联表 -model RolePermission { - id Int @id @default(autoincrement()) - roleId Int @map("role_id") /// 角色ID - permissionId Int @map("permission_id") /// 权限ID - - role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) - permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade) - - @@unique([roleId, permissionId]) - @@map("role_permissions") -} - -/// 菜单表(全局菜单模板,超级租户管理) -model Menu { - id Int @id @default(autoincrement()) - name String /// 菜单名称 - path String? /// 路由路径 - icon String? /// 图标 - component String? /// 组件路径 - parentId Int? @map("parent_id") /// 父菜单ID - permission String? /// 权限编码(用于控制菜单显示,如:menu:read) - sort Int @default(0) /// 排序 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - creator Int? @map("creator") /// 创建人ID - modifier Int? @map("modifier") /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - parent Menu? @relation("MenuTree", fields: [parentId], references: [id]) - children Menu[] @relation("MenuTree") - tenantMenus TenantMenu[] /// 租户菜单关联 - creatorUser User? @relation("MenuCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("MenuModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@map("menus") -} - -/// 租户菜单关联表(租户分配的菜单) -model TenantMenu { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - menuId Int @map("menu_id") /// 菜单ID - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - menu Menu @relation(fields: [menuId], references: [id], onDelete: Cascade) - - @@unique([tenantId, menuId]) - @@map("tenant_menus") -} - -/// 数据字典表 -model Dict { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - name String /// 字典名称 - code String /// 字典编码(在租户内唯一) - description String? /// 字典描述 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - items DictItem[] - creatorUser User? @relation("DictCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("DictModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([tenantId, code]) - @@map("dicts") -} - -/// 字典项表 -model DictItem { - id Int @id @default(autoincrement()) - dictId Int @map("dict_id") /// 字典ID - label String /// 标签 - value String /// 值 - sort Int @default(0) /// 排序 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - creator Int? @map("creator") /// 创建人ID - modifier Int? @map("modifier") /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - dict Dict @relation(fields: [dictId], references: [id], onDelete: Cascade) - creatorUser User? @relation("DictItemCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("DictItemModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@map("dict_items") -} - -/// 系统配置表 -model Config { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - key String /// 配置键(在租户内唯一) - value String /// 配置值 - description String? /// 配置描述 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - creatorUser User? @relation("ConfigCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ConfigModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([tenantId, key]) - @@map("configs") -} - -/// 日志记录表 -model Log { - id Int @id @default(autoincrement()) - userId Int? @map("user_id") /// 用户ID - action String /// 操作类型 - content String? @db.Text /// 操作内容(使用 TEXT 类型支持长文本) - ip String? /// IP地址 - userAgent String? @map("user_agent") /// 用户代理 - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - - user User? @relation(fields: [userId], references: [id], onDelete: SetNull) - - @@map("logs") -} - -// ============================================ -// 赛事管理模块 -// ============================================ - -/// 赛事表 -model Contest { - id Int @id @default(autoincrement()) - contestName String @map("contest_name") /// 赛事名称 - contestType String @map("contest_type") /// 赛事类型:individual/team - contestState String @default("unpublished") @map("contest_state") /// 赛事状态:unpublished/published - status String @default("ongoing") /// 赛事进度状态:ongoing/finished - startTime DateTime @map("start_time") /// 赛事开始时间 - endTime DateTime @map("end_time") /// 赛事结束时间 - address String? /// 线下地址 - content String? @db.Text /// 赛事详情 - contestTenants Json? @map("contest_tenants") /// 授权租户ID数组 - coverUrl String? @map("cover_url") /// 封面url - posterUrl String? @map("poster_url") /// 海报url - contactName String? @map("contact_name") /// 联系人 - contactPhone String? @map("contact_phone") /// 联系电话 - contactQrcode String? @map("contact_qrcode") /// 联系人二维码 - organizers Json? /// 主办单位数组 - coOrganizers Json? @map("co_organizers") /// 协办单位数组 - sponsors Json? /// 赞助单位数组 - // 报名配置 - registerStartTime DateTime @map("register_start_time") /// 报名开始时间 - registerEndTime DateTime @map("register_end_time") /// 报名结束时间 - registerState String? @map("register_state") /// 报名任务状态:started/closed - requireAudit Boolean @default(true) @map("require_audit") /// 报名是否需要审核 - allowedGrades Json? @map("allowed_grades") /// 允许报名的年级ID数组 - allowedClasses Json? @map("allowed_classes") /// 允许报名的班级ID数组 - teamMinMembers Int? @map("team_min_members") /// 团队最少成员数 - teamMaxMembers Int? @map("team_max_members") /// 团队最多成员数 - // 定向推送条件(visibility='targeted'时使用) - targetCities Json? @map("target_cities") /// 目标城市列表 - ageMin Int? @map("age_min") /// 最小年龄限制 - ageMax Int? @map("age_max") /// 最大年龄限制 - // 作品配置 - submitRule String @default("once") @map("submit_rule") /// 提交规则:once/resubmit - submitStartTime DateTime @map("submit_start_time") /// 作品提交开始时间 - submitEndTime DateTime @map("submit_end_time") /// 作品提交结束时间 - workType String? @map("work_type") /// 作品类型(如:image/video/document/code) - workRequirement String? @map("work_requirement") @db.Text /// 作品要求说明 - // 评审配置 - reviewRuleId Int? @map("review_rule_id") /// 评审规则id - reviewStartTime DateTime @map("review_start_time") /// 评审开始时间 - reviewEndTime DateTime @map("review_end_time") /// 评审结束时间 - // 赛果配置 - resultState String @default("unpublished") @map("result_state") /// 赛果状态:unpublished/published - resultPublishTime DateTime? @map("result_publish_time") /// 结果发布时间 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - visibility String @default("designated") /// 可见范围:public-公开/designated-指定机构/internal-仅内部 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - attachments ContestAttachment[] /// 赛事附件 - reviewRule ContestReviewRule? @relation("ContestReviewRuleContest", fields: [reviewRuleId], references: [id], onDelete: SetNull) - teams ContestTeam[] /// 赛事团队 - registrations ContestRegistration[] /// 报名记录 - works ContestWork[] /// 参赛作品 - judges ContestJudge[] /// 比赛评委 - workAssignments ContestWorkJudgeAssignment[] @relation("ContestWorkJudgeAssignmentContest") /// 作品分配 - workScores ContestWorkScore[] @relation("ContestWorkScoreContest") /// 作品评分 - notices ContestNotice[] /// 赛事公告 - presetComments PresetComment[] /// 预设评语 - creatorUser User? @relation("ContestCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([contestName]) - @@index([contestState]) - @@index([startTime, endTime]) - @@index([reviewRuleId]) - @@map("t_contest") -} - -/// 赛事附件表 -model ContestAttachment { - id Int @id @default(autoincrement()) - contestId Int @map("contest_id") /// 赛事id - fileName String @map("file_name") /// 文件名 - fileUrl String @map("file_url") /// 文件路径 - format String? /// 文件类型(png,mp4) - fileType String? @map("file_type") /// 素材类型(image,video) - size String @default("0") /// 文件大小 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - contest Contest @relation(fields: [contestId], references: [id], onDelete: Cascade) - creatorUser User? @relation("ContestAttachmentCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestAttachmentModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([contestId]) - @@map("t_contest_attachment") -} - -/// 评审规则表(独立存在,可被多个赛事使用) -model ContestReviewRule { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - ruleName String @map("rule_name") /// 规则名称 - ruleDescription String? @map("rule_description") @db.Text /// 规则说明 - judgeCount Int? @map("judge_count") /// 评委数量 - dimensions Json /// 评分维度配置JSON - calculationRule String @default("average") @map("calculation_rule") /// 计算规则:average/remove_max_min/remove_min - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - contests Contest[] @relation("ContestReviewRuleContest") /// 使用此规则的赛事列表 - creatorUser User? @relation("ContestReviewRuleCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestReviewRuleModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([tenantId]) - @@map("t_contest_review_rule") -} - -/// 赛事团队表 -model ContestTeam { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 团队所属租户ID - contestId Int @map("contest_id") /// 赛事id - teamName String @map("team_name") /// 团队名称(租户内唯一) - leaderUserId Int @map("leader_user_id") /// 团队负责人用户id - maxMembers Int? @map("max_members") /// 团队最大成员数 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - contest Contest @relation(fields: [contestId], references: [id], onDelete: Cascade) - leader User @relation("ContestTeamLeader", fields: [leaderUserId], references: [id], onDelete: Restrict) - members ContestTeamMember[] /// 团队成员 - registrations ContestRegistration[] /// 报名记录 - creatorUser User? @relation("ContestTeamCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestTeamModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([tenantId, contestId, teamName]) - @@index([contestId]) - @@index([leaderUserId]) - @@map("t_contest_team") -} - -/// 团队成员表 -model ContestTeamMember { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 成员所属租户ID - teamId Int @map("team_id") /// 团队id - userId Int @map("user_id") /// 成员用户id - role String @default("member") /// 成员角色:member/leader/mentor - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - team ContestTeam @relation(fields: [teamId], references: [id], onDelete: Cascade) - user User @relation("ContestTeamMemberUser", fields: [userId], references: [id], onDelete: Cascade) - creatorUser User? @relation("ContestTeamMemberCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestTeamMemberModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([tenantId, teamId, userId]) - @@index([teamId]) - @@index([userId]) - @@map("t_contest_team_member") -} - -/// 赛事报名表 -model ContestRegistration { - id Int @id @default(autoincrement()) - contestId Int @map("contest_id") /// 赛事id - tenantId Int @map("tenant_id") /// 所属租户ID - registrationType String? @map("registration_type") /// 报名类型:individual/team - teamId Int? @map("team_id") /// 团队id - teamName String? @map("team_name") /// 团队名称快照(团队赛) - userId Int @map("user_id") /// 账号id - accountNo String @map("account_no") /// 报名账号(记录报名快照) - accountName String @map("account_name") /// 报名账号名称(记录报名快照) - role String? /// 报名角色快照:leader/member/mentor - registrationState String @default("pending") @map("registration_state") /// 报名状态:pending/passed/rejected/withdrawn - participantType String @default("self") @map("participant_type") /// 参与者类型:self-自己/child-代子女报名 - childId Int? @map("child_id") /// 子女ID,代子女报名时填写 - registrant Int? /// 实际报名人用户ID - registrationTime DateTime @map("registration_time") /// 报名时间 - reason String? @db.VarChar(1023) /// 审核理由 - operator Int? /// 审核人用户ID - operationDate DateTime? @map("operation_date") /// 审核时间 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - - contest Contest @relation(fields: [contestId], references: [id], onDelete: Cascade) - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - team ContestTeam? @relation(fields: [teamId], references: [id], onDelete: SetNull) - user User @relation("ContestRegistrationUser", fields: [userId], references: [id], onDelete: Restrict) - child Child? @relation("ContestRegistrationChild", fields: [childId], references: [id], onDelete: SetNull) - works ContestWork[] /// 参赛作品 - creatorUser User? @relation("ContestRegistrationCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestRegistrationModifier", fields: [modifier], references: [id], onDelete: SetNull) - - teachers ContestRegistrationTeacher[] /// 指导老师关联 - - @@index([contestId, tenantId]) - @@index([userId, contestId]) - @@index([teamId]) - @@index([registrationState]) - @@index([participantType]) - @@index([childId]) - @@map("t_contest_registration") -} - -/// 报名指导老师关联表 -model ContestRegistrationTeacher { - id Int @id @default(autoincrement()) - registrationId Int @map("registration_id") /// 报名记录ID - tenantId Int @map("tenant_id") /// 租户ID - userId Int @map("user_id") /// 指导老师用户ID - isDefault Boolean @default(false) @map("is_default") /// 是否为默认指导老师(报名时自动添加的,不能移除) - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - - registration ContestRegistration @relation(fields: [registrationId], references: [id], onDelete: Cascade) - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - user User @relation("ContestRegistrationTeacherUser", fields: [userId], references: [id], onDelete: Cascade) - creatorUser User? @relation("ContestRegistrationTeacherCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestRegistrationTeacherModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([tenantId, registrationId, userId]) - @@index([registrationId]) - @@index([userId]) - @@map("t_contest_registration_teacher") -} - -/// 参赛作品表 -model ContestWork { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 作品所属租户ID - contestId Int @map("contest_id") /// 赛事id - registrationId Int @map("registration_id") /// 报名记录id - workNo String? @unique @map("work_no") /// 作品编号(展示用唯一编号) - title String /// 作品标题 - description String? @db.Text /// 作品说明 - files Json? /// 作品文件列表(简易场景) - version Int @default(1) /// 作品版本号(递增) - isLatest Boolean @default(true) @map("is_latest") /// 是否最新版本 - status String @default("submitted") /// 作品状态:submitted/locked/reviewing/rejected/accepted - submitTime DateTime @default(now()) @map("submit_time") /// 提交时间 - submitterUserId Int? @map("submitter_user_id") /// 提交人用户id - submitterAccountNo String? @map("submitter_account_no") /// 提交人账号 - submitSource String @default("teacher") @map("submit_source") /// 提交来源:teacher/student/team_leader - previewUrl String? @map("preview_url") @db.Text /// 作品预览URL(兼容单预览图) - previewUrls Json? @map("preview_urls") /// 作品预览图URL列表(多模型场景) - aiModelMeta Json? @map("ai_model_meta") /// AI建模元数据 - userWorkId Int? @map("user_work_id") /// 关联用户作品库(从作品库选择提交时) - // 赛果相关字段 - finalScore Decimal? @map("final_score") @db.Decimal(10, 2) /// 最终得分(根据规则计算) - rank Int? /// 排名 - awardLevel String? @map("award_level") /// 奖项等级:first/second/third/excellent/none - awardName String? @map("award_name") /// 奖项名称(如:一等奖、金奖) - certificateUrl String? @map("certificate_url") /// 证书URL - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - contest Contest @relation(fields: [contestId], references: [id], onDelete: Cascade) - registration ContestRegistration @relation(fields: [registrationId], references: [id], onDelete: Restrict) - userWork UserWork? @relation("ContestWorkUserWork", fields: [userWorkId], references: [id], onDelete: SetNull) - attachments ContestWorkAttachment[] /// 作品附件 - assignments ContestWorkJudgeAssignment[] /// 作品分配 - scores ContestWorkScore[] /// 作品评分 - creatorUser User? @relation("ContestWorkCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestWorkModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([tenantId, contestId, isLatest]) - @@index([registrationId]) - @@index([tenantId, contestId, submitTime, status]) - @@index([contestId, status]) - @@map("t_contest_work") -} - -/// 作品附件文件表 -model ContestWorkAttachment { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 所属租户ID - contestId Int @map("contest_id") /// 赛事id - workId Int @map("work_id") /// 作品id - fileName String @map("file_name") /// 文件名 - fileUrl String @map("file_url") /// 文件路径 - format String? /// 文件类型(png,mp4) - fileType String? @map("file_type") /// 素材类型(image,video) - size String @default("0") /// 文件大小 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - - work ContestWork @relation(fields: [workId], references: [id], onDelete: Cascade) - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - creatorUser User? @relation("ContestWorkAttachmentCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestWorkAttachmentModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([tenantId, contestId, workId]) - @@map("t_contest_work_attachment") -} - -/// 比赛评委关联表(比赛与评委的多对多关系) -model ContestJudge { - id Int @id @default(autoincrement()) - contestId Int @map("contest_id") /// 比赛id - judgeId Int @map("judge_id") /// 评委用户id - specialty String? /// 评审专业领域(可选) - weight Decimal? @db.Decimal(3, 2) /// 评审权重(可选,用于加权平均计算) - description String? @db.Text /// 评委在该比赛中的说明 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - contest Contest @relation(fields: [contestId], references: [id], onDelete: Cascade) - judge User @relation("ContestJudgeUser", fields: [judgeId], references: [id], onDelete: Cascade) - creatorUser User? @relation("ContestJudgeCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestJudgeModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([contestId, judgeId]) - @@index([contestId]) - @@index([judgeId]) - @@map("t_contest_judge") -} - -/// 作品分配表(评委分配作品) -model ContestWorkJudgeAssignment { - id Int @id @default(autoincrement()) - contestId Int @map("contest_id") /// 赛事id - workId Int @map("work_id") /// 作品id - judgeId Int @map("judge_id") /// 评委用户id - assignmentTime DateTime @default(now()) @map("assignment_time") /// 分配时间 - status String @default("assigned") /// 分配状态:assigned/reviewing/completed - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - - contest Contest @relation("ContestWorkJudgeAssignmentContest", fields: [contestId], references: [id], onDelete: Cascade) - work ContestWork @relation(fields: [workId], references: [id], onDelete: Cascade) - judge User @relation("ContestWorkJudgeAssignmentJudge", fields: [judgeId], references: [id], onDelete: Restrict) - scores ContestWorkScore[] /// 评分记录 - creatorUser User? @relation("ContestWorkJudgeAssignmentCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestWorkJudgeAssignmentModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([workId, judgeId]) - @@index([contestId, judgeId]) - @@index([workId]) - @@index([status]) - @@map("t_contest_work_judge_assignment") -} - -/// 作品评分表 -model ContestWorkScore { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 所属租户ID - contestId Int @map("contest_id") /// 赛事id - workId Int @map("work_id") /// 作品id - assignmentId Int @map("assignment_id") /// 分配记录id - judgeId Int @map("judge_id") /// 评委用户id - judgeName String @map("judge_name") /// 评委姓名 - dimensionScores Json @map("dimension_scores") /// 各维度评分JSON - totalScore Decimal @map("total_score") @db.Decimal(10, 2) /// 总分 - comments String? @db.Text /// 评语 - scoreTime DateTime @map("score_time") /// 评分时间 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - contest Contest @relation("ContestWorkScoreContest", fields: [contestId], references: [id], onDelete: Cascade) - work ContestWork @relation(fields: [workId], references: [id], onDelete: Cascade) - assignment ContestWorkJudgeAssignment @relation(fields: [assignmentId], references: [id], onDelete: Restrict) - judge User @relation("ContestWorkScoreJudge", fields: [judgeId], references: [id], onDelete: Restrict) - creatorUser User? @relation("ContestWorkScoreCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestWorkScoreModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([contestId, workId, judgeId]) - @@index([workId]) - @@index([assignmentId]) - @@map("t_contest_work_score") -} - -/// 赛事公告表 -model ContestNotice { - id Int @id @default(autoincrement()) - contestId Int @map("contest_id") /// 赛事id - title String /// 公告标题 - content String @db.Text /// 公告内容 - noticeType String @default("manual") @map("notice_type") /// 公告类型:system/manual/urgent - priority Int @default(0) /// 优先级(数字越大优先级越高) - publishTime DateTime? @map("publish_time") /// 发布时间 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - contest Contest @relation(fields: [contestId], references: [id], onDelete: Cascade) - creatorUser User? @relation("ContestNoticeCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("ContestNoticeModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([contestId]) - @@index([publishTime]) - @@index([noticeType]) - @@map("t_contest_notice") -} - -// ============================================ -// 作业管理模块 -// ============================================ - -/// 作业表 -model Homework { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - name String /// 作业名称 - content String? @db.Text /// 作业内容(富文本) - status String @default("unpublished") /// 作业状态:unpublished/published - publishTime DateTime? @map("publish_time") /// 发布时间 - submitStartTime DateTime @map("submit_start_time") /// 提交开始时间 - submitEndTime DateTime @map("submit_end_time") /// 提交结束时间 - attachments Json? /// 附件列表 [{fileName, fileUrl, size}] - publishScope Json? @map("publish_scope") /// 公开范围(班级ID数组) - reviewRuleId Int? @map("review_rule_id") /// 评审规则ID - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - reviewRule HomeworkReviewRule? @relation(fields: [reviewRuleId], references: [id], onDelete: SetNull) - submissions HomeworkSubmission[] /// 作业提交记录 - creatorUser User? @relation("HomeworkCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("HomeworkModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([tenantId, status]) - @@index([tenantId, submitStartTime, submitEndTime]) - @@map("t_homework") -} - -/// 作业提交表 -model HomeworkSubmission { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - homeworkId Int @map("homework_id") /// 作业ID - studentId Int @map("student_id") /// 学生用户ID - workNo String? @map("work_no") /// 作品编号 - workName String @map("work_name") /// 作品名称 - workDescription String? @map("work_description") @db.Text /// 作品介绍 - files Json? /// 作品文件列表 - attachments Json? /// 附件列表 - submitTime DateTime @default(now()) @map("submit_time") /// 提交时间 - status String @default("pending") /// 状态:pending/reviewed/rejected - totalScore Decimal? @map("total_score") @db.Decimal(10, 2) /// 总分 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - homework Homework @relation(fields: [homeworkId], references: [id], onDelete: Cascade) - student User @relation("HomeworkSubmissionStudent", fields: [studentId], references: [id], onDelete: Cascade) - scores HomeworkScore[] /// 评分记录 - creatorUser User? @relation("HomeworkSubmissionCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("HomeworkSubmissionModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([homeworkId, studentId]) - @@index([tenantId, homeworkId]) - @@index([studentId]) - @@index([status]) - @@map("t_homework_submission") -} - -/// 作业评审规则表 -model HomeworkReviewRule { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - name String /// 规则名称 - description String? @db.Text /// 规则描述 - criteria Json /// 评分标准 [{name, maxScore, description}] - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - homeworks Homework[] /// 关联的作业 - creatorUser User? @relation("HomeworkReviewRuleCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("HomeworkReviewRuleModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@index([tenantId]) - @@map("t_homework_review_rule") -} - -/// 作业评分表 -model HomeworkScore { - id Int @id @default(autoincrement()) - tenantId Int @map("tenant_id") /// 租户ID - submissionId Int @map("submission_id") /// 提交记录ID - reviewerId Int @map("reviewer_id") /// 评审人ID - dimensionScores Json @map("dimension_scores") /// 各维度评分 - totalScore Decimal @map("total_score") @db.Decimal(10, 2) /// 总分 - comments String? @db.Text /// 评语 - scoreTime DateTime @default(now()) @map("score_time") /// 评分时间 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 更新时间 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - - tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade) - submission HomeworkSubmission @relation(fields: [submissionId], references: [id], onDelete: Cascade) - reviewer User @relation("HomeworkScoreReviewer", fields: [reviewerId], references: [id], onDelete: Restrict) - creatorUser User? @relation("HomeworkScoreCreator", fields: [creator], references: [id], onDelete: SetNull) - modifierUser User? @relation("HomeworkScoreModifier", fields: [modifier], references: [id], onDelete: SetNull) - - @@unique([submissionId, reviewerId]) - @@index([tenantId, submissionId]) - @@index([reviewerId]) - @@map("t_homework_score") -} - -// ============================================ -// AI 3D 模型生成模块 -// ============================================ - -/// 预设评语表 -model PresetComment { - id Int @id @default(autoincrement()) - contestId Int @map("contest_id") /// 赛事ID - judgeId Int @map("judge_id") /// 评委用户ID - content String @db.Text /// 评语内容 - score Decimal? @db.Decimal(10, 2) /// 关联评审分数 - sortOrder Int @default(0) @map("sort_order") /// 排序顺序 - useCount Int @default(0) @map("use_count") /// 使用次数 - validState Int @default(1) @map("valid_state") /// 有效状态:1-有效,2-失效 - creator Int? /// 创建人ID - modifier Int? /// 修改人ID - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - contest Contest @relation(fields: [contestId], references: [id], onDelete: Cascade) - judge User @relation("PresetCommentJudge", fields: [judgeId], references: [id], onDelete: Cascade) - - @@index([contestId, judgeId]) - @@map("t_preset_comment") -} - -/// 子女信息表 -model Child { - id Int @id @default(autoincrement()) - parentId Int @map("parent_id") /// 家长用户ID - name String @db.VarChar(50) /// 子女姓名 - gender String? @db.VarChar(10) /// 性别:male/female - birthday DateTime? @db.Date /// 出生日期 - grade String? @db.VarChar(20) /// 年级 - city String? @db.VarChar(50) /// 所在城市 - schoolName String? @map("school_name") @db.VarChar(100) /// 学校/幼儿园名称 - avatar String? @db.VarChar(500) /// 头像URL - isDeleted Int @default(0) @map("is_deleted") /// 软删除标记 - createTime DateTime @default(now()) @map("create_time") /// 创建时间 - modifyTime DateTime @updatedAt @map("modify_time") /// 修改时间 - - parent User @relation("ChildParent", fields: [parentId], references: [id], onDelete: Cascade) - registrations ContestRegistration[] @relation("ContestRegistrationChild") - - @@index([parentId]) - @@map("children") -} - -// ==================== 家长-子女账号关系 ==================== - -/// 家长-子女独立账号管理关系 -model UserParentChild { - id Int @id @default(autoincrement()) - parentUserId Int @map("parent_user_id") /// 家长 User.id - childUserId Int @map("child_user_id") /// 子女 User.id - relationship String? @db.VarChar(20) /// 关系:father/mother/guardian - controlMode String @default("open") @map("control_mode") /// 管控模式:open(子女自主)/restricted(需家长确认) - createTime DateTime @default(now()) @map("create_time") - - parent User @relation("ParentUser", fields: [parentUserId], references: [id], onDelete: Cascade) - child User @relation("ChildUser", fields: [childUserId], references: [id], onDelete: Cascade) - - @@unique([parentUserId, childUserId]) - @@index([childUserId]) - @@map("user_parent_child") -} - -// ==================== UGC 用户作品 ==================== - -/// 用户作品主表 -model UserWork { - id Int @id @default(autoincrement()) - userId Int @map("user_id") /// 创作者 User.id - title String @db.VarChar(200) /// 作品名称 - coverUrl String? @map("cover_url") @db.Text /// 封面图 URL - description String? @db.Text /// 作品简介 - visibility String @default("private") /// 可见性:public/private/friends - status String @default("draft") /// 状态:draft/pending_review/published/rejected/taken_down - reviewNote String? @map("review_note") @db.Text /// 审核备注/拒绝原因 - reviewTime DateTime? @map("review_time") /// 审核时间 - reviewerId Int? @map("reviewer_id") /// 审核人 ID - machineReviewResult String? @map("machine_review_result") /// 机器预审结果:safe/suspicious - machineReviewNote String? @map("machine_review_note") @db.Text /// 机器预审备注 - isRecommended Boolean @default(false) @map("is_recommended") /// 是否推荐 - // 统计字段(冗余,提升查询性能) - viewCount Int @default(0) @map("view_count") - likeCount Int @default(0) @map("like_count") - favoriteCount Int @default(0) @map("favorite_count") - commentCount Int @default(0) @map("comment_count") - shareCount Int @default(0) @map("share_count") - // AI 创作元数据 - originalImageUrl String? @map("original_image_url") @db.Text /// 用户原画 URL - voiceInputUrl String? @map("voice_input_url") @db.Text /// 语音输入 URL - textInput String? @map("text_input") @db.Text /// 文字描述输入 - aiMeta Json? @map("ai_meta") /// AI 生成的元数据(模型/参数等) - // 通用字段 - publishTime DateTime? @map("publish_time") /// 发布时间 - isDeleted Int @default(0) @map("is_deleted") /// 软删除标记 - createTime DateTime @default(now()) @map("create_time") - modifyTime DateTime @updatedAt @map("modify_time") - - creator User @relation("UserWorkCreator", fields: [userId], references: [id], onDelete: Cascade) - pages UserWorkPage[] @relation("UserWorkPages") - tags WorkTagRelation[] @relation("UserWorkTags") - likes UserWorkLike[] @relation("UserWorkLikes") - favorites UserWorkFavorite[] @relation("UserWorkFavorites") - comments UserWorkComment[] @relation("UserWorkComments") - reports UserWorkReport[] @relation("UserWorkReports") - reviewLogs ContentReviewLog[] @relation("ContentReviewLogWork") - contestWorks ContestWork[] @relation("ContestWorkUserWork") /// 关联的活动参赛作品 - - @@index([userId, status]) - @@index([status, publishTime]) - @@index([isRecommended, publishTime]) - @@map("user_works") -} - -/// 绘本分页内容 -model UserWorkPage { - id Int @id @default(autoincrement()) - workId Int @map("work_id") /// 作品 ID - pageNo Int @map("page_no") /// 页码(从 1 开始) - imageUrl String? @map("image_url") @db.Text /// 页面插图 URL - text String? @db.Text /// 页面文字 - audioUrl String? @map("audio_url") @db.Text /// 页面配音 URL - - work UserWork @relation("UserWorkPages", fields: [workId], references: [id], onDelete: Cascade) - - @@unique([workId, pageNo]) - @@map("user_work_pages") -} - -// ==================== 标签体系 ==================== - -/// 作品标签 -model WorkTag { - id Int @id @default(autoincrement()) - name String @unique @db.VarChar(50) /// 标签名称 - category String? @db.VarChar(50) /// 所属分类(如:主题/风格/情感) - color String? @db.VarChar(20) /// 标签颜色(如:#6366f1) - sort Int @default(0) /// 排序权重 - status String @default("enabled") /// 状态:enabled/disabled - usageCount Int @default(0) @map("usage_count") /// 使用次数(冗余) - createTime DateTime @default(now()) @map("create_time") - modifyTime DateTime @updatedAt @map("modify_time") - - works WorkTagRelation[] @relation("WorkTagRelations") - - @@index([category, sort]) - @@map("work_tags") -} - -/// 作品-标签关联 -model WorkTagRelation { - id Int @id @default(autoincrement()) - workId Int @map("work_id") - tagId Int @map("tag_id") - - work UserWork @relation("UserWorkTags", fields: [workId], references: [id], onDelete: Cascade) - tag WorkTag @relation("WorkTagRelations", fields: [tagId], references: [id], onDelete: Cascade) - - @@unique([workId, tagId]) - @@map("work_tag_relations") -} - -// ==================== 社区互动 ==================== - -/// 作品点赞 -model UserWorkLike { - id Int @id @default(autoincrement()) - userId Int @map("user_id") - workId Int @map("work_id") - createTime DateTime @default(now()) @map("create_time") - - user User @relation("UserWorkLikeUser", fields: [userId], references: [id], onDelete: Cascade) - work UserWork @relation("UserWorkLikes", fields: [workId], references: [id], onDelete: Cascade) - - @@unique([userId, workId]) - @@map("user_work_likes") -} - -/// 作品收藏 -model UserWorkFavorite { - id Int @id @default(autoincrement()) - userId Int @map("user_id") - workId Int @map("work_id") - createTime DateTime @default(now()) @map("create_time") - - user User @relation("UserWorkFavoriteUser", fields: [userId], references: [id], onDelete: Cascade) - work UserWork @relation("UserWorkFavorites", fields: [workId], references: [id], onDelete: Cascade) - - @@unique([userId, workId]) - @@map("user_work_favorites") -} - -/// 作品评论 -model UserWorkComment { - id Int @id @default(autoincrement()) - workId Int @map("work_id") - userId Int @map("user_id") - parentId Int? @map("parent_id") /// 父评论 ID(支持回复嵌套) - content String @db.Text /// 评论内容 - status String @default("pending") /// 状态:pending/approved/rejected - createTime DateTime @default(now()) @map("create_time") - - user User @relation("UserWorkCommentUser", fields: [userId], references: [id], onDelete: Cascade) - work UserWork @relation("UserWorkComments", fields: [workId], references: [id], onDelete: Cascade) - parent UserWorkComment? @relation("CommentReplies", fields: [parentId], references: [id], onDelete: SetNull) - replies UserWorkComment[] @relation("CommentReplies") - - @@index([workId, status, createTime]) - @@map("user_work_comments") -} - -/// 作品举报 -model UserWorkReport { - id Int @id @default(autoincrement()) - reporterId Int @map("reporter_id") /// 举报人 - targetType String @map("target_type") /// 举报类型:work/comment/user - targetId Int @map("target_id") /// 被举报对象 ID - targetUserId Int? @map("target_user_id") /// 被举报人 User.id - reason String @db.VarChar(200) /// 举报原因 - description String? @db.Text /// 详细描述 - status String @default("pending") /// 状态:pending/handled/ignored - handleAction String? @map("handle_action") /// 处理操作:takedown/warn/ban/ignore - handleNote String? @map("handle_note") @db.Text /// 处理备注 - handlerId Int? @map("handler_id") /// 处理人 ID - handleTime DateTime? @map("handle_time") /// 处理时间 - createTime DateTime @default(now()) @map("create_time") - - reporter User @relation("UserWorkReportReporter", fields: [reporterId], references: [id], onDelete: Cascade) - targetUser User? @relation("UserWorkReportTarget", fields: [targetUserId], references: [id], onDelete: SetNull) - work UserWork? @relation("UserWorkReports", fields: [targetId], references: [id], onDelete: Cascade) - - @@index([status, createTime]) - @@index([targetType, targetId]) - @@map("user_work_reports") -} - -// ==================== 内容审核日志 ==================== - -/// 审核操作日志 -model ContentReviewLog { - id Int @id @default(autoincrement()) - targetType String @map("target_type") /// 审核类型:work/comment - targetId Int @map("target_id") /// 审核对象 ID - workId Int? @map("work_id") /// 关联作品 ID(方便查询) - action String /// 操作:approve/reject/takedown/restore - reason String? @db.Text /// 原因 - note String? @db.Text /// 备注 - operatorId Int @map("operator_id") /// 操作人 ID - createTime DateTime @default(now()) @map("create_time") - - operator User @relation("ContentReviewLogOperator", fields: [operatorId], references: [id], onDelete: Cascade) - work UserWork? @relation("ContentReviewLogWork", fields: [workId], references: [id], onDelete: SetNull) - - @@index([targetType, targetId]) - @@index([workId]) - @@map("content_review_logs") -} diff --git a/backend/scripts/check-permissions.js b/backend/scripts/check-permissions.js deleted file mode 100644 index 1d6497b..0000000 --- a/backend/scripts/check-permissions.js +++ /dev/null @@ -1,60 +0,0 @@ -const { PrismaClient } = require('@prisma/client'); -const prisma = new PrismaClient(); - -async function main() { - // 查找香港小学租户 - const tenant = await prisma.tenant.findFirst({ - where: { code: 'school001' } - }); - - if (!tenant) { - console.log('租户 school001 不存在'); - return; - } - - console.log(`租户: ${tenant.name} (${tenant.code})\n`); - - // 查找该租户的 school_admin 角色 - const role = await prisma.role.findFirst({ - where: { tenantId: tenant.id, code: 'school_admin' }, - include: { - permissions: { - include: { - permission: true - } - } - } - }); - - if (!role) { - console.log('school_admin 角色不存在'); - return; - } - - console.log(`角色: ${role.name} (${role.code})`); - console.log(`权限数量: ${role.permissions.length}\n`); - - // 检查系统管理相关权限 - const systemPermissions = ['user:read', 'role:read', 'menu:read', 'permission:read']; - console.log('系统管理相关权限:'); - systemPermissions.forEach(code => { - const has = role.permissions.some(rp => rp.permission.code === code); - console.log(` ${code}: ${has ? '✓' : '✗'}`); - }); - - // 查找该租户的权限 - console.log('\n该租户所有权限:'); - const permissions = await prisma.permission.findMany({ - where: { tenantId: tenant.id } - }); - permissions.forEach(p => { - console.log(` ${p.code}`); - }); -} - -main() - .then(() => prisma.$disconnect()) - .catch(e => { - console.error(e); - prisma.$disconnect(); - }); diff --git a/backend/scripts/check-registrations.js b/backend/scripts/check-registrations.js deleted file mode 100644 index 6acedb2..0000000 --- a/backend/scripts/check-registrations.js +++ /dev/null @@ -1,64 +0,0 @@ -const { PrismaClient } = require('@prisma/client'); -const prisma = new PrismaClient(); - -async function main() { - // 查找3D打印作品大赛 - const contest = await prisma.contest.findFirst({ - where: { contestName: { contains: '3D打印' } } - }); - - if (!contest) { - console.log('未找到3D打印作品大赛'); - return; - } - - console.log(`赛事: ${contest.contestName} (ID: ${contest.id})\n`); - - // 查找该赛事的所有报名记录 - const registrations = await prisma.contestRegistration.findMany({ - where: { contestId: contest.id }, - include: { - user: true, - contest: true - } - }); - - console.log(`报名记录数量: ${registrations.length}\n`); - - if (registrations.length > 0) { - console.log('报名记录详情:'); - registrations.forEach(r => { - console.log(` ID: ${r.id}, 用户: ${r.user?.username || 'N/A'}, 租户ID: ${r.tenantId}, 状态: ${r.status}`); - }); - } - - // 查找 xuesheng1 用户 - const user = await prisma.user.findFirst({ - where: { username: 'xuesheng1' } - }); - - if (user) { - console.log(`\nxuesheng1 用户信息:`); - console.log(` ID: ${user.id}, 租户ID: ${user.tenantId}`); - - // 查找该用户的所有报名记录 - const userRegistrations = await prisma.contestRegistration.findMany({ - where: { userId: user.id }, - include: { contest: true } - }); - - console.log(`\nxuesheng1 的所有报名记录 (${userRegistrations.length}):`); - userRegistrations.forEach(r => { - console.log(` 赛事: ${r.contest?.contestName}, 状态: ${r.status}, 租户ID: ${r.tenantId}`); - }); - } else { - console.log('\n未找到 xuesheng1 用户'); - } -} - -main() - .then(() => prisma.$disconnect()) - .catch(e => { - console.error(e); - prisma.$disconnect(); - }); diff --git a/backend/scripts/check-student-permissions.js b/backend/scripts/check-student-permissions.js deleted file mode 100644 index a323693..0000000 --- a/backend/scripts/check-student-permissions.js +++ /dev/null @@ -1,52 +0,0 @@ -const { PrismaClient } = require('@prisma/client'); -const prisma = new PrismaClient(); - -async function main() { - // 查找香港小学租户 - const tenant = await prisma.tenant.findFirst({ - where: { code: 'school001' } - }); - - if (!tenant) { - console.log('租户 school001 不存在'); - return; - } - - console.log(`租户: ${tenant.name} (${tenant.code})\n`); - - // 查找该租户的 student 角色 - const role = await prisma.role.findFirst({ - where: { tenantId: tenant.id, code: 'student' }, - include: { - permissions: { - include: { - permission: true - } - } - } - }); - - if (!role) { - console.log('student 角色不存在'); - return; - } - - console.log(`角色: ${role.name} (${role.code})`); - console.log(`权限数量: ${role.permissions.length}\n`); - - console.log('学生角色所有权限:'); - role.permissions.forEach(rp => { - console.log(` ${rp.permission.code}`); - }); - - // 检查是否有 registration:read 权限 - const hasRegistrationRead = role.permissions.some(rp => rp.permission.code === 'registration:read'); - console.log(`\nregistration:read 权限: ${hasRegistrationRead ? '有' : '无'}`); -} - -main() - .then(() => prisma.$disconnect()) - .catch(e => { - console.error(e); - prisma.$disconnect(); - }); diff --git a/backend/scripts/check-users.js b/backend/scripts/check-users.js deleted file mode 100644 index ec7ad69..0000000 --- a/backend/scripts/check-users.js +++ /dev/null @@ -1,22 +0,0 @@ -const { PrismaClient } = require('@prisma/client'); -const prisma = new PrismaClient(); - -async function main() { - const users = await prisma.user.findMany({ - include: { tenant: true }, - }); - - console.log('All users:'); - users.forEach(u => { - const tenantName = u.tenant ? u.tenant.name : 'N/A'; - const tenantCode = u.tenant ? u.tenant.code : 'N/A'; - console.log(` Tenant: ${tenantName} (${tenantCode}), User: ${u.username}, ID: ${u.id}`); - }); -} - -main() - .then(() => prisma.$disconnect()) - .catch(e => { - console.error(e); - prisma.$disconnect(); - }); diff --git a/backend/scripts/cleanup-tenant-permissions.ts b/backend/scripts/cleanup-tenant-permissions.ts deleted file mode 100644 index 6fd33b1..0000000 --- a/backend/scripts/cleanup-tenant-permissions.ts +++ /dev/null @@ -1,127 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -dotenv.config({ path: envPath }); - -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -if (!process.env.DATABASE_URL) { - console.error('DATABASE_URL not found'); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -// 超级管理员专属权限(普通租户不应该有这些权限) -const superAdminOnlyPermissions = [ - 'tenant:create', - 'tenant:update', - 'tenant:delete', -]; - -async function cleanupTenantPermissions() { - try { - console.log('🚀 开始清理普通租户的超级管理员权限...\n'); - - // 1. 获取所有非超级租户 - const normalTenants = await prisma.tenant.findMany({ - where: { - isSuper: { not: 1 }, - validState: 1, - }, - }); - - console.log(`找到 ${normalTenants.length} 个普通租户\n`); - - for (const tenant of normalTenants) { - console.log(`处理租户: ${tenant.name} (${tenant.code})`); - - // 2. 找到该租户下的超级管理员专属权限 - const permissionsToRemove = await prisma.permission.findMany({ - where: { - tenantId: tenant.id, - code: { in: superAdminOnlyPermissions }, - }, - }); - - if (permissionsToRemove.length === 0) { - console.log(` ✓ 没有需要清理的权限\n`); - continue; - } - - const permissionIds = permissionsToRemove.map((p) => p.id); - console.log(` 找到 ${permissionsToRemove.length} 个需要清理的权限: ${permissionsToRemove.map((p) => p.code).join(', ')}`); - - // 3. 删除角色-权限关联 - const deletedRolePermissions = await prisma.rolePermission.deleteMany({ - where: { - permissionId: { in: permissionIds }, - }, - }); - console.log(` 删除了 ${deletedRolePermissions.count} 条角色-权限关联`); - - // 4. 删除权限记录 - const deletedPermissions = await prisma.permission.deleteMany({ - where: { - id: { in: permissionIds }, - }, - }); - console.log(` 删除了 ${deletedPermissions.count} 条权限记录\n`); - } - - // 5. 更新租户管理菜单权限 - console.log('更新租户管理菜单权限...'); - const tenantMenu = await prisma.menu.findFirst({ - where: { - name: '租户管理', - path: '/system/tenants', - }, - }); - - if (tenantMenu) { - if (tenantMenu.permission !== 'tenant:update') { - await prisma.menu.update({ - where: { id: tenantMenu.id }, - data: { permission: 'tenant:update' }, - }); - console.log(`✅ 菜单权限已更新为 tenant:update (原: ${tenantMenu.permission})`); - } else { - console.log('✅ 菜单权限已经是 tenant:update'); - } - } else { - console.log('⚠️ 未找到租户管理菜单'); - } - - console.log('\n✅ 清理完成!'); - console.log('\n说明:'); - console.log(' - 普通租户现在只有 tenant:read 权限(用于读取租户列表)'); - console.log(' - 租户管理菜单需要 tenant:update 权限才能看到'); - console.log(' - 只有超级租户才有 tenant:create/update/delete 权限'); - } catch (error) { - console.error('❌ 清理失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -cleanupTenantPermissions() - .then(() => { - console.log('\n🎉 脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 脚本执行失败:', error); - process.exit(1); - }); diff --git a/backend/scripts/compress.sh b/backend/scripts/compress.sh deleted file mode 100644 index 38e25e7..0000000 --- a/backend/scripts/compress.sh +++ /dev/null @@ -1,219 +0,0 @@ -#!/bin/bash - -# 压缩脚本 -# 使用方法: -# ./scripts/compress.sh # 使用默认配置(不包含 node_modules) -# ./scripts/compress.sh --include-node-modules # 使用默认配置(包含 node_modules) -# ./scripts/compress.sh -n # 使用默认配置(包含 node_modules,简写) -# ./scripts/compress.sh --env production --version 1.0.0 # 指定环境和版本 -# ./scripts/compress.sh --env test --version 1.0.0 -n # 组合使用多个参数 -# ./scripts/compress.sh src/ package.json # 自定义文件/文件夹列表 - -set -e - -# 颜色输出 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# 默认值 -ENV="" -VERSION="" -INCLUDE_NODE_MODULES=false - -# 解析命令行参数 -CUSTOM_ITEMS=() -while [[ $# -gt 0 ]]; do - case $1 in - --include-node-modules|-n) - INCLUDE_NODE_MODULES=true - shift - ;; - --env) - if [ -z "$2" ]; then - echo -e "${RED}错误: --env 参数需要一个值${NC}" - exit 1 - fi - ENV="$2" - shift 2 - ;; - --version) - if [ -z "$2" ]; then - echo -e "${RED}错误: --version 参数需要一个值${NC}" - exit 1 - fi - VERSION="$2" - shift 2 - ;; - *) - CUSTOM_ITEMS+=("$1") - shift - ;; - esac -done - -# 构建输出文件名 -OUTPUT_FILE="competition-management-service" -if [ -n "$ENV" ]; then - OUTPUT_FILE="${OUTPUT_FILE}-${ENV}" -fi -if [ -n "$VERSION" ]; then - OUTPUT_FILE="${OUTPUT_FILE}-${VERSION}" -fi -OUTPUT_FILE="${OUTPUT_FILE}.tgz" - -# 默认要压缩的文件和文件夹(如果用户没有指定) -DEFAULT_ITEMS=( - "dist" - "package.json" - "tsconfig.json" - "ecosystem.config.js" - "prisma/" - ".env" - ".env.development" - ".env.production" - ".env.test" -) - -# 如果指定了包含 node_modules,则添加到默认列表的开头 -if [ "$INCLUDE_NODE_MODULES" = true ]; then - DEFAULT_ITEMS=("node_modules" "${DEFAULT_ITEMS[@]}") -fi - -# 排除的文件和文件夹模式 -EXCLUDE_PATTERNS=( - "docs/" - "scripts/" - "sql/" - ".git" - ".DS_Store" - "*.log" - "./logs" - "coverage" - "*.tmp" - "*.temp" - ".cache" - ".pnpm-store" -) - -# 获取脚本所在目录 -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" - -# 切换到项目根目录 -cd "$PROJECT_ROOT" - -echo -e "${GREEN}📦 开始压缩项目...${NC}" -if [ -n "$ENV" ]; then - echo -e "${BLUE}环境: ${ENV}${NC}" -fi -if [ -n "$VERSION" ]; then - echo -e "${BLUE}版本: ${VERSION}${NC}" -fi -echo "" - -# 确定要压缩的文件和文件夹 -if [ ${#CUSTOM_ITEMS[@]} -eq 0 ]; then - if [ "$INCLUDE_NODE_MODULES" = true ]; then - echo -e "${YELLOW}未指定文件/文件夹,使用默认配置(包含 node_modules)${NC}" - else - echo -e "${YELLOW}未指定文件/文件夹,使用默认配置(不包含 node_modules)${NC}" - fi - ITEMS_TO_COMPRESS=("${DEFAULT_ITEMS[@]}") -else - echo -e "${YELLOW}使用自定义文件/文件夹列表${NC}" - ITEMS_TO_COMPRESS=("${CUSTOM_ITEMS[@]}") -fi - -# 验证文件和文件夹是否存在 -echo -e "${BLUE}检查文件/文件夹是否存在...${NC}" -MISSING_ITEMS=() -for item in "${ITEMS_TO_COMPRESS[@]}"; do - if [ ! -e "$item" ]; then - MISSING_ITEMS+=("$item") - echo -e "${RED} ⚠️ 警告: $item 不存在,将被跳过${NC}" - else - echo -e "${GREEN} ✅ $item${NC}" - fi -done - -# 如果有缺失的文件,询问是否继续 -if [ ${#MISSING_ITEMS[@]} -gt 0 ]; then - echo "" - echo -e "${YELLOW}发现 ${#MISSING_ITEMS[@]} 个不存在的文件/文件夹${NC}" - read -p "是否继续压缩? (y/n) " -n 1 -r - echo "" - if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo -e "${RED}已取消压缩${NC}" - exit 1 - fi -fi - -# 构建 tar 排除选项 -EXCLUDE_ARGS=() -for pattern in "${EXCLUDE_PATTERNS[@]}"; do - EXCLUDE_ARGS+=(--exclude="$pattern") -done - -# 如果输出文件已存在,询问是否覆盖 -if [ -f "$OUTPUT_FILE" ]; then - echo "" - echo -e "${YELLOW}输出文件 $OUTPUT_FILE 已存在${NC}" - read -p "是否覆盖? (y/n) " -n 1 -r - echo "" - if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo -e "${RED}已取消压缩${NC}" - exit 1 - fi - rm -f "$OUTPUT_FILE" -fi - -# 执行压缩 -echo "" -echo -e "${BLUE}正在压缩...${NC}" - -# 使用 tar 压缩 -tar -czf "$OUTPUT_FILE" \ - "${EXCLUDE_ARGS[@]}" \ - "${ITEMS_TO_COMPRESS[@]}" 2>/dev/null || { - echo -e "${RED}压缩失败${NC}" - exit 1 -} - -# 检查压缩结果 -if [ ! -f "$OUTPUT_FILE" ]; then - echo -e "${RED}错误: 压缩文件未生成${NC}" - exit 1 -fi - -# 显示压缩文件信息 -FILE_SIZE=$(du -h "$OUTPUT_FILE" | cut -f1) -echo "" -echo -e "${GREEN}═══════════════════════════════════════${NC}" -echo -e "${GREEN}✅ 压缩完成!${NC}" -echo -e "${GREEN}═══════════════════════════════════════${NC}" -echo "" -echo "📦 输出文件: $OUTPUT_FILE" -echo "📊 文件大小: $FILE_SIZE" -echo "📍 位置: $(pwd)/$OUTPUT_FILE" -if [ -n "$ENV" ]; then - echo "🌍 环境: $ENV" -fi -if [ -n "$VERSION" ]; then - echo "🏷️ 版本: $VERSION" -fi -echo "" -echo "📝 已压缩的内容:" -for item in "${ITEMS_TO_COMPRESS[@]}"; do - if [ -e "$item" ]; then - echo " ✅ $item" - fi -done -echo "" -echo "🚫 已排除的内容:" -for pattern in "${EXCLUDE_PATTERNS[@]}"; do - echo " ❌ $pattern" -done -echo "" diff --git a/backend/scripts/init-admin-permissions.ts b/backend/scripts/init-admin-permissions.ts deleted file mode 100644 index e18b730..0000000 --- a/backend/scripts/init-admin-permissions.ts +++ /dev/null @@ -1,598 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck - -// 加载环境变量(必须在其他导入之前) -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -// scripts 目录的父目录就是 backend 目录 -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -// 尝试加载环境特定的配置文件 -dotenv.config({ path: envPath }); - -// 如果环境特定文件不存在,尝试加载默认的 .env 文件 -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -// 验证必要的环境变量 -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - console.error(` 请确保存在以下文件之一:`); - console.error(` - ${envPath}`); - console.error(` - ${path.resolve(backendDir, '.env')}`); - console.error(` 或者设置 NODE_ENV 环境变量(当前: ${nodeEnv})`); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -// 定义所有基础权限 -const permissions = [ - // 用户管理权限 - { - code: 'user:create', - resource: 'user', - action: 'create', - name: '创建用户', - description: '允许创建新用户', - }, - { - code: 'user:read', - resource: 'user', - action: 'read', - name: '查看用户', - description: '允许查看用户列表和详情', - }, - { - code: 'user:update', - resource: 'user', - action: 'update', - name: '更新用户', - description: '允许更新用户信息', - }, - { - code: 'user:delete', - resource: 'user', - action: 'delete', - name: '删除用户', - description: '允许删除用户', - }, - - // 角色管理权限 - { - code: 'role:create', - resource: 'role', - action: 'create', - name: '创建角色', - description: '允许创建新角色', - }, - { - code: 'role:read', - resource: 'role', - action: 'read', - name: '查看角色', - description: '允许查看角色列表和详情', - }, - { - code: 'role:update', - resource: 'role', - action: 'update', - name: '更新角色', - description: '允许更新角色信息', - }, - { - code: 'role:delete', - resource: 'role', - action: 'delete', - name: '删除角色', - description: '允许删除角色', - }, - { - code: 'role:assign', - resource: 'role', - action: 'assign', - name: '分配角色', - description: '允许给用户分配角色', - }, - - // 权限管理权限 - { - code: 'permission:create', - resource: 'permission', - action: 'create', - name: '创建权限', - description: '允许创建新权限', - }, - { - code: 'permission:read', - resource: 'permission', - action: 'read', - name: '查看权限', - description: '允许查看权限列表和详情', - }, - { - code: 'permission:update', - resource: 'permission', - action: 'update', - name: '更新权限', - description: '允许更新权限信息', - }, - { - code: 'permission:delete', - resource: 'permission', - action: 'delete', - name: '删除权限', - description: '允许删除权限', - }, - - // 菜单管理权限 - { - code: 'menu:create', - resource: 'menu', - action: 'create', - name: '创建菜单', - description: '允许创建新菜单', - }, - { - code: 'menu:read', - resource: 'menu', - action: 'read', - name: '查看菜单', - description: '允许查看菜单列表和详情', - }, - { - code: 'menu:update', - resource: 'menu', - action: 'update', - name: '更新菜单', - description: '允许更新菜单信息', - }, - { - code: 'menu:delete', - resource: 'menu', - action: 'delete', - name: '删除菜单', - description: '允许删除菜单', - }, - - // 数据字典权限 - { - code: 'dict:create', - resource: 'dict', - action: 'create', - name: '创建字典', - description: '允许创建新字典', - }, - { - code: 'dict:read', - resource: 'dict', - action: 'read', - name: '查看字典', - description: '允许查看字典列表和详情', - }, - { - code: 'dict:update', - resource: 'dict', - action: 'update', - name: '更新字典', - description: '允许更新字典信息', - }, - { - code: 'dict:delete', - resource: 'dict', - action: 'delete', - name: '删除字典', - description: '允许删除字典', - }, - - // 系统配置权限 - { - code: 'config:create', - resource: 'config', - action: 'create', - name: '创建配置', - description: '允许创建新配置', - }, - { - code: 'config:read', - resource: 'config', - action: 'read', - name: '查看配置', - description: '允许查看配置列表和详情', - }, - { - code: 'config:update', - resource: 'config', - action: 'update', - name: '更新配置', - description: '允许更新配置信息', - }, - { - code: 'config:delete', - resource: 'config', - action: 'delete', - name: '删除配置', - description: '允许删除配置', - }, - - // 日志管理权限 - { - code: 'log:read', - resource: 'log', - action: 'read', - name: '查看日志', - description: '允许查看系统日志', - }, - { - code: 'log:delete', - resource: 'log', - action: 'delete', - name: '删除日志', - description: '允许删除系统日志', - }, - - // 活动管理权限 - { - code: 'contest:create', - resource: 'contest', - action: 'create', - name: '创建活动', - description: '允许创建新活动', - }, - { - code: 'contest:read', - resource: 'contest', - action: 'read', - name: '查看活动', - description: '允许查看活动列表和详情', - }, - { - code: 'contest:update', - resource: 'contest', - action: 'update', - name: '更新活动', - description: '允许更新活动信息', - }, - { - code: 'contest:delete', - resource: 'contest', - action: 'delete', - name: '删除活动', - description: '允许删除活动', - }, - { - code: 'contest:publish', - resource: 'contest', - action: 'publish', - name: '发布活动', - description: '允许发布和撤回活动', - }, - - // 活动公告权限 - { - code: 'notice:create', - resource: 'notice', - action: 'create', - name: '创建公告', - description: '允许创建活动公告', - }, - { - code: 'notice:read', - resource: 'notice', - action: 'read', - name: '查看公告', - description: '允许查看活动公告', - }, - { - code: 'notice:update', - resource: 'notice', - action: 'update', - name: '更新公告', - description: '允许更新活动公告', - }, - { - code: 'notice:delete', - resource: 'notice', - action: 'delete', - name: '删除公告', - description: '允许删除活动公告', - }, - - // 报名管理权限 - { - code: 'registration:read', - resource: 'registration', - action: 'read', - name: '查看报名', - description: '允许查看报名列表', - }, - { - code: 'registration:audit', - resource: 'registration', - action: 'audit', - name: '审核报名', - description: '允许审核报名申请', - }, - - // 作品管理权限 - { - code: 'work:read', - resource: 'work', - action: 'read', - name: '查看作品', - description: '允许查看参赛作品', - }, - { - code: 'work:update', - resource: 'work', - action: 'update', - name: '更新作品', - description: '允许更新作品状态', - }, - - // 评审管理权限 - { - code: 'review:read', - resource: 'review', - action: 'read', - name: '查看评审', - description: '允许查看评审信息', - }, - { - code: 'review:assign', - resource: 'review', - action: 'assign', - name: '分配评审', - description: '允许分配作品给评委', - }, - { - code: 'review:score', - resource: 'review', - action: 'score', - name: '评分', - description: '允许对作品进行评分', - }, - - // 评委管理权限 - { - code: 'judge:create', - resource: 'judge', - action: 'create', - name: '添加评委', - description: '允许添加活动评委', - }, - { - code: 'judge:read', - resource: 'judge', - action: 'read', - name: '查看评委', - description: '允许查看评委列表', - }, - { - code: 'judge:delete', - resource: 'judge', - action: 'delete', - name: '移除评委', - description: '允许移除活动评委', - }, - - // 成果管理权限 - { - code: 'result:read', - resource: 'result', - action: 'read', - name: '查看成果', - description: '允许查看成果信息', - }, - { - code: 'result:publish', - resource: 'result', - action: 'publish', - name: '发布成果', - description: '允许发布活动结果', - }, - { - code: 'result:award', - resource: 'result', - action: 'award', - name: '设置奖项', - description: '允许设置作品奖项', - }, - - // 用户密码管理权限 - { - code: 'user:password:update', - resource: 'user', - action: 'password:update', - name: '修改用户密码', - description: '允许修改用户密码', - }, -]; - -async function initAdminPermissions() { - try { - console.log('🚀 开始为超级管理员(admin)用户初始化权限...\n'); - - // 1. 检查 admin 用户是否存在(先获取超级租户) - console.log('👤 步骤 1: 检查 admin 用户...'); - const superTenant = await prisma.tenant.findUnique({ - where: { code: 'super' }, - }); - if (!superTenant) { - console.error('❌ 错误: 超级租户不存在!'); - console.error(' 请先运行 pnpm init:super-tenant 创建超级租户'); - process.exit(1); - } - const adminUser = await prisma.user.findUnique({ - where: { tenantId_username: { tenantId: superTenant.id, username: 'admin' } }, - }); - - if (!adminUser) { - console.error('❌ 错误: admin 用户不存在!'); - console.error(' 请先运行 pnpm init:admin 创建 admin 用户'); - process.exit(1); - } - console.log( - `✅ admin 用户存在: ${adminUser.username} (${adminUser.nickname})\n`, - ); - - // 2. 创建或更新所有权限 - console.log('📝 步骤 2: 确保所有权限存在...'); - const createdPermissions = []; - for (const perm of permissions) { - const permission = await prisma.permission.upsert({ - where: { tenantId_code: { tenantId: superTenant.id, code: perm.code } }, - update: { - name: perm.name, - resource: perm.resource, - action: perm.action, - description: perm.description, - }, - create: { ...perm, tenantId: superTenant.id }, - }); - createdPermissions.push(permission); - } - console.log(`✅ 共确保 ${createdPermissions.length} 个权限存在\n`); - - // 3. 创建或获取超级管理员角色 - console.log('👤 步骤 3: 确保超级管理员角色存在...'); - const adminRole = await prisma.role.upsert({ - where: { tenantId_code: { tenantId: superTenant.id, code: 'super_admin' } }, - update: { - name: '超级管理员', - description: '拥有系统所有权限的超级管理员角色', - validState: 1, - }, - create: { - tenantId: superTenant.id, - name: '超级管理员', - code: 'super_admin', - description: '拥有系统所有权限的超级管理员角色', - validState: 1, - }, - }); - console.log( - `✅ 超级管理员角色已确保存在: ${adminRole.name} (${adminRole.code})\n`, - ); - - // 4. 确保超级管理员角色拥有所有权限 - console.log('🔗 步骤 4: 为超级管理员角色分配所有权限...'); - const existingRolePermissions = await prisma.rolePermission.findMany({ - where: { roleId: adminRole.id }, - select: { permissionId: true }, - }); - const existingPermissionIds = new Set( - existingRolePermissions.map((rp) => rp.permissionId), - ); - - let addedCount = 0; - for (const permission of createdPermissions) { - if (!existingPermissionIds.has(permission.id)) { - await prisma.rolePermission.create({ - data: { - roleId: adminRole.id, - permissionId: permission.id, - }, - }); - addedCount++; - } - } - - if (addedCount > 0) { - console.log(`✅ 为超级管理员角色添加了 ${addedCount} 个权限\n`); - } else { - console.log( - `✅ 超级管理员角色已拥有所有权限(${createdPermissions.length} 个)\n`, - ); - } - - // 5. 确保 admin 用户拥有超级管理员角色 - console.log('🔗 步骤 5: 确保 admin 用户拥有超级管理员角色...'); - const existingUserRole = await prisma.userRole.findUnique({ - where: { - userId_roleId: { - userId: adminUser.id, - roleId: adminRole.id, - }, - }, - }); - - if (!existingUserRole) { - await prisma.userRole.create({ - data: { - userId: adminUser.id, - roleId: adminRole.id, - }, - }); - console.log(`✅ 已为 admin 用户分配超级管理员角色\n`); - } else { - console.log(`✅ admin 用户已拥有超级管理员角色\n`); - } - - // 6. 验证结果 - console.log('🔍 步骤 6: 验证结果...'); - const userWithRoles = await prisma.user.findUnique({ - where: { id: adminUser.id }, - include: { - roles: { - include: { - role: { - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }, - }, - }, - }, - }); - - const roleCodes = userWithRoles?.roles.map((ur) => ur.role.code) || []; - const permissionCodes = new Set(); - userWithRoles?.roles.forEach((ur) => { - ur.role.permissions.forEach((rp) => { - permissionCodes.add(rp.permission.code); - }); - }); - - console.log(`\n📊 初始化结果:`); - console.log(` 用户名: ${adminUser.username}`); - console.log(` 昵称: ${adminUser.nickname}`); - console.log(` 角色: ${roleCodes.join(', ')}`); - console.log(` 权限数量: ${permissionCodes.size}`); - console.log(` 权限列表:`); - Array.from(permissionCodes) - .sort() - .forEach((code) => { - console.log(` - ${code}`); - }); - console.log(`\n✅ 超级管理员权限初始化完成!`); - } catch (error) { - console.error('❌ 初始化失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -// 执行初始化 -initAdminPermissions() - .then(() => { - console.log('\n🎉 权限初始化脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 权限初始化脚本执行失败:', error); - process.exit(1); - }); diff --git a/backend/scripts/init-admin.ts b/backend/scripts/init-admin.ts deleted file mode 100644 index 9b95ae6..0000000 --- a/backend/scripts/init-admin.ts +++ /dev/null @@ -1,277 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -// 初始化超级管理员脚本(支持多租户) -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -dotenv.config({ path: envPath }); - -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcrypt'; - -const prisma = new PrismaClient(); - -// 超级管理员基础权限 -const permissions = [ - // 工作台 - { code: 'workbench:read', resource: 'workbench', action: 'read', name: '查看工作台', description: '允许查看工作台' }, - // 用户管理 - { code: 'user:create', resource: 'user', action: 'create', name: '创建用户', description: '允许创建新用户' }, - { code: 'user:read', resource: 'user', action: 'read', name: '查看用户', description: '允许查看用户列表和详情' }, - { code: 'user:update', resource: 'user', action: 'update', name: '更新用户', description: '允许更新用户信息' }, - { code: 'user:delete', resource: 'user', action: 'delete', name: '删除用户', description: '允许删除用户' }, - // 角色管理 - { code: 'role:create', resource: 'role', action: 'create', name: '创建角色', description: '允许创建新角色' }, - { code: 'role:read', resource: 'role', action: 'read', name: '查看角色', description: '允许查看角色列表和详情' }, - { code: 'role:update', resource: 'role', action: 'update', name: '更新角色', description: '允许更新角色信息' }, - { code: 'role:delete', resource: 'role', action: 'delete', name: '删除角色', description: '允许删除角色' }, - { code: 'role:assign', resource: 'role', action: 'assign', name: '分配角色', description: '允许给用户分配角色' }, - // 权限管理 - { code: 'permission:read', resource: 'permission', action: 'read', name: '查看权限', description: '允许查看权限列表' }, - // 菜单管理 - { code: 'menu:read', resource: 'menu', action: 'read', name: '查看菜单', description: '允许查看菜单列表' }, - // 租户管理 - { code: 'tenant:create', resource: 'tenant', action: 'create', name: '创建租户', description: '允许创建租户' }, - { code: 'tenant:read', resource: 'tenant', action: 'read', name: '查看租户', description: '允许查看租户列表' }, - { code: 'tenant:update', resource: 'tenant', action: 'update', name: '更新租户', description: '允许更新租户信息' }, - { code: 'tenant:delete', resource: 'tenant', action: 'delete', name: '删除租户', description: '允许删除租户' }, - // 活动管理 - { code: 'contest:create', resource: 'contest', action: 'create', name: '创建活动', description: '允许创建活动' }, - { code: 'contest:read', resource: 'contest', action: 'read', name: '查看活动', description: '允许查看活动列表' }, - { code: 'contest:update', resource: 'contest', action: 'update', name: '更新活动', description: '允许更新活动信息' }, - { code: 'contest:delete', resource: 'contest', action: 'delete', name: '删除活动', description: '允许删除活动' }, - { code: 'contest:publish', resource: 'contest', action: 'publish', name: '发布活动', description: '允许发布活动' }, - { code: 'contest:finish', resource: 'contest', action: 'finish', name: '结束活动', description: '允许结束活动' }, - // 评审规则 - { code: 'review-rule:create', resource: 'review-rule', action: 'create', name: '创建评审规则', description: '允许创建评审规则' }, - { code: 'review-rule:read', resource: 'review-rule', action: 'read', name: '查看评审规则', description: '允许查看评审规则' }, - { code: 'review-rule:update', resource: 'review-rule', action: 'update', name: '更新评审规则', description: '允许更新评审规则' }, - { code: 'review-rule:delete', resource: 'review-rule', action: 'delete', name: '删除评审规则', description: '允许删除评审规则' }, - // 评委管理 - { code: 'judge:create', resource: 'judge', action: 'create', name: '添加评委', description: '允许添加评委' }, - { code: 'judge:read', resource: 'judge', action: 'read', name: '查看评委', description: '允许查看评委列表' }, - { code: 'judge:update', resource: 'judge', action: 'update', name: '更新评委', description: '允许更新评委信息' }, - { code: 'judge:delete', resource: 'judge', action: 'delete', name: '删除评委', description: '允许删除评委' }, - { code: 'judge:assign', resource: 'judge', action: 'assign', name: '分配评委', description: '允许为活动分配评委' }, - // 报名管理 - { code: 'registration:read', resource: 'registration', action: 'read', name: '查看报名', description: '允许查看报名记录' }, - { code: 'registration:approve', resource: 'registration', action: 'approve', name: '审核报名', description: '允许审核报名' }, - // 作品管理 - { code: 'work:read', resource: 'work', action: 'read', name: '查看作品', description: '允许查看参赛作品' }, - // 公告管理 - { code: 'notice:create', resource: 'notice', action: 'create', name: '创建公告', description: '允许创建活动公告' }, - { code: 'notice:read', resource: 'notice', action: 'read', name: '查看公告', description: '允许查看活动公告' }, - { code: 'notice:update', resource: 'notice', action: 'update', name: '更新公告', description: '允许更新公告信息' }, - { code: 'notice:delete', resource: 'notice', action: 'delete', name: '删除公告', description: '允许删除公告' }, - // 系统管理 - { code: 'dict:create', resource: 'dict', action: 'create', name: '创建字典', description: '允许创建新字典' }, - { code: 'dict:read', resource: 'dict', action: 'read', name: '查看字典', description: '允许查看字典列表和详情' }, - { code: 'dict:update', resource: 'dict', action: 'update', name: '更新字典', description: '允许更新字典信息' }, - { code: 'dict:delete', resource: 'dict', action: 'delete', name: '删除字典', description: '允许删除字典' }, - { code: 'config:create', resource: 'config', action: 'create', name: '创建配置', description: '允许创建新配置' }, - { code: 'config:read', resource: 'config', action: 'read', name: '查看配置', description: '允许查看配置列表和详情' }, - { code: 'config:update', resource: 'config', action: 'update', name: '更新配置', description: '允许更新配置信息' }, - { code: 'config:delete', resource: 'config', action: 'delete', name: '删除配置', description: '允许删除配置' }, - { code: 'log:read', resource: 'log', action: 'read', name: '查看日志', description: '允许查看系统日志' }, - { code: 'log:delete', resource: 'log', action: 'delete', name: '删除日志', description: '允许删除系统日志' }, -]; - -async function initAdmin() { - try { - console.log('🚀 开始初始化超级管理员...\n'); - - // 1. 获取或创建超级租户 - console.log('🏢 步骤 1: 获取超级租户...'); - let superTenant = await prisma.tenant.findFirst({ - where: { isSuper: 1, validState: 1 } - }); - - if (!superTenant) { - console.log(' 未找到超级租户,正在创建...'); - superTenant = await prisma.tenant.create({ - data: { - name: '超级租户', - code: 'super', - isSuper: 1, - validState: 1, - } - }); - console.log(` ✓ 创建超级租户: ${superTenant.name} (${superTenant.code})`); - } else { - console.log(` ✓ 找到超级租户: ${superTenant.name} (ID: ${superTenant.id})`); - } - - const tenantId = superTenant.id; - - // 2. 创建权限 - console.log('\n📝 步骤 2: 创建基础权限...'); - const createdPermissions: any[] = []; - - for (const perm of permissions) { - // 使用 tenantId + code 作为唯一约束 - let permission = await prisma.permission.findFirst({ - where: { tenantId, code: perm.code } - }); - - if (permission) { - permission = await prisma.permission.update({ - where: { id: permission.id }, - data: { ...perm, tenantId } - }); - } else { - permission = await prisma.permission.create({ - data: { ...perm, tenantId, validState: 1 } - }); - } - - createdPermissions.push(permission); - } - console.log(` ✓ 共创建/更新 ${createdPermissions.length} 个权限`); - - // 3. 创建超级管理员角色 - console.log('\n👤 步骤 3: 创建超级管理员角色...'); - let adminRole = await prisma.role.findFirst({ - where: { tenantId, code: 'super_admin' } - }); - - if (adminRole) { - adminRole = await prisma.role.update({ - where: { id: adminRole.id }, - data: { - name: '超级管理员', - description: '拥有系统所有权限的超级管理员角色', - } - }); - console.log(` ✓ 更新角色: ${adminRole.name}`); - } else { - adminRole = await prisma.role.create({ - data: { - tenantId, - name: '超级管理员', - code: 'super_admin', - description: '拥有系统所有权限的超级管理员角色', - validState: 1, - } - }); - console.log(` ✓ 创建角色: ${adminRole.name}`); - } - - // 4. 分配权限给角色 - console.log('\n🔗 步骤 4: 分配权限给角色...'); - // 先获取已有的角色权限 - const existingRolePermissions = await prisma.rolePermission.findMany({ - where: { roleId: adminRole.id }, - select: { permissionId: true } - }); - const existingPermissionIds = new Set(existingRolePermissions.map(rp => rp.permissionId)); - - let addedCount = 0; - for (const perm of createdPermissions) { - if (!existingPermissionIds.has(perm.id)) { - await prisma.rolePermission.create({ - data: { - roleId: adminRole.id, - permissionId: perm.id, - } - }); - addedCount++; - } - } - console.log(` ✓ 新增 ${addedCount} 个权限分配`); - - // 5. 创建 admin 用户 - console.log('\n👤 步骤 5: 创建 admin 用户...'); - const password = `admin@${superTenant.code}`; - const hashedPassword = await bcrypt.hash(password, 10); - - let adminUser = await prisma.user.findFirst({ - where: { tenantId, username: 'admin' } - }); - - if (adminUser) { - adminUser = await prisma.user.update({ - where: { id: adminUser.id }, - data: { - password: hashedPassword, - nickname: '超级管理员', - validState: 1, - } - }); - console.log(` ✓ 更新用户: ${adminUser.username}`); - } else { - adminUser = await prisma.user.create({ - data: { - tenantId, - username: 'admin', - password: hashedPassword, - nickname: '超级管理员', - validState: 1, - } - }); - console.log(` ✓ 创建用户: ${adminUser.username}`); - } - - // 6. 给用户分配角色 - console.log('\n🔗 步骤 6: 分配角色给用户...'); - const existingUserRole = await prisma.userRole.findFirst({ - where: { userId: adminUser.id, roleId: adminRole.id } - }); - - if (!existingUserRole) { - await prisma.userRole.create({ - data: { - userId: adminUser.id, - roleId: adminRole.id, - } - }); - console.log(` ✓ 分配角色: ${adminRole.name}`); - } else { - console.log(` ✓ 角色已分配: ${adminRole.name}`); - } - - // 7. 输出结果 - console.log('\n' + '='.repeat(50)); - console.log('🎉 超级管理员初始化完成!'); - console.log('='.repeat(50)); - console.log(` 租户编码: ${superTenant.code}`); - console.log(` 用户名: admin`); - console.log(` 密码: ${password}`); - console.log(` 角色: ${adminRole.name}`); - console.log(` 权限数量: ${createdPermissions.length}`); - console.log('='.repeat(50)); - console.log('\n💡 提示: 请运行以下命令初始化菜单:'); - console.log(' npm run init:menus'); - - } catch (error) { - console.error('❌ 初始化失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -// 执行初始化 -initAdmin() - .then(() => { - console.log('\n✅ 初始化脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 初始化脚本执行失败:', error); - process.exit(1); - }); diff --git a/backend/scripts/init-dev-tenants.ts b/backend/scripts/init-dev-tenants.ts deleted file mode 100644 index a687d93..0000000 --- a/backend/scripts/init-dev-tenants.ts +++ /dev/null @@ -1,438 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -// 批量创建开发测试租户脚本 -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -dotenv.config({ path: envPath }); - -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcrypt'; - -const prisma = new PrismaClient(); - -// ============================================ -// 要创建的租户配置 -// ============================================ -const devTenants = [ - { - name: '学校管理端', - code: 'school', - description: '学校管理员端,管理学校信息、教师、学生等', - roles: [ - { - code: 'school_admin', - name: '学校管理员', - description: '学校管理员', - isDefault: true, - permissions: [ - 'workbench:read', - 'user:create', 'user:read', 'user:update', 'user:delete', - 'role:read', - 'permission:read', - 'school:create', 'school:read', 'school:update', - 'department:create', 'department:read', 'department:update', 'department:delete', - 'grade:create', 'grade:read', 'grade:update', 'grade:delete', - 'class:create', 'class:read', 'class:update', 'class:delete', - 'teacher:create', 'teacher:read', 'teacher:update', 'teacher:delete', - 'student:create', 'student:read', 'student:update', 'student:delete', - 'activity:read', 'notice:read', - 'registration:read', 'work:read', - 'homework:create', 'homework:read', 'homework:update', 'homework:delete', 'homework:publish', - 'homework-submission:read', - 'homework-review-rule:create', 'homework-review-rule:read', 'homework-review-rule:update', 'homework-review-rule:delete', - 'homework-score:read', - ], - }, - ], - menus: ['工作台', '学校管理', '我的评审', '作业管理'], - }, - { - name: '教师端', - code: 'teacher', - description: '教师端,可以报名活动、指导学生、管理作业', - roles: [ - { - code: 'teacher', - name: '教师', - description: '教师角色', - isDefault: true, - permissions: [ - 'workbench:read', - 'grade:read', 'class:read', 'student:read', - 'activity:read', 'activity:guidance', 'notice:read', - 'registration:create', 'registration:read', 'registration:update', 'registration:delete', - 'work:create', 'work:read', 'work:update', 'work:submit', - 'homework:create', 'homework:read', 'homework:update', 'homework:delete', 'homework:publish', - 'homework-submission:read', - 'homework-review-rule:create', 'homework-review-rule:read', 'homework-review-rule:update', 'homework-review-rule:delete', - 'homework-score:create', 'homework-score:read', - ], - }, - ], - menus: ['工作台', '我的评审', '作业管理'], - }, - { - name: '学生端', - code: 'student', - description: '学生端,可以查看活动、上传作品、提交作业', - roles: [ - { - code: 'student', - name: '学生', - description: '学生角色', - isDefault: true, - permissions: [ - 'workbench:read', - 'activity:read', 'notice:read', - 'registration:read', - 'work:create', 'work:read', 'work:update', 'work:submit', - 'homework:read', - 'homework-submission:create', 'homework-submission:read', 'homework-submission:update', - 'homework-score:read', - ], - }, - ], - menus: ['工作台', '我的评审', '作业管理'], - }, - { - name: '评委端', - code: 'judge', - description: '评委端,可以评审作品、打分', - roles: [ - { - code: 'judge', - name: '评委', - description: '评委角色', - isDefault: true, - permissions: [ - 'workbench:read', - 'activity:read', 'notice:read', - 'work:read', - 'judge:read', 'judge:assign', - 'review:read', 'review:create', 'review:update', - ], - }, - ], - menus: ['工作台', '我的评审'], - }, -]; - -// ============================================ -// 权限定义(完整列表) -// ============================================ -const allPermissions = [ - // 工作台 - { code: 'workbench:read', resource: 'workbench', action: 'read', name: '查看工作台', description: '允许查看工作台' }, - - // 用户管理 - { code: 'user:create', resource: 'user', action: 'create', name: '创建用户', description: '允许创建新用户' }, - { code: 'user:read', resource: 'user', action: 'read', name: '查看用户', description: '允许查看用户列表和详情' }, - { code: 'user:update', resource: 'user', action: 'update', name: '更新用户', description: '允许更新用户信息' }, - { code: 'user:delete', resource: 'user', action: 'delete', name: '删除用户', description: '允许删除用户' }, - - // 角色管理 - { code: 'role:create', resource: 'role', action: 'create', name: '创建角色', description: '允许创建新角色' }, - { code: 'role:read', resource: 'role', action: 'read', name: '查看角色', description: '允许查看角色列表和详情' }, - { code: 'role:update', resource: 'role', action: 'update', name: '更新角色', description: '允许更新角色信息' }, - { code: 'role:delete', resource: 'role', action: 'delete', name: '删除角色', description: '允许删除角色' }, - { code: 'role:assign', resource: 'role', action: 'assign', name: '分配角色', description: '允许给用户分配角色' }, - - // 权限管理 - { code: 'permission:read', resource: 'permission', action: 'read', name: '查看权限', description: '允许查看权限列表' }, - - // 学校管理 - { code: 'school:create', resource: 'school', action: 'create', name: '创建学校', description: '允许创建学校信息' }, - { code: 'school:read', resource: 'school', action: 'read', name: '查看学校', description: '允许查看学校信息' }, - { code: 'school:update', resource: 'school', action: 'update', name: '更新学校', description: '允许更新学校信息' }, - { code: 'school:delete', resource: 'school', action: 'delete', name: '删除学校', description: '允许删除学校信息' }, - - // 部门管理 - { code: 'department:create', resource: 'department', action: 'create', name: '创建部门', description: '允许创建部门' }, - { code: 'department:read', resource: 'department', action: 'read', name: '查看部门', description: '允许查看部门列表' }, - { code: 'department:update', resource: 'department', action: 'update', name: '更新部门', description: '允许更新部门信息' }, - { code: 'department:delete', resource: 'department', action: 'delete', name: '删除部门', description: '允许删除部门' }, - - // 年级管理 - { code: 'grade:create', resource: 'grade', action: 'create', name: '创建年级', description: '允许创建年级' }, - { code: 'grade:read', resource: 'grade', action: 'read', name: '查看年级', description: '允许查看年级列表' }, - { code: 'grade:update', resource: 'grade', action: 'update', name: '更新年级', description: '允许更新年级信息' }, - { code: 'grade:delete', resource: 'grade', action: 'delete', name: '删除年级', description: '允许删除年级' }, - - // 班级管理 - { code: 'class:create', resource: 'class', action: 'create', name: '创建班级', description: '允许创建班级' }, - { code: 'class:read', resource: 'class', action: 'read', name: '查看班级', description: '允许查看班级列表' }, - { code: 'class:update', resource: 'class', action: 'update', name: '更新班级', description: '允许更新班级信息' }, - { code: 'class:delete', resource: 'class', action: 'delete', name: '删除班级', description: '允许删除班级' }, - - // 教师管理 - { code: 'teacher:create', resource: 'teacher', action: 'create', name: '创建教师', description: '允许创建教师' }, - { code: 'teacher:read', resource: 'teacher', action: 'read', name: '查看教师', description: '允许查看教师列表' }, - { code: 'teacher:update', resource: 'teacher', action: 'update', name: '更新教师', description: '允许更新教师信息' }, - { code: 'teacher:delete', resource: 'teacher', action: 'delete', name: '删除教师', description: '允许删除教师' }, - - // 学生管理 - { code: 'student:create', resource: 'student', action: 'create', name: '创建学生', description: '允许创建学生' }, - { code: 'student:read', resource: 'student', action: 'read', name: '查看学生', description: '允许查看学生列表' }, - { code: 'student:update', resource: 'student', action: 'update', name: '更新学生', description: '允许更新学生信息' }, - { code: 'student:delete', resource: 'student', action: 'delete', name: '删除学生', description: '允许删除学生' }, - - // 我的评审 - { code: 'activity:read', resource: 'activity', action: 'read', name: '查看我的评审', description: '允许查看已发布的我的评审' }, - { code: 'activity:guidance', resource: 'activity', action: 'guidance', name: '指导学生', description: '允许指导学生参赛' }, - - // 活动报名 - { code: 'registration:create', resource: 'registration', action: 'create', name: '创建报名', description: '允许报名活动' }, - { code: 'registration:read', resource: 'registration', action: 'read', name: '查看报名', description: '允许查看报名记录' }, - { code: 'registration:update', resource: 'registration', action: 'update', name: '更新报名', description: '允许更新报名信息' }, - { code: 'registration:delete', resource: 'registration', action: 'delete', name: '取消报名', description: '允许取消报名' }, - { code: 'registration:approve', resource: 'registration', action: 'approve', name: '审核报名', description: '允许审核报名' }, - - // 参赛作品 - { code: 'work:create', resource: 'work', action: 'create', name: '上传作品', description: '允许上传参赛作品' }, - { code: 'work:read', resource: 'work', action: 'read', name: '查看作品', description: '允许查看参赛作品' }, - { code: 'work:update', resource: 'work', action: 'update', name: '更新作品', description: '允许更新作品信息' }, - { code: 'work:delete', resource: 'work', action: 'delete', name: '删除作品', description: '允许删除作品' }, - { code: 'work:submit', resource: 'work', action: 'submit', name: '提交作品', description: '允许提交作品' }, - - // 活动公告 - { code: 'notice:read', resource: 'notice', action: 'read', name: '查看公告', description: '允许查看活动公告' }, - - // 评委管理 - { code: 'judge:create', resource: 'judge', action: 'create', name: '创建评委', description: '允许创建评委' }, - { code: 'judge:read', resource: 'judge', action: 'read', name: '查看评委', description: '允许查看评委' }, - { code: 'judge:update', resource: 'judge', action: 'update', name: '更新评委', description: '允许更新评委' }, - { code: 'judge:delete', resource: 'judge', action: 'delete', name: '删除评委', description: '允许删除评委' }, - { code: 'judge:assign', resource: 'judge', action: 'assign', name: '分配评委', description: '允许分配评委' }, - - // 评审 - { code: 'review:create', resource: 'review', action: 'create', name: '创建评审', description: '允许创建评审' }, - { code: 'review:read', resource: 'review', action: 'read', name: '查看评审', description: '允许查看评审' }, - { code: 'review:update', resource: 'review', action: 'update', name: '更新评审', description: '允许更新评审' }, - { code: 'review:delete', resource: 'review', action: 'delete', name: '删除评审', description: '允许删除评审' }, - - // 作业管理 - { code: 'homework:create', resource: 'homework', action: 'create', name: '创建作业', description: '允许创建作业' }, - { code: 'homework:read', resource: 'homework', action: 'read', name: '查看作业', description: '允许查看作业列表' }, - { code: 'homework:update', resource: 'homework', action: 'update', name: '更新作业', description: '允许更新作业信息' }, - { code: 'homework:delete', resource: 'homework', action: 'delete', name: '删除作业', description: '允许删除作业' }, - { code: 'homework:publish', resource: 'homework', action: 'publish', name: '发布作业', description: '允许发布作业' }, - - // 作业提交 - { code: 'homework-submission:create', resource: 'homework-submission', action: 'create', name: '提交作业', description: '允许提交作业' }, - { code: 'homework-submission:read', resource: 'homework-submission', action: 'read', name: '查看作业提交', description: '允许查看作业提交记录' }, - { code: 'homework-submission:update', resource: 'homework-submission', action: 'update', name: '更新作业提交', description: '允许更新提交的作业' }, - - // 作业评审规则 - { code: 'homework-review-rule:create', resource: 'homework-review-rule', action: 'create', name: '创建作业评审规则', description: '允许创建作业评审规则' }, - { code: 'homework-review-rule:read', resource: 'homework-review-rule', action: 'read', name: '查看作业评审规则', description: '允许查看作业评审规则' }, - { code: 'homework-review-rule:update', resource: 'homework-review-rule', action: 'update', name: '更新作业评审规则', description: '允许更新作业评审规则' }, - { code: 'homework-review-rule:delete', resource: 'homework-review-rule', action: 'delete', name: '删除作业评审规则', description: '允许删除作业评审规则' }, - - // 作业评分 - { code: 'homework-score:create', resource: 'homework-score', action: 'create', name: '作业评分', description: '允许对作业评分' }, - { code: 'homework-score:read', resource: 'homework-score', action: 'read', name: '查看作业评分', description: '允许查看作业评分' }, -]; - -async function initDevTenants() { - console.log('🚀 开始批量创建开发测试租户...\n'); - - try { - // 获取所有菜单 - const allMenus = await prisma.menu.findMany({ - orderBy: [{ sort: 'asc' }, { id: 'asc' }], - }); - - const results: any[] = []; - - for (const tenantConfig of devTenants) { - console.log(`\n${'='.repeat(50)}`); - console.log(`📦 创建租户: ${tenantConfig.name}`); - console.log('='.repeat(50)); - - // 检查是否已存在 - const existingTenant = await prisma.tenant.findFirst({ - where: { code: tenantConfig.code } - }); - - if (existingTenant) { - console.log(` ⚠️ 租户 "${tenantConfig.code}" 已存在,跳过创建`); - results.push({ - name: tenantConfig.name, - code: tenantConfig.code, - status: 'skipped', - username: 'admin', - password: `admin@${tenantConfig.code}`, - }); - continue; - } - - // 1. 创建租户 - console.log('\n 🏢 步骤 1: 创建租户...'); - const tenant = await prisma.tenant.create({ - data: { - name: tenantConfig.name, - code: tenantConfig.code, - description: tenantConfig.description, - isSuper: 0, - validState: 1, - } - }); - console.log(` ✓ 租户创建成功: ${tenant.name} (${tenant.code})`); - - const tenantId = tenant.id; - - // 2. 创建权限 - console.log('\n 📝 步骤 2: 创建权限...'); - const createdPermissions: { [code: string]: number } = {}; - - for (const perm of allPermissions) { - const existingPerm = await prisma.permission.findFirst({ - where: { code: perm.code, tenantId } - }); - - if (!existingPerm) { - const permission = await prisma.permission.create({ - data: { ...perm, tenantId, validState: 1 } - }); - createdPermissions[perm.code] = permission.id; - } else { - createdPermissions[perm.code] = existingPerm.id; - } - } - console.log(` ✓ 共 ${Object.keys(createdPermissions).length} 个权限`); - - // 3. 创建角色并分配权限 - console.log('\n 👥 步骤 3: 创建角色...'); - let defaultRoleId: number | null = null; - - for (const roleConfig of tenantConfig.roles) { - const role = await prisma.role.create({ - data: { - tenantId, - name: roleConfig.name, - code: roleConfig.code, - description: roleConfig.description, - validState: 1, - } - }); - - // 分配权限 - for (const permCode of roleConfig.permissions) { - const permissionId = createdPermissions[permCode]; - if (permissionId) { - await prisma.rolePermission.create({ - data: { roleId: role.id, permissionId } - }); - } - } - - if (roleConfig.isDefault) { - defaultRoleId = role.id; - } - console.log(` ✓ 角色: ${role.name} (${roleConfig.permissions.length} 个权限)`); - } - - // 4. 创建管理员用户 - console.log('\n 👤 步骤 4: 创建管理员用户...'); - const password = `admin@${tenantConfig.code}`; - const hashedPassword = await bcrypt.hash(password, 10); - - const adminUser = await prisma.user.create({ - data: { - tenantId, - username: 'admin', - password: hashedPassword, - nickname: `${tenantConfig.name}管理员`, - validState: 1, - } - }); - console.log(` ✓ 用户: admin`); - - // 5. 分配角色 - if (defaultRoleId) { - await prisma.userRole.create({ - data: { userId: adminUser.id, roleId: defaultRoleId } - }); - console.log(` ✓ 已分配默认角色`); - } - - // 6. 分配菜单 - console.log('\n 📋 步骤 5: 分配菜单...'); - const menuIds = new Set(); - - for (const menu of allMenus) { - // 顶级菜单 - if (!menu.parentId && tenantConfig.menus.includes(menu.name)) { - menuIds.add(menu.id); - } - // 子菜单 - if (menu.parentId) { - const parentMenu = allMenus.find(m => m.id === menu.parentId); - if (parentMenu && tenantConfig.menus.includes(parentMenu.name)) { - menuIds.add(menu.id); - } - } - } - - for (const menuId of menuIds) { - await prisma.tenantMenu.create({ - data: { tenantId: tenant.id, menuId } - }); - } - console.log(` ✓ 分配 ${menuIds.size} 个菜单`); - - results.push({ - name: tenantConfig.name, - code: tenantConfig.code, - status: 'created', - username: 'admin', - password: password, - }); - } - - // 输出汇总 - console.log('\n\n' + '='.repeat(60)); - console.log('🎉 开发测试租户创建完成!'); - console.log('='.repeat(60)); - console.log('\n📝 登录账号汇总:\n'); - console.log('| 端\t\t| 租户编码\t| 用户名\t| 密码\t\t\t|'); - console.log('|---------------|---------------|---------------|-----------------------|'); - for (const r of results) { - console.log(`| ${r.name}\t| ${r.code}\t\t| ${r.username}\t\t| ${r.password}\t\t|`); - } - console.log('\n'); - - } catch (error) { - console.error('❌ 创建失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -// 执行初始化 -initDevTenants() - .then(() => { - console.log('✅ 脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('💥 脚本执行失败:', error); - process.exit(1); - }); diff --git a/backend/scripts/init-guangdong-library.ts b/backend/scripts/init-guangdong-library.ts deleted file mode 100644 index 0c643ae..0000000 --- a/backend/scripts/init-guangdong-library.ts +++ /dev/null @@ -1,193 +0,0 @@ -/** - * 广东省立中山图书馆 - 租户初始化脚本 - * - * 运行方式: - * npx ts-node -r tsconfig-paths/register scripts/init-guangdong-library.ts - * - * 功能: - * 1. 创建广东省图租户(library 类型) - * 2. 创建管理员账号 - * 3. 分配必要的角色和权限 - * 4. 分配菜单 - */ - -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcrypt'; - -const prisma = new PrismaClient(); - -async function main() { - console.log('开始初始化广东省图数据...\n'); - - // 1. 创建租户 - const tenantCode = 'gdlib'; - let tenant = await prisma.tenant.findUnique({ where: { code: tenantCode } }); - - if (tenant) { - console.log(`租户 ${tenantCode} 已存在 (ID: ${tenant.id}),跳过创建`); - } else { - tenant = await prisma.tenant.create({ - data: { - name: '广东省立中山图书馆', - code: tenantCode, - tenantType: 'library', - description: '广东省图少儿绘本创作活动主办方', - isSuper: 0, - validState: 1, - }, - }); - console.log(`创建租户: ${tenant.name} (ID: ${tenant.id})`); - } - - const tenantId = tenant.id; - - // 2. 创建权限 - const permissions = [ - // 活动管理 - { code: 'contest:create', resource: 'contest', action: 'create', name: '创建活动', description: '允许创建活动' }, - { code: 'contest:read', resource: 'contest', action: 'read', name: '查看活动', description: '允许查看活动' }, - { code: 'contest:update', resource: 'contest', action: 'update', name: '更新活动', description: '允许更新活动' }, - { code: 'contest:delete', resource: 'contest', action: 'delete', name: '删除活动', description: '允许删除活动' }, - { code: 'contest:publish', resource: 'contest', action: 'publish', name: '发布活动', description: '允许发布活动' }, - { code: 'contest:finish', resource: 'contest', action: 'finish', name: '结束活动', description: '允许结束活动' }, - // 报名管理 - { code: 'registration:approve', resource: 'registration', action: 'approve', name: '审核报名', description: '允许审核报名' }, - { code: 'registration:read', resource: 'registration', action: 'read', name: '查看报名', description: '允许查看报名记录' }, - // 评委管理 - { code: 'judge:read', resource: 'judge', action: 'read', name: '查看评委', description: '允许查看评委' }, - { code: 'judge:create', resource: 'judge', action: 'create', name: '添加评委', description: '允许添加评委' }, - { code: 'judge:assign', resource: 'judge', action: 'assign', name: '分配评委', description: '允许分配评委' }, - // 评审规则 - { code: 'review-rule:read', resource: 'review-rule', action: 'read', name: '查看评审规则', description: '允许查看评审规则' }, - { code: 'review-rule:create', resource: 'review-rule', action: 'create', name: '创建评审规则', description: '允许创建评审规则' }, - // 成果发布 - { code: 'result:read', resource: 'result', action: 'read', name: '查看成果', description: '允许查看活动成果' }, - { code: 'result:publish', resource: 'result', action: 'publish', name: '发布成果', description: '允许发布活动成果' }, - // 公告 - { code: 'notice:create', resource: 'notice', action: 'create', name: '创建公告', description: '允许创建活动公告' }, - { code: 'notice:read', resource: 'notice', action: 'read', name: '查看公告', description: '允许查看活动公告' }, - // 用户管理 - { code: 'user:read', resource: 'user', action: 'read', name: '查看用户', description: '允许查看用户' }, - { code: 'user:create', resource: 'user', action: 'create', name: '创建用户', description: '允许创建用户' }, - // 角色管理 - { code: 'role:read', resource: 'role', action: 'read', name: '查看角色', description: '允许查看角色' }, - // 菜单 - { code: 'menu:read', resource: 'menu', action: 'read', name: '查看菜单', description: '允许查看菜单' }, - ]; - - const permissionIds: number[] = []; - for (const perm of permissions) { - const existing = await prisma.permission.findFirst({ - where: { tenantId, code: perm.code }, - }); - if (existing) { - permissionIds.push(existing.id); - } else { - const created = await prisma.permission.create({ - data: { ...perm, tenantId, validState: 1 }, - }); - permissionIds.push(created.id); - } - } - console.log(`权限已创建/确认: ${permissionIds.length} 个`); - - // 3. 创建管理员角色 - let adminRole = await prisma.role.findFirst({ - where: { tenantId, code: 'tenant_admin' }, - }); - if (!adminRole) { - adminRole = await prisma.role.create({ - data: { - tenantId, - name: '机构管理员', - code: 'tenant_admin', - description: '广东省图机构管理员,管理活动和报名', - validState: 1, - }, - }); - console.log(`创建角色: ${adminRole.name}`); - } - - // 分配所有权限给管理员角色 - for (const permId of permissionIds) { - const existing = await prisma.rolePermission.findFirst({ - where: { roleId: adminRole.id, permissionId: permId }, - }); - if (!existing) { - await prisma.rolePermission.create({ - data: { roleId: adminRole.id, permissionId: permId }, - }); - } - } - console.log(`角色权限已分配`); - - // 4. 创建管理员账号 - const adminUsername = 'admin'; - let adminUser = await prisma.user.findFirst({ - where: { tenantId, username: adminUsername }, - }); - if (!adminUser) { - const hashedPassword = await bcrypt.hash('admin@gdlib', 10); - adminUser = await prisma.user.create({ - data: { - tenantId, - username: adminUsername, - password: hashedPassword, - nickname: '广东省图管理员', - userSource: 'admin_created', - status: 'enabled', - validState: 1, - roles: { - create: [{ roleId: adminRole.id }], - }, - }, - }); - console.log(`创建管理员: ${adminUsername} / admin@gdlib`); - } else { - console.log(`管理员 ${adminUsername} 已存在`); - } - - // 5. 分配菜单(活动管理 + 系统管理) - const menuNames = ['活动管理', '系统管理']; - const menus = await prisma.menu.findMany({ - where: { name: { in: menuNames }, parentId: null }, - include: { children: true }, - }); - - for (const menu of menus) { - // 分配父菜单 - const existing = await prisma.tenantMenu.findFirst({ - where: { tenantId, menuId: menu.id }, - }); - if (!existing) { - await prisma.tenantMenu.create({ - data: { tenantId, menuId: menu.id }, - }); - } - // 分配子菜单 - for (const child of menu.children || []) { - const childExisting = await prisma.tenantMenu.findFirst({ - where: { tenantId, menuId: child.id }, - }); - if (!childExisting) { - await prisma.tenantMenu.create({ - data: { tenantId, menuId: child.id }, - }); - } - } - } - console.log(`菜单已分配: ${menuNames.join(', ')}`); - - console.log('\n广东省图初始化完成!'); - console.log(`登录地址: /${tenantCode}/login`); - console.log(`账号: admin / admin@gdlib`); -} - -main() - .catch((e) => { - console.error('初始化失败:', e); - process.exit(1); - }) - .finally(async () => { - await prisma.$disconnect(); - }); diff --git a/backend/scripts/init-linksea-tenant.ts b/backend/scripts/init-linksea-tenant.ts deleted file mode 100644 index 4afd223..0000000 --- a/backend/scripts/init-linksea-tenant.ts +++ /dev/null @@ -1,210 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -// 加载环境变量(必须在其他导入之前) -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -// scripts 目录的父目录就是 backend 目录 -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -// 尝试加载环境特定的配置文件 -dotenv.config({ path: envPath }); - -// 如果环境特定文件不存在,尝试加载默认的 .env 文件 -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -// 验证必要的环境变量 -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - console.error(` 请确保存在以下文件之一:`); - console.error(` - ${envPath}`); - console.error(` - ${path.resolve(backendDir, '.env')}`); - console.error(` 或者设置 NODE_ENV 环境变量(当前: ${nodeEnv})`); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -async function main() { - console.log('🚀 开始创建 LinkSea 普通租户...\n'); - - const tenantCode = 'linksea'; - const menuNames = ['活动管理', '系统管理']; - - // 1. 查找或创建租户 - console.log(`📋 步骤 1: 查找或创建租户 "${tenantCode}"...`); - let tenant = await prisma.tenant.findUnique({ - where: { code: tenantCode }, - }); - - if (!tenant) { - // 创建普通租户 - tenant = await prisma.tenant.create({ - data: { - name: 'LinkSea 租户', - code: tenantCode, - domain: tenantCode, - description: 'LinkSea 普通租户', - isSuper: 0, - validState: 1, - }, - }); - console.log(`✅ 租户创建成功: ${tenant.name} (${tenant.code})\n`); - } else { - if (tenant.validState !== 1) { - console.error(`❌ 错误: 租户 "${tenantCode}" 状态无效!`); - process.exit(1); - } - console.log(`✅ 找到租户: ${tenant.name} (${tenant.code})\n`); - } - - // 2. 查找指定的菜单(顶级菜单) - console.log(`📋 步骤 2: 查找菜单 "${menuNames.join('", "')}"...`); - const menus = await prisma.menu.findMany({ - where: { - name: { in: menuNames }, - parentId: null, // 只查找顶级菜单 - validState: 1, - }, - }); - - if (menus.length === 0) { - console.error(`❌ 错误: 未找到指定的菜单!`); - console.error(` 请确保菜单 "${menuNames.join('", "')}" 已初始化`); - console.error(` 运行: pnpm init:menus`); - process.exit(1); - } - - if (menus.length !== menuNames.length) { - const foundMenuNames = menus.map((m) => m.name); - const missingMenus = menuNames.filter( - (name) => !foundMenuNames.includes(name), - ); - console.warn(`⚠️ 警告: 部分菜单未找到: ${missingMenus.join(', ')}`); - console.log(` 找到的菜单: ${foundMenuNames.join(', ')}\n`); - } else { - console.log(`✅ 找到 ${menus.length} 个菜单:`); - menus.forEach((menu) => { - console.log(` ✓ ${menu.name}`); - }); - console.log(''); - } - - // 3. 递归获取菜单及其所有子菜单 - console.log(`📋 步骤 3: 获取菜单及其所有子菜单...`); - const menuIds = new Set(); - - // 递归函数:获取菜单及其所有子菜单的ID - async function getMenuAndChildrenIds(menuId: number) { - menuIds.add(menuId); - - // 获取所有子菜单 - const children = await prisma.menu.findMany({ - where: { - parentId: menuId, - validState: 1, - }, - }); - - // 递归获取子菜单的子菜单 - for (const child of children) { - await getMenuAndChildrenIds(child.id); - } - } - - // 为每个顶级菜单获取所有子菜单 - for (const menu of menus) { - await getMenuAndChildrenIds(menu.id); - } - - const menuIdArray = Array.from(menuIds); - console.log(`✅ 共找到 ${menuIdArray.length} 个菜单(包括子菜单)\n`); - - // 4. 获取租户已分配的菜单 - console.log(`📋 步骤 4: 检查租户已分配的菜单...`); - const existingTenantMenus = await prisma.tenantMenu.findMany({ - where: { - tenantId: tenant.id, - }, - select: { - menuId: true, - }, - }); - - const existingMenuIds = new Set(existingTenantMenus.map((tm) => tm.menuId)); - - // 5. 为租户分配菜单(只分配新的菜单) - console.log(`📋 步骤 5: 为租户分配菜单...`); - const menusToAdd = menuIdArray.filter((id) => !existingMenuIds.has(id)); - - if (menusToAdd.length === 0) { - console.log(`✅ 租户已拥有所有指定的菜单\n`); - } else { - let addedCount = 0; - const menuNamesToAdd: string[] = []; - - for (const menuId of menusToAdd) { - const menu = await prisma.menu.findUnique({ - where: { id: menuId }, - select: { name: true }, - }); - - await prisma.tenantMenu.create({ - data: { - tenantId: tenant.id, - menuId: menuId, - }, - }); - addedCount++; - if (menu) { - menuNamesToAdd.push(menu.name); - } - } - - console.log(`✅ 为租户添加了 ${addedCount} 个菜单:`); - menuNamesToAdd.forEach((name) => { - console.log(` ✓ ${name}`); - }); - console.log( - `\n✅ 租户现在拥有 ${menuIdArray.length} 个菜单(包括子菜单)\n`, - ); - } - - // 6. 验证结果 - console.log('📊 初始化结果:'); - console.log('========================================'); - console.log('租户信息:'); - console.log(` 租户编码: ${tenant.code}`); - console.log(` 租户名称: ${tenant.name}`); - console.log(` 租户类型: ${tenant.isSuper === 1 ? '超级租户' : '普通租户'}`); - console.log(` 访问链接: http://your-domain.com/?tenant=${tenant.code}`); - console.log('========================================'); - console.log('分配的菜单:'); - console.log(` 顶级菜单: ${menuNames.join(', ')}`); - console.log(` 菜单总数: ${menuIdArray.length} 个(包括子菜单)`); - console.log('========================================'); - console.log('\n💡 提示:'); - console.log(' 如需创建管理员账号,请运行: pnpm init:tenant-admin linksea'); - console.log('========================================'); -} - -main() - .then(() => { - console.log('\n🎉 LinkSea 租户创建脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 LinkSea 租户创建脚本执行失败:', error); - process.exit(1); - }) - .finally(async () => { - await prisma.$disconnect(); - }); diff --git a/backend/scripts/init-menus.ts b/backend/scripts/init-menus.ts deleted file mode 100644 index a472c92..0000000 --- a/backend/scripts/init-menus.ts +++ /dev/null @@ -1,277 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -// 加载环境变量(必须在其他导入之前) -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -// scripts 目录的父目录就是 backend 目录 -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -// 尝试加载环境特定的配置文件 -dotenv.config({ path: envPath }); - -// 如果环境特定文件不存在,尝试加载默认的 .env 文件 -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -// 验证必要的环境变量 -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - console.error(` 请确保存在以下文件之一:`); - console.error(` - ${envPath}`); - console.error(` - ${path.resolve(backendDir, '.env')}`); - console.error(` 或者设置 NODE_ENV 环境变量(当前: ${nodeEnv})`); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; -import * as fs from 'fs'; - -const prisma = new PrismaClient(); - -// 从 JSON 文件加载菜单数据 -const menusFilePath = path.resolve(backendDir, 'data', 'menus.json'); - -if (!fs.existsSync(menusFilePath)) { - console.error(`❌ 错误: 菜单数据文件不存在: ${menusFilePath}`); - process.exit(1); -} - -const menus = JSON.parse(fs.readFileSync(menusFilePath, 'utf-8')); - -// 超级租户可见的菜单名称 -const SUPER_TENANT_MENUS = ['我的评审', '活动监管', '内容管理', '活动管理', '机构管理', '用户中心', '系统设置']; - -// 普通租户可见的菜单名称 -const NORMAL_TENANT_MENUS = ['工作台', '学校管理', '我的评审', '活动管理', '系统设置']; - -// 普通租户在系统设置下排除的子菜单(只保留用户管理和角色管理) -const NORMAL_TENANT_EXCLUDED_SYSTEM_MENUS = ['租户管理', '数据字典', '系统配置', '日志记录', '菜单管理', '权限管理']; - -// 普通租户在我的评审下排除的子菜单(只保留评审任务) -const NORMAL_TENANT_EXCLUDED_ACTIVITY_MENUS = ['预设评语']; - -async function initMenus() { - try { - console.log('🚀 开始初始化菜单数据...\n'); - - // 递归创建菜单 - async function createMenu(menuData: any, parentId: number | null = null) { - const { children, ...menuFields } = menuData; - - // 查找是否已存在相同名称和父菜单的菜单 - const existingMenu = await prisma.menu.findFirst({ - where: { - name: menuFields.name, - parentId: parentId, - }, - }); - - let menu; - if (existingMenu) { - // 更新现有菜单 - menu = await prisma.menu.update({ - where: { id: existingMenu.id }, - data: { - name: menuFields.name, - path: menuFields.path || null, - icon: menuFields.icon || null, - component: menuFields.component || null, - permission: menuFields.permission || null, - parentId: parentId, - sort: menuFields.sort || 0, - validState: 1, - }, - }); - } else { - // 创建新菜单 - menu = await prisma.menu.create({ - data: { - name: menuFields.name, - path: menuFields.path || null, - icon: menuFields.icon || null, - component: menuFields.component || null, - permission: menuFields.permission || null, - parentId: parentId, - sort: menuFields.sort || 0, - validState: 1, - }, - }); - } - - console.log(` ✓ ${menu.name} (${menu.path || '无路径'})`); - - // 如果有子菜单,递归创建 - if (children && children.length > 0) { - for (const child of children) { - await createMenu(child, menu.id); - } - } - - return menu; - } - - // 清空现有菜单(重新初始化) - console.log('🗑️ 清空现有菜单和租户菜单关联...'); - // 先删除租户菜单关联 - await prisma.tenantMenu.deleteMany({}); - // 再删除所有子菜单,再删除父菜单(避免外键约束问题) - await prisma.menu.deleteMany({ - where: { - parentId: { - not: null, - }, - }, - }); - await prisma.menu.deleteMany({ - where: { - parentId: null, - }, - }); - console.log('✅ 已清空现有菜单\n'); - - // 创建所有菜单 - console.log('📝 创建菜单...\n'); - for (const menu of menus) { - await createMenu(menu); - } - - // 验证结果 - console.log('\n🔍 验证结果...'); - const allMenus = await prisma.menu.findMany({ - orderBy: [{ sort: 'asc' }, { id: 'asc' }], - include: { - children: { - orderBy: { - sort: 'asc', - }, - }, - }, - }); - - const topLevelMenus = allMenus.filter((m) => !m.parentId); - const totalMenus = allMenus.length; - - console.log(`\n📊 初始化结果:`); - console.log(` 顶级菜单数量: ${topLevelMenus.length}`); - console.log(` 总菜单数量: ${totalMenus}`); - console.log(`\n📋 菜单结构:`); - - function printMenuTree(menu: any, indent: string = '') { - console.log(`${indent}├─ ${menu.name} (${menu.path || '无路径'})`); - if (menu.children && menu.children.length > 0) { - menu.children.forEach((child: any, index: number) => { - const isLast = index === menu.children.length - 1; - const childIndent = indent + (isLast ? ' ' : '│ '); - printMenuTree(child, childIndent); - }); - } - } - - topLevelMenus.forEach((menu) => { - printMenuTree(menu); - }); - - // 为所有现有租户分配菜单(区分超级租户和普通租户) - console.log(`\n📋 为所有租户分配菜单...`); - const allTenants = await prisma.tenant.findMany({ - where: { validState: 1 }, - }); - - if (allTenants.length === 0) { - console.log('⚠️ 没有找到任何有效租户,跳过菜单分配\n'); - } else { - console.log(` 找到 ${allTenants.length} 个租户\n`); - - // 获取超级租户菜单ID(工作台、我的评审、活动管理、系统管理及其子菜单) - const superTenantMenuIds = new Set(); - for (const menu of allMenus) { - // 顶级菜单 - if (!menu.parentId && SUPER_TENANT_MENUS.includes(menu.name)) { - superTenantMenuIds.add(menu.id); - } - // 子菜单(检查父菜单是否在超级租户菜单中) - if (menu.parentId) { - const parentMenu = allMenus.find(m => m.id === menu.parentId); - if (parentMenu && SUPER_TENANT_MENUS.includes(parentMenu.name)) { - superTenantMenuIds.add(menu.id); - } - } - } - - // 获取普通租户菜单ID(工作台、学校管理、我的评审、作业管理、部分系统管理) - const normalTenantMenuIds = new Set(); - for (const menu of allMenus) { - // 顶级菜单 - if (!menu.parentId && NORMAL_TENANT_MENUS.includes(menu.name)) { - normalTenantMenuIds.add(menu.id); - } - // 子菜单 - if (menu.parentId) { - const parentMenu = allMenus.find(m => m.id === menu.parentId); - if (parentMenu && NORMAL_TENANT_MENUS.includes(parentMenu.name)) { - // 系统设置下排除部分子菜单 - if (parentMenu.name === '系统设置' && NORMAL_TENANT_EXCLUDED_SYSTEM_MENUS.includes(menu.name)) { - continue; - } - // 我的评审下排除部分子菜单 - if (parentMenu.name === '我的评审' && NORMAL_TENANT_EXCLUDED_ACTIVITY_MENUS.includes(menu.name)) { - continue; - } - normalTenantMenuIds.add(menu.id); - } - } - } - - for (const tenant of allTenants) { - const isSuperTenant = tenant.isSuper === 1; - - // 确定要分配的菜单 - const menusToAssign = isSuperTenant - ? allMenus.filter(m => superTenantMenuIds.has(m.id)) - : allMenus.filter(m => normalTenantMenuIds.has(m.id)); - - // 为租户分配菜单 - let addedMenuCount = 0; - for (const menu of menusToAssign) { - await prisma.tenantMenu.create({ - data: { - tenantId: tenant.id, - menuId: menu.id, - }, - }); - addedMenuCount++; - } - - const tenantType = isSuperTenant ? '(超级租户)' : '(普通租户)'; - console.log( - ` ✓ 租户 "${tenant.name}" ${tenantType}: 分配了 ${addedMenuCount} 个菜单`, - ); - } - console.log(`\n✅ 菜单分配完成!`); - } - - console.log(`\n✅ 菜单初始化完成!`); - } catch (error) { - console.error('\n💥 初始化菜单失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -// 执行初始化 -initMenus() - .then(() => { - console.log('\n🎉 菜单初始化脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 菜单初始化脚本执行失败:', error); - process.exit(1); - }); diff --git a/backend/scripts/init-roles-permissions.ts b/backend/scripts/init-roles-permissions.ts deleted file mode 100644 index 51e8de6..0000000 --- a/backend/scripts/init-roles-permissions.ts +++ /dev/null @@ -1,576 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -dotenv.config({ path: envPath }); - -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -if (!process.env.DATABASE_URL) { - console.error('DATABASE_URL not found'); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -// ============================================ -// 权限定义 -// ============================================ - -// 基础权限(所有角色共享的权限池) -const allPermissions = [ - // AI 3D建模 - { code: 'ai-3d:read', resource: 'ai-3d', action: 'read', name: '使用3D建模实验室', description: '允许使用AI 3D建模实验室' }, - { code: 'ai-3d:create', resource: 'ai-3d', action: 'create', name: '创建3D模型任务', description: '允许创建AI 3D模型生成任务' }, - - // 用户管理 - { code: 'user:create', resource: 'user', action: 'create', name: '创建用户', description: '允许创建新用户' }, - { code: 'user:read', resource: 'user', action: 'read', name: '查看用户', description: '允许查看用户列表和详情' }, - { code: 'user:update', resource: 'user', action: 'update', name: '更新用户', description: '允许更新用户信息' }, - { code: 'user:delete', resource: 'user', action: 'delete', name: '删除用户', description: '允许删除用户' }, - { code: 'user:password:update', resource: 'user', action: 'password:update', name: '重置密码', description: '允许重置用户密码' }, - - // 角色管理 - { code: 'role:create', resource: 'role', action: 'create', name: '创建角色', description: '允许创建新角色' }, - { code: 'role:read', resource: 'role', action: 'read', name: '查看角色', description: '允许查看角色列表和详情' }, - { code: 'role:update', resource: 'role', action: 'update', name: '更新角色', description: '允许更新角色信息' }, - { code: 'role:delete', resource: 'role', action: 'delete', name: '删除角色', description: '允许删除角色' }, - { code: 'role:assign', resource: 'role', action: 'assign', name: '分配角色', description: '允许给用户分配角色' }, - - // 权限管理 - { code: 'permission:create', resource: 'permission', action: 'create', name: '创建权限', description: '允许创建新权限' }, - { code: 'permission:read', resource: 'permission', action: 'read', name: '查看权限', description: '允许查看权限列表' }, - { code: 'permission:update', resource: 'permission', action: 'update', name: '更新权限', description: '允许更新权限信息' }, - { code: 'permission:delete', resource: 'permission', action: 'delete', name: '删除权限', description: '允许删除权限' }, - - // 菜单管理 - { code: 'menu:create', resource: 'menu', action: 'create', name: '创建菜单', description: '允许创建新菜单' }, - { code: 'menu:read', resource: 'menu', action: 'read', name: '查看菜单', description: '允许查看菜单列表' }, - { code: 'menu:update', resource: 'menu', action: 'update', name: '更新菜单', description: '允许更新菜单信息' }, - { code: 'menu:delete', resource: 'menu', action: 'delete', name: '删除菜单', description: '允许删除菜单' }, - - // 租户管理(超级租户专属) - { code: 'tenant:create', resource: 'tenant', action: 'create', name: '创建租户', description: '允许创建租户' }, - { code: 'tenant:read', resource: 'tenant', action: 'read', name: '查看租户', description: '允许查看租户列表' }, - { code: 'tenant:update', resource: 'tenant', action: 'update', name: '更新租户', description: '允许更新租户信息' }, - { code: 'tenant:delete', resource: 'tenant', action: 'delete', name: '删除租户', description: '允许删除租户' }, - - // 学校管理 - { code: 'school:create', resource: 'school', action: 'create', name: '创建学校', description: '允许创建学校信息' }, - { code: 'school:read', resource: 'school', action: 'read', name: '查看学校', description: '允许查看学校信息' }, - { code: 'school:update', resource: 'school', action: 'update', name: '更新学校', description: '允许更新学校信息' }, - { code: 'school:delete', resource: 'school', action: 'delete', name: '删除学校', description: '允许删除学校信息' }, - - // 部门管理 - { code: 'department:create', resource: 'department', action: 'create', name: '创建部门', description: '允许创建部门' }, - { code: 'department:read', resource: 'department', action: 'read', name: '查看部门', description: '允许查看部门列表' }, - { code: 'department:update', resource: 'department', action: 'update', name: '更新部门', description: '允许更新部门信息' }, - { code: 'department:delete', resource: 'department', action: 'delete', name: '删除部门', description: '允许删除部门' }, - - // 年级管理 - { code: 'grade:create', resource: 'grade', action: 'create', name: '创建年级', description: '允许创建年级' }, - { code: 'grade:read', resource: 'grade', action: 'read', name: '查看年级', description: '允许查看年级列表' }, - { code: 'grade:update', resource: 'grade', action: 'update', name: '更新年级', description: '允许更新年级信息' }, - { code: 'grade:delete', resource: 'grade', action: 'delete', name: '删除年级', description: '允许删除年级' }, - - // 班级管理 - { code: 'class:create', resource: 'class', action: 'create', name: '创建班级', description: '允许创建班级' }, - { code: 'class:read', resource: 'class', action: 'read', name: '查看班级', description: '允许查看班级列表' }, - { code: 'class:update', resource: 'class', action: 'update', name: '更新班级', description: '允许更新班级信息' }, - { code: 'class:delete', resource: 'class', action: 'delete', name: '删除班级', description: '允许删除班级' }, - - // 教师管理 - { code: 'teacher:create', resource: 'teacher', action: 'create', name: '创建教师', description: '允许创建教师' }, - { code: 'teacher:read', resource: 'teacher', action: 'read', name: '查看教师', description: '允许查看教师列表' }, - { code: 'teacher:update', resource: 'teacher', action: 'update', name: '更新教师', description: '允许更新教师信息' }, - { code: 'teacher:delete', resource: 'teacher', action: 'delete', name: '删除教师', description: '允许删除教师' }, - - // 学生管理 - { code: 'student:create', resource: 'student', action: 'create', name: '创建学生', description: '允许创建学生' }, - { code: 'student:read', resource: 'student', action: 'read', name: '查看学生', description: '允许查看学生列表' }, - { code: 'student:update', resource: 'student', action: 'update', name: '更新学生', description: '允许更新学生信息' }, - { code: 'student:delete', resource: 'student', action: 'delete', name: '删除学生', description: '允许删除学生' }, - - // 活动管理(超级租户) - { code: 'contest:create', resource: 'contest', action: 'create', name: '创建活动', description: '允许创建活动' }, - { code: 'contest:read', resource: 'contest', action: 'read', name: '查看活动', description: '允许查看活动列表' }, - { code: 'contest:update', resource: 'contest', action: 'update', name: '更新活动', description: '允许更新活动信息' }, - { code: 'contest:delete', resource: 'contest', action: 'delete', name: '删除活动', description: '允许删除活动' }, - { code: 'contest:publish', resource: 'contest', action: 'publish', name: '发布活动', description: '允许发布/取消发布活动' }, - { code: 'contest:finish', resource: 'contest', action: 'finish', name: '结束活动', description: '允许结束活动' }, - - // 评审规则管理 - { code: 'review-rule:create', resource: 'review-rule', action: 'create', name: '创建评审规则', description: '允许创建评审规则' }, - { code: 'review-rule:read', resource: 'review-rule', action: 'read', name: '查看评审规则', description: '允许查看评审规则' }, - { code: 'review-rule:update', resource: 'review-rule', action: 'update', name: '更新评审规则', description: '允许更新评审规则' }, - { code: 'review-rule:delete', resource: 'review-rule', action: 'delete', name: '删除评审规则', description: '允许删除评审规则' }, - - // 评委管理 - { code: 'judge:create', resource: 'judge', action: 'create', name: '添加评委', description: '允许添加评委' }, - { code: 'judge:read', resource: 'judge', action: 'read', name: '查看评委', description: '允许查看评委列表' }, - { code: 'judge:update', resource: 'judge', action: 'update', name: '更新评委', description: '允许更新评委信息' }, - { code: 'judge:delete', resource: 'judge', action: 'delete', name: '删除评委', description: '允许删除评委' }, - { code: 'judge:assign', resource: 'judge', action: 'assign', name: '分配评委', description: '允许为活动分配评委' }, - - // 活动报名(学校端) - { code: 'registration:create', resource: 'registration', action: 'create', name: '创建报名', description: '允许报名活动' }, - { code: 'registration:read', resource: 'registration', action: 'read', name: '查看报名', description: '允许查看报名记录' }, - { code: 'registration:update', resource: 'registration', action: 'update', name: '更新报名', description: '允许更新报名信息' }, - { code: 'registration:delete', resource: 'registration', action: 'delete', name: '取消报名', description: '允许取消报名' }, - { code: 'registration:approve', resource: 'registration', action: 'approve', name: '审核报名', description: '允许审核报名' }, - { code: 'registration:audit', resource: 'registration', action: 'audit', name: '审核报名记录', description: '允许审核报名记录' }, - - // 参赛作品 - { code: 'work:create', resource: 'work', action: 'create', name: '上传作品', description: '允许上传参赛作品' }, - { code: 'work:read', resource: 'work', action: 'read', name: '查看作品', description: '允许查看参赛作品' }, - { code: 'work:update', resource: 'work', action: 'update', name: '更新作品', description: '允许更新作品信息' }, - { code: 'work:delete', resource: 'work', action: 'delete', name: '删除作品', description: '允许删除作品' }, - { code: 'work:submit', resource: 'work', action: 'submit', name: '提交作品', description: '允许提交作品' }, - - // 作品评审(评委端) - { code: 'review:read', resource: 'review', action: 'read', name: '查看评审任务', description: '允许查看待评审作品' }, - { code: 'review:score', resource: 'review', action: 'score', name: '评审打分', description: '允许对作品打分' }, - { code: 'review:assign', resource: 'review', action: 'assign', name: '分配评审', description: '允许分配作品给评委' }, - - // 成果管理 - { code: 'result:read', resource: 'result', action: 'read', name: '查看成果', description: '允许查看活动结果' }, - { code: 'result:publish', resource: 'result', action: 'publish', name: '发布成果', description: '允许发布活动结果' }, - { code: 'result:award', resource: 'result', action: 'award', name: '设置奖项', description: '允许设置奖项等级' }, - - // 活动公告 - { code: 'notice:create', resource: 'notice', action: 'create', name: '创建公告', description: '允许创建活动公告' }, - { code: 'notice:read', resource: 'notice', action: 'read', name: '查看公告', description: '允许查看活动公告' }, - { code: 'notice:update', resource: 'notice', action: 'update', name: '更新公告', description: '允许更新公告信息' }, - { code: 'notice:delete', resource: 'notice', action: 'delete', name: '删除公告', description: '允许删除公告' }, - - // 作业管理 - { code: 'homework:create', resource: 'homework', action: 'create', name: '创建作业', description: '允许创建作业' }, - { code: 'homework:read', resource: 'homework', action: 'read', name: '查看作业', description: '允许查看作业列表' }, - { code: 'homework:update', resource: 'homework', action: 'update', name: '更新作业', description: '允许更新作业信息' }, - { code: 'homework:delete', resource: 'homework', action: 'delete', name: '删除作业', description: '允许删除作业' }, - { code: 'homework:publish', resource: 'homework', action: 'publish', name: '发布作业', description: '允许发布作业' }, - - // 作业提交 - { code: 'homework-submission:create', resource: 'homework-submission', action: 'create', name: '提交作业', description: '允许提交作业' }, - { code: 'homework-submission:read', resource: 'homework-submission', action: 'read', name: '查看作业提交', description: '允许查看作业提交记录' }, - { code: 'homework-submission:update', resource: 'homework-submission', action: 'update', name: '更新作业提交', description: '允许更新提交的作业' }, - - // 作业评审规则 - { code: 'homework-review-rule:create', resource: 'homework-review-rule', action: 'create', name: '创建作业评审规则', description: '允许创建作业评审规则' }, - { code: 'homework-review-rule:read', resource: 'homework-review-rule', action: 'read', name: '查看作业评审规则', description: '允许查看作业评审规则' }, - { code: 'homework-review-rule:update', resource: 'homework-review-rule', action: 'update', name: '更新作业评审规则', description: '允许更新作业评审规则' }, - { code: 'homework-review-rule:delete', resource: 'homework-review-rule', action: 'delete', name: '删除作业评审规则', description: '允许删除作业评审规则' }, - - // 作业评分 - { code: 'homework-score:create', resource: 'homework-score', action: 'create', name: '作业评分', description: '允许对作业评分' }, - { code: 'homework-score:read', resource: 'homework-score', action: 'read', name: '查看作业评分', description: '允许查看作业评分' }, - - // 字典管理 - { code: 'dict:create', resource: 'dict', action: 'create', name: '创建字典', description: '允许创建新字典' }, - { code: 'dict:read', resource: 'dict', action: 'read', name: '查看字典', description: '允许查看字典列表和详情' }, - { code: 'dict:update', resource: 'dict', action: 'update', name: '更新字典', description: '允许更新字典信息' }, - { code: 'dict:delete', resource: 'dict', action: 'delete', name: '删除字典', description: '允许删除字典' }, - - // 系统配置 - { code: 'config:create', resource: 'config', action: 'create', name: '创建配置', description: '允许创建新配置' }, - { code: 'config:read', resource: 'config', action: 'read', name: '查看配置', description: '允许查看配置列表和详情' }, - { code: 'config:update', resource: 'config', action: 'update', name: '更新配置', description: '允许更新配置信息' }, - { code: 'config:delete', resource: 'config', action: 'delete', name: '删除配置', description: '允许删除配置' }, - - // 日志管理 - { code: 'log:read', resource: 'log', action: 'read', name: '查看日志', description: '允许查看系统日志' }, - { code: 'log:delete', resource: 'log', action: 'delete', name: '删除日志', description: '允许删除系统日志' }, - - // 我的评审(学校端) - { code: 'activity:read', resource: 'activity', action: 'read', name: '查看我的评审', description: '允许查看已发布的我的评审' }, - { code: 'activity:guidance', resource: 'activity', action: 'guidance', name: '指导学生', description: '允许指导学生参赛' }, -]; - -// ============================================ -// 角色定义和权限映射 -// ============================================ - -// 超级租户角色 -const superTenantRoles = [ - { - code: 'super_admin', - name: '超级管理员', - description: '系统超级管理员,管理活动和系统配置', - permissions: [ - // 系统管理 - 'user:create', 'user:read', 'user:update', 'user:delete', 'user:password:update', - 'role:create', 'role:read', 'role:update', 'role:delete', 'role:assign', - 'permission:create', 'permission:read', 'permission:update', 'permission:delete', - 'menu:create', 'menu:read', 'menu:update', 'menu:delete', - 'tenant:create', 'tenant:read', 'tenant:update', 'tenant:delete', - 'dict:create', 'dict:read', 'dict:update', 'dict:delete', - 'config:create', 'config:read', 'config:update', 'config:delete', - 'log:read', 'log:delete', - // 活动管理 - 'contest:create', 'contest:read', 'contest:update', 'contest:delete', 'contest:publish', 'contest:finish', - 'review-rule:create', 'review-rule:read', 'review-rule:update', 'review-rule:delete', - 'judge:create', 'judge:read', 'judge:update', 'judge:delete', 'judge:assign', - 'registration:read', 'registration:approve', 'registration:audit', - 'work:read', 'work:update', - 'review:read', 'review:assign', - 'result:read', 'result:publish', 'result:award', - 'notice:create', 'notice:read', 'notice:update', 'notice:delete', - ], - }, - { - code: 'judge', - name: '评委', - description: '活动评委,可以评审作品', - permissions: [ - 'activity:read', // 查看我的评审 - 'work:read', // 查看待评审作品 - 'review:read', // 查看评审任务 - 'review:score', // 评审打分 - 'notice:read', // 查看公告 - ], - }, -]; - -// 普通租户(学校)角色 -const normalTenantRoles = [ - { - code: 'school_admin', - name: '学校管理员', - description: '学校管理员,管理学校信息、教师、学生等', - permissions: [ - 'user:create', 'user:read', 'user:update', 'user:delete', - 'role:create', 'role:read', 'role:update', 'role:delete', 'role:assign', - 'permission:read', - 'menu:read', - // 学校管理 - 'school:create', 'school:read', 'school:update', 'school:delete', - 'department:create', 'department:read', 'department:update', 'department:delete', - 'grade:create', 'grade:read', 'grade:update', 'grade:delete', - 'class:create', 'class:read', 'class:update', 'class:delete', - 'teacher:create', 'teacher:read', 'teacher:update', 'teacher:delete', - 'student:create', 'student:read', 'student:update', 'student:delete', - // 我的评审 - 'activity:read', - 'notice:read', - // 可以查看报名和作品 - 'registration:read', - 'work:read', - ], - }, - { - code: 'teacher', - name: '教师', - description: '教师角色,可以报名活动、指导学生、管理作业', - permissions: [ - // AI 3D建模(工作台入口) - 'ai-3d:read', 'ai-3d:create', // 使用AI 3D建模实验室 - // 查看基础信息 - 'grade:read', - 'class:read', - 'student:read', - // 我的评审 - 'activity:read', // 查看我的评审列表 - 'activity:guidance', // 指导学生参赛 - 'notice:read', // 查看活动公告 - 'registration:create', 'registration:read', 'registration:update', 'registration:delete', // 报名管理 - 'work:create', 'work:read', 'work:update', 'work:submit', // 指导学生上传作品 - // 作业管理 - 'homework:create', 'homework:read', 'homework:update', 'homework:delete', 'homework:publish', - 'homework-submission:read', - 'homework-review-rule:create', 'homework-review-rule:read', 'homework-review-rule:update', 'homework-review-rule:delete', - 'homework-score:create', 'homework-score:read', - ], - }, - { - code: 'student', - name: '学生', - description: '学生角色,可以查看活动、上传作品、提交作业', - permissions: [ - // AI 3D建模(工作台入口) - 'ai-3d:read', 'ai-3d:create', // 使用AI 3D建模实验室 - // 我的评审 - 'activity:read', // 查看我的评审列表 - 'notice:read', // 查看活动公告 - 'registration:read', // 查看自己的报名记录 - 'work:create', 'work:read', 'work:update', 'work:submit', // 上传/管理自己的作品 - // 作业 - 'homework:read', // 查看作业 - 'homework-submission:create', 'homework-submission:read', 'homework-submission:update', // 提交作业 - 'homework-score:read', // 查看自己的作业评分 - ], - }, -]; - -// ============================================ -// 初始化函数 -// ============================================ - -/** - * 为租户创建权限 - */ -async function createPermissions(tenantId: number, permissionCodes: string[]) { - const createdPermissions: { [code: string]: number } = {}; - - for (const code of permissionCodes) { - const permDef = allPermissions.find(p => p.code === code); - if (!permDef) { - console.log(` ⚠️ 权限定义不存在: ${code}`); - continue; - } - - // 检查是否已存在 - let permission = await prisma.permission.findFirst({ - where: { tenantId, code }, - }); - - if (!permission) { - permission = await prisma.permission.create({ - data: { - tenantId, - code: permDef.code, - resource: permDef.resource, - action: permDef.action, - name: permDef.name, - description: permDef.description, - validState: 1, - }, - }); - console.log(` ✓ 创建权限: ${code}`); - } - - createdPermissions[code] = permission.id; - } - - return createdPermissions; -} - -/** - * 为租户创建角色并分配权限 - */ -async function createRoleWithPermissions( - tenantId: number, - roleConfig: { code: string; name: string; description: string; permissions: string[] }, - permissionMap: { [code: string]: number } -) { - // 创建或获取角色 - let role = await prisma.role.findFirst({ - where: { tenantId, code: roleConfig.code }, - }); - - if (!role) { - role = await prisma.role.create({ - data: { - tenantId, - code: roleConfig.code, - name: roleConfig.name, - description: roleConfig.description, - validState: 1, - }, - }); - console.log(` ✓ 创建角色: ${roleConfig.name} (${roleConfig.code})`); - } else { - // 更新角色信息 - role = await prisma.role.update({ - where: { id: role.id }, - data: { - name: roleConfig.name, - description: roleConfig.description, - }, - }); - console.log(` ✓ 更新角色: ${roleConfig.name} (${roleConfig.code})`); - } - - // 分配权限 - const existingRolePermissions = await prisma.rolePermission.findMany({ - where: { roleId: role.id }, - select: { permissionId: true }, - }); - const existingPermissionIds = new Set(existingRolePermissions.map(rp => rp.permissionId)); - - let addedCount = 0; - for (const permCode of roleConfig.permissions) { - const permissionId = permissionMap[permCode]; - if (!permissionId) { - console.log(` ⚠️ 权限不存在: ${permCode}`); - continue; - } - - if (!existingPermissionIds.has(permissionId)) { - await prisma.rolePermission.create({ - data: { - roleId: role.id, - permissionId, - }, - }); - addedCount++; - } - } - - if (addedCount > 0) { - console.log(` 添加了 ${addedCount} 个权限`); - } - - return role; -} - -/** - * 初始化超级租户的角色和权限 - */ -async function initSuperTenantRoles() { - console.log('\n🚀 开始初始化超级租户角色和权限...\n'); - - // 查找超级租户 - const superTenant = await prisma.tenant.findFirst({ - where: { isSuper: 1, validState: 1 }, - }); - - if (!superTenant) { - console.error('❌ 超级租户不存在!请先运行 init:super-tenant'); - return; - } - - console.log(`找到超级租户: ${superTenant.name} (${superTenant.code})\n`); - - // 收集所有需要的权限码 - const allPermissionCodes = new Set(); - superTenantRoles.forEach(role => { - role.permissions.forEach(code => allPermissionCodes.add(code)); - }); - - // 创建权限 - console.log('📝 创建权限...'); - const permissionMap = await createPermissions(superTenant.id, Array.from(allPermissionCodes)); - console.log(`✅ 共 ${Object.keys(permissionMap).length} 个权限\n`); - - // 创建角色 - console.log('👥 创建角色...'); - for (const roleConfig of superTenantRoles) { - await createRoleWithPermissions(superTenant.id, roleConfig, permissionMap); - } - - console.log('\n✅ 超级租户角色和权限初始化完成!'); -} - -/** - * 初始化普通租户的角色和权限 - */ -async function initNormalTenantRoles(tenantCode: string) { - console.log(`\n🚀 开始初始化租户 "${tenantCode}" 的角色和权限...\n`); - - // 查找租户 - const tenant = await prisma.tenant.findFirst({ - where: { code: tenantCode, validState: 1 }, - }); - - if (!tenant) { - console.error(`❌ 租户 "${tenantCode}" 不存在!`); - return; - } - - if (tenant.isSuper === 1) { - console.log('⚠️ 这是超级租户,请使用 --super 选项'); - return; - } - - console.log(`找到租户: ${tenant.name} (${tenant.code})\n`); - - // 收集所有需要的权限码 - const allPermissionCodes = new Set(); - normalTenantRoles.forEach(role => { - role.permissions.forEach(code => allPermissionCodes.add(code)); - }); - - // 创建权限 - console.log('📝 创建权限...'); - const permissionMap = await createPermissions(tenant.id, Array.from(allPermissionCodes)); - console.log(`✅ 共 ${Object.keys(permissionMap).length} 个权限\n`); - - // 创建角色 - console.log('👥 创建角色...'); - for (const roleConfig of normalTenantRoles) { - await createRoleWithPermissions(tenant.id, roleConfig, permissionMap); - } - - // 输出角色信息 - console.log('\n📊 角色权限概览:'); - for (const roleConfig of normalTenantRoles) { - console.log(` ${roleConfig.name} (${roleConfig.code}): ${roleConfig.permissions.length} 个权限`); - } - - console.log(`\n✅ 租户 "${tenantCode}" 角色和权限初始化完成!`); -} - -/** - * 初始化所有普通租户的角色和权限 - */ -async function initAllNormalTenantRoles() { - console.log('\n🚀 开始初始化所有普通租户的角色和权限...\n'); - - // 查找所有普通租户 - const normalTenants = await prisma.tenant.findMany({ - where: { isSuper: { not: 1 }, validState: 1 }, - }); - - if (normalTenants.length === 0) { - console.log('⚠️ 没有找到普通租户'); - return; - } - - console.log(`找到 ${normalTenants.length} 个普通租户\n`); - - for (const tenant of normalTenants) { - await initNormalTenantRoles(tenant.code); - console.log(''); - } - - console.log('\n✅ 所有普通租户角色和权限初始化完成!'); -} - -// ============================================ -// 主函数 -// ============================================ - -async function main() { - const args = process.argv.slice(2); - const isSuper = args.includes('--super'); - const isAll = args.includes('--all'); - const tenantCode = args.find(arg => !arg.startsWith('--')); - - try { - if (isSuper) { - await initSuperTenantRoles(); - } else if (isAll) { - await initAllNormalTenantRoles(); - } else if (tenantCode) { - await initNormalTenantRoles(tenantCode); - } else { - console.log('使用方法:'); - console.log(' 初始化超级租户角色: ts-node scripts/init-roles-permissions.ts --super'); - console.log(' 初始化指定租户角色: ts-node scripts/init-roles-permissions.ts <租户编码>'); - console.log(' 初始化所有普通租户: ts-node scripts/init-roles-permissions.ts --all'); - process.exit(1); - } - } finally { - await prisma.$disconnect(); - } -} - -main() - .then(() => { - console.log('\n🎉 脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 脚本执行失败:', error); - process.exit(1); - }); diff --git a/backend/scripts/init-super-tenant.ts b/backend/scripts/init-super-tenant.ts deleted file mode 100644 index 5165adf..0000000 --- a/backend/scripts/init-super-tenant.ts +++ /dev/null @@ -1,322 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -// 加载环境变量(必须在其他导入之前) -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -// scripts 目录的父目录就是 backend 目录 -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -// 尝试加载环境特定的配置文件 -dotenv.config({ path: envPath }); - -// 如果环境特定文件不存在,尝试加载默认的 .env 文件 -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -// 验证必要的环境变量 -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - console.error(` 请确保存在以下文件之一:`); - console.error(` - ${envPath}`); - console.error(` - ${path.resolve(backendDir, '.env')}`); - console.error(` 或者设置 NODE_ENV 环境变量(当前: ${nodeEnv})`); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcrypt'; - -const prisma = new PrismaClient(); - -async function main() { - console.log('🚀 开始初始化超级租户...\n'); - - // 检查是否已存在超级租户 - let superTenant = await prisma.tenant.findFirst({ - where: { isSuper: 1 }, - }); - - if (superTenant) { - console.log('⚠️ 超级租户已存在,将更新菜单分配'); - console.log(` 租户编码: ${superTenant.code}\n`); - } else { - // 创建超级租户 - superTenant = await prisma.tenant.create({ - data: { - name: '超级租户', - code: 'super', - domain: 'super', - description: '系统超级租户,拥有所有权限', - isSuper: 1, - validState: 1, - }, - }); - - console.log('✅ 超级租户创建成功!'); - console.log(` 租户ID: ${superTenant.id}`); - console.log(` 租户编码: ${superTenant.code}`); - console.log(` 租户名称: ${superTenant.name}\n`); - } - - // 创建或获取超级管理员用户 - console.log('📋 步骤 2: 创建或获取超级管理员用户...\n'); - let superAdmin = await prisma.user.findFirst({ - where: { - tenantId: superTenant.id, - username: 'admin', - }, - }); - - if (!superAdmin) { - const hashedPassword = await bcrypt.hash('admin@super', 10); - superAdmin = await prisma.user.create({ - data: { - tenantId: superTenant.id, - username: 'admin', - password: hashedPassword, - nickname: '超级管理员', - email: 'admin@super.com', - validState: 1, - }, - }); - console.log('✅ 超级管理员用户创建成功!'); - console.log(` 用户名: ${superAdmin.username}`); - console.log(` 密码: admin@super`); - console.log(` 用户ID: ${superAdmin.id}\n`); - } else { - console.log('✅ 超级管理员用户已存在'); - console.log(` 用户名: ${superAdmin.username}`); - console.log(` 用户ID: ${superAdmin.id}\n`); - } - - // 创建或获取超级管理员角色 - console.log('📋 步骤 3: 创建或获取超级管理员角色...\n'); - let superAdminRole = await prisma.role.findFirst({ - where: { - tenantId: superTenant.id, - code: 'super_admin', - }, - }); - - if (!superAdminRole) { - superAdminRole = await prisma.role.create({ - data: { - tenantId: superTenant.id, - name: '超级管理员', - code: 'super_admin', - description: '超级管理员角色,拥有所有权限', - validState: 1, - }, - }); - console.log('✅ 超级管理员角色创建成功!'); - console.log(` 角色编码: ${superAdminRole.code}\n`); - } else { - console.log('✅ 超级管理员角色已存在'); - console.log(` 角色编码: ${superAdminRole.code}\n`); - } - - // 将超级管理员角色分配给用户 - const existingUserRole = await prisma.userRole.findUnique({ - where: { - userId_roleId: { - userId: superAdmin.id, - roleId: superAdminRole.id, - }, - }, - }); - - if (!existingUserRole) { - await prisma.userRole.create({ - data: { - userId: superAdmin.id, - roleId: superAdminRole.id, - }, - }); - console.log('✅ 超级管理员角色已分配给用户'); - } else { - console.log('✅ 超级管理员角色已分配给用户,跳过'); - } - console.log('💡 提示: 权限初始化请使用 init:admin:permissions 脚本\n'); - - // 为超级租户分配所有菜单 - console.log('📋 步骤 4: 为超级租户分配所有菜单...\n'); - - // 获取所有有效菜单 - const allMenus = await prisma.menu.findMany({ - where: { - validState: 1, - }, - orderBy: [{ sort: 'asc' }, { id: 'asc' }], - }); - - if (allMenus.length === 0) { - console.log('⚠️ 警告: 数据库中没有任何菜单'); - console.log(' 请先运行 pnpm init:menus 初始化菜单'); - } else { - console.log(` 找到 ${allMenus.length} 个菜单\n`); - - // 获取超级租户已分配的菜单 - const existingTenantMenus = await prisma.tenantMenu.findMany({ - where: { - tenantId: superTenant.id, - }, - select: { - menuId: true, - }, - }); - - const existingMenuIds = new Set(existingTenantMenus.map((tm) => tm.menuId)); - - // 为超级租户分配所有菜单(包括新增的菜单) - let addedCount = 0; - const menuNames: string[] = []; - - for (const menu of allMenus) { - if (!existingMenuIds.has(menu.id)) { - await prisma.tenantMenu.create({ - data: { - tenantId: superTenant.id, - menuId: menu.id, - }, - }); - addedCount++; - menuNames.push(menu.name); - } - } - - if (addedCount > 0) { - console.log(`✅ 为超级租户添加了 ${addedCount} 个菜单:`); - menuNames.forEach((name) => { - console.log(` ✓ ${name}`); - }); - console.log(`\n✅ 超级租户现在拥有 ${allMenus.length} 个菜单\n`); - } else { - console.log(`✅ 超级租户已拥有所有菜单(${allMenus.length} 个)\n`); - } - } - - // 创建租户管理菜单(如果不存在) - console.log('📋 步骤 5: 创建租户管理菜单(如果不存在)...\n'); - - // 查找系统管理菜单(父菜单) - const systemMenu = await prisma.menu.findFirst({ - where: { - name: '系统管理', - parentId: null, - }, - }); - - if (systemMenu) { - // 检查租户管理菜单是否已存在 - const existingTenantMenu = await prisma.menu.findFirst({ - where: { - name: '租户管理', - path: '/system/tenants', - }, - }); - - let tenantMenu; - if (!existingTenantMenu) { - tenantMenu = await prisma.menu.create({ - data: { - name: '租户管理', - path: '/system/tenants', - icon: 'TeamOutlined', - component: 'system/tenants/Index', - parentId: systemMenu.id, - permission: 'tenant:update', // 只有超级租户才有此权限,普通租户只有 tenant:read - sort: 7, - validState: 1, - }, - }); - console.log('✅ 租户管理菜单创建成功'); - - // 为超级租户分配租户管理菜单 - await prisma.tenantMenu.create({ - data: { - tenantId: superTenant.id, - menuId: tenantMenu.id, - }, - }); - console.log('✅ 租户管理菜单已分配给超级租户\n'); - } else { - tenantMenu = existingTenantMenu; - console.log('✅ 租户管理菜单已存在'); - - // 检查是否已分配 - const existingTenantMenuRelation = await prisma.tenantMenu.findFirst({ - where: { - tenantId: superTenant.id, - menuId: tenantMenu.id, - }, - }); - - if (!existingTenantMenuRelation) { - await prisma.tenantMenu.create({ - data: { - tenantId: superTenant.id, - menuId: tenantMenu.id, - }, - }); - console.log('✅ 租户管理菜单已分配给超级租户\n'); - } else { - console.log('✅ 租户管理菜单已分配给超级租户,跳过\n'); - } - } - } else { - console.log('⚠️ 警告:未找到系统管理菜单,无法创建租户管理菜单\n'); - } - - // 验证菜单分配结果 - const finalMenus = await prisma.tenantMenu.findMany({ - where: { - tenantId: superTenant.id, - }, - include: { - menu: true, - }, - }); - - console.log('📊 初始化结果:'); - console.log('========================================'); - console.log('超级租户信息:'); - console.log(` 租户编码: ${superTenant.code}`); - console.log(` 租户名称: ${superTenant.name}`); - console.log(` 访问链接: http://your-domain.com/?tenant=${superTenant.code}`); - console.log('========================================'); - console.log('超级管理员登录信息:'); - console.log(` 用户名: ${superAdmin.username}`); - console.log(` 密码: admin@super`); - console.log(` 租户编码: ${superTenant.code}`); - console.log('========================================'); - console.log('菜单分配情况:'); - console.log(` 已分配菜单数: ${finalMenus.length}`); - if (finalMenus.length > 0) { - const topLevelMenus = finalMenus.filter((tm) => !tm.menu.parentId); - console.log(` 顶级菜单数: ${topLevelMenus.length}`); - } - console.log('========================================'); - console.log('\n💡 提示:'); - console.log(' 权限初始化请使用: pnpm init:admin:permissions'); - console.log(' 菜单初始化请使用: pnpm init:menus'); - console.log('========================================'); -} - -main() - .then(() => { - console.log('\n🎉 初始化脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 初始化脚本执行失败:', error); - process.exit(1); - }) - .finally(async () => { - await prisma.$disconnect(); - }); diff --git a/backend/scripts/init-tenant-admin.ts b/backend/scripts/init-tenant-admin.ts deleted file mode 100644 index 6eb3690..0000000 --- a/backend/scripts/init-tenant-admin.ts +++ /dev/null @@ -1,1324 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -// 加载环境变量(必须在其他导入之前) -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -// scripts 目录的父目录就是 backend 目录 -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -// 尝试加载环境特定的配置文件 -dotenv.config({ path: envPath }); - -// 如果环境特定文件不存在,尝试加载默认的 .env 文件 -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -// 验证必要的环境变量 -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - console.error(` 请确保存在以下文件之一:`); - console.error(` - ${envPath}`); - console.error(` - ${path.resolve(backendDir, '.env')}`); - console.error(` 或者设置 NODE_ENV 环境变量(当前: ${nodeEnv})`); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcrypt'; - -const prisma = new PrismaClient(); - -// 定义所有基础权限 -const permissions = [ - { - code: 'workbench:read', - resource: 'workbench', - action: 'read', - name: '查看工作台', - description: '允许查看工作台', - }, - // 用户管理权限 - { - code: 'user:create', - resource: 'user', - action: 'create', - name: '创建用户', - description: '允许创建新用户', - }, - { - code: 'user:read', - resource: 'user', - action: 'read', - name: '查看用户', - description: '允许查看用户列表和详情', - }, - { - code: 'user:update', - resource: 'user', - action: 'update', - name: '更新用户', - description: '允许更新用户信息', - }, - { - code: 'user:delete', - resource: 'user', - action: 'delete', - name: '删除用户', - description: '允许删除用户', - }, - - // 角色管理权限 - { - code: 'role:create', - resource: 'role', - action: 'create', - name: '创建角色', - description: '允许创建新角色', - }, - { - code: 'role:read', - resource: 'role', - action: 'read', - name: '查看角色', - description: '允许查看角色列表和详情', - }, - { - code: 'role:update', - resource: 'role', - action: 'update', - name: '更新角色', - description: '允许更新角色信息', - }, - { - code: 'role:delete', - resource: 'role', - action: 'delete', - name: '删除角色', - description: '允许删除角色', - }, - { - code: 'role:assign', - resource: 'role', - action: 'assign', - name: '分配角色', - description: '允许给用户分配角色', - }, - - // 权限管理权限 - { - code: 'permission:create', - resource: 'permission', - action: 'create', - name: '创建权限', - description: '允许创建新权限', - }, - { - code: 'permission:read', - resource: 'permission', - action: 'read', - name: '查看权限', - description: '允许查看权限列表和详情', - }, - { - code: 'permission:update', - resource: 'permission', - action: 'update', - name: '更新权限', - description: '允许更新权限信息', - }, - { - code: 'permission:delete', - resource: 'permission', - action: 'delete', - name: '删除权限', - description: '允许删除权限', - }, - - // 菜单管理权限 - { - code: 'menu:create', - resource: 'menu', - action: 'create', - name: '创建菜单', - description: '允许创建新菜单', - }, - { - code: 'menu:read', - resource: 'menu', - action: 'read', - name: '查看菜单', - description: '允许查看菜单列表和详情', - }, - { - code: 'menu:update', - resource: 'menu', - action: 'update', - name: '更新菜单', - description: '允许更新菜单信息', - }, - { - code: 'menu:delete', - resource: 'menu', - action: 'delete', - name: '删除菜单', - description: '允许删除菜单', - }, - - // 数据字典权限 - { - code: 'dict:create', - resource: 'dict', - action: 'create', - name: '创建字典', - description: '允许创建新字典', - }, - { - code: 'dict:read', - resource: 'dict', - action: 'read', - name: '查看字典', - description: '允许查看字典列表和详情', - }, - { - code: 'dict:update', - resource: 'dict', - action: 'update', - name: '更新字典', - description: '允许更新字典信息', - }, - { - code: 'dict:delete', - resource: 'dict', - action: 'delete', - name: '删除字典', - description: '允许删除字典', - }, - - // 系统配置权限 - { - code: 'config:create', - resource: 'config', - action: 'create', - name: '创建配置', - description: '允许创建新配置', - }, - { - code: 'config:read', - resource: 'config', - action: 'read', - name: '查看配置', - description: '允许查看配置列表和详情', - }, - { - code: 'config:update', - resource: 'config', - action: 'update', - name: '更新配置', - description: '允许更新配置信息', - }, - { - code: 'config:delete', - resource: 'config', - action: 'delete', - name: '删除配置', - description: '允许删除配置', - }, - - // 日志管理权限 - { - code: 'log:read', - resource: 'log', - action: 'read', - name: '查看日志', - description: '允许查看系统日志', - }, - { - code: 'log:delete', - resource: 'log', - action: 'delete', - name: '删除日志', - description: '允许删除系统日志', - }, - - // 用户密码管理权限 - { - code: 'user:password:update', - resource: 'user', - action: 'password:update', - name: '修改用户密码', - description: '允许修改用户密码', - }, - - // 学校管理权限 - { - code: 'school:create', - resource: 'school', - action: 'create', - name: '创建学校', - description: '允许创建学校信息', - }, - { - code: 'school:read', - resource: 'school', - action: 'read', - name: '查看学校', - description: '允许查看学校信息', - }, - { - code: 'school:update', - resource: 'school', - action: 'update', - name: '更新学校', - description: '允许更新学校信息', - }, - { - code: 'school:delete', - resource: 'school', - action: 'delete', - name: '删除学校', - description: '允许删除学校信息', - }, - { - code: 'department:create', - resource: 'department', - action: 'create', - name: '创建部门', - description: '允许创建部门', - }, - { - code: 'department:read', - resource: 'department', - action: 'read', - name: '查看部门', - description: '允许查看部门列表和详情', - }, - { - code: 'department:update', - resource: 'department', - action: 'update', - name: '更新部门', - description: '允许更新部门信息', - }, - { - code: 'department:delete', - resource: 'department', - action: 'delete', - name: '删除部门', - description: '允许删除部门', - }, - { - code: 'grade:create', - resource: 'grade', - action: 'create', - name: '创建年级', - description: '允许创建年级', - }, - { - code: 'grade:read', - resource: 'grade', - action: 'read', - name: '查看年级', - description: '允许查看年级列表和详情', - }, - { - code: 'grade:update', - resource: 'grade', - action: 'update', - name: '更新年级', - description: '允许更新年级信息', - }, - { - code: 'grade:delete', - resource: 'grade', - action: 'delete', - name: '删除年级', - description: '允许删除年级', - }, - { - code: 'class:create', - resource: 'class', - action: 'create', - name: '创建班级', - description: '允许创建班级', - }, - { - code: 'class:read', - resource: 'class', - action: 'read', - name: '查看班级', - description: '允许查看班级列表和详情', - }, - { - code: 'class:update', - resource: 'class', - action: 'update', - name: '更新班级', - description: '允许更新班级信息', - }, - { - code: 'class:delete', - resource: 'class', - action: 'delete', - name: '删除班级', - description: '允许删除班级', - }, - { - code: 'teacher:create', - resource: 'teacher', - action: 'create', - name: '创建教师', - description: '允许创建教师', - }, - { - code: 'teacher:read', - resource: 'teacher', - action: 'read', - name: '查看教师', - description: '允许查看教师列表和详情', - }, - { - code: 'teacher:update', - resource: 'teacher', - action: 'update', - name: '更新教师', - description: '允许更新教师信息', - }, - { - code: 'teacher:delete', - resource: 'teacher', - action: 'delete', - name: '删除教师', - description: '允许删除教师', - }, - { - code: 'student:create', - resource: 'student', - action: 'create', - name: '创建学生', - description: '允许创建学生', - }, - { - code: 'student:read', - resource: 'student', - action: 'read', - name: '查看学生', - description: '允许查看学生列表和详情', - }, - { - code: 'student:update', - resource: 'student', - action: 'update', - name: '更新学生', - description: '允许更新学生信息', - }, - { - code: 'student:delete', - resource: 'student', - action: 'delete', - name: '删除学生', - description: '允许删除学生', - }, - - // 活动管理权限 - { - code: 'contest:create', - resource: 'contest', - action: 'create', - name: '创建活动', - description: '允许创建活动', - }, - { - code: 'contest:read', - resource: 'contest', - action: 'read', - name: '查看活动', - description: '允许查看活动列表和详情', - }, - { - code: 'contest:update', - resource: 'contest', - action: 'update', - name: '更新活动', - description: '允许更新活动信息', - }, - { - code: 'contest:delete', - resource: 'contest', - action: 'delete', - name: '删除活动', - description: '允许删除活动', - }, - { - code: 'contest:publish', - resource: 'contest', - action: 'publish', - name: '发布活动', - description: '允许发布活动', - }, - { - code: 'contest:team:create', - resource: 'contest:team', - action: 'create', - name: '创建团队', - description: '允许创建活动团队', - }, - { - code: 'contest:team:read', - resource: 'contest:team', - action: 'read', - name: '查看团队', - description: '允许查看团队列表和详情', - }, - { - code: 'contest:team:update', - resource: 'contest:team', - action: 'update', - name: '更新团队', - description: '允许更新团队信息', - }, - { - code: 'contest:team:delete', - resource: 'contest:team', - action: 'delete', - name: '删除团队', - description: '允许删除团队', - }, - { - code: 'contest:team:manage', - resource: 'contest:team', - action: 'manage', - name: '管理团队成员', - description: '允许管理团队成员', - }, - { - code: 'contest:review:create', - resource: 'contest:review', - action: 'create', - name: '创建评审规则', - description: '允许创建评审规则', - }, - { - code: 'contest:review:read', - resource: 'contest:review', - action: 'read', - name: '查看评审', - description: '允许查看评审规则和评审记录', - }, - { - code: 'contest:review:update', - resource: 'contest:review', - action: 'update', - name: '更新评审规则', - description: '允许更新评审规则', - }, - { - code: 'contest:review:delete', - resource: 'contest:review', - action: 'delete', - name: '删除评审规则', - description: '允许删除评审规则', - }, - { - code: 'contest:review:assign', - resource: 'contest:review', - action: 'assign', - name: '分配评审任务', - description: '允许分配评审任务给评委', - }, - { - code: 'contest:review:score', - resource: 'contest:review', - action: 'score', - name: '评审打分', - description: '允许对作品进行评审打分', - }, - { - code: 'contest:judge:create', - resource: 'contest:judge', - action: 'create', - name: '添加评委', - description: '允许添加活动评委', - }, - { - code: 'contest:judge:read', - resource: 'contest:judge', - action: 'read', - name: '查看评委', - description: '允许查看评委列表', - }, - { - code: 'contest:judge:update', - resource: 'contest:judge', - action: 'update', - name: '更新评委', - description: '允许更新评委信息', - }, - { - code: 'contest:judge:delete', - resource: 'contest:judge', - action: 'delete', - name: '删除评委', - description: '允许删除评委', - }, - { - code: 'contest:work:create', - resource: 'contest:work', - action: 'create', - name: '创建作品', - description: '允许创建参赛作品', - }, - { - code: 'contest:work:read', - resource: 'contest:work', - action: 'read', - name: '查看作品', - description: '允许查看作品列表和详情', - }, - { - code: 'contest:work:update', - resource: 'contest:work', - action: 'update', - name: '更新作品', - description: '允许更新作品信息', - }, - { - code: 'contest:work:delete', - resource: 'contest:work', - action: 'delete', - name: '删除作品', - description: '允许删除作品', - }, - { - code: 'contest:work:submit', - resource: 'contest:work', - action: 'submit', - name: '提交作品', - description: '允许提交作品', - }, - { - code: 'contest:work:review', - resource: 'contest:work', - action: 'review', - name: '审核作品', - description: '允许审核作品状态', - }, - { - code: 'contest:registration:create', - resource: 'contest:registration', - action: 'create', - name: '创建报名', - description: '允许创建报名记录', - }, - { - code: 'contest:registration:read', - resource: 'contest:registration', - action: 'read', - name: '查看报名', - description: '允许查看报名列表和详情', - }, - { - code: 'contest:registration:update', - resource: 'contest:registration', - action: 'update', - name: '更新报名', - description: '允许更新报名信息', - }, - { - code: 'contest:registration:delete', - resource: 'contest:registration', - action: 'delete', - name: '删除报名', - description: '允许删除报名记录', - }, - { - code: 'contest:registration:approve', - resource: 'contest:registration', - action: 'approve', - name: '审核报名', - description: '允许审核报名(通过/拒绝)', - }, - { - code: 'contest:notice:create', - resource: 'contest:notice', - action: 'create', - name: '创建公告', - description: '允许创建活动公告', - }, - { - code: 'contest:notice:read', - resource: 'contest:notice', - action: 'read', - name: '查看公告', - description: '允许查看公告列表和详情', - }, - { - code: 'contest:notice:update', - resource: 'contest:notice', - action: 'update', - name: '更新公告', - description: '允许更新公告信息', - }, - { - code: 'contest:notice:delete', - resource: 'contest:notice', - action: 'delete', - name: '删除公告', - description: '允许删除公告', - }, - { - code: 'contest:notice:publish', - resource: 'contest:notice', - action: 'publish', - name: '发布公告', - description: '允许发布公告', - }, - - // 作业管理权限 - { - code: 'homework:create', - resource: 'homework', - action: 'create', - name: '创建作业', - description: '允许创建作业', - }, - { - code: 'homework:read', - resource: 'homework', - action: 'read', - name: '查看作业', - description: '允许查看作业列表和详情', - }, - { - code: 'homework:update', - resource: 'homework', - action: 'update', - name: '更新作业', - description: '允许更新作业信息', - }, - { - code: 'homework:delete', - resource: 'homework', - action: 'delete', - name: '删除作业', - description: '允许删除作业', - }, - - // 租户查看权限(所有租户都可以查看租户列表,用于发布活动选择公开范围等) - { - code: 'tenant:read', - resource: 'tenant', - action: 'read', - name: '查看租户', - description: '允许查看租户列表和详情', - }, - - // 评委管理权限(简化前缀) - { - code: 'judge:create', - resource: 'judge', - action: 'create', - name: '添加评委', - description: '允许添加评委', - }, - { - code: 'judge:read', - resource: 'judge', - action: 'read', - name: '查看评委', - description: '允许查看评委列表和详情', - }, - { - code: 'judge:update', - resource: 'judge', - action: 'update', - name: '更新评委', - description: '允许更新评委信息', - }, - { - code: 'judge:delete', - resource: 'judge', - action: 'delete', - name: '删除评委', - description: '允许删除评委', - }, - - // 公告管理权限(简化前缀) - { - code: 'notice:create', - resource: 'notice', - action: 'create', - name: '创建公告', - description: '允许创建公告', - }, - { - code: 'notice:read', - resource: 'notice', - action: 'read', - name: '查看公告', - description: '允许查看公告列表和详情', - }, - { - code: 'notice:update', - resource: 'notice', - action: 'update', - name: '更新公告', - description: '允许更新公告信息', - }, - { - code: 'notice:delete', - resource: 'notice', - action: 'delete', - name: '删除公告', - description: '允许删除公告', - }, - - // 作品管理权限(简化前缀) - { - code: 'work:read', - resource: 'work', - action: 'read', - name: '查看作品', - description: '允许查看参赛作品', - }, -]; - -// 超级管理员专属权限(只有超级租户才能拥有) -const superAdminPermissions = [ - { - code: 'tenant:create', - resource: 'tenant', - action: 'create', - name: '创建租户', - description: '允许创建租户(仅超级管理员)', - }, - { - code: 'tenant:update', - resource: 'tenant', - action: 'update', - name: '更新租户', - description: '允许更新租户信息(仅超级管理员)', - }, - { - code: 'tenant:delete', - resource: 'tenant', - action: 'delete', - name: '删除租户', - description: '允许删除租户(仅超级管理员)', - }, -]; - -/** - * 仅初始化 admin 角色的权限(不创建用户、角色和菜单) - */ -async function initTenantAdminPermissionsOnly(tenantCode: string) { - try { - console.log(`🚀 开始为租户 "${tenantCode}" 的 admin 角色初始化权限...\n`); - - // 1. 查找租户 - console.log(`📋 步骤 1: 查找租户 "${tenantCode}"...`); - const tenant = await prisma.tenant.findUnique({ - where: { code: tenantCode }, - }); - - if (!tenant) { - console.error(`❌ 错误: 租户 "${tenantCode}" 不存在!`); - console.error(' 请先创建租户后再运行此脚本'); - process.exit(1); - } - - if (tenant.validState !== 1) { - console.error(`❌ 错误: 租户 "${tenantCode}" 状态无效!`); - process.exit(1); - } - - const isSuperTenant = tenant.isSuper === 1; - console.log(`✅ 找到租户: ${tenant.name} (${tenant.code})${isSuperTenant ? ' [超级租户]' : ''}\n`); - - // 2. 检查 admin 角色是否存在 - console.log(`👤 步骤 2: 检查 admin 角色是否存在...`); - const adminRole = await prisma.role.findFirst({ - where: { - tenantId: tenant.id, - code: 'admin', - }, - }); - - if (!adminRole) { - console.error(`❌ 错误: 租户 "${tenantCode}" 的 admin 角色不存在!`); - console.error(' 请先运行完整初始化脚本创建 admin 角色'); - console.error(` 使用方法: pnpm init:tenant-admin ${tenantCode}`); - process.exit(1); - } - - console.log(`✅ 找到 admin 角色: ${adminRole.name} (${adminRole.code})\n`); - - // 3. 初始化租户权限(如果不存在则创建) - // 超级租户拥有所有权限,普通租户只拥有基础权限 - const allPermissions = isSuperTenant - ? [...permissions, ...superAdminPermissions] - : permissions; - - console.log(`📝 步骤 3: 初始化租户权限...${isSuperTenant ? '(包含超级管理员权限)' : ''}`); - const createdPermissions = []; - - for (const perm of allPermissions) { - // 检查权限是否已存在 - const existingPermission = await prisma.permission.findFirst({ - where: { - tenantId: tenant.id, - code: perm.code, - }, - }); - - if (!existingPermission) { - // 创建权限 - const permission = await prisma.permission.create({ - data: { - tenantId: tenant.id, - code: perm.code, - resource: perm.resource, - action: perm.action, - name: perm.name, - description: perm.description, - validState: 1, - }, - }); - createdPermissions.push(permission); - console.log(` ✓ 创建权限: ${perm.code} - ${perm.name}`); - } else { - // 更新现有权限(确保信息是最新的) - const permission = await prisma.permission.update({ - where: { id: existingPermission.id }, - data: { - name: perm.name, - resource: perm.resource, - action: perm.action, - description: perm.description, - validState: 1, - }, - }); - createdPermissions.push(permission); - } - } - - console.log(`✅ 共确保 ${createdPermissions.length} 个权限存在\n`); - - // 获取租户的所有有效权限 - const tenantPermissions = await prisma.permission.findMany({ - where: { - tenantId: tenant.id, - validState: 1, - }, - }); - - // 4. 为 admin 角色分配所有权限 - console.log(`🔗 步骤 4: 为 admin 角色分配所有权限...`); - const existingRolePermissions = await prisma.rolePermission.findMany({ - where: { roleId: adminRole.id }, - select: { permissionId: true }, - }); - const existingPermissionIds = new Set( - existingRolePermissions.map((rp) => rp.permissionId), - ); - - let addedCount = 0; - for (const permission of tenantPermissions) { - if (!existingPermissionIds.has(permission.id)) { - await prisma.rolePermission.create({ - data: { - roleId: adminRole.id, - permissionId: permission.id, - }, - }); - addedCount++; - } - } - - if (addedCount > 0) { - console.log(`✅ 为 admin 角色添加了 ${addedCount} 个权限`); - console.log(`✅ admin 角色现在拥有 ${tenantPermissions.length} 个权限\n`); - } else { - console.log( - `✅ admin 角色已拥有所有权限(${tenantPermissions.length} 个)\n`, - ); - } - - // 5. 验证结果 - console.log('🔍 步骤 5: 验证结果...'); - const roleWithPermissions = await prisma.role.findUnique({ - where: { id: adminRole.id }, - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }); - - const permissionCodes = new Set(); - roleWithPermissions?.permissions.forEach((rp) => { - permissionCodes.add(rp.permission.code); - }); - - console.log(`\n📊 初始化结果:`); - console.log(` 租户名称: ${tenant.name}`); - console.log(` 租户编码: ${tenant.code}`); - console.log(` 角色名称: ${adminRole.name}`); - console.log(` 角色编码: ${adminRole.code}`); - console.log(` 权限数量: ${permissionCodes.size}`); - if (permissionCodes.size > 0) { - console.log(` 权限列表:`); - Array.from(permissionCodes) - .sort() - .forEach((code) => { - console.log(` - ${code}`); - }); - } - console.log(`\n✅ admin 角色权限初始化完成!`); - } catch (error) { - console.error('❌ 初始化失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -async function initTenantAdmin(tenantCode: string) { - try { - console.log(`🚀 开始为租户 "${tenantCode}" 初始化 admin 账号...\n`); - - // 1. 查找租户 - console.log(`📋 步骤 1: 查找租户 "${tenantCode}"...`); - const tenant = await prisma.tenant.findUnique({ - where: { code: tenantCode }, - }); - - if (!tenant) { - console.error(`❌ 错误: 租户 "${tenantCode}" 不存在!`); - console.error(' 请先创建租户后再运行此脚本'); - process.exit(1); - } - - if (tenant.validState !== 1) { - console.error(`❌ 错误: 租户 "${tenantCode}" 状态无效!`); - process.exit(1); - } - - const isSuperTenant = tenant.isSuper === 1; - console.log(`✅ 找到租户: ${tenant.name} (${tenant.code})${isSuperTenant ? ' [超级租户]' : ''}\n`); - - // 2. 检查是否已存在 admin 用户 - console.log(`👤 步骤 2: 检查 admin 用户是否已存在...`); - const existingAdmin = await prisma.user.findFirst({ - where: { - tenantId: tenant.id, - username: 'admin', - }, - }); - - if (existingAdmin) { - console.log(`⚠️ 警告: 租户 "${tenantCode}" 已存在 admin 用户`); - console.log(` 用户ID: ${existingAdmin.id}`); - console.log(` 用户名: ${existingAdmin.username}`); - console.log(` 昵称: ${existingAdmin.nickname}`); - console.log(` 将更新密码和权限...\n`); - } - - // 3. 初始化租户权限(如果不存在则创建) - // 超级租户拥有所有权限,普通租户只拥有基础权限 - const allPermissions = isSuperTenant - ? [...permissions, ...superAdminPermissions] - : permissions; - - console.log(`📝 步骤 3: 初始化租户权限...${isSuperTenant ? '(包含超级管理员权限)' : ''}`); - const createdPermissions = []; - - for (const perm of allPermissions) { - // 检查权限是否已存在 - const existingPermission = await prisma.permission.findFirst({ - where: { - tenantId: tenant.id, - code: perm.code, - }, - }); - - if (!existingPermission) { - // 创建权限 - const permission = await prisma.permission.create({ - data: { - tenantId: tenant.id, - code: perm.code, - resource: perm.resource, - action: perm.action, - name: perm.name, - description: perm.description, - validState: 1, - }, - }); - createdPermissions.push(permission); - console.log(` ✓ 创建权限: ${perm.code} - ${perm.name}`); - } else { - // 更新现有权限(确保信息是最新的) - const permission = await prisma.permission.update({ - where: { id: existingPermission.id }, - data: { - name: perm.name, - resource: perm.resource, - action: perm.action, - description: perm.description, - validState: 1, - }, - }); - createdPermissions.push(permission); - } - } - - console.log(`✅ 共确保 ${createdPermissions.length} 个权限存在\n`); - - // 获取租户的所有有效权限 - const tenantPermissions = await prisma.permission.findMany({ - where: { - tenantId: tenant.id, - validState: 1, - }, - }); - - // 4. 创建或获取 admin 角色 - console.log(`👤 步骤 4: 创建或获取 admin 角色...`); - let adminRole = await prisma.role.findFirst({ - where: { - tenantId: tenant.id, - code: 'admin', - }, - }); - - if (!adminRole) { - adminRole = await prisma.role.create({ - data: { - tenantId: tenant.id, - name: '管理员', - code: 'admin', - description: '租户管理员角色,拥有租户的所有权限', - validState: 1, - }, - }); - console.log( - `✅ admin 角色已创建: ${adminRole.name} (${adminRole.code})\n`, - ); - } else { - // 更新角色信息 - adminRole = await prisma.role.update({ - where: { id: adminRole.id }, - data: { - name: '管理员', - description: '租户管理员角色,拥有租户的所有权限', - validState: 1, - }, - }); - console.log( - `✅ admin 角色已更新: ${adminRole.name} (${adminRole.code})\n`, - ); - } - - // 5. 为 admin 角色分配所有权限 - console.log(`🔗 步骤 5: 为 admin 角色分配所有权限...`); - const existingRolePermissions = await prisma.rolePermission.findMany({ - where: { roleId: adminRole.id }, - select: { permissionId: true }, - }); - const existingPermissionIds = new Set( - existingRolePermissions.map((rp) => rp.permissionId), - ); - - let addedCount = 0; - for (const permission of tenantPermissions) { - if (!existingPermissionIds.has(permission.id)) { - await prisma.rolePermission.create({ - data: { - roleId: adminRole.id, - permissionId: permission.id, - }, - }); - addedCount++; - } - } - - if (addedCount > 0) { - console.log(`✅ 为 admin 角色添加了 ${addedCount} 个权限`); - console.log(`✅ admin 角色现在拥有 ${tenantPermissions.length} 个权限\n`); - } else { - console.log( - `✅ admin 角色已拥有所有权限(${tenantPermissions.length} 个)\n`, - ); - } - - // 6. 创建或更新 admin 用户 - console.log(`👤 步骤 6: 创建或更新 admin 用户...`); - const password = `admin@${tenantCode}`; - const hashedPassword = await bcrypt.hash(password, 10); - - let adminUser; - if (existingAdmin) { - adminUser = await prisma.user.update({ - where: { id: existingAdmin.id }, - data: { - password: hashedPassword, - nickname: '管理员', - email: `admin@${tenantCode}.com`, - validState: 1, - }, - }); - console.log( - `✅ 用户已更新: ${adminUser.username} (${adminUser.nickname})\n`, - ); - } else { - adminUser = await prisma.user.create({ - data: { - tenantId: tenant.id, - username: 'admin', - password: hashedPassword, - nickname: '管理员', - email: `admin@${tenantCode}.com`, - validState: 1, - }, - }); - console.log( - `✅ 用户已创建: ${adminUser.username} (${adminUser.nickname})\n`, - ); - } - - // 7. 为 admin 用户分配 admin 角色 - console.log(`🔗 步骤 7: 为 admin 用户分配 admin 角色...`); - const existingUserRole = await prisma.userRole.findUnique({ - where: { - userId_roleId: { - userId: adminUser.id, - roleId: adminRole.id, - }, - }, - }); - - if (!existingUserRole) { - await prisma.userRole.create({ - data: { - userId: adminUser.id, - roleId: adminRole.id, - }, - }); - console.log(`✅ 角色分配成功\n`); - } else { - console.log(`✅ 用户已拥有 admin 角色\n`); - } - - // 8. 验证结果 - console.log('🔍 步骤 8: 验证结果...'); - const userWithRoles = await prisma.user.findUnique({ - where: { id: adminUser.id }, - include: { - roles: { - include: { - role: { - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }, - }, - }, - }, - }); - - const roleCodes = userWithRoles?.roles.map((ur) => ur.role.code) || []; - const permissionCodes = new Set(); - userWithRoles?.roles.forEach((ur) => { - ur.role.permissions.forEach((rp) => { - permissionCodes.add(rp.permission.code); - }); - }); - - console.log(`\n📊 初始化结果:`); - console.log(` 租户名称: ${tenant.name}`); - console.log(` 租户编码: ${tenant.code}`); - console.log(` 用户名: ${adminUser.username}`); - console.log(` 昵称: ${adminUser.nickname}`); - console.log(` 密码: ${password}`); - console.log(` 角色: ${roleCodes.join(', ')}`); - console.log(` 权限数量: ${permissionCodes.size}`); - if (permissionCodes.size > 0) { - console.log(` 权限列表:`); - Array.from(permissionCodes) - .sort() - .forEach((code) => { - console.log(` - ${code}`); - }); - } - console.log(`\n✅ 租户 admin 账号初始化完成!`); - console.log(`\n💡 现在可以使用以下凭据登录:`); - console.log(` 租户编码: ${tenant.code}`); - console.log(` 用户名: ${adminUser.username}`); - console.log(` 密码: ${password}`); - } catch (error) { - console.error('❌ 初始化失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -// 获取命令行参数 -// 支持两种调用方式: -// 1. pnpm init:tenant-admin tenant1 --permissions-only -// 2. pnpm init:tenant-admin:permissions tenant1 (--permissions-only 在 argv[2]) -let tenantCode: string | undefined; -let permissionsOnly = false; - -// 检查是否有 --permissions-only 标志 -if (process.argv[2] === '--permissions-only') { - permissionsOnly = true; - tenantCode = process.argv[3]; -} else if (process.argv[3] === '--permissions-only') { - permissionsOnly = true; - tenantCode = process.argv[2]; -} else { - tenantCode = process.argv[2]; -} - -if (!tenantCode) { - console.error('❌ 错误: 请提供租户编码作为参数'); - console.error(' 使用方法:'); - console.error(' 完整初始化: pnpm init:tenant-admin <租户编码>'); - console.error( - ' 仅初始化权限: pnpm init:tenant-admin <租户编码> --permissions-only', - ); - console.error(' 或: pnpm init:tenant-admin:permissions <租户编码>'); - console.error(' 示例:'); - console.error(' pnpm init:tenant-admin tenant1'); - console.error(' pnpm init:tenant-admin tenant1 --permissions-only'); - console.error(' pnpm init:tenant-admin:permissions tenant1'); - process.exit(1); -} - -// 执行初始化 -const initFunction = permissionsOnly - ? initTenantAdminPermissionsOnly - : initTenantAdmin; - -initFunction(tenantCode) - .then(() => { - console.log('\n🎉 初始化脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 初始化脚本执行失败:', error); - process.exit(1); - }); diff --git a/backend/scripts/init-tenant-menu-permissions.ts b/backend/scripts/init-tenant-menu-permissions.ts deleted file mode 100644 index 7f5f7d6..0000000 --- a/backend/scripts/init-tenant-menu-permissions.ts +++ /dev/null @@ -1,429 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -// 加载环境变量(必须在其他导入之前) -import * as dotenv from 'dotenv'; -import * as path from 'path'; -import * as fs from 'fs'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -// scripts 目录的父目录就是 backend 目录 -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -// 尝试加载环境特定的配置文件 -dotenv.config({ path: envPath }); - -// 如果环境特定文件不存在,尝试加载默认的 .env 文件 -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -// 验证必要的环境变量 -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - console.error(` 请确保存在以下文件之一:`); - console.error(` - ${envPath}`); - console.error(` - ${path.resolve(backendDir, '.env')}`); - console.error(` 或者设置 NODE_ENV 环境变量(当前: ${nodeEnv})`); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcrypt'; - -const prisma = new PrismaClient(); - -// 从 JSON 文件加载权限数据 -const permissionsFilePath = path.resolve(backendDir, 'data', 'permissions.json'); - -if (!fs.existsSync(permissionsFilePath)) { - console.error(`❌ 错误: 权限数据文件不存在: ${permissionsFilePath}`); - process.exit(1); -} - -const permissions = JSON.parse(fs.readFileSync(permissionsFilePath, 'utf-8')); - -async function initTenantMenuAndPermissions(tenantCode: string) { - try { - console.log(`🚀 开始为租户 "${tenantCode}" 初始化菜单和权限...\n`); - - // 1. 查找或创建租户 - console.log(`📋 步骤 1: 查找或创建租户 "${tenantCode}"...`); - let tenant = await prisma.tenant.findUnique({ - where: { code: tenantCode }, - }); - - if (!tenant) { - // 创建租户 - tenant = await prisma.tenant.create({ - data: { - name: `${tenantCode} 租户`, - code: tenantCode, - domain: tenantCode, - description: `租户 ${tenantCode}`, - isSuper: 0, - validState: 1, - }, - }); - console.log(`✅ 租户创建成功: ${tenant.name} (${tenant.code})\n`); - } else { - if (tenant.validState !== 1) { - console.error(`❌ 错误: 租户 "${tenantCode}" 状态无效!`); - process.exit(1); - } - console.log(`✅ 找到租户: ${tenant.name} (${tenant.code})\n`); - } - - // 2. 查找或创建 admin 用户 - console.log(`👤 步骤 2: 查找或创建 admin 用户...`); - let adminUser = await prisma.user.findFirst({ - where: { - tenantId: tenant.id, - username: 'admin', - }, - }); - - const password = `admin@${tenantCode}`; - const hashedPassword = await bcrypt.hash(password, 10); - - if (!adminUser) { - adminUser = await prisma.user.create({ - data: { - tenantId: tenant.id, - username: 'admin', - password: hashedPassword, - nickname: '管理员', - email: `admin@${tenantCode}.com`, - validState: 1, - }, - }); - console.log(`✅ admin 用户创建成功: ${adminUser.username}\n`); - } else { - // 更新密码(确保密码是最新的) - adminUser = await prisma.user.update({ - where: { id: adminUser.id }, - data: { - password: hashedPassword, - nickname: '管理员', - email: `admin@${tenantCode}.com`, - validState: 1, - }, - }); - console.log(`✅ admin 用户已存在: ${adminUser.username}\n`); - } - - // 3. 查找或创建 admin 角色 - console.log(`👤 步骤 3: 查找或创建 admin 角色...`); - let adminRole = await prisma.role.findFirst({ - where: { - tenantId: tenant.id, - code: 'admin', - }, - }); - - if (!adminRole) { - adminRole = await prisma.role.create({ - data: { - tenantId: tenant.id, - name: '管理员', - code: 'admin', - description: '租户管理员角色,拥有租户的所有权限', - validState: 1, - }, - }); - console.log(`✅ admin 角色创建成功: ${adminRole.name} (${adminRole.code})\n`); - } else { - adminRole = await prisma.role.update({ - where: { id: adminRole.id }, - data: { - name: '管理员', - description: '租户管理员角色,拥有租户的所有权限', - validState: 1, - }, - }); - console.log(`✅ admin 角色已存在: ${adminRole.name} (${adminRole.code})\n`); - } - - // 4. 为 admin 用户分配 admin 角色 - console.log(`🔗 步骤 4: 为 admin 用户分配 admin 角色...`); - const existingUserRole = await prisma.userRole.findUnique({ - where: { - userId_roleId: { - userId: adminUser.id, - roleId: adminRole.id, - }, - }, - }); - - if (!existingUserRole) { - await prisma.userRole.create({ - data: { - userId: adminUser.id, - roleId: adminRole.id, - }, - }); - console.log(`✅ 角色分配成功\n`); - } else { - console.log(`✅ 用户已拥有 admin 角色\n`); - } - - // 5. 初始化租户权限(如果不存在则创建) - console.log(`📝 步骤 5: 初始化租户权限...`); - const createdPermissions = []; - - for (const perm of permissions) { - // 检查权限是否已存在 - const existingPermission = await prisma.permission.findFirst({ - where: { - tenantId: tenant.id, - code: perm.code, - }, - }); - - if (!existingPermission) { - // 创建权限 - const permission = await prisma.permission.create({ - data: { - tenantId: tenant.id, - code: perm.code, - resource: perm.resource, - action: perm.action, - name: perm.name, - description: perm.description, - validState: 1, - }, - }); - createdPermissions.push(permission); - console.log(` ✓ 创建权限: ${perm.code} - ${perm.name}`); - } else { - // 更新现有权限(确保信息是最新的) - const permission = await prisma.permission.update({ - where: { id: existingPermission.id }, - data: { - name: perm.name, - resource: perm.resource, - action: perm.action, - description: perm.description, - validState: 1, - }, - }); - createdPermissions.push(permission); - } - } - - console.log(`✅ 共确保 ${createdPermissions.length} 个权限存在\n`); - - // 获取租户的所有有效权限 - const tenantPermissions = await prisma.permission.findMany({ - where: { - tenantId: tenant.id, - validState: 1, - }, - }); - - // 6. 为 admin 角色分配所有权限 - console.log(`🔗 步骤 6: 为 admin 角色分配所有权限...`); - const existingRolePermissions = await prisma.rolePermission.findMany({ - where: { roleId: adminRole.id }, - select: { permissionId: true }, - }); - const existingPermissionIds = new Set( - existingRolePermissions.map((rp) => rp.permissionId), - ); - - let addedPermissionCount = 0; - for (const permission of tenantPermissions) { - if (!existingPermissionIds.has(permission.id)) { - await prisma.rolePermission.create({ - data: { - roleId: adminRole.id, - permissionId: permission.id, - }, - }); - addedPermissionCount++; - } - } - - if (addedPermissionCount > 0) { - console.log(`✅ 为 admin 角色添加了 ${addedPermissionCount} 个权限`); - console.log(`✅ admin 角色现在拥有 ${tenantPermissions.length} 个权限\n`); - } else { - console.log( - `✅ admin 角色已拥有所有权限(${tenantPermissions.length} 个)\n`, - ); - } - - // 7. 为租户分配所有菜单 - console.log(`📋 步骤 7: 为租户分配所有菜单...`); - - // 获取所有有效菜单 - const allMenus = await prisma.menu.findMany({ - where: { - validState: 1, - }, - orderBy: [{ sort: 'asc' }, { id: 'asc' }], - }); - - if (allMenus.length === 0) { - console.log('⚠️ 警告: 数据库中没有任何菜单'); - console.log(' 请先运行 pnpm init:menus 初始化菜单\n'); - } else { - console.log(` 找到 ${allMenus.length} 个菜单\n`); - - // 获取租户已分配的菜单 - const existingTenantMenus = await prisma.tenantMenu.findMany({ - where: { - tenantId: tenant.id, - }, - select: { - menuId: true, - }, - }); - - const existingMenuIds = new Set(existingTenantMenus.map((tm) => tm.menuId)); - - // 为租户分配所有菜单 - let addedMenuCount = 0; - const menuNames: string[] = []; - - for (const menu of allMenus) { - if (!existingMenuIds.has(menu.id)) { - await prisma.tenantMenu.create({ - data: { - tenantId: tenant.id, - menuId: menu.id, - }, - }); - addedMenuCount++; - menuNames.push(menu.name); - } - } - - if (addedMenuCount > 0) { - console.log(`✅ 为租户添加了 ${addedMenuCount} 个菜单:`); - menuNames.forEach((name) => { - console.log(` ✓ ${name}`); - }); - console.log(`\n✅ 租户现在拥有 ${allMenus.length} 个菜单\n`); - } else { - console.log(`✅ 租户已拥有所有菜单(${allMenus.length} 个)\n`); - } - } - - // 8. 验证结果 - console.log('🔍 步骤 8: 验证结果...'); - const userWithRoles = await prisma.user.findUnique({ - where: { id: adminUser.id }, - include: { - roles: { - include: { - role: { - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }, - }, - }, - }, - }); - - const roleCodes = userWithRoles?.roles.map((ur) => ur.role.code) || []; - const permissionCodes = new Set(); - userWithRoles?.roles.forEach((ur) => { - ur.role.permissions.forEach((rp) => { - permissionCodes.add(rp.permission.code); - }); - }); - - const finalMenus = await prisma.tenantMenu.findMany({ - where: { - tenantId: tenant.id, - }, - include: { - menu: true, - }, - }); - - console.log(`\n📊 初始化结果:`); - console.log('========================================'); - console.log('租户信息:'); - console.log(` 租户名称: ${tenant.name}`); - console.log(` 租户编码: ${tenant.code}`); - console.log(` 访问链接: http://your-domain.com/?tenant=${tenant.code}`); - console.log('========================================'); - console.log('管理员登录信息:'); - console.log(` 用户名: ${adminUser.username}`); - console.log(` 密码: ${password}`); - console.log(` 昵称: ${adminUser.nickname}`); - console.log(` 邮箱: ${adminUser.email}`); - console.log('========================================'); - console.log('角色和权限:'); - console.log(` 角色: ${roleCodes.join(', ')}`); - console.log(` 权限数量: ${permissionCodes.size}`); - if (permissionCodes.size > 0 && permissionCodes.size <= 20) { - console.log(` 权限列表:`); - Array.from(permissionCodes) - .sort() - .forEach((code) => { - console.log(` - ${code}`); - }); - } else if (permissionCodes.size > 20) { - console.log(` 权限列表(前20个):`); - Array.from(permissionCodes) - .sort() - .slice(0, 20) - .forEach((code) => { - console.log(` - ${code}`); - }); - console.log(` ... 还有 ${permissionCodes.size - 20} 个权限`); - } - console.log('========================================'); - console.log('菜单分配:'); - console.log(` 已分配菜单数: ${finalMenus.length}`); - if (finalMenus.length > 0) { - const topLevelMenus = finalMenus.filter((tm) => !tm.menu.parentId); - console.log(` 顶级菜单数: ${topLevelMenus.length}`); - } - console.log('========================================'); - console.log(`\n✅ 租户菜单和权限初始化完成!`); - console.log(`\n💡 现在可以使用以下凭据登录:`); - console.log(` 租户编码: ${tenant.code}`); - console.log(` 用户名: ${adminUser.username}`); - console.log(` 密码: ${password}`); - } catch (error) { - console.error('❌ 初始化失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -// 获取命令行参数 -const tenantCode = process.argv[2]; - -if (!tenantCode) { - console.error('❌ 错误: 请提供租户编码作为参数'); - console.error(' 使用方法:'); - console.error(' pnpm init:tenant-menu-permissions <租户编码>'); - console.error(' 示例:'); - console.error(' pnpm init:tenant-menu-permissions tenant1'); - process.exit(1); -} - -// 执行初始化 -initTenantMenuAndPermissions(tenantCode) - .then(() => { - console.log('\n🎉 初始化脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 初始化脚本执行失败:', error); - process.exit(1); - }); - diff --git a/backend/scripts/init-tenant.ts b/backend/scripts/init-tenant.ts deleted file mode 100644 index 58015d2..0000000 --- a/backend/scripts/init-tenant.ts +++ /dev/null @@ -1,429 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck -// 初始化普通租户脚本(包含角色) -import * as dotenv from 'dotenv'; -import * as path from 'path'; - -// 根据 NODE_ENV 加载对应的环境配置文件 -const nodeEnv = process.env.NODE_ENV || 'development'; -const envFile = `.env.${nodeEnv}`; -const backendDir = path.resolve(__dirname, '..'); -const envPath = path.resolve(backendDir, envFile); - -dotenv.config({ path: envPath }); - -if (!process.env.DATABASE_URL) { - dotenv.config({ path: path.resolve(backendDir, '.env') }); -} - -if (!process.env.DATABASE_URL) { - console.error('❌ 错误: 未找到 DATABASE_URL 环境变量'); - process.exit(1); -} - -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcrypt'; -import * as readline from 'readline'; - -const prisma = new PrismaClient(); - -// ============================================ -// 权限定义 -// ============================================ -const allPermissions = [ - // 工作台 - { code: 'workbench:read', resource: 'workbench', action: 'read', name: '查看工作台', description: '允许查看工作台' }, - - // 用户管理 - { code: 'user:create', resource: 'user', action: 'create', name: '创建用户', description: '允许创建新用户' }, - { code: 'user:read', resource: 'user', action: 'read', name: '查看用户', description: '允许查看用户列表和详情' }, - { code: 'user:update', resource: 'user', action: 'update', name: '更新用户', description: '允许更新用户信息' }, - { code: 'user:delete', resource: 'user', action: 'delete', name: '删除用户', description: '允许删除用户' }, - - // 角色管理 - { code: 'role:create', resource: 'role', action: 'create', name: '创建角色', description: '允许创建新角色' }, - { code: 'role:read', resource: 'role', action: 'read', name: '查看角色', description: '允许查看角色列表和详情' }, - { code: 'role:update', resource: 'role', action: 'update', name: '更新角色', description: '允许更新角色信息' }, - { code: 'role:delete', resource: 'role', action: 'delete', name: '删除角色', description: '允许删除角色' }, - { code: 'role:assign', resource: 'role', action: 'assign', name: '分配角色', description: '允许给用户分配角色' }, - - // 权限管理 - { code: 'permission:read', resource: 'permission', action: 'read', name: '查看权限', description: '允许查看权限列表' }, - - // 菜单管理 - { code: 'menu:read', resource: 'menu', action: 'read', name: '查看菜单', description: '允许查看菜单列表' }, - - // 学校管理 - { code: 'school:create', resource: 'school', action: 'create', name: '创建学校', description: '允许创建学校信息' }, - { code: 'school:read', resource: 'school', action: 'read', name: '查看学校', description: '允许查看学校信息' }, - { code: 'school:update', resource: 'school', action: 'update', name: '更新学校', description: '允许更新学校信息' }, - { code: 'school:delete', resource: 'school', action: 'delete', name: '删除学校', description: '允许删除学校信息' }, - - // 部门管理 - { code: 'department:create', resource: 'department', action: 'create', name: '创建部门', description: '允许创建部门' }, - { code: 'department:read', resource: 'department', action: 'read', name: '查看部门', description: '允许查看部门列表' }, - { code: 'department:update', resource: 'department', action: 'update', name: '更新部门', description: '允许更新部门信息' }, - { code: 'department:delete', resource: 'department', action: 'delete', name: '删除部门', description: '允许删除部门' }, - - // 年级管理 - { code: 'grade:create', resource: 'grade', action: 'create', name: '创建年级', description: '允许创建年级' }, - { code: 'grade:read', resource: 'grade', action: 'read', name: '查看年级', description: '允许查看年级列表' }, - { code: 'grade:update', resource: 'grade', action: 'update', name: '更新年级', description: '允许更新年级信息' }, - { code: 'grade:delete', resource: 'grade', action: 'delete', name: '删除年级', description: '允许删除年级' }, - - // 班级管理 - { code: 'class:create', resource: 'class', action: 'create', name: '创建班级', description: '允许创建班级' }, - { code: 'class:read', resource: 'class', action: 'read', name: '查看班级', description: '允许查看班级列表' }, - { code: 'class:update', resource: 'class', action: 'update', name: '更新班级', description: '允许更新班级信息' }, - { code: 'class:delete', resource: 'class', action: 'delete', name: '删除班级', description: '允许删除班级' }, - - // 教师管理 - { code: 'teacher:create', resource: 'teacher', action: 'create', name: '创建教师', description: '允许创建教师' }, - { code: 'teacher:read', resource: 'teacher', action: 'read', name: '查看教师', description: '允许查看教师列表' }, - { code: 'teacher:update', resource: 'teacher', action: 'update', name: '更新教师', description: '允许更新教师信息' }, - { code: 'teacher:delete', resource: 'teacher', action: 'delete', name: '删除教师', description: '允许删除教师' }, - - // 学生管理 - { code: 'student:create', resource: 'student', action: 'create', name: '创建学生', description: '允许创建学生' }, - { code: 'student:read', resource: 'student', action: 'read', name: '查看学生', description: '允许查看学生列表' }, - { code: 'student:update', resource: 'student', action: 'update', name: '更新学生', description: '允许更新学生信息' }, - { code: 'student:delete', resource: 'student', action: 'delete', name: '删除学生', description: '允许删除学生' }, - - // 我的评审(参与者权限) - { code: 'activity:read', resource: 'activity', action: 'read', name: '查看我的评审', description: '允许查看已发布的我的评审' }, - { code: 'activity:guidance', resource: 'activity', action: 'guidance', name: '指导学生', description: '允许指导学生参赛' }, - - // 活动报名 - { code: 'registration:create', resource: 'registration', action: 'create', name: '创建报名', description: '允许报名活动' }, - { code: 'registration:read', resource: 'registration', action: 'read', name: '查看报名', description: '允许查看报名记录' }, - { code: 'registration:update', resource: 'registration', action: 'update', name: '更新报名', description: '允许更新报名信息' }, - { code: 'registration:delete', resource: 'registration', action: 'delete', name: '取消报名', description: '允许取消报名' }, - - // 参赛作品 - { code: 'work:create', resource: 'work', action: 'create', name: '上传作品', description: '允许上传参赛作品' }, - { code: 'work:read', resource: 'work', action: 'read', name: '查看作品', description: '允许查看参赛作品' }, - { code: 'work:update', resource: 'work', action: 'update', name: '更新作品', description: '允许更新作品信息' }, - { code: 'work:delete', resource: 'work', action: 'delete', name: '删除作品', description: '允许删除作品' }, - { code: 'work:submit', resource: 'work', action: 'submit', name: '提交作品', description: '允许提交作品' }, - - // 活动公告 - { code: 'notice:read', resource: 'notice', action: 'read', name: '查看公告', description: '允许查看活动公告' }, - - // 作业管理 - { code: 'homework:create', resource: 'homework', action: 'create', name: '创建作业', description: '允许创建作业' }, - { code: 'homework:read', resource: 'homework', action: 'read', name: '查看作业', description: '允许查看作业列表' }, - { code: 'homework:update', resource: 'homework', action: 'update', name: '更新作业', description: '允许更新作业信息' }, - { code: 'homework:delete', resource: 'homework', action: 'delete', name: '删除作业', description: '允许删除作业' }, - { code: 'homework:publish', resource: 'homework', action: 'publish', name: '发布作业', description: '允许发布作业' }, - - // 作业提交 - { code: 'homework-submission:create', resource: 'homework-submission', action: 'create', name: '提交作业', description: '允许提交作业' }, - { code: 'homework-submission:read', resource: 'homework-submission', action: 'read', name: '查看作业提交', description: '允许查看作业提交记录' }, - { code: 'homework-submission:update', resource: 'homework-submission', action: 'update', name: '更新作业提交', description: '允许更新提交的作业' }, - - // 作业评审规则 - { code: 'homework-review-rule:create', resource: 'homework-review-rule', action: 'create', name: '创建作业评审规则', description: '允许创建作业评审规则' }, - { code: 'homework-review-rule:read', resource: 'homework-review-rule', action: 'read', name: '查看作业评审规则', description: '允许查看作业评审规则' }, - { code: 'homework-review-rule:update', resource: 'homework-review-rule', action: 'update', name: '更新作业评审规则', description: '允许更新作业评审规则' }, - { code: 'homework-review-rule:delete', resource: 'homework-review-rule', action: 'delete', name: '删除作业评审规则', description: '允许删除作业评审规则' }, - - // 作业评分 - { code: 'homework-score:create', resource: 'homework-score', action: 'create', name: '作业评分', description: '允许对作业评分' }, - { code: 'homework-score:read', resource: 'homework-score', action: 'read', name: '查看作业评分', description: '允许查看作业评分' }, -]; - -// ============================================ -// 角色定义 -// ============================================ -const normalTenantRoles = [ - { - code: 'school_admin', - name: '学校管理员', - description: '学校管理员,管理学校信息、教师、学生等', - permissions: [ - 'workbench:read', - 'user:create', 'user:read', 'user:update', 'user:delete', - 'role:create', 'role:read', 'role:update', 'role:delete', 'role:assign', - 'permission:read', - 'menu:read', - // 学校管理 - 'school:create', 'school:read', 'school:update', 'school:delete', - 'department:create', 'department:read', 'department:update', 'department:delete', - 'grade:create', 'grade:read', 'grade:update', 'grade:delete', - 'class:create', 'class:read', 'class:update', 'class:delete', - 'teacher:create', 'teacher:read', 'teacher:update', 'teacher:delete', - 'student:create', 'student:read', 'student:update', 'student:delete', - // 我的评审 - 'activity:read', - 'notice:read', - // 可以查看报名和作品 - 'registration:read', - 'work:read', - // 作业管理 - 'homework:create', 'homework:read', 'homework:update', 'homework:delete', 'homework:publish', - 'homework-submission:read', - 'homework-review-rule:create', 'homework-review-rule:read', 'homework-review-rule:update', 'homework-review-rule:delete', - 'homework-score:read', - ], - }, - { - code: 'teacher', - name: '教师', - description: '教师角色,可以报名活动、指导学生、管理作业', - permissions: [ - 'workbench:read', - // 查看基础信息 - 'grade:read', - 'class:read', - 'student:read', - // 我的评审 - 'activity:read', - 'activity:guidance', - 'notice:read', - 'registration:create', 'registration:read', 'registration:update', 'registration:delete', - 'work:create', 'work:read', 'work:update', 'work:submit', - // 作业管理 - 'homework:create', 'homework:read', 'homework:update', 'homework:delete', 'homework:publish', - 'homework-submission:read', - 'homework-review-rule:create', 'homework-review-rule:read', 'homework-review-rule:update', 'homework-review-rule:delete', - 'homework-score:create', 'homework-score:read', - ], - }, - { - code: 'student', - name: '学生', - description: '学生角色,可以查看活动、上传作品、提交作业', - permissions: [ - 'workbench:read', - // 我的评审 - 'activity:read', - 'notice:read', - 'registration:read', - 'work:create', 'work:read', 'work:update', 'work:submit', - // 作业 - 'homework:read', - 'homework-submission:create', 'homework-submission:read', 'homework-submission:update', - 'homework-score:read', - ], - }, -]; - -// 创建 readline 接口用于用户输入 -function createReadlineInterface(): readline.Interface { - return readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); -} - -// 提示用户输入 -function prompt(rl: readline.Interface, question: string): Promise { - return new Promise((resolve) => { - rl.question(question, (answer) => { - resolve(answer.trim()); - }); - }); -} - -async function initTenant() { - const rl = createReadlineInterface(); - - try { - console.log('🚀 开始创建普通租户...\n'); - - // 获取租户信息 - const tenantName = await prompt(rl, '请输入租户名称: '); - if (!tenantName) { - console.error('❌ 错误: 租户名称不能为空'); - process.exit(1); - } - - const tenantCode = await prompt(rl, '请输入租户编码(英文): '); - if (!tenantCode) { - console.error('❌ 错误: 租户编码不能为空'); - process.exit(1); - } - - // 检查租户编码是否已存在 - const existingTenant = await prisma.tenant.findFirst({ - where: { code: tenantCode } - }); - - if (existingTenant) { - console.error(`❌ 错误: 租户编码 "${tenantCode}" 已存在`); - process.exit(1); - } - - rl.close(); - - // 1. 创建租户 - console.log('\n🏢 步骤 1: 创建租户...'); - const tenant = await prisma.tenant.create({ - data: { - name: tenantName, - code: tenantCode, - isSuper: 0, - validState: 1, - } - }); - console.log(` ✓ 创建租户: ${tenant.name} (${tenant.code})`); - - const tenantId = tenant.id; - - // 2. 创建权限 - console.log('\n📝 步骤 2: 创建基础权限...'); - const createdPermissions: { [code: string]: number } = {}; - - for (const perm of allPermissions) { - const permission = await prisma.permission.create({ - data: { ...perm, tenantId, validState: 1 } - }); - createdPermissions[perm.code] = permission.id; - } - console.log(` ✓ 共创建 ${Object.keys(createdPermissions).length} 个权限`); - - // 3. 创建角色并分配权限 - console.log('\n👥 步骤 3: 创建角色并分配权限...'); - const createdRoles: any[] = []; - - for (const roleConfig of normalTenantRoles) { - // 创建角色 - const role = await prisma.role.create({ - data: { - tenantId, - name: roleConfig.name, - code: roleConfig.code, - description: roleConfig.description, - validState: 1, - } - }); - - // 分配权限给角色 - let permCount = 0; - for (const permCode of roleConfig.permissions) { - const permissionId = createdPermissions[permCode]; - if (permissionId) { - await prisma.rolePermission.create({ - data: { - roleId: role.id, - permissionId, - } - }); - permCount++; - } - } - - createdRoles.push({ ...role, permCount }); - console.log(` ✓ 创建角色: ${role.name} (${role.code}) - ${permCount} 个权限`); - } - - // 4. 创建 admin 用户 - console.log('\n👤 步骤 4: 创建 admin 用户...'); - const password = `admin@${tenant.code}`; - const hashedPassword = await bcrypt.hash(password, 10); - - const adminUser = await prisma.user.create({ - data: { - tenantId, - username: 'admin', - password: hashedPassword, - nickname: '管理员', - validState: 1, - } - }); - console.log(` ✓ 创建用户: ${adminUser.username}`); - - // 5. 给用户分配 school_admin 角色 - console.log('\n🔗 步骤 5: 分配角色给用户...'); - const schoolAdminRole = createdRoles.find(r => r.code === 'school_admin'); - if (schoolAdminRole) { - await prisma.userRole.create({ - data: { - userId: adminUser.id, - roleId: schoolAdminRole.id, - } - }); - console.log(` ✓ 分配角色: ${schoolAdminRole.name}`); - } - - // 6. 分配菜单给租户 - console.log('\n📋 步骤 6: 分配菜单给租户...'); - - // 普通租户可见的菜单 - const NORMAL_TENANT_MENUS = ['工作台', '学校管理', '我的评审', '作业管理', '系统管理']; - const NORMAL_TENANT_EXCLUDED_SYSTEM_MENUS = ['租户管理', '数据字典', '系统配置', '日志记录', '菜单管理', '权限管理']; - const NORMAL_TENANT_EXCLUDED_ACTIVITY_MENUS = ['我的报名', '我的作品']; - - const allMenus = await prisma.menu.findMany({ - orderBy: [{ sort: 'asc' }, { id: 'asc' }], - }); - - const normalTenantMenuIds = new Set(); - for (const menu of allMenus) { - // 顶级菜单 - if (!menu.parentId && NORMAL_TENANT_MENUS.includes(menu.name)) { - normalTenantMenuIds.add(menu.id); - } - // 子菜单 - if (menu.parentId) { - const parentMenu = allMenus.find(m => m.id === menu.parentId); - if (parentMenu && NORMAL_TENANT_MENUS.includes(parentMenu.name)) { - // 系统管理下排除部分子菜单 - if (parentMenu.name === '系统管理' && NORMAL_TENANT_EXCLUDED_SYSTEM_MENUS.includes(menu.name)) { - continue; - } - // 我的评审下排除部分子菜单(只保留活动列表) - if (parentMenu.name === '我的评审' && NORMAL_TENANT_EXCLUDED_ACTIVITY_MENUS.includes(menu.name)) { - continue; - } - normalTenantMenuIds.add(menu.id); - } - } - } - - let menuCount = 0; - for (const menuId of normalTenantMenuIds) { - await prisma.tenantMenu.create({ - data: { - tenantId: tenant.id, - menuId: menuId, - } - }); - menuCount++; - } - console.log(` ✓ 分配 ${menuCount} 个菜单`); - - // 7. 输出结果 - console.log('\n' + '='.repeat(50)); - console.log('🎉 普通租户创建完成!'); - console.log('='.repeat(50)); - console.log(` 租户名称: ${tenant.name}`); - console.log(` 租户编码: ${tenant.code}`); - console.log(` 用户名: admin`); - console.log(` 密码: ${password}`); - console.log(` 权限数量: ${Object.keys(createdPermissions).length}`); - console.log(` 菜单数量: ${menuCount}`); - console.log('\n 📊 角色列表:'); - for (const role of createdRoles) { - console.log(` - ${role.name} (${role.code}): ${role.permCount} 个权限`); - } - console.log('='.repeat(50)); - - } catch (error) { - console.error('❌ 创建失败:', error); - throw error; - } finally { - await prisma.$disconnect(); - } -} - -// 执行初始化 -initTenant() - .then(() => { - console.log('\n✅ 租户创建脚本执行完成!'); - process.exit(0); - }) - .catch((error) => { - console.error('\n💥 租户创建脚本执行失败:', error); - process.exit(1); - }); diff --git a/backend/sql/add_tenant_menu.sql b/backend/sql/add_tenant_menu.sql deleted file mode 100644 index 2c8ea86..0000000 --- a/backend/sql/add_tenant_menu.sql +++ /dev/null @@ -1,58 +0,0 @@ --- 为超级租户添加租户管理菜单 --- 注意:需要先查询系统管理菜单的ID,然后替换下面的 parent_id - --- 查询系统管理菜单的ID --- SELECT id FROM menus WHERE name = '系统管理' AND parent_id IS NULL; - --- 假设系统管理菜单的ID为某个值(需要根据实际情况调整) --- 这里使用子查询来动态获取系统管理菜单的ID - -INSERT INTO menus ( - name, - path, - icon, - component, - parent_id, - permission, - sort, - valid_state, - create_time, - modify_time -) -SELECT - '租户管理', - '/system/tenants', - 'TeamOutlined', - 'system/tenants/Index', - id, -- 系统管理菜单的ID - 'tenant:read', - 7, -- 排序,放在其他系统管理菜单之后 - 1, - NOW(), - NOW() -FROM menus -WHERE name = '系统管理' AND parent_id IS NULL -LIMIT 1; - --- 如果系统管理菜单不存在,可以手动指定ID: --- INSERT INTO menus (name, path, icon, component, parent_id, permission, sort, valid_state, create_time, modify_time) --- VALUES ('租户管理', '/system/tenants', 'TeamOutlined', 'system/tenants/Index', 2, 'tenant:read', 7, 1, NOW(), NOW()); - --- 为超级租户分配租户管理菜单 --- 假设超级租户的ID为1(需要根据实际情况调整) --- 假设租户管理菜单的ID为刚插入的菜单ID - -INSERT INTO tenant_menus (tenant_id, menu_id) -SELECT - t.id AS tenant_id, - m.id AS menu_id -FROM tenants t -CROSS JOIN menus m -WHERE t.code = 'super' AND t.is_super = 1 - AND m.name = '租户管理' AND m.path = '/system/tenants' -LIMIT 1; - --- 如果上面的查询没有结果,可以手动指定ID: --- INSERT INTO tenant_menus (tenant_id, menu_id) --- VALUES (1, (SELECT id FROM menus WHERE name = '租户管理' AND path = '/system/tenants' LIMIT 1)); - diff --git a/backend/sql/competition.sql b/backend/sql/competition.sql deleted file mode 100644 index fcc4e19..0000000 --- a/backend/sql/competition.sql +++ /dev/null @@ -1,276 +0,0 @@ --- ============================================ --- 活动管理模块数据库表结构 --- ============================================ - --- 1. 活动表 -CREATE TABLE `t_contest` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `contest_name` varchar(127) NOT NULL COMMENT '活动名称', - `contest_type` varchar(31) NOT NULL COMMENT '活动类型,字典:contest_type:individual/team', - `contest_state` varchar(31) NOT NULL DEFAULT 'unpublished' COMMENT '活动状态(未发布:unpublished 已发布:published)', - `start_time` datetime NOT NULL COMMENT '活动开始时间', - `end_time` datetime NOT NULL COMMENT '活动结束时间', - `address` varchar(512) DEFAULT NULL COMMENT '线下地址', - `content` text COMMENT '活动详情', - `contest_tenants` json DEFAULT NULL COMMENT '活动参赛范围(授权租户ID数组)', - `cover_url` varchar(255) DEFAULT NULL COMMENT '封面url', - `poster_url` varchar(255) DEFAULT NULL COMMENT '海报url', - `contact_name` varchar(63) DEFAULT NULL COMMENT '联系人', - `contact_phone` varchar(63) DEFAULT NULL COMMENT '联系电话', - `contact_qrcode` varchar(255) DEFAULT NULL COMMENT '联系人二维码', - `organizers` json DEFAULT NULL COMMENT '主办单位数组', - `co_organizers` json DEFAULT NULL COMMENT '协办单位数组', - `sponsors` json DEFAULT NULL COMMENT '赞助单位数组', - `register_start_time` datetime NOT NULL COMMENT '报名开始时间', - `register_end_time` datetime NOT NULL COMMENT '报名结束时间', - `register_state` varchar(31) DEFAULT NULL COMMENT '报名任务状态,映射写死:启动(started),已关闭(closed)', - `submit_rule` varchar(31) NOT NULL DEFAULT 'once' COMMENT '提交规则:once/resubmit', - `submit_start_time` datetime NOT NULL COMMENT '作品提交开始时间', - `submit_end_time` datetime NOT NULL COMMENT '作品提交结束时间', - `review_rule_id` int DEFAULT NULL COMMENT '评审规则id', - `review_start_time` datetime NOT NULL COMMENT '评审开始时间', - `review_end_time` datetime NOT NULL COMMENT '评审结束时间', - `result_publish_time` datetime DEFAULT NULL COMMENT '结果发布时间', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `valid_state` int NOT NULL DEFAULT 1 COMMENT '有效状态(1-有效,2-失效)', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_contest_name` (`contest_name`), - KEY `idx_contest_state` (`contest_state`), - KEY `idx_contest_time` (`start_time`, `end_time`), - KEY `idx_review_rule` (`review_rule_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='活动表'; - --- 2. 活动附件表 -CREATE TABLE `t_contest_attachment` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `contest_id` int NOT NULL COMMENT '活动id', - `file_name` varchar(100) NOT NULL COMMENT '文件名', - `file_url` varchar(255) NOT NULL COMMENT '文件路径', - `format` varchar(255) DEFAULT NULL COMMENT '文件类型(png,mp4)', - `file_type` varchar(255) DEFAULT NULL COMMENT '素材类型(image,video)', - `size` varchar(255) DEFAULT '0' COMMENT '文件大小', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `valid_state` int NOT NULL DEFAULT 1 COMMENT '有效状态(1-有效,2-失效)', - PRIMARY KEY (`id`), - KEY `idx_contest` (`contest_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='活动附件'; - --- 3. 评审规则表 -CREATE TABLE `t_contest_review_rule` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `contest_id` int NOT NULL COMMENT '活动id', - `rule_name` varchar(127) NOT NULL COMMENT '规则名称', - `dimensions` json NOT NULL COMMENT '评分维度配置JSON', - `calculation_rule` varchar(31) DEFAULT 'average' COMMENT '计算规则:average/max/min/weighted', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `valid_state` int NOT NULL DEFAULT 1 COMMENT '有效状态(1-有效,2-失效)', - PRIMARY KEY (`id`), - KEY `idx_contest` (`contest_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='评审规则表'; - --- 4. 活动团队表 -CREATE TABLE `t_contest_team` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `tenant_id` int NOT NULL COMMENT '团队所属租户ID', - `contest_id` int NOT NULL COMMENT '活动id', - `team_name` varchar(127) NOT NULL COMMENT '团队名称(租户内唯一)', - `leader_user_id` int NOT NULL COMMENT '团队负责人用户id', - `max_members` int DEFAULT NULL COMMENT '团队最大成员数', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `valid_state` int NOT NULL DEFAULT 1 COMMENT '有效状态(1-有效,2-失效)', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_team_name` (`tenant_id`,`contest_id`,`team_name`), - KEY `idx_contest` (`contest_id`), - KEY `idx_leader` (`leader_user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='活动团队'; - --- 5. 团队成员表 -CREATE TABLE `t_contest_team_member` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `tenant_id` int NOT NULL COMMENT '成员所属租户ID', - `team_id` int NOT NULL COMMENT '团队id', - `user_id` int NOT NULL COMMENT '成员用户id', - `role` varchar(31) NOT NULL DEFAULT 'member' COMMENT '成员角色:member/leader/mentor', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_member_once` (`tenant_id`,`team_id`,`user_id`), - KEY `idx_team` (`team_id`), - KEY `idx_user` (`user_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='团队成员'; - --- 6. 活动报名表 -CREATE TABLE `t_contest_registration` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `contest_id` int NOT NULL COMMENT '活动id', - `tenant_id` int NOT NULL COMMENT '所属租户ID(学校/机构)', - `registration_type` varchar(20) DEFAULT NULL COMMENT '报名类型:individual(个人)/team(团队)', - `team_id` int DEFAULT NULL COMMENT '团队id', - `team_name` varchar(255) DEFAULT NULL COMMENT '团队名称快照(团队参与)', - `user_id` int NOT NULL COMMENT '账号id', - `account_no` varchar(64) NOT NULL COMMENT '报名账号(记录报名快照)', - `account_name` varchar(100) NOT NULL COMMENT '报名账号名称(记录报名快照)', - `role` varchar(63) DEFAULT NULL COMMENT '报名角色快照:leader(队长)/member(队员)/mentor(指导教师)', - `registration_state` varchar(31) NOT NULL DEFAULT 'pending' COMMENT '报名状态:pending(待审核)、passed(已通过)、rejected(已拒绝)、withdrawn(已撤回)', - `registrant` int DEFAULT NULL COMMENT '实际报名人用户ID(老师报名填老师用户ID)', - `registration_time` datetime NOT NULL COMMENT '报名时间', - `reason` varchar(1023) DEFAULT NULL COMMENT '审核理由', - `operator` int DEFAULT NULL COMMENT '审核人用户ID', - `operation_date` datetime DEFAULT NULL COMMENT '审核时间', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_contest_tenant` (`contest_id`, `tenant_id`), - KEY `idx_user_contest` (`user_id`, `contest_id`), - KEY `idx_team` (`team_id`), - KEY `idx_registration_state` (`registration_state`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动报名人员记录表'; - --- 7. 参赛作品表 -CREATE TABLE `t_contest_work` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `tenant_id` int NOT NULL COMMENT '作品所属租户ID', - `contest_id` int NOT NULL COMMENT '活动id', - `registration_id` int NOT NULL COMMENT '报名记录id(关联t_contest_registration.id)', - `work_no` varchar(63) DEFAULT NULL COMMENT '作品编号(展示用唯一编号)', - `title` varchar(255) NOT NULL COMMENT '作品标题', - `description` text DEFAULT NULL COMMENT '作品说明', - `files` json DEFAULT NULL COMMENT '作品文件列表(简易场景)', - `version` int NOT NULL DEFAULT 1 COMMENT '作品版本号(递增)', - `is_latest` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否最新版本:1是/0否', - `status` varchar(31) NOT NULL DEFAULT 'submitted' COMMENT '作品状态:submitted/locked/reviewing/rejected/accepted', - `submit_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '提交时间', - `submitter_user_id` int DEFAULT NULL COMMENT '提交人用户id', - `submitter_account_no` varchar(127) DEFAULT NULL COMMENT '提交人账号(手机号/学号)', - `submit_source` varchar(31) NOT NULL DEFAULT 'teacher' COMMENT '提交来源:teacher/student/team_leader', - `preview_url` varchar(255) DEFAULT NULL COMMENT '作品预览URL(3D/视频)', - `ai_model_meta` json DEFAULT NULL COMMENT 'AI建模元数据(模型类型、版本、参数)', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `valid_state` int NOT NULL DEFAULT 1 COMMENT '有效状态(1-有效,2-失效)', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_work_no` (`work_no`), - KEY `idx_work_contest_latest` (`tenant_id`,`contest_id`,`is_latest`), - KEY `idx_work_registration` (`registration_id`), - KEY `idx_submit_filter` (`tenant_id`,`contest_id`,`submit_time`,`status`), - KEY `idx_contest_status` (`contest_id`, `status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='参赛作品'; - --- 8. 作品附件文件表 -CREATE TABLE `t_contest_work_attachment` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `tenant_id` int NOT NULL COMMENT '所属租户ID', - `contest_id` int NOT NULL COMMENT '活动id', - `work_id` int NOT NULL COMMENT '作品id', - `file_name` varchar(255) NOT NULL COMMENT '文件名', - `file_url` varchar(255) NOT NULL COMMENT '文件路径', - `format` varchar(255) DEFAULT NULL COMMENT '文件类型(png,mp4)', - `file_type` varchar(255) DEFAULT NULL COMMENT '素材类型(image,video)', - `size` varchar(255) DEFAULT '0' COMMENT '文件大小', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - KEY `idx_work_file` (`tenant_id`,`contest_id`,`work_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='作品附件文件表'; - --- 9. 活动评委关联表(活动与评委的多对多关系) -CREATE TABLE `t_contest_judge` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `contest_id` int NOT NULL COMMENT '活动id', - `judge_id` int NOT NULL COMMENT '评委用户id', - `specialty` varchar(255) DEFAULT NULL COMMENT '评审专业领域(可选)', - `weight` decimal(3,2) DEFAULT NULL COMMENT '评审权重(可选,用于加权平均计算)', - `description` text DEFAULT NULL COMMENT '评委在该活动中的说明', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `valid_state` int NOT NULL DEFAULT 1 COMMENT '有效状态(1-有效,2-失效)', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_contest_judge` (`contest_id`, `judge_id`), - KEY `idx_contest` (`contest_id`), - KEY `idx_judge` (`judge_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动评委关联表'; - --- 10. 作品分配表(评委分配作品) -CREATE TABLE `t_contest_work_judge_assignment` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `contest_id` int NOT NULL COMMENT '活动id', - `work_id` int NOT NULL COMMENT '作品id', - `judge_id` int NOT NULL COMMENT '评委用户id', - `assignment_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '分配时间', - `status` varchar(31) NOT NULL DEFAULT 'assigned' COMMENT '分配状态:assigned/reviewing/completed', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - PRIMARY KEY (`id`), - UNIQUE KEY `uk_work_judge` (`work_id`, `judge_id`), - KEY `idx_contest_judge` (`contest_id`, `judge_id`), - KEY `idx_work` (`work_id`), - KEY `idx_status` (`status`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='作品分配表'; - --- 11. 作品评分表 -CREATE TABLE `t_contest_work_score` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `tenant_id` int NOT NULL COMMENT '所属租户ID', - `contest_id` int NOT NULL COMMENT '活动id', - `work_id` int NOT NULL COMMENT '作品id', - `assignment_id` int NOT NULL COMMENT '分配记录id(关联t_contest_work_judge_assignment)', - `judge_id` int NOT NULL COMMENT '评委用户id', - `judge_name` varchar(127) NOT NULL COMMENT '评委姓名', - `dimension_scores` json NOT NULL COMMENT '各维度评分JSON,格式:{"dimension1": 85, "dimension2": 90, ...}', - `total_score` decimal(10,2) NOT NULL COMMENT '总分(根据评审规则计算)', - `comments` text DEFAULT NULL COMMENT '评语', - `score_time` datetime NOT NULL COMMENT '评分时间', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `valid_state` int NOT NULL DEFAULT 1 COMMENT '有效状态(1-有效,2-失效)', - PRIMARY KEY (`id`), - KEY `idx_contest_work_judge` (`contest_id`, `work_id`, `judge_id`), - KEY `idx_work` (`work_id`), - KEY `idx_assignment` (`assignment_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='作品评分表'; - --- 12. 活动公告表 -CREATE TABLE `t_contest_notice` ( - `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id', - `contest_id` int NOT NULL COMMENT '活动id', - `title` varchar(255) NOT NULL COMMENT '公告标题', - `content` text NOT NULL COMMENT '公告内容', - `notice_type` varchar(31) NOT NULL DEFAULT 'manual' COMMENT '公告类型:system/manual/urgent', - `priority` int DEFAULT 0 COMMENT '优先级(数字越大优先级越高)', - `publish_time` datetime DEFAULT NULL COMMENT '发布时间', - `creator` int DEFAULT NULL COMMENT '创建人ID', - `modifier` int DEFAULT NULL COMMENT '修改人ID', - `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - `valid_state` int NOT NULL DEFAULT 1 COMMENT '有效状态(1-有效,2-失效)', - PRIMARY KEY (`id`), - KEY `idx_contest` (`contest_id`), - KEY `idx_publish_time` (`publish_time`), - KEY `idx_notice_type` (`notice_type`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='活动公告表'; diff --git a/backend/sql/init_data.sql b/backend/sql/init_data.sql deleted file mode 100644 index bd13390..0000000 --- a/backend/sql/init_data.sql +++ /dev/null @@ -1,1573 +0,0 @@ --- MySQL dump 10.13 Distrib 8.0.44, for Win64 (x86_64) --- --- Host: localhost Database: db_competition_management --- ------------------------------------------------------ --- Server version 8.0.44 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `classes` --- -USE db_competition_management; - -DROP TABLE IF EXISTS `classes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `classes` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `grade_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `type` int NOT NULL DEFAULT '1', - `capacity` int DEFAULT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `classes_tenant_id_code_key` (`tenant_id`,`code`), - KEY `classes_grade_id_fkey` (`grade_id`), - KEY `classes_creator_fkey` (`creator`), - KEY `classes_modifier_fkey` (`modifier`), - CONSTRAINT `classes_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `classes_grade_id_fkey` FOREIGN KEY (`grade_id`) REFERENCES `grades` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `classes_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `classes_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `classes` --- - -LOCK TABLES `classes` WRITE; -/*!40000 ALTER TABLE `classes` DISABLE KEYS */; -/*!40000 ALTER TABLE `classes` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `configs` --- - -DROP TABLE IF EXISTS `configs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `configs` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `key` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `value` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `configs_tenant_id_key_key` (`tenant_id`,`key`), - KEY `configs_creator_fkey` (`creator`), - KEY `configs_modifier_fkey` (`modifier`), - CONSTRAINT `configs_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `configs_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `configs_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `configs` --- - -LOCK TABLES `configs` WRITE; -/*!40000 ALTER TABLE `configs` DISABLE KEYS */; -/*!40000 ALTER TABLE `configs` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `departments` --- - -DROP TABLE IF EXISTS `departments`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `departments` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `parent_id` int DEFAULT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `sort` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `departments_tenant_id_code_key` (`tenant_id`,`code`), - KEY `departments_parent_id_fkey` (`parent_id`), - KEY `departments_creator_fkey` (`creator`), - KEY `departments_modifier_fkey` (`modifier`), - CONSTRAINT `departments_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `departments_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `departments_parent_id_fkey` FOREIGN KEY (`parent_id`) REFERENCES `departments` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `departments_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `departments` --- - -LOCK TABLES `departments` WRITE; -/*!40000 ALTER TABLE `departments` DISABLE KEYS */; -/*!40000 ALTER TABLE `departments` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `dict_items` --- - -DROP TABLE IF EXISTS `dict_items`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `dict_items` ( - `id` int NOT NULL AUTO_INCREMENT, - `dict_id` int NOT NULL, - `label` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `value` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `sort` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - KEY `dict_items_dict_id_fkey` (`dict_id`), - KEY `dict_items_creator_fkey` (`creator`), - KEY `dict_items_modifier_fkey` (`modifier`), - CONSTRAINT `dict_items_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `dict_items_dict_id_fkey` FOREIGN KEY (`dict_id`) REFERENCES `dicts` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `dict_items_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `dict_items` --- - -LOCK TABLES `dict_items` WRITE; -/*!40000 ALTER TABLE `dict_items` DISABLE KEYS */; -/*!40000 ALTER TABLE `dict_items` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `dicts` --- - -DROP TABLE IF EXISTS `dicts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `dicts` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `dicts_tenant_id_code_key` (`tenant_id`,`code`), - KEY `dicts_creator_fkey` (`creator`), - KEY `dicts_modifier_fkey` (`modifier`), - CONSTRAINT `dicts_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `dicts_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `dicts_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `dicts` --- - -LOCK TABLES `dicts` WRITE; -/*!40000 ALTER TABLE `dicts` DISABLE KEYS */; -/*!40000 ALTER TABLE `dicts` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `grades` --- - -DROP TABLE IF EXISTS `grades`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `grades` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `level` int NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `grades_tenant_id_code_key` (`tenant_id`,`code`), - UNIQUE KEY `grades_tenant_id_level_key` (`tenant_id`,`level`), - KEY `grades_creator_fkey` (`creator`), - KEY `grades_modifier_fkey` (`modifier`), - CONSTRAINT `grades_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `grades_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `grades_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `grades` --- - -LOCK TABLES `grades` WRITE; -/*!40000 ALTER TABLE `grades` DISABLE KEYS */; -/*!40000 ALTER TABLE `grades` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `logs` --- - -DROP TABLE IF EXISTS `logs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `logs` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int DEFAULT NULL, - `action` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `content` text COLLATE utf8mb4_unicode_ci, - `ip` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `user_agent` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - PRIMARY KEY (`id`), - KEY `logs_user_id_fkey` (`user_id`), - CONSTRAINT `logs_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `logs` --- - -LOCK TABLES `logs` WRITE; -/*!40000 ALTER TABLE `logs` DISABLE KEYS */; -INSERT INTO `logs` VALUES (1,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:07.750'),(2,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:08.449'),(3,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:08.459'),(4,1,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:13.977'),(5,1,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:13.981'),(6,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:15.736'),(7,1,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:17.133'),(8,1,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:17.137'),(9,1,'GET /api/menus','{\"method\":\"GET\",\"url\":\"/api/menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:21.452'),(10,1,'GET /api/tenants?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:21.459'),(11,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:45.955'),(12,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:45.963'),(13,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:47.376'),(14,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:47.931'),(15,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:48.345'),(16,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:02:48.358'),(17,2,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:06.092'),(18,2,'GET /api/contests/my-contests?page=1&pageSize=12&role=student','{\"method\":\"GET\",\"url\":\"/api/contests/my-contests?page=1&pageSize=12&role=student\",\"query\":{\"page\":\"1\",\"pageSize\":\"12\",\"role\":\"student\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:06.395'),(19,2,'GET /api/schools','{\"method\":\"GET\",\"url\":\"/api/schools\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:08.731'),(20,2,'GET /api/homework/homeworks?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/homework/homeworks?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:10.670'),(21,2,'GET /api/homework/homeworks?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/homework/homeworks?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:10.684'),(22,2,'GET /api/homework/review-rules?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/homework/review-rules?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:11.211'),(23,2,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:12.814'),(24,2,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:12.816'),(25,2,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:13.853'),(26,2,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:13.856'),(27,2,'GET /api/users?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/users?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:15.048'),(28,2,'GET /api/roles?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:15.050'),(29,2,'GET /api/permissions?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/permissions?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:15.798'),(30,2,'GET /api/roles?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/roles?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:15.800'),(31,2,'GET /api/roles/4','{\"method\":\"GET\",\"url\":\"/api/roles/4\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:04:23.704'),(32,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:25.687'),(33,1,'GET /api/auth/user-info','{\"method\":\"GET\",\"url\":\"/api/auth/user-info\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:25.731'),(34,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:25.736'),(35,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:25.773'),(36,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:26.035'),(37,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:26.048'),(38,1,'GET /api/judges-management?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/judges-management?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:26.853'),(39,1,'GET /api/contests?contestName=&contestType=individual&page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?contestName=&contestType=individual&page=1&pageSize=10\",\"query\":{\"contestName\":\"\",\"contestType\":\"individual\",\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:27.413'),(40,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:27.870'),(41,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:55:27.881'),(42,1,'GET /api/menus/user-menus','{\"method\":\"GET\",\"url\":\"/api/menus/user-menus\",\"query\":{},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:59:58.243'),(43,1,'GET /api/contests?page=1&pageSize=10','{\"method\":\"GET\",\"url\":\"/api/contests?page=1&pageSize=10\",\"query\":{\"page\":\"1\",\"pageSize\":\"10\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:59:58.840'),(44,1,'GET /api/tenants?page=1&pageSize=100','{\"method\":\"GET\",\"url\":\"/api/tenants?page=1&pageSize=100\",\"query\":{\"page\":\"1\",\"pageSize\":\"100\"},\"body\":{}}','::1','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36','2026-01-18 02:59:58.850'); -/*!40000 ALTER TABLE `logs` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `menus` --- - -DROP TABLE IF EXISTS `menus`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `menus` ( - `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `path` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `icon` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `component` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `parent_id` int DEFAULT NULL, - `permission` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `sort` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - KEY `menus_parent_id_fkey` (`parent_id`), - KEY `menus_creator_fkey` (`creator`), - KEY `menus_modifier_fkey` (`modifier`), - CONSTRAINT `menus_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `menus_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `menus_parent_id_fkey` FOREIGN KEY (`parent_id`) REFERENCES `menus` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `menus` --- - -LOCK TABLES `menus` WRITE; -/*!40000 ALTER TABLE `menus` DISABLE KEYS */; -INSERT INTO `menus` VALUES (1,'活动活动','/activities','FlagOutlined',NULL,NULL,'activity:read',1,1,NULL,NULL,'2026-01-18 02:00:50.341','2026-01-18 02:00:50.341'),(2,'活动列表','/activities','UnorderedListOutlined','contests/Activities',1,'activity:read',1,1,NULL,NULL,'2026-01-18 02:00:50.351','2026-01-18 02:00:50.351'),(3,'我的报名','/activities/registrations','UserAddOutlined','contests/registrations/Index',1,'registration:create',2,1,NULL,NULL,'2026-01-18 02:00:50.355','2026-01-18 02:00:50.355'),(4,'我的作品','/activities/works','FileTextOutlined','contests/works/Index',1,'work:create',3,1,NULL,NULL,'2026-01-18 02:00:50.359','2026-01-18 02:00:50.359'),(5,'学校管理','/school','BankOutlined',NULL,NULL,'school:read',2,1,NULL,NULL,'2026-01-18 02:00:50.363','2026-01-18 02:00:50.363'),(6,'学校信息','/school/schools','BankOutlined','school/schools/Index',5,'school:read',1,1,NULL,NULL,'2026-01-18 02:00:50.367','2026-01-18 02:00:50.367'),(7,'部门管理','/school/departments','ApartmentOutlined','school/departments/Index',5,'department:read',2,1,NULL,NULL,'2026-01-18 02:00:50.371','2026-01-18 02:00:50.371'),(8,'年级管理','/school/grades','AppstoreOutlined','school/grades/Index',5,'grade:read',3,1,NULL,NULL,'2026-01-18 02:00:50.373','2026-01-18 02:00:50.373'),(9,'班级管理','/school/classes','TeamOutlined','school/classes/Index',5,'class:read',4,1,NULL,NULL,'2026-01-18 02:00:50.377','2026-01-18 02:00:50.377'),(10,'教师管理','/school/teachers','UserOutlined','school/teachers/Index',5,'teacher:read',5,1,NULL,NULL,'2026-01-18 02:00:50.381','2026-01-18 02:00:50.381'),(11,'学生管理','/school/students','UsergroupAddOutlined','school/students/Index',5,'student:read',6,1,NULL,NULL,'2026-01-18 02:00:50.384','2026-01-18 02:00:50.384'),(12,'活动管理','/contests','TrophyOutlined',NULL,NULL,'contest:create',3,1,NULL,NULL,'2026-01-18 02:00:50.388','2026-01-18 02:00:50.388'),(13,'活动列表','/contests','UnorderedListOutlined','contests/Index',12,'contest:create',1,1,NULL,NULL,'2026-01-18 02:00:50.391','2026-01-18 02:00:50.391'),(14,'评委管理','/contests/judges','SolutionOutlined','contests/judges/Index',12,'judge:read',2,1,NULL,NULL,'2026-01-18 02:00:50.396','2026-01-18 02:00:50.396'),(15,'报名管理','/contests/registrations','UserAddOutlined','contests/registrations/Index',12,'registration:approve',3,1,NULL,NULL,'2026-01-18 02:00:50.399','2026-01-18 02:00:50.399'),(16,'作品管理','/contests/works','FileTextOutlined','contests/works/Index',12,'contest:read',4,1,NULL,NULL,'2026-01-18 02:00:50.402','2026-01-18 02:00:50.402'),(17,'评审进度','/contests/review-progress','AuditOutlined','contests/reviews/Progress',12,'review-rule:read',5,1,NULL,NULL,'2026-01-18 02:00:50.404','2026-01-18 02:00:50.404'),(18,'评审规则','/contests/reviews','CheckCircleOutlined','contests/reviews/Index',12,'review-rule:read',6,1,NULL,NULL,'2026-01-18 02:00:50.407','2026-01-18 02:00:50.407'),(19,'成果发布','/contests/results','TrophyOutlined','contests/results/Index',12,'contest:create',7,1,NULL,NULL,'2026-01-18 02:00:50.412','2026-01-18 02:00:50.412'),(20,'通知管理','/contests/notices','BellOutlined','contests/notices/Index',12,'notice:create',8,1,NULL,NULL,'2026-01-18 02:00:50.416','2026-01-18 02:00:50.416'),(21,'作业管理','/homework','FormOutlined',NULL,NULL,'homework:read',4,1,NULL,NULL,'2026-01-18 02:00:50.419','2026-01-18 02:00:50.419'),(22,'作业列表','/homework','FileTextOutlined','homework/Index',21,'homework:create',1,1,NULL,NULL,'2026-01-18 02:00:50.422','2026-01-18 02:00:50.422'),(23,'评审规则','/homework/review-rules','CheckCircleOutlined','homework/ReviewRules',21,'homework-review-rule:read',2,1,NULL,NULL,'2026-01-18 02:00:50.424','2026-01-18 02:00:50.424'),(24,'我的作业','/homework/my','BookOutlined','homework/StudentList',21,'homework-submission:create',3,1,NULL,NULL,'2026-01-18 02:00:50.429','2026-01-18 02:00:50.429'),(25,'系统管理','/system','SettingOutlined',NULL,NULL,'user:read',9,1,NULL,NULL,'2026-01-18 02:00:50.432','2026-01-18 02:00:50.432'),(26,'用户管理','/system/users','UserOutlined','system/users/Index',25,'user:read',1,1,NULL,NULL,'2026-01-18 02:00:50.436','2026-01-18 02:00:50.436'),(27,'角色管理','/system/roles','TeamOutlined','system/roles/Index',25,'role:read',2,1,NULL,NULL,'2026-01-18 02:00:50.438','2026-01-18 02:00:50.438'),(28,'菜单管理','/system/menus','MenuOutlined','system/menus/Index',25,'menu:read',3,1,NULL,NULL,'2026-01-18 02:00:50.442','2026-01-18 02:00:50.442'),(29,'数据字典','/system/dict','BookOutlined','system/dict/Index',25,'dict:read',4,1,NULL,NULL,'2026-01-18 02:00:50.446','2026-01-18 02:00:50.446'),(30,'系统配置','/system/config','ToolOutlined','system/config/Index',25,'config:read',5,1,NULL,NULL,'2026-01-18 02:00:50.450','2026-01-18 02:00:50.450'),(31,'日志记录','/system/logs','FileTextOutlined','system/logs/Index',25,'log:read',6,1,NULL,NULL,'2026-01-18 02:00:50.453','2026-01-18 02:00:50.453'),(32,'权限管理','/system/permissions','SafetyOutlined','system/permissions/Index',25,'permission:read',7,1,NULL,NULL,'2026-01-18 02:00:50.457','2026-01-18 02:00:50.457'),(33,'租户管理','/system/tenants','TeamOutlined','system/tenants/Index',25,'tenant:read',8,1,NULL,NULL,'2026-01-18 02:00:50.462','2026-01-18 02:00:50.462'),(34,'工作台','/workbench','DashboardOutlined',NULL,NULL,'ai-3d:read',10,1,NULL,NULL,'2026-01-18 02:00:50.465','2026-01-18 02:00:50.465'),(35,'3D建模实验室','/workbench/3d-lab','ExperimentOutlined','workbench/ai-3d/Index',34,'ai-3d:read',1,1,NULL,NULL,'2026-01-18 02:00:50.469','2026-01-18 02:00:50.469'); -/*!40000 ALTER TABLE `menus` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `permissions` --- - -DROP TABLE IF EXISTS `permissions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `permissions` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `resource` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `action` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `permissions_tenant_id_resource_action_key` (`tenant_id`,`resource`,`action`), - UNIQUE KEY `permissions_tenant_id_code_key` (`tenant_id`,`code`), - KEY `permissions_creator_fkey` (`creator`), - KEY `permissions_modifier_fkey` (`modifier`), - CONSTRAINT `permissions_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `permissions_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `permissions_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `permissions` --- - -LOCK TABLES `permissions` WRITE; -/*!40000 ALTER TABLE `permissions` DISABLE KEYS */; -INSERT INTO `permissions` VALUES (1,1,'查看工作台','workbench:read','workbench','read','允许查看工作台',1,NULL,NULL,'2026-01-18 02:00:40.576','2026-01-18 02:00:40.576'),(2,1,'创建用户','user:create','user','create','允许创建新用户',1,NULL,NULL,'2026-01-18 02:00:40.580','2026-01-18 02:00:40.580'),(3,1,'查看用户','user:read','user','read','允许查看用户列表和详情',1,NULL,NULL,'2026-01-18 02:00:40.583','2026-01-18 02:00:40.583'),(4,1,'更新用户','user:update','user','update','允许更新用户信息',1,NULL,NULL,'2026-01-18 02:00:40.588','2026-01-18 02:00:40.588'),(5,1,'删除用户','user:delete','user','delete','允许删除用户',1,NULL,NULL,'2026-01-18 02:00:40.591','2026-01-18 02:00:40.591'),(6,1,'创建角色','role:create','role','create','允许创建新角色',1,NULL,NULL,'2026-01-18 02:00:40.595','2026-01-18 02:00:40.595'),(7,1,'查看角色','role:read','role','read','允许查看角色列表和详情',1,NULL,NULL,'2026-01-18 02:00:40.598','2026-01-18 02:00:40.598'),(8,1,'更新角色','role:update','role','update','允许更新角色信息',1,NULL,NULL,'2026-01-18 02:00:40.601','2026-01-18 02:00:40.601'),(9,1,'删除角色','role:delete','role','delete','允许删除角色',1,NULL,NULL,'2026-01-18 02:00:40.604','2026-01-18 02:00:40.604'),(10,1,'分配角色','role:assign','role','assign','允许给用户分配角色',1,NULL,NULL,'2026-01-18 02:00:40.606','2026-01-18 02:00:40.606'),(11,1,'查看权限','permission:read','permission','read','允许查看权限列表',1,NULL,NULL,'2026-01-18 02:00:40.611','2026-01-18 02:00:40.611'),(12,1,'查看菜单','menu:read','menu','read','允许查看菜单列表',1,NULL,NULL,'2026-01-18 02:00:40.614','2026-01-18 02:00:40.614'),(13,1,'创建租户','tenant:create','tenant','create','允许创建租户',1,NULL,NULL,'2026-01-18 02:00:40.617','2026-01-18 02:00:40.617'),(14,1,'查看租户','tenant:read','tenant','read','允许查看租户列表',1,NULL,NULL,'2026-01-18 02:00:40.620','2026-01-18 02:00:40.620'),(15,1,'更新租户','tenant:update','tenant','update','允许更新租户信息',1,NULL,NULL,'2026-01-18 02:00:40.622','2026-01-18 02:00:40.622'),(16,1,'删除租户','tenant:delete','tenant','delete','允许删除租户',1,NULL,NULL,'2026-01-18 02:00:40.626','2026-01-18 02:00:40.626'),(17,1,'创建活动','contest:create','contest','create','允许创建活动',1,NULL,NULL,'2026-01-18 02:00:40.629','2026-01-18 02:00:40.629'),(18,1,'查看活动','contest:read','contest','read','允许查看活动列表',1,NULL,NULL,'2026-01-18 02:00:40.632','2026-01-18 02:00:40.632'),(19,1,'更新活动','contest:update','contest','update','允许更新活动信息',1,NULL,NULL,'2026-01-18 02:00:40.634','2026-01-18 02:00:40.634'),(20,1,'删除活动','contest:delete','contest','delete','允许删除活动',1,NULL,NULL,'2026-01-18 02:00:40.637','2026-01-18 02:00:40.637'),(21,1,'发布活动','contest:publish','contest','publish','允许发布活动',1,NULL,NULL,'2026-01-18 02:00:40.639','2026-01-18 02:00:40.639'),(22,1,'结束活动','contest:finish','contest','finish','允许结束活动',1,NULL,NULL,'2026-01-18 02:00:40.643','2026-01-18 02:00:40.643'),(23,1,'创建评审规则','review-rule:create','review-rule','create','允许创建评审规则',1,NULL,NULL,'2026-01-18 02:00:40.646','2026-01-18 02:00:40.646'),(24,1,'查看评审规则','review-rule:read','review-rule','read','允许查看评审规则',1,NULL,NULL,'2026-01-18 02:00:40.648','2026-01-18 02:00:40.648'),(25,1,'更新评审规则','review-rule:update','review-rule','update','允许更新评审规则',1,NULL,NULL,'2026-01-18 02:00:40.651','2026-01-18 02:00:40.651'),(26,1,'删除评审规则','review-rule:delete','review-rule','delete','允许删除评审规则',1,NULL,NULL,'2026-01-18 02:00:40.654','2026-01-18 02:00:40.654'),(27,1,'添加评委','judge:create','judge','create','允许添加评委',1,NULL,NULL,'2026-01-18 02:00:40.656','2026-01-18 02:00:40.656'),(28,1,'查看评委','judge:read','judge','read','允许查看评委列表',1,NULL,NULL,'2026-01-18 02:00:40.659','2026-01-18 02:00:40.659'),(29,1,'更新评委','judge:update','judge','update','允许更新评委信息',1,NULL,NULL,'2026-01-18 02:00:40.662','2026-01-18 02:00:40.662'),(30,1,'删除评委','judge:delete','judge','delete','允许删除评委',1,NULL,NULL,'2026-01-18 02:00:40.664','2026-01-18 02:00:40.664'),(31,1,'分配评委','judge:assign','judge','assign','允许为活动分配评委',1,NULL,NULL,'2026-01-18 02:00:40.667','2026-01-18 02:00:40.667'),(32,1,'查看报名','registration:read','registration','read','允许查看报名记录',1,NULL,NULL,'2026-01-18 02:00:40.669','2026-01-18 02:00:40.669'),(33,1,'审核报名','registration:approve','registration','approve','允许审核报名',1,NULL,NULL,'2026-01-18 02:00:40.672','2026-01-18 02:00:40.672'),(34,1,'查看作品','work:read','work','read','允许查看参赛作品',1,NULL,NULL,'2026-01-18 02:00:40.676','2026-01-18 02:00:40.676'),(35,1,'创建公告','notice:create','notice','create','允许创建活动公告',1,NULL,NULL,'2026-01-18 02:00:40.679','2026-01-18 02:00:40.679'),(36,1,'查看公告','notice:read','notice','read','允许查看活动公告',1,NULL,NULL,'2026-01-18 02:00:40.681','2026-01-18 02:00:40.681'),(37,1,'更新公告','notice:update','notice','update','允许更新公告信息',1,NULL,NULL,'2026-01-18 02:00:40.683','2026-01-18 02:00:40.683'),(38,1,'删除公告','notice:delete','notice','delete','允许删除公告',1,NULL,NULL,'2026-01-18 02:00:40.686','2026-01-18 02:00:40.686'),(39,1,'创建字典','dict:create','dict','create','允许创建新字典',1,NULL,NULL,'2026-01-18 02:00:40.688','2026-01-18 02:00:40.688'),(40,1,'查看字典','dict:read','dict','read','允许查看字典列表和详情',1,NULL,NULL,'2026-01-18 02:00:40.693','2026-01-18 02:00:40.693'),(41,1,'更新字典','dict:update','dict','update','允许更新字典信息',1,NULL,NULL,'2026-01-18 02:00:40.696','2026-01-18 02:00:40.696'),(42,1,'删除字典','dict:delete','dict','delete','允许删除字典',1,NULL,NULL,'2026-01-18 02:00:40.698','2026-01-18 02:00:40.698'),(43,1,'创建配置','config:create','config','create','允许创建新配置',1,NULL,NULL,'2026-01-18 02:00:40.701','2026-01-18 02:00:40.701'),(44,1,'查看配置','config:read','config','read','允许查看配置列表和详情',1,NULL,NULL,'2026-01-18 02:00:40.704','2026-01-18 02:00:40.704'),(45,1,'更新配置','config:update','config','update','允许更新配置信息',1,NULL,NULL,'2026-01-18 02:00:40.707','2026-01-18 02:00:40.707'),(46,1,'删除配置','config:delete','config','delete','允许删除配置',1,NULL,NULL,'2026-01-18 02:00:40.711','2026-01-18 02:00:40.711'),(47,1,'查看日志','log:read','log','read','允许查看系统日志',1,NULL,NULL,'2026-01-18 02:00:40.714','2026-01-18 02:00:40.714'),(48,1,'删除日志','log:delete','log','delete','允许删除系统日志',1,NULL,NULL,'2026-01-18 02:00:40.716','2026-01-18 02:00:40.716'),(49,2,'查看工作台','workbench:read','workbench','read','允许查看工作台',1,NULL,NULL,'2026-01-18 02:03:25.311','2026-01-18 02:03:25.311'),(50,2,'创建用户','user:create','user','create','允许创建新用户',1,NULL,NULL,'2026-01-18 02:03:25.315','2026-01-18 02:03:25.315'),(51,2,'查看用户','user:read','user','read','允许查看用户列表和详情',1,NULL,NULL,'2026-01-18 02:03:25.318','2026-01-18 02:03:25.318'),(52,2,'更新用户','user:update','user','update','允许更新用户信息',1,NULL,NULL,'2026-01-18 02:03:25.321','2026-01-18 02:03:25.321'),(53,2,'删除用户','user:delete','user','delete','允许删除用户',1,NULL,NULL,'2026-01-18 02:03:25.323','2026-01-18 02:03:25.323'),(54,2,'创建角色','role:create','role','create','允许创建新角色',1,NULL,NULL,'2026-01-18 02:03:25.326','2026-01-18 02:03:25.326'),(55,2,'查看角色','role:read','role','read','允许查看角色列表和详情',1,NULL,NULL,'2026-01-18 02:03:25.329','2026-01-18 02:03:25.329'),(56,2,'更新角色','role:update','role','update','允许更新角色信息',1,NULL,NULL,'2026-01-18 02:03:25.333','2026-01-18 02:03:25.333'),(57,2,'删除角色','role:delete','role','delete','允许删除角色',1,NULL,NULL,'2026-01-18 02:03:25.337','2026-01-18 02:03:25.337'),(58,2,'分配角色','role:assign','role','assign','允许给用户分配角色',1,NULL,NULL,'2026-01-18 02:03:25.340','2026-01-18 02:03:25.340'),(59,2,'查看权限','permission:read','permission','read','允许查看权限列表',1,NULL,NULL,'2026-01-18 02:03:25.342','2026-01-18 02:03:25.342'),(60,2,'查看菜单','menu:read','menu','read','允许查看菜单列表',1,NULL,NULL,'2026-01-18 02:03:25.345','2026-01-18 02:03:25.345'),(61,2,'创建学校','school:create','school','create','允许创建学校信息',1,NULL,NULL,'2026-01-18 02:03:25.349','2026-01-18 02:03:25.349'),(62,2,'查看学校','school:read','school','read','允许查看学校信息',1,NULL,NULL,'2026-01-18 02:03:25.352','2026-01-18 02:03:25.352'),(63,2,'更新学校','school:update','school','update','允许更新学校信息',1,NULL,NULL,'2026-01-18 02:03:25.355','2026-01-18 02:03:25.355'),(64,2,'删除学校','school:delete','school','delete','允许删除学校信息',1,NULL,NULL,'2026-01-18 02:03:25.357','2026-01-18 02:03:25.357'),(65,2,'创建部门','department:create','department','create','允许创建部门',1,NULL,NULL,'2026-01-18 02:03:25.360','2026-01-18 02:03:25.360'),(66,2,'查看部门','department:read','department','read','允许查看部门列表',1,NULL,NULL,'2026-01-18 02:03:25.363','2026-01-18 02:03:25.363'),(67,2,'更新部门','department:update','department','update','允许更新部门信息',1,NULL,NULL,'2026-01-18 02:03:25.366','2026-01-18 02:03:25.366'),(68,2,'删除部门','department:delete','department','delete','允许删除部门',1,NULL,NULL,'2026-01-18 02:03:25.369','2026-01-18 02:03:25.369'),(69,2,'创建年级','grade:create','grade','create','允许创建年级',1,NULL,NULL,'2026-01-18 02:03:25.372','2026-01-18 02:03:25.372'),(70,2,'查看年级','grade:read','grade','read','允许查看年级列表',1,NULL,NULL,'2026-01-18 02:03:25.374','2026-01-18 02:03:25.374'),(71,2,'更新年级','grade:update','grade','update','允许更新年级信息',1,NULL,NULL,'2026-01-18 02:03:25.378','2026-01-18 02:03:25.378'),(72,2,'删除年级','grade:delete','grade','delete','允许删除年级',1,NULL,NULL,'2026-01-18 02:03:25.381','2026-01-18 02:03:25.381'),(73,2,'创建班级','class:create','class','create','允许创建班级',1,NULL,NULL,'2026-01-18 02:03:25.384','2026-01-18 02:03:25.384'),(74,2,'查看班级','class:read','class','read','允许查看班级列表',1,NULL,NULL,'2026-01-18 02:03:25.387','2026-01-18 02:03:25.387'),(75,2,'更新班级','class:update','class','update','允许更新班级信息',1,NULL,NULL,'2026-01-18 02:03:25.389','2026-01-18 02:03:25.389'),(76,2,'删除班级','class:delete','class','delete','允许删除班级',1,NULL,NULL,'2026-01-18 02:03:25.392','2026-01-18 02:03:25.392'),(77,2,'创建教师','teacher:create','teacher','create','允许创建教师',1,NULL,NULL,'2026-01-18 02:03:25.396','2026-01-18 02:03:25.396'),(78,2,'查看教师','teacher:read','teacher','read','允许查看教师列表',1,NULL,NULL,'2026-01-18 02:03:25.399','2026-01-18 02:03:25.399'),(79,2,'更新教师','teacher:update','teacher','update','允许更新教师信息',1,NULL,NULL,'2026-01-18 02:03:25.401','2026-01-18 02:03:25.401'),(80,2,'删除教师','teacher:delete','teacher','delete','允许删除教师',1,NULL,NULL,'2026-01-18 02:03:25.404','2026-01-18 02:03:25.404'),(81,2,'创建学生','student:create','student','create','允许创建学生',1,NULL,NULL,'2026-01-18 02:03:25.406','2026-01-18 02:03:25.406'),(82,2,'查看学生','student:read','student','read','允许查看学生列表',1,NULL,NULL,'2026-01-18 02:03:25.408','2026-01-18 02:03:25.408'),(83,2,'更新学生','student:update','student','update','允许更新学生信息',1,NULL,NULL,'2026-01-18 02:03:25.410','2026-01-18 02:03:25.410'),(84,2,'删除学生','student:delete','student','delete','允许删除学生',1,NULL,NULL,'2026-01-18 02:03:25.412','2026-01-18 02:03:25.412'),(85,2,'查看活动活动','activity:read','activity','read','允许查看已发布的活动活动',1,NULL,NULL,'2026-01-18 02:03:25.414','2026-01-18 02:03:25.414'),(86,2,'指导学生','activity:guidance','activity','guidance','允许指导学生参赛',1,NULL,NULL,'2026-01-18 02:03:25.416','2026-01-18 02:03:25.416'),(87,2,'创建报名','registration:create','registration','create','允许报名活动',1,NULL,NULL,'2026-01-18 02:03:25.418','2026-01-18 02:03:25.418'),(88,2,'查看报名','registration:read','registration','read','允许查看报名记录',1,NULL,NULL,'2026-01-18 02:03:25.420','2026-01-18 02:03:25.420'),(89,2,'更新报名','registration:update','registration','update','允许更新报名信息',1,NULL,NULL,'2026-01-18 02:03:25.422','2026-01-18 02:03:25.422'),(90,2,'取消报名','registration:delete','registration','delete','允许取消报名',1,NULL,NULL,'2026-01-18 02:03:25.424','2026-01-18 02:03:25.424'),(91,2,'上传作品','work:create','work','create','允许上传参赛作品',1,NULL,NULL,'2026-01-18 02:03:25.427','2026-01-18 02:03:25.427'),(92,2,'查看作品','work:read','work','read','允许查看参赛作品',1,NULL,NULL,'2026-01-18 02:03:25.429','2026-01-18 02:03:25.429'),(93,2,'更新作品','work:update','work','update','允许更新作品信息',1,NULL,NULL,'2026-01-18 02:03:25.431','2026-01-18 02:03:25.431'),(94,2,'删除作品','work:delete','work','delete','允许删除作品',1,NULL,NULL,'2026-01-18 02:03:25.433','2026-01-18 02:03:25.433'),(95,2,'提交作品','work:submit','work','submit','允许提交作品',1,NULL,NULL,'2026-01-18 02:03:25.435','2026-01-18 02:03:25.435'),(96,2,'查看公告','notice:read','notice','read','允许查看活动公告',1,NULL,NULL,'2026-01-18 02:03:25.437','2026-01-18 02:03:25.437'),(97,2,'创建作业','homework:create','homework','create','允许创建作业',1,NULL,NULL,'2026-01-18 02:03:25.439','2026-01-18 02:03:25.439'),(98,2,'查看作业','homework:read','homework','read','允许查看作业列表',1,NULL,NULL,'2026-01-18 02:03:25.442','2026-01-18 02:03:25.442'),(99,2,'更新作业','homework:update','homework','update','允许更新作业信息',1,NULL,NULL,'2026-01-18 02:03:25.445','2026-01-18 02:03:25.445'),(100,2,'删除作业','homework:delete','homework','delete','允许删除作业',1,NULL,NULL,'2026-01-18 02:03:25.448','2026-01-18 02:03:25.448'),(101,2,'发布作业','homework:publish','homework','publish','允许发布作业',1,NULL,NULL,'2026-01-18 02:03:25.450','2026-01-18 02:03:25.450'),(102,2,'提交作业','homework-submission:create','homework-submission','create','允许提交作业',1,NULL,NULL,'2026-01-18 02:03:25.452','2026-01-18 02:03:25.452'),(103,2,'查看作业提交','homework-submission:read','homework-submission','read','允许查看作业提交记录',1,NULL,NULL,'2026-01-18 02:03:25.454','2026-01-18 02:03:25.454'),(104,2,'更新作业提交','homework-submission:update','homework-submission','update','允许更新提交的作业',1,NULL,NULL,'2026-01-18 02:03:25.456','2026-01-18 02:03:25.456'),(105,2,'创建作业评审规则','homework-review-rule:create','homework-review-rule','create','允许创建作业评审规则',1,NULL,NULL,'2026-01-18 02:03:25.460','2026-01-18 02:03:25.460'),(106,2,'查看作业评审规则','homework-review-rule:read','homework-review-rule','read','允许查看作业评审规则',1,NULL,NULL,'2026-01-18 02:03:25.462','2026-01-18 02:03:25.462'),(107,2,'更新作业评审规则','homework-review-rule:update','homework-review-rule','update','允许更新作业评审规则',1,NULL,NULL,'2026-01-18 02:03:25.465','2026-01-18 02:03:25.465'),(108,2,'删除作业评审规则','homework-review-rule:delete','homework-review-rule','delete','允许删除作业评审规则',1,NULL,NULL,'2026-01-18 02:03:25.467','2026-01-18 02:03:25.467'),(109,2,'作业评分','homework-score:create','homework-score','create','允许对作业评分',1,NULL,NULL,'2026-01-18 02:03:25.470','2026-01-18 02:03:25.470'),(110,2,'查看作业评分','homework-score:read','homework-score','read','允许查看作业评分',1,NULL,NULL,'2026-01-18 02:03:25.472','2026-01-18 02:03:25.472'); -/*!40000 ALTER TABLE `permissions` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `role_permissions` --- - -DROP TABLE IF EXISTS `role_permissions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `role_permissions` ( - `id` int NOT NULL AUTO_INCREMENT, - `role_id` int NOT NULL, - `permission_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `role_permissions_role_id_permission_id_key` (`role_id`,`permission_id`), - KEY `role_permissions_permission_id_fkey` (`permission_id`), - CONSTRAINT `role_permissions_permission_id_fkey` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `role_permissions_role_id_fkey` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=140 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `role_permissions` --- - -LOCK TABLES `role_permissions` WRITE; -/*!40000 ALTER TABLE `role_permissions` DISABLE KEYS */; -INSERT INTO `role_permissions` VALUES (1,1,1),(2,1,2),(3,1,3),(4,1,4),(5,1,5),(6,1,6),(7,1,7),(8,1,8),(9,1,9),(10,1,10),(11,1,11),(12,1,12),(13,1,13),(14,1,14),(15,1,15),(16,1,16),(17,1,17),(18,1,18),(19,1,19),(20,1,20),(21,1,21),(22,1,22),(23,1,23),(24,1,24),(25,1,25),(26,1,26),(27,1,27),(28,1,28),(29,1,29),(30,1,30),(31,1,31),(32,1,32),(33,1,33),(34,1,34),(35,1,35),(36,1,36),(37,1,37),(38,1,38),(39,1,39),(40,1,40),(41,1,41),(42,1,42),(43,1,43),(44,1,44),(45,1,45),(46,1,46),(47,1,47),(48,1,48),(49,2,49),(50,2,50),(51,2,51),(52,2,52),(53,2,53),(54,2,54),(55,2,55),(56,2,56),(57,2,57),(58,2,58),(59,2,59),(60,2,60),(61,2,61),(62,2,62),(63,2,63),(64,2,64),(65,2,65),(66,2,66),(67,2,67),(68,2,68),(69,2,69),(70,2,70),(71,2,71),(72,2,72),(73,2,73),(74,2,74),(75,2,75),(76,2,76),(77,2,77),(78,2,78),(79,2,79),(80,2,80),(81,2,81),(82,2,82),(83,2,83),(84,2,84),(85,2,85),(87,2,88),(88,2,92),(86,2,96),(89,2,97),(90,2,98),(91,2,99),(92,2,100),(93,2,101),(94,2,103),(95,2,105),(96,2,106),(97,2,107),(98,2,108),(99,2,110),(100,3,49),(101,3,70),(102,3,74),(103,3,82),(104,3,85),(105,3,86),(107,3,87),(108,3,88),(109,3,89),(110,3,90),(111,3,91),(112,3,92),(113,3,93),(114,3,95),(106,3,96),(115,3,97),(116,3,98),(117,3,99),(118,3,100),(119,3,101),(120,3,103),(121,3,105),(122,3,106),(123,3,107),(124,3,108),(125,3,109),(126,3,110),(127,4,49),(128,4,85),(130,4,88),(131,4,91),(132,4,92),(133,4,93),(134,4,95),(129,4,96),(135,4,98),(136,4,102),(137,4,103),(138,4,104),(139,4,110); -/*!40000 ALTER TABLE `role_permissions` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `roles` --- - -DROP TABLE IF EXISTS `roles`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `roles` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `roles_tenant_id_name_key` (`tenant_id`,`name`), - UNIQUE KEY `roles_tenant_id_code_key` (`tenant_id`,`code`), - KEY `roles_creator_fkey` (`creator`), - KEY `roles_modifier_fkey` (`modifier`), - CONSTRAINT `roles_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `roles_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `roles_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `roles` --- - -LOCK TABLES `roles` WRITE; -/*!40000 ALTER TABLE `roles` DISABLE KEYS */; -INSERT INTO `roles` VALUES (1,1,'超级管理员','super_admin','拥有系统所有权限的超级管理员角色',1,NULL,NULL,'2026-01-18 02:00:23.928','2026-01-18 02:00:40.723'),(2,2,'学校管理员','school_admin','学校管理员,管理学校信息、教师、学生等',1,NULL,NULL,'2026-01-18 02:03:25.475','2026-01-18 02:03:25.475'),(3,2,'教师','teacher','教师角色,可以报名活动、指导学生、管理作业',1,NULL,NULL,'2026-01-18 02:03:25.596','2026-01-18 02:03:25.596'),(4,2,'学生','student','学生角色,可以查看活动、上传作品、提交作业',1,NULL,NULL,'2026-01-18 02:03:25.666','2026-01-18 02:03:25.666'); -/*!40000 ALTER TABLE `roles` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `schools` --- - -DROP TABLE IF EXISTS `schools`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `schools` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `address` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `principal` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `established` datetime(3) DEFAULT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `logo` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `website` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `schools_tenant_id_key` (`tenant_id`), - KEY `schools_creator_fkey` (`creator`), - KEY `schools_modifier_fkey` (`modifier`), - CONSTRAINT `schools_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `schools_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `schools_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `schools` --- - -LOCK TABLES `schools` WRITE; -/*!40000 ALTER TABLE `schools` DISABLE KEYS */; -/*!40000 ALTER TABLE `schools` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `student_interest_classes` --- - -DROP TABLE IF EXISTS `student_interest_classes`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `student_interest_classes` ( - `id` int NOT NULL AUTO_INCREMENT, - `student_id` int NOT NULL, - `class_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `student_interest_classes_student_id_class_id_key` (`student_id`,`class_id`), - KEY `student_interest_classes_class_id_fkey` (`class_id`), - CONSTRAINT `student_interest_classes_class_id_fkey` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `student_interest_classes_student_id_fkey` FOREIGN KEY (`student_id`) REFERENCES `students` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `student_interest_classes` --- - -LOCK TABLES `student_interest_classes` WRITE; -/*!40000 ALTER TABLE `student_interest_classes` DISABLE KEYS */; -/*!40000 ALTER TABLE `student_interest_classes` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `students` --- - -DROP TABLE IF EXISTS `students`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `students` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `tenant_id` int NOT NULL, - `class_id` int NOT NULL, - `student_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `id_card` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `gender` int DEFAULT NULL, - `birth_date` datetime(3) DEFAULT NULL, - `enrollment_date` datetime(3) DEFAULT NULL, - `parent_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `parent_phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `address` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `students_user_id_key` (`user_id`), - UNIQUE KEY `students_tenant_id_student_no_key` (`tenant_id`,`student_no`), - KEY `students_class_id_fkey` (`class_id`), - KEY `students_creator_fkey` (`creator`), - KEY `students_modifier_fkey` (`modifier`), - CONSTRAINT `students_class_id_fkey` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `students_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `students_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `students_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `students_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `students` --- - -LOCK TABLES `students` WRITE; -/*!40000 ALTER TABLE `students` DISABLE KEYS */; -/*!40000 ALTER TABLE `students` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_ai_3d_task` --- - -DROP TABLE IF EXISTS `t_ai_3d_task`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_ai_3d_task` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `user_id` int NOT NULL, - `input_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `input_content` text COLLATE utf8mb4_unicode_ci NOT NULL, - `generate_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Normal', - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', - `result_url` text COLLATE utf8mb4_unicode_ci, - `preview_url` text COLLATE utf8mb4_unicode_ci, - `result_urls` json DEFAULT NULL, - `preview_urls` json DEFAULT NULL, - `error_message` text COLLATE utf8mb4_unicode_ci, - `external_task_id` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `retry_count` int NOT NULL DEFAULT '0', - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `complete_time` datetime(3) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `t_ai_3d_task_user_id_idx` (`user_id`), - KEY `t_ai_3d_task_tenant_id_idx` (`tenant_id`), - KEY `t_ai_3d_task_status_idx` (`status`), - KEY `t_ai_3d_task_create_time_idx` (`create_time`), - CONSTRAINT `t_ai_3d_task_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_ai_3d_task_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_ai_3d_task` --- - -LOCK TABLES `t_ai_3d_task` WRITE; -/*!40000 ALTER TABLE `t_ai_3d_task` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_ai_3d_task` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest` --- - -DROP TABLE IF EXISTS `t_contest`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `contest_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `contest_state` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'unpublished', - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'ongoing', - `start_time` datetime(3) NOT NULL, - `end_time` datetime(3) NOT NULL, - `address` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `content` text COLLATE utf8mb4_unicode_ci, - `contest_tenants` json DEFAULT NULL, - `cover_url` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `poster_url` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `contact_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `contact_phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `contact_qrcode` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `organizers` json DEFAULT NULL, - `co_organizers` json DEFAULT NULL, - `sponsors` json DEFAULT NULL, - `register_start_time` datetime(3) NOT NULL, - `register_end_time` datetime(3) NOT NULL, - `register_state` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `require_audit` tinyint(1) NOT NULL DEFAULT '1', - `allowed_grades` json DEFAULT NULL, - `allowed_classes` json DEFAULT NULL, - `team_min_members` int DEFAULT NULL, - `team_max_members` int DEFAULT NULL, - `submit_rule` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'once', - `submit_start_time` datetime(3) NOT NULL, - `submit_end_time` datetime(3) NOT NULL, - `work_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `work_requirement` text COLLATE utf8mb4_unicode_ci, - `review_rule_id` int DEFAULT NULL, - `review_start_time` datetime(3) NOT NULL, - `review_end_time` datetime(3) NOT NULL, - `result_state` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'unpublished', - `result_publish_time` datetime(3) DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_contest_name_key` (`contest_name`), - KEY `t_contest_contest_state_idx` (`contest_state`), - KEY `t_contest_start_time_end_time_idx` (`start_time`,`end_time`), - KEY `t_contest_review_rule_id_idx` (`review_rule_id`), - KEY `t_contest_creator_fkey` (`creator`), - KEY `t_contest_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_review_rule_id_fkey` FOREIGN KEY (`review_rule_id`) REFERENCES `t_contest_review_rule` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest` --- - -LOCK TABLES `t_contest` WRITE; -/*!40000 ALTER TABLE `t_contest` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_attachment` --- - -DROP TABLE IF EXISTS `t_contest_attachment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_attachment` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `file_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `file_url` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `format` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `file_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `size` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_contest_attachment_contest_id_idx` (`contest_id`), - KEY `t_contest_attachment_creator_fkey` (`creator`), - KEY `t_contest_attachment_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_attachment_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_attachment_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_attachment_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_attachment` --- - -LOCK TABLES `t_contest_attachment` WRITE; -/*!40000 ALTER TABLE `t_contest_attachment` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_attachment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_judge` --- - -DROP TABLE IF EXISTS `t_contest_judge`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_judge` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `judge_id` int NOT NULL, - `specialty` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `weight` decimal(3,2) DEFAULT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_judge_contest_id_judge_id_key` (`contest_id`,`judge_id`), - KEY `t_contest_judge_contest_id_idx` (`contest_id`), - KEY `t_contest_judge_judge_id_idx` (`judge_id`), - KEY `t_contest_judge_creator_fkey` (`creator`), - KEY `t_contest_judge_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_judge_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_judge_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_judge_judge_id_fkey` FOREIGN KEY (`judge_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_judge_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_judge` --- - -LOCK TABLES `t_contest_judge` WRITE; -/*!40000 ALTER TABLE `t_contest_judge` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_judge` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_notice` --- - -DROP TABLE IF EXISTS `t_contest_notice`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_notice` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `content` text COLLATE utf8mb4_unicode_ci NOT NULL, - `notice_type` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'manual', - `priority` int NOT NULL DEFAULT '0', - `publish_time` datetime(3) DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_contest_notice_contest_id_idx` (`contest_id`), - KEY `t_contest_notice_publish_time_idx` (`publish_time`), - KEY `t_contest_notice_notice_type_idx` (`notice_type`), - KEY `t_contest_notice_creator_fkey` (`creator`), - KEY `t_contest_notice_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_notice_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_notice_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_notice_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_notice` --- - -LOCK TABLES `t_contest_notice` WRITE; -/*!40000 ALTER TABLE `t_contest_notice` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_notice` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_registration` --- - -DROP TABLE IF EXISTS `t_contest_registration`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_registration` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `tenant_id` int NOT NULL, - `registration_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `team_id` int DEFAULT NULL, - `team_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `user_id` int NOT NULL, - `account_no` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `account_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `role` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `registration_state` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', - `registrant` int DEFAULT NULL, - `registration_time` datetime(3) NOT NULL, - `reason` varchar(1023) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `operator` int DEFAULT NULL, - `operation_date` datetime(3) DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - KEY `t_contest_registration_contest_id_tenant_id_idx` (`contest_id`,`tenant_id`), - KEY `t_contest_registration_user_id_contest_id_idx` (`user_id`,`contest_id`), - KEY `t_contest_registration_team_id_idx` (`team_id`), - KEY `t_contest_registration_registration_state_idx` (`registration_state`), - KEY `t_contest_registration_tenant_id_fkey` (`tenant_id`), - KEY `t_contest_registration_creator_fkey` (`creator`), - KEY `t_contest_registration_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_registration_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_team_id_fkey` FOREIGN KEY (`team_id`) REFERENCES `t_contest_team` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_registration` --- - -LOCK TABLES `t_contest_registration` WRITE; -/*!40000 ALTER TABLE `t_contest_registration` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_registration` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_registration_teacher` --- - -DROP TABLE IF EXISTS `t_contest_registration_teacher`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_registration_teacher` ( - `id` int NOT NULL AUTO_INCREMENT, - `registration_id` int NOT NULL, - `tenant_id` int NOT NULL, - `user_id` int NOT NULL, - `is_default` tinyint(1) NOT NULL DEFAULT '0', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_registration_teacher_tenant_id_registration_id_use_key` (`tenant_id`,`registration_id`,`user_id`), - KEY `t_contest_registration_teacher_registration_id_idx` (`registration_id`), - KEY `t_contest_registration_teacher_user_id_idx` (`user_id`), - KEY `t_contest_registration_teacher_creator_fkey` (`creator`), - KEY `t_contest_registration_teacher_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_registration_teacher_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_teacher_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_teacher_registration_id_fkey` FOREIGN KEY (`registration_id`) REFERENCES `t_contest_registration` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_teacher_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_registration_teacher_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_registration_teacher` --- - -LOCK TABLES `t_contest_registration_teacher` WRITE; -/*!40000 ALTER TABLE `t_contest_registration_teacher` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_registration_teacher` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_review_rule` --- - -DROP TABLE IF EXISTS `t_contest_review_rule`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_review_rule` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `rule_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `rule_description` text COLLATE utf8mb4_unicode_ci, - `judge_count` int DEFAULT NULL, - `dimensions` json NOT NULL, - `calculation_rule` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'average', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_contest_review_rule_tenant_id_idx` (`tenant_id`), - KEY `t_contest_review_rule_creator_fkey` (`creator`), - KEY `t_contest_review_rule_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_review_rule_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_review_rule_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_review_rule_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_review_rule` --- - -LOCK TABLES `t_contest_review_rule` WRITE; -/*!40000 ALTER TABLE `t_contest_review_rule` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_review_rule` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_team` --- - -DROP TABLE IF EXISTS `t_contest_team`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_team` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `contest_id` int NOT NULL, - `team_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `leader_user_id` int NOT NULL, - `max_members` int DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_team_tenant_id_contest_id_team_name_key` (`tenant_id`,`contest_id`,`team_name`), - KEY `t_contest_team_contest_id_idx` (`contest_id`), - KEY `t_contest_team_leader_user_id_idx` (`leader_user_id`), - KEY `t_contest_team_creator_fkey` (`creator`), - KEY `t_contest_team_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_team_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_leader_user_id_fkey` FOREIGN KEY (`leader_user_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_team` --- - -LOCK TABLES `t_contest_team` WRITE; -/*!40000 ALTER TABLE `t_contest_team` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_team` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_team_member` --- - -DROP TABLE IF EXISTS `t_contest_team_member`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_team_member` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `team_id` int NOT NULL, - `user_id` int NOT NULL, - `role` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'member', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_team_member_tenant_id_team_id_user_id_key` (`tenant_id`,`team_id`,`user_id`), - KEY `t_contest_team_member_team_id_idx` (`team_id`), - KEY `t_contest_team_member_user_id_idx` (`user_id`), - KEY `t_contest_team_member_creator_fkey` (`creator`), - KEY `t_contest_team_member_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_team_member_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_member_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_member_team_id_fkey` FOREIGN KEY (`team_id`) REFERENCES `t_contest_team` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_member_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_team_member_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_team_member` --- - -LOCK TABLES `t_contest_team_member` WRITE; -/*!40000 ALTER TABLE `t_contest_team_member` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_team_member` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_work` --- - -DROP TABLE IF EXISTS `t_contest_work`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_work` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `contest_id` int NOT NULL, - `registration_id` int NOT NULL, - `work_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `title` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `files` json DEFAULT NULL, - `version` int NOT NULL DEFAULT '1', - `is_latest` tinyint(1) NOT NULL DEFAULT '1', - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'submitted', - `submit_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `submitter_user_id` int DEFAULT NULL, - `submitter_account_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `submit_source` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'teacher', - `preview_url` text COLLATE utf8mb4_unicode_ci, - `preview_urls` json DEFAULT NULL, - `ai_model_meta` json DEFAULT NULL, - `final_score` decimal(10,2) DEFAULT NULL, - `rank` int DEFAULT NULL, - `award_level` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `award_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `certificate_url` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_work_work_no_key` (`work_no`), - KEY `t_contest_work_tenant_id_contest_id_is_latest_idx` (`tenant_id`,`contest_id`,`is_latest`), - KEY `t_contest_work_registration_id_idx` (`registration_id`), - KEY `t_contest_work_tenant_id_contest_id_submit_time_status_idx` (`tenant_id`,`contest_id`,`submit_time`,`status`), - KEY `t_contest_work_contest_id_status_idx` (`contest_id`,`status`), - KEY `t_contest_work_creator_fkey` (`creator`), - KEY `t_contest_work_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_work_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_registration_id_fkey` FOREIGN KEY (`registration_id`) REFERENCES `t_contest_registration` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_work` --- - -LOCK TABLES `t_contest_work` WRITE; -/*!40000 ALTER TABLE `t_contest_work` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_work` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_work_attachment` --- - -DROP TABLE IF EXISTS `t_contest_work_attachment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_work_attachment` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `contest_id` int NOT NULL, - `work_id` int NOT NULL, - `file_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `file_url` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `format` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `file_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `size` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - KEY `t_contest_work_attachment_tenant_id_contest_id_work_id_idx` (`tenant_id`,`contest_id`,`work_id`), - KEY `t_contest_work_attachment_work_id_fkey` (`work_id`), - KEY `t_contest_work_attachment_creator_fkey` (`creator`), - KEY `t_contest_work_attachment_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_work_attachment_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_attachment_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_attachment_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_attachment_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `t_contest_work` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_work_attachment` --- - -LOCK TABLES `t_contest_work_attachment` WRITE; -/*!40000 ALTER TABLE `t_contest_work_attachment` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_work_attachment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_work_judge_assignment` --- - -DROP TABLE IF EXISTS `t_contest_work_judge_assignment`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_work_judge_assignment` ( - `id` int NOT NULL AUTO_INCREMENT, - `contest_id` int NOT NULL, - `work_id` int NOT NULL, - `judge_id` int NOT NULL, - `assignment_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'assigned', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `t_contest_work_judge_assignment_work_id_judge_id_key` (`work_id`,`judge_id`), - KEY `t_contest_work_judge_assignment_contest_id_judge_id_idx` (`contest_id`,`judge_id`), - KEY `t_contest_work_judge_assignment_work_id_idx` (`work_id`), - KEY `t_contest_work_judge_assignment_status_idx` (`status`), - KEY `t_contest_work_judge_assignment_judge_id_fkey` (`judge_id`), - KEY `t_contest_work_judge_assignment_creator_fkey` (`creator`), - KEY `t_contest_work_judge_assignment_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_work_judge_assignment_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_judge_assignment_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_judge_assignment_judge_id_fkey` FOREIGN KEY (`judge_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_judge_assignment_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_judge_assignment_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `t_contest_work` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_work_judge_assignment` --- - -LOCK TABLES `t_contest_work_judge_assignment` WRITE; -/*!40000 ALTER TABLE `t_contest_work_judge_assignment` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_work_judge_assignment` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_contest_work_score` --- - -DROP TABLE IF EXISTS `t_contest_work_score`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_contest_work_score` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `contest_id` int NOT NULL, - `work_id` int NOT NULL, - `assignment_id` int NOT NULL, - `judge_id` int NOT NULL, - `judge_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `dimension_scores` json NOT NULL, - `total_score` decimal(10,2) NOT NULL, - `comments` text COLLATE utf8mb4_unicode_ci, - `score_time` datetime(3) NOT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_contest_work_score_contest_id_work_id_judge_id_idx` (`contest_id`,`work_id`,`judge_id`), - KEY `t_contest_work_score_work_id_idx` (`work_id`), - KEY `t_contest_work_score_assignment_id_idx` (`assignment_id`), - KEY `t_contest_work_score_tenant_id_fkey` (`tenant_id`), - KEY `t_contest_work_score_judge_id_fkey` (`judge_id`), - KEY `t_contest_work_score_creator_fkey` (`creator`), - KEY `t_contest_work_score_modifier_fkey` (`modifier`), - CONSTRAINT `t_contest_work_score_assignment_id_fkey` FOREIGN KEY (`assignment_id`) REFERENCES `t_contest_work_judge_assignment` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_contest_id_fkey` FOREIGN KEY (`contest_id`) REFERENCES `t_contest` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_judge_id_fkey` FOREIGN KEY (`judge_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_contest_work_score_work_id_fkey` FOREIGN KEY (`work_id`) REFERENCES `t_contest_work` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_contest_work_score` --- - -LOCK TABLES `t_contest_work_score` WRITE; -/*!40000 ALTER TABLE `t_contest_work_score` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_contest_work_score` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_homework` --- - -DROP TABLE IF EXISTS `t_homework`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_homework` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `content` text COLLATE utf8mb4_unicode_ci, - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'unpublished', - `publish_time` datetime(3) DEFAULT NULL, - `submit_start_time` datetime(3) NOT NULL, - `submit_end_time` datetime(3) NOT NULL, - `attachments` json DEFAULT NULL, - `publish_scope` json DEFAULT NULL, - `review_rule_id` int DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_homework_tenant_id_status_idx` (`tenant_id`,`status`), - KEY `t_homework_tenant_id_submit_start_time_submit_end_time_idx` (`tenant_id`,`submit_start_time`,`submit_end_time`), - KEY `t_homework_review_rule_id_fkey` (`review_rule_id`), - KEY `t_homework_creator_fkey` (`creator`), - KEY `t_homework_modifier_fkey` (`modifier`), - CONSTRAINT `t_homework_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_review_rule_id_fkey` FOREIGN KEY (`review_rule_id`) REFERENCES `t_homework_review_rule` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_homework` --- - -LOCK TABLES `t_homework` WRITE; -/*!40000 ALTER TABLE `t_homework` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_homework` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_homework_review_rule` --- - -DROP TABLE IF EXISTS `t_homework_review_rule`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_homework_review_rule` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `criteria` json NOT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - KEY `t_homework_review_rule_tenant_id_idx` (`tenant_id`), - KEY `t_homework_review_rule_creator_fkey` (`creator`), - KEY `t_homework_review_rule_modifier_fkey` (`modifier`), - CONSTRAINT `t_homework_review_rule_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_review_rule_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_review_rule_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_homework_review_rule` --- - -LOCK TABLES `t_homework_review_rule` WRITE; -/*!40000 ALTER TABLE `t_homework_review_rule` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_homework_review_rule` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_homework_score` --- - -DROP TABLE IF EXISTS `t_homework_score`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_homework_score` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `submission_id` int NOT NULL, - `reviewer_id` int NOT NULL, - `dimension_scores` json NOT NULL, - `total_score` decimal(10,2) NOT NULL, - `comments` text COLLATE utf8mb4_unicode_ci, - `score_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_homework_score_submission_id_reviewer_id_key` (`submission_id`,`reviewer_id`), - KEY `t_homework_score_tenant_id_submission_id_idx` (`tenant_id`,`submission_id`), - KEY `t_homework_score_reviewer_id_idx` (`reviewer_id`), - KEY `t_homework_score_creator_fkey` (`creator`), - KEY `t_homework_score_modifier_fkey` (`modifier`), - CONSTRAINT `t_homework_score_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_score_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_score_reviewer_id_fkey` FOREIGN KEY (`reviewer_id`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `t_homework_score_submission_id_fkey` FOREIGN KEY (`submission_id`) REFERENCES `t_homework_submission` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_homework_score_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_homework_score` --- - -LOCK TABLES `t_homework_score` WRITE; -/*!40000 ALTER TABLE `t_homework_score` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_homework_score` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `t_homework_submission` --- - -DROP TABLE IF EXISTS `t_homework_submission`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `t_homework_submission` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `homework_id` int NOT NULL, - `student_id` int NOT NULL, - `work_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `work_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `work_description` text COLLATE utf8mb4_unicode_ci, - `files` json DEFAULT NULL, - `attachments` json DEFAULT NULL, - `submit_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'pending', - `total_score` decimal(10,2) DEFAULT NULL, - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - `valid_state` int NOT NULL DEFAULT '1', - PRIMARY KEY (`id`), - UNIQUE KEY `t_homework_submission_homework_id_student_id_key` (`homework_id`,`student_id`), - KEY `t_homework_submission_tenant_id_homework_id_idx` (`tenant_id`,`homework_id`), - KEY `t_homework_submission_student_id_idx` (`student_id`), - KEY `t_homework_submission_status_idx` (`status`), - KEY `t_homework_submission_creator_fkey` (`creator`), - KEY `t_homework_submission_modifier_fkey` (`modifier`), - CONSTRAINT `t_homework_submission_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_submission_homework_id_fkey` FOREIGN KEY (`homework_id`) REFERENCES `t_homework` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_homework_submission_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `t_homework_submission_student_id_fkey` FOREIGN KEY (`student_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `t_homework_submission_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `t_homework_submission` --- - -LOCK TABLES `t_homework_submission` WRITE; -/*!40000 ALTER TABLE `t_homework_submission` DISABLE KEYS */; -/*!40000 ALTER TABLE `t_homework_submission` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `teachers` --- - -DROP TABLE IF EXISTS `teachers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `teachers` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `tenant_id` int NOT NULL, - `department_id` int NOT NULL, - `employee_no` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `id_card` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `gender` int DEFAULT NULL, - `birth_date` datetime(3) DEFAULT NULL, - `hire_date` datetime(3) DEFAULT NULL, - `subject` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `title` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `description` text COLLATE utf8mb4_unicode_ci, - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `teachers_user_id_key` (`user_id`), - UNIQUE KEY `teachers_tenant_id_employee_no_key` (`tenant_id`,`employee_no`), - KEY `teachers_department_id_fkey` (`department_id`), - KEY `teachers_creator_fkey` (`creator`), - KEY `teachers_modifier_fkey` (`modifier`), - CONSTRAINT `teachers_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `teachers_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `departments` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT `teachers_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `teachers_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `teachers_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `teachers` --- - -LOCK TABLES `teachers` WRITE; -/*!40000 ALTER TABLE `teachers` DISABLE KEYS */; -/*!40000 ALTER TABLE `teachers` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `tenant_menus` --- - -DROP TABLE IF EXISTS `tenant_menus`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `tenant_menus` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `menu_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `tenant_menus_tenant_id_menu_id_key` (`tenant_id`,`menu_id`), - KEY `tenant_menus_menu_id_fkey` (`menu_id`), - CONSTRAINT `tenant_menus_menu_id_fkey` FOREIGN KEY (`menu_id`) REFERENCES `menus` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `tenant_menus_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `tenant_menus` --- - -LOCK TABLES `tenant_menus` WRITE; -/*!40000 ALTER TABLE `tenant_menus` DISABLE KEYS */; -INSERT INTO `tenant_menus` VALUES (1,1,1),(2,1,2),(5,1,3),(8,1,4),(9,1,12),(3,1,13),(6,1,14),(10,1,15),(12,1,16),(14,1,17),(16,1,18),(18,1,19),(20,1,20),(22,1,25),(4,1,26),(7,1,27),(11,1,28),(13,1,29),(15,1,30),(17,1,31),(19,1,32),(21,1,33),(23,2,1),(24,2,2),(29,2,5),(25,2,6),(30,2,7),(33,2,8),(35,2,9),(37,2,10),(38,2,11),(36,2,21),(26,2,22),(31,2,23),(34,2,24),(39,2,25),(27,2,26),(32,2,27),(40,2,34),(28,2,35); -/*!40000 ALTER TABLE `tenant_menus` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `tenants` --- - -DROP TABLE IF EXISTS `tenants`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `tenants` ( - `id` int NOT NULL AUTO_INCREMENT, - `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `code` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `domain` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `is_super` int NOT NULL DEFAULT '0', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `tenants_code_key` (`code`), - UNIQUE KEY `tenants_domain_key` (`domain`), - KEY `tenants_creator_fkey` (`creator`), - KEY `tenants_modifier_fkey` (`modifier`), - CONSTRAINT `tenants_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `tenants_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `tenants` --- - -LOCK TABLES `tenants` WRITE; -/*!40000 ALTER TABLE `tenants` DISABLE KEYS */; -INSERT INTO `tenants` VALUES (1,'超级租户','super','super','系统超级租户,拥有所有权限',1,1,NULL,NULL,'2026-01-18 02:00:23.863','2026-01-18 02:00:23.863'),(2,'香港小学','school1',NULL,NULL,0,1,NULL,NULL,'2026-01-18 02:03:25.302','2026-01-18 02:03:25.302'); -/*!40000 ALTER TABLE `tenants` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `user_roles` --- - -DROP TABLE IF EXISTS `user_roles`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `user_roles` ( - `id` int NOT NULL AUTO_INCREMENT, - `user_id` int NOT NULL, - `role_id` int NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `user_roles_user_id_role_id_key` (`user_id`,`role_id`), - KEY `user_roles_role_id_fkey` (`role_id`), - CONSTRAINT `user_roles_role_id_fkey` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT `user_roles_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `user_roles` --- - -LOCK TABLES `user_roles` WRITE; -/*!40000 ALTER TABLE `user_roles` DISABLE KEYS */; -INSERT INTO `user_roles` VALUES (1,1,1),(2,2,2); -/*!40000 ALTER TABLE `user_roles` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `users` --- - -DROP TABLE IF EXISTS `users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `users` ( - `id` int NOT NULL AUTO_INCREMENT, - `tenant_id` int NOT NULL, - `username` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `nickname` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, - `email` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `phone` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `gender` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `avatar` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `organization` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `status` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'enabled', - `valid_state` int NOT NULL DEFAULT '1', - `creator` int DEFAULT NULL, - `modifier` int DEFAULT NULL, - `create_time` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), - `modify_time` datetime(3) NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `users_tenant_id_username_key` (`tenant_id`,`username`), - UNIQUE KEY `users_tenant_id_email_key` (`tenant_id`,`email`), - KEY `users_creator_fkey` (`creator`), - KEY `users_modifier_fkey` (`modifier`), - CONSTRAINT `users_creator_fkey` FOREIGN KEY (`creator`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `users_modifier_fkey` FOREIGN KEY (`modifier`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, - CONSTRAINT `users_tenant_id_fkey` FOREIGN KEY (`tenant_id`) REFERENCES `tenants` (`id`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `users` --- - -LOCK TABLES `users` WRITE; -/*!40000 ALTER TABLE `users` DISABLE KEYS */; -INSERT INTO `users` VALUES (1,1,'admin','$2b$10$yEs4YwTEZ9/uhTXFuvUbfu5bKkUmvvcfV3K7EtDukVYFo3BltjZya','超级管理员','admin@super.com',NULL,NULL,NULL,NULL,'enabled',1,NULL,NULL,'2026-01-18 02:00:23.921','2026-01-18 02:00:40.895'),(2,2,'admin','$2b$10$7ppuHA7QhrqaBctS2C6Q2.GNvZtU3glDcLMUNFIY3NNYAqKCztLu6','管理员',NULL,NULL,NULL,NULL,NULL,'enabled',1,NULL,NULL,'2026-01-18 02:03:25.756','2026-01-18 02:03:25.756'); -/*!40000 ALTER TABLE `users` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2026-01-18 11:19:37 diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts deleted file mode 100644 index 41cca23..0000000 --- a/backend/src/app.module.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ConfigModule } from '@nestjs/config'; -import { APP_GUARD, APP_INTERCEPTOR, APP_FILTER } from '@nestjs/core'; -import { PrismaModule } from './prisma/prisma.module'; -import { AuthModule } from './auth/auth.module'; -import { UsersModule } from './users/users.module'; -import { RolesModule } from './roles/roles.module'; -import { PermissionsModule } from './permissions/permissions.module'; -import { MenusModule } from './menus/menus.module'; -import { DictModule } from './dict/dict.module'; -import { ConfigModule as SystemConfigModule } from './config/config.module'; -import { LogsModule } from './logs/logs.module'; -import { TenantsModule } from './tenants/tenants.module'; -import { ContestsModule } from './contests/contests.module'; -import { AnalyticsModule } from './contests/analytics/analytics.module'; -import { JudgesManagementModule } from './judges-management/judges-management.module'; -import { UploadModule } from './upload/upload.module'; -import { HomeworkModule } from './homework/homework.module'; -import { OssModule } from './oss/oss.module'; -import { PublicModule } from './public/public.module'; -import { JwtAuthGuard } from './auth/guards/jwt-auth.guard'; -import { RolesGuard } from './auth/guards/roles.guard'; -import { TransformInterceptor } from './common/interceptors/transform.interceptor'; -import { LoggingInterceptor } from './common/interceptors/logging.interceptor'; -import { HttpExceptionFilter } from './common/filters/http-exception.filter'; - -@Module({ - imports: [ - ConfigModule.forRoot({ - isGlobal: true, - // envFilePath 数组中第一个文件优先级最高 - envFilePath: [ - `.env.${process.env.NODE_ENV || 'development'}`, // 优先加载环境特定配置 - '.env', // 通用配置作为后备 - ], - }), - PrismaModule, - AuthModule, - UsersModule, - RolesModule, - PermissionsModule, - MenusModule, - DictModule, - SystemConfigModule, - LogsModule, - TenantsModule, - ContestsModule, - AnalyticsModule, - JudgesManagementModule, - UploadModule, - HomeworkModule, - OssModule, - PublicModule, - ], - providers: [ - { - provide: APP_GUARD, - useClass: JwtAuthGuard, - }, - { - provide: APP_GUARD, - useClass: RolesGuard, - }, - { - provide: APP_INTERCEPTOR, - useClass: LoggingInterceptor, // 日志拦截器,先执行 - }, - { - provide: APP_INTERCEPTOR, - useClass: TransformInterceptor, // 响应转换拦截器 - }, - { - provide: APP_FILTER, - useClass: HttpExceptionFilter, - }, - ], -}) -export class AppModule {} diff --git a/backend/src/auth/auth.controller.ts b/backend/src/auth/auth.controller.ts deleted file mode 100644 index a3e958e..0000000 --- a/backend/src/auth/auth.controller.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - Controller, - Post, - Get, - Body, - UseGuards, - Request, -} from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; -import { AuthService } from './auth.service'; -import { LoginDto } from './dto/login.dto'; -import { Public } from './decorators/public.decorator'; - -@Controller('auth') -export class AuthController { - constructor(private authService: AuthService) {} - - @Public() - @UseGuards(AuthGuard('local')) - @Post('login') - async login(@Body() loginDto: LoginDto, @Request() req) { - // 从请求头或请求体获取租户ID - const tenantId = req.headers['x-tenant-id'] - ? parseInt(req.headers['x-tenant-id'], 10) - : req.user?.tenantId; - - return this.authService.login(req.user, tenantId); - } - - @UseGuards(AuthGuard('jwt')) - @Get('user-info') - async getUserInfo(@Request() req) { - return this.authService.getUserInfo(req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Post('logout') - async logout() { - return { message: '登出成功' }; - } -} diff --git a/backend/src/auth/auth.module.ts b/backend/src/auth/auth.module.ts deleted file mode 100644 index 7e66a39..0000000 --- a/backend/src/auth/auth.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Module } from '@nestjs/common'; -import { JwtModule } from '@nestjs/jwt'; -import { PassportModule } from '@nestjs/passport'; -import { ConfigService } from '@nestjs/config'; -import { AuthService } from './auth.service'; -import { AuthController } from './auth.controller'; -import { JwtStrategy } from './strategies/jwt.strategy'; -import { LocalStrategy } from './strategies/local.strategy'; -import { RolesGuard } from './guards/roles.guard'; -import { UsersModule } from '../users/users.module'; -import { PrismaModule } from '../prisma/prisma.module'; - -@Module({ - imports: [ - UsersModule, - PrismaModule, - PassportModule, - JwtModule.registerAsync({ - inject: [ConfigService], - useFactory: (config: ConfigService) => ({ - secret: config.get('JWT_SECRET') || 'your-secret-key', - signOptions: { expiresIn: '7d' }, - }), - }), - ], - controllers: [AuthController], - providers: [AuthService, JwtStrategy, LocalStrategy, RolesGuard], - exports: [AuthService, RolesGuard], -}) -export class AuthModule {} diff --git a/backend/src/auth/auth.service.ts b/backend/src/auth/auth.service.ts deleted file mode 100644 index 52f1d1f..0000000 --- a/backend/src/auth/auth.service.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { - Injectable, - UnauthorizedException, - BadRequestException, -} from '@nestjs/common'; -import { JwtService } from '@nestjs/jwt'; -import { UsersService } from '../users/users.service'; -import { PrismaService } from '../prisma/prisma.service'; -import * as bcrypt from 'bcrypt'; - -@Injectable() -export class AuthService { - constructor( - private usersService: UsersService, - private jwtService: JwtService, - private prisma: PrismaService, - ) {} - - async validateUser( - username: string, - password: string, - tenantId?: number, - ): Promise { - const user = await this.usersService.findByUsername(username, tenantId); - if (user && (await bcrypt.compare(password, user.password))) { - // 验证租户是否匹配 - if (tenantId && user.tenantId !== tenantId) { - throw new UnauthorizedException('用户不属于该租户'); - } - const { password, ...result } = user; - password; - return result; - } - return null; - } - - async login(user: any, tenantId?: number) { - // 确保租户ID存在 - const finalTenantId = tenantId || user.tenantId; - if (!finalTenantId) { - throw new BadRequestException('无法确定租户信息'); - } - - // 验证租户是否有效 - const tenant = await this.prisma.tenant.findUnique({ - where: { id: finalTenantId }, - }); - - if (!tenant) { - throw new BadRequestException('租户不存在'); - } - - if (tenant.validState !== 1) { - throw new BadRequestException('租户已失效'); - } - - // 验证用户是否属于该租户 - if (user.tenantId !== finalTenantId) { - throw new UnauthorizedException('用户不属于该租户'); - } - - const payload = { - username: user.username, - sub: user.id, - tenantId: finalTenantId, - }; - - return { - token: this.jwtService.sign(payload), - user: { - id: user.id, - username: user.username, - nickname: user.nickname, - email: user.email, - avatar: user.avatar, - tenantId: finalTenantId, - tenantCode: tenant.code, - roles: user.roles?.map((ur: any) => ur.role.code) || [], - permissions: await this.getUserPermissions(user.id), - }, - }; - } - - async getUserInfo(userId: number) { - const user = await this.usersService.findOne(userId); - if (!user) { - throw new UnauthorizedException('用户不存在'); - } - - const tenant = await this.prisma.tenant.findUnique({ - where: { id: user.tenantId }, - }); - - return { - id: user.id, - username: user.username, - nickname: user.nickname, - email: user.email, - avatar: user.avatar, - tenantId: user.tenantId, - tenantCode: tenant?.code, - roles: user.roles?.map((ur: any) => ur.role.code) || [], - permissions: await this.getUserPermissions(userId), - }; - } - - async getUserPermissions(userId: number): Promise { - const user = await this.usersService.findOne(userId); - if (!user) return []; - - const permissions = new Set(); - user.roles?.forEach((ur: any) => { - ur.role.permissions?.forEach((rp: any) => { - permissions.add(rp.permission.code); - }); - }); - - return Array.from(permissions); - } - - async getUserRoles(userId: number): Promise { - const user = await this.usersService.findOne(userId); - if (!user) return []; - - return user.roles?.map((ur: any) => ur.role.code) || []; - } -} diff --git a/backend/src/auth/decorators/current-tenant-id.decorator.ts b/backend/src/auth/decorators/current-tenant-id.decorator.ts deleted file mode 100644 index 7388e4b..0000000 --- a/backend/src/auth/decorators/current-tenant-id.decorator.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { createParamDecorator, ExecutionContext } from '@nestjs/common'; - -/** - * 从请求中获取当前租户ID - * 优先从 req.tenantId 获取,其次从 req.user.tenantId 获取 - */ -export const CurrentTenantId = createParamDecorator( - (data: unknown, ctx: ExecutionContext): number | undefined => { - const request = ctx.switchToHttp().getRequest(); - return request.tenantId || request.user?.tenantId; - }, -); diff --git a/backend/src/auth/decorators/public.decorator.ts b/backend/src/auth/decorators/public.decorator.ts deleted file mode 100644 index 39ebd50..0000000 --- a/backend/src/auth/decorators/public.decorator.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { SetMetadata } from '@nestjs/common'; - -export const IS_PUBLIC_KEY = 'isPublic'; -export const Public = () => SetMetadata(IS_PUBLIC_KEY, true); diff --git a/backend/src/auth/decorators/require-permission.decorator.ts b/backend/src/auth/decorators/require-permission.decorator.ts deleted file mode 100644 index 7dffafd..0000000 --- a/backend/src/auth/decorators/require-permission.decorator.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { SetMetadata } from '@nestjs/common'; - -export const PERMISSION_KEY = 'permission'; - -/** - * 权限装饰器 - * @param permissions 单个权限或多个权限(多个权限为 OR 逻辑,满足其一即可) - */ -export const RequirePermission = (...permissions: string[]) => - SetMetadata(PERMISSION_KEY, permissions); diff --git a/backend/src/auth/decorators/roles.decorator.ts b/backend/src/auth/decorators/roles.decorator.ts deleted file mode 100644 index 8df7064..0000000 --- a/backend/src/auth/decorators/roles.decorator.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { SetMetadata } from '@nestjs/common'; - -export const ROLES_KEY = 'roles'; -export const Roles = (...roles: string[]) => SetMetadata(ROLES_KEY, roles); diff --git a/backend/src/auth/dto/login.dto.ts b/backend/src/auth/dto/login.dto.ts deleted file mode 100644 index 0ae9579..0000000 --- a/backend/src/auth/dto/login.dto.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IsString, IsNotEmpty, IsOptional } from 'class-validator'; - -export class LoginDto { - @IsString() - @IsNotEmpty() - username: string; - - @IsString() - @IsNotEmpty() - password: string; - - @IsString() - @IsOptional() - tenantCode?: string; // 租户编码(可选,如果未提供则从请求头获取) -} diff --git a/backend/src/auth/guards/jwt-auth.guard.ts b/backend/src/auth/guards/jwt-auth.guard.ts deleted file mode 100644 index b52e7f7..0000000 --- a/backend/src/auth/guards/jwt-auth.guard.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Injectable, ExecutionContext } from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; -import { Reflector } from '@nestjs/core'; -import { IS_PUBLIC_KEY } from '../decorators/public.decorator'; - -@Injectable() -export class JwtAuthGuard extends AuthGuard('jwt') { - constructor(private reflector: Reflector) { - super(); - } - - canActivate(context: ExecutionContext) { - const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ - context.getHandler(), - context.getClass(), - ]); - - if (isPublic) { - // 公开接口:尝试解析 JWT(有 token 就解析,没有就跳过) - // 这样公众端活动列表等接口可以根据用户身份做个性化过滤 - const request = context.switchToHttp().getRequest(); - const authHeader = request.headers?.authorization; - if (authHeader && authHeader.startsWith('Bearer ')) { - // 有 token,尝试验证(但失败不阻塞) - return super.canActivate(context); - } - return true; - } - - return super.canActivate(context); - } - - // 公开接口 JWT 验证失败时不抛异常,只是 user 为空 - handleRequest(err: any, user: any, info: any, context: ExecutionContext) { - const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ - context.getHandler(), - context.getClass(), - ]); - - if (isPublic && !user) { - return null; // 公开接口,无用户也放行 - } - - if (err || !user) { - throw err || new (require('@nestjs/common').UnauthorizedException)(); - } - - return user; - } -} diff --git a/backend/src/auth/guards/permissions.guard.ts b/backend/src/auth/guards/permissions.guard.ts deleted file mode 100644 index 1a64831..0000000 --- a/backend/src/auth/guards/permissions.guard.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common'; -import { Reflector } from '@nestjs/core'; -import { AuthService } from '../auth.service'; -import { PERMISSION_KEY } from '../decorators/require-permission.decorator'; - -@Injectable() -export class PermissionsGuard implements CanActivate { - constructor( - private reflector: Reflector, - private authService: AuthService, - ) {} - - async canActivate(context: ExecutionContext): Promise { - const requiredPermissions = this.reflector.getAllAndOverride(PERMISSION_KEY, [ - context.getHandler(), - context.getClass(), - ]); - - if (!requiredPermissions || requiredPermissions.length === 0) { - return true; - } - - const request = context.switchToHttp().getRequest(); - const user = request.user; - - if (!user || !user.userId) { - throw new ForbiddenException('未授权访问'); - } - - // 获取用户角色并检查是否为超级管理员 - const userRoles = await this.authService.getUserRoles(user.userId); - if (userRoles.includes('super_admin')) { - return true; - } - - // 获取用户的所有权限 - const userPermissions = await this.authService.getUserPermissions(user.userId); - - // OR 逻辑:满足其中任意一个权限即可 - const hasPermission = requiredPermissions.some(perm => userPermissions.includes(perm)); - - if (!hasPermission) { - throw new ForbiddenException(`缺少权限: ${requiredPermissions.join(' 或 ')}`); - } - - return true; - } -} - diff --git a/backend/src/auth/guards/roles.guard.ts b/backend/src/auth/guards/roles.guard.ts deleted file mode 100644 index bcd604b..0000000 --- a/backend/src/auth/guards/roles.guard.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common'; -import { Reflector } from '@nestjs/core'; -import { PrismaService } from '../../prisma/prisma.service'; - -@Injectable() -export class RolesGuard implements CanActivate { - constructor( - private reflector: Reflector, - private prisma: PrismaService, - ) {} - - async canActivate(context: ExecutionContext): Promise { - const requiredRoles = this.reflector.getAllAndOverride('roles', [ - context.getHandler(), - context.getClass(), - ]); - - if (!requiredRoles) { - return true; - } - - const request = context.switchToHttp().getRequest(); - const user = request.user; - - if (!user || !user.userId) { - throw new ForbiddenException('未授权访问'); - } - - // 从数据库获取用户的角色 - const userWithRoles = await this.prisma.user.findUnique({ - where: { id: user.userId }, - include: { - roles: { - include: { - role: true, - }, - }, - }, - }); - - if (!userWithRoles) { - throw new ForbiddenException('用户不存在'); - } - - const userRoles = userWithRoles.roles?.map((ur: any) => ur.role.code) || []; - - // 检查用户是否有任一所需角色 - const hasRequiredRole = requiredRoles.some((role) => userRoles.includes(role)); - - if (!hasRequiredRole) { - throw new ForbiddenException(`需要以下角色之一: ${requiredRoles.join(', ')}`); - } - - return true; - } -} diff --git a/backend/src/auth/strategies/jwt.strategy.ts b/backend/src/auth/strategies/jwt.strategy.ts deleted file mode 100644 index 76d50e8..0000000 --- a/backend/src/auth/strategies/jwt.strategy.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { ExtractJwt, Strategy } from 'passport-jwt'; -import { PassportStrategy } from '@nestjs/passport'; -import { Injectable } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import { PrismaService } from '../../prisma/prisma.service'; - -@Injectable() -export class JwtStrategy extends PassportStrategy(Strategy) { - constructor( - private configService: ConfigService, - private prisma: PrismaService, - ) { - super({ - jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), - ignoreExpiration: false, - secretOrKey: configService.get('JWT_SECRET') || 'your-secret-key', - }); - } - - async validate(payload: any) { - // 查询租户是否为超级租户 - let isSuperTenant = false; - if (payload.tenantId) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id: payload.tenantId }, - select: { isSuper: true }, - }); - isSuperTenant = tenant?.isSuper === 1; - } - - return { - userId: payload.sub, - username: payload.username, - tenantId: payload.tenantId, - isSuperTenant, - userType: payload.userType || 'adult', - parentUserId: payload.parentUserId || null, - }; - } -} diff --git a/backend/src/auth/strategies/local.strategy.ts b/backend/src/auth/strategies/local.strategy.ts deleted file mode 100644 index b7eaa8b..0000000 --- a/backend/src/auth/strategies/local.strategy.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Strategy } from 'passport-local'; -import { PassportStrategy } from '@nestjs/passport'; -import { Injectable, UnauthorizedException, Logger } from '@nestjs/common'; -import { AuthService } from '../auth.service'; -import { PrismaService } from '../../prisma/prisma.service'; - -@Injectable() -export class LocalStrategy extends PassportStrategy(Strategy) { - private readonly logger = new Logger(LocalStrategy.name); - - constructor( - private authService: AuthService, - private prisma: PrismaService, - ) { - super({ - usernameField: 'username', - passwordField: 'password', - passReqToCallback: true, // 允许访问request对象 - }); - } - - async validate(req: any, username: string, password: string): Promise { - // 从请求体或请求头获取租户信息 - const tenantCode = req.body?.tenantCode || req.headers['x-tenant-code']; - const tenantId = req.headers['x-tenant-id']; - - this.logger.debug(`Login attempt: username=${username}, tenantCode=${tenantCode}, tenantId=${tenantId}`); - - let finalTenantId: number | undefined; - - if (tenantId) { - finalTenantId = parseInt(tenantId, 10); - } else if (tenantCode) { - const tenant = await this.prisma.tenant.findUnique({ - where: { code: tenantCode }, - }); - this.logger.debug(`Tenant lookup result: ${JSON.stringify(tenant)}`); - if (!tenant) { - throw new UnauthorizedException('租户不存在'); - } - finalTenantId = tenant.id; - } - - const user = await this.authService.validateUser(username, password, finalTenantId); - if (!user) { - throw new UnauthorizedException('用户名或密码错误'); - } - return user; - } -} diff --git a/backend/src/common/filters/http-exception.filter.ts b/backend/src/common/filters/http-exception.filter.ts deleted file mode 100644 index fac452c..0000000 --- a/backend/src/common/filters/http-exception.filter.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - ExceptionFilter, - Catch, - ArgumentsHost, - HttpException, - HttpStatus, -} from '@nestjs/common'; -import { Request, Response } from 'express'; -// import { LogsService } from '../../logs/logs.service'; // TODO: 待实现 - -@Catch() -export class HttpExceptionFilter implements ExceptionFilter { - // constructor(private logsService: LogsService) {} // TODO: 待实现 - - catch(exception: unknown, host: ArgumentsHost) { - const ctx = host.switchToHttp(); - const response = ctx.getResponse(); - const request = ctx.getRequest(); - - const status = - exception instanceof HttpException - ? exception.getStatus() - : HttpStatus.INTERNAL_SERVER_ERROR; - - const message = - exception instanceof HttpException - ? exception.getResponse() - : 'Internal server error'; - - const errorMessage = - typeof message === 'string' - ? message - : (message as any).message || 'Error'; - - const errorResponse = { - code: status, - message: errorMessage, - data: null, - timestamp: new Date().toISOString(), - path: request.url, - }; - - // 记录错误日志(仅记录 500 及以上错误) - // 跳过日志接口本身,避免循环记录 - if (status >= 500 && !request.url.startsWith('/logs')) { - const user = (request as any).user; - const userId = user?.userId || null; - console.error( - '[HttpExceptionFilter]', - request.method, - request.url, - userId, - exception, - ); - - // const errorContent = { - // status, - // message: errorMessage, - // method: request.method, - // url: request.url, - // error: exception instanceof Error ? exception.stack : String(exception), - // }; - // 限制内容长度,避免过长(TEXT 类型最大 65KB,这里限制为 50KB) - // const content = this.truncateContent(JSON.stringify(errorContent), 50000); - - // this.logsService - // .create({ - // userId, - // action: `ERROR ${request.method} ${request.url}`, - // content, - // ip: request.ip || '', - // userAgent: request.headers['user-agent'] || '', - // }) - // .catch((error) => { - // console.error('Failed to log error:', error); - // }); - } - - response.status(status).json(errorResponse); - } - - // 截断内容,避免超过数据库字段限制 - private truncateContent(content: string, maxLength: number): string { - if (!content || content.length <= maxLength) { - return content; - } - return content.substring(0, maxLength - 50) + '\n...(内容过长,已截断)'; - } -} diff --git a/backend/src/common/interceptors/logging.interceptor.ts b/backend/src/common/interceptors/logging.interceptor.ts deleted file mode 100644 index 968a701..0000000 --- a/backend/src/common/interceptors/logging.interceptor.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { - Injectable, - NestInterceptor, - ExecutionContext, - CallHandler, -} from '@nestjs/common'; -import { Observable } from 'rxjs'; -import { Request } from 'express'; -import { Reflector } from '@nestjs/core'; -import { LogsService } from '../../logs/logs.service'; -import { IS_PUBLIC_KEY } from '../../auth/decorators/public.decorator'; - -@Injectable() -export class LoggingInterceptor implements NestInterceptor { - constructor( - private logsService: LogsService, - private reflector: Reflector, - ) {} - - intercept(context: ExecutionContext, next: CallHandler): Observable { - const request = context.switchToHttp().getRequest(); - const { method, url, ip, headers } = request; - const userAgent = headers['user-agent'] || ''; - - // 检查是否为公共接口,公共接口不记录日志 - const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ - context.getHandler(), - context.getClass(), - ]); - - // 跳过日志接口本身,避免循环记录 - if (url.startsWith('/logs') || isPublic) { - return next.handle(); - } - - // 获取用户信息(如果已认证) - const user = (request as any).user; - const userId = user?.userId || null; - - // 构建操作内容 - const action = `${method} ${url}`; - const contentData = { - method, - url, - query: request.query, - body: this.sanitizeBody(request.body), - }; - // 限制内容长度,避免过长(TEXT 类型最大 65KB,这里限制为 50KB) - console.log('[LoggingInterceptor]', contentData); - const content = this.truncateContent(JSON.stringify(contentData), 50000); - - // 异步记录日志,不阻塞请求 - this.logsService - .create({ - userId, - action, - content, - ip: ip || request.ip || '', - userAgent, - }) - .catch((error) => { - // 日志记录失败不影响主流程,只打印错误 - console.error('Failed to log request:', error); - }); - - return next.handle(); - } - - // 清理敏感信息(如密码) - private sanitizeBody(body: any): any { - if (!body || typeof body !== 'object') { - return body; - } - - const sanitized = { ...body }; - const sensitiveFields = ['password', 'oldPassword', 'newPassword', 'token']; - - sensitiveFields.forEach((field) => { - if (sanitized[field]) { - sanitized[field] = '***'; - } - }); - - return sanitized; - } - - // 截断内容,避免超过数据库字段限制 - private truncateContent(content: string, maxLength: number): string { - if (!content || content.length <= maxLength) { - return content; - } - return content.substring(0, maxLength - 50) + '\n...(内容过长,已截断)'; - } -} diff --git a/backend/src/common/interceptors/transform.interceptor.ts b/backend/src/common/interceptors/transform.interceptor.ts deleted file mode 100644 index b40d228..0000000 --- a/backend/src/common/interceptors/transform.interceptor.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - Injectable, - NestInterceptor, - ExecutionContext, - CallHandler, -} from '@nestjs/common'; -import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; - -export interface Response { - code: number; - message: string; - data: T; -} - -@Injectable() -export class TransformInterceptor - implements NestInterceptor> -{ - intercept( - context: ExecutionContext, - next: CallHandler, - ): Observable> { - return next.handle().pipe( - map((data) => ({ - code: 200, - message: 'success', - data, - })), - ); - } -} diff --git a/backend/src/config/config-verification.controller.ts b/backend/src/config/config-verification.controller.ts deleted file mode 100644 index 3d6fe3f..0000000 --- a/backend/src/config/config-verification.controller.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Controller, Get, UseGuards } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; -import { Public } from '../auth/decorators/public.decorator'; -import * as fs from 'fs'; -import * as path from 'path'; - -/** - * 配置验证控制器 - * 用于验证环境配置文件是否正确加载 - */ -@Controller('config-verification') -export class ConfigVerificationController { - constructor(private configService: ConfigService) {} - - /** - * 公开接口,用于验证配置加载 - */ - @Public() - @Get('env-info') - getEnvInfo() { - const nodeEnv = process.env.NODE_ENV || 'development'; - const expectedEnvFile = `.env.${nodeEnv}`; // 匹配实际文件名格式:.development.env - const envFilePath = path.join(process.cwd(), expectedEnvFile); - const fallbackEnvPath = path.join(process.cwd(), '.env'); - - // 检查文件是否存在 - const envFileExists = fs.existsSync(envFilePath); - const fallbackExists = fs.existsSync(fallbackEnvPath); - - // 获取一些关键配置(不暴露敏感信息) - const config = { - nodeEnv, - expectedEnvFile, - envFileExists, - fallbackExists, - envFilePath, - fallbackEnvPath, - loadedFrom: envFileExists - ? expectedEnvFile - : fallbackExists - ? '.env' - : '环境变量', - // 显示具体配置信息(包括实际值) - configs: { - PORT: this.configService.get('PORT') || process.env.PORT || 3001, - DATABASE_URL: - this.configService.get('DATABASE_URL') || - process.env.DATABASE_URL || - '未配置', - JWT_SECRET: - this.configService.get('JWT_SECRET') || - process.env.JWT_SECRET || - '未配置', - NODE_ENV: this.configService.get('NODE_ENV') || nodeEnv, - }, - publicConfigs: { - PORT: this.configService.get('PORT') || process.env.PORT || 3001, - NODE_ENV: this.configService.get('NODE_ENV') || nodeEnv, - }, - }; - - return { - code: 200, - message: '配置信息', - data: config, - }; - } - - /** - * 需要认证的接口,显示更多配置详情(仍隐藏敏感信息) - */ - @Get('detailed') - getDetailedConfig() { - const nodeEnv = process.env.NODE_ENV || 'development'; - const expectedEnvFile = `.env.${nodeEnv}`; - const envFilePath = path.join(process.cwd(), expectedEnvFile); - - // 读取文件内容(用于验证,但不返回敏感信息) - let fileContent = ''; - try { - if (fs.existsSync(envFilePath)) { - fileContent = fs.readFileSync(envFilePath, 'utf-8'); - } - } catch (error) { - // 忽略读取错误 - } - - // 统计配置项数量 - const configKeys = fileContent - .split('\n') - .filter((line) => line.trim() && !line.trim().startsWith('#')) - .map((line) => line.split('=')[0]?.trim()) - .filter(Boolean); - - return { - code: 200, - message: '详细配置信息', - data: { - nodeEnv, - expectedEnvFile, - fileExists: fs.existsSync(envFilePath), - configKeysCount: configKeys.length, - configKeys: configKeys, // 只显示键名,不显示值 - // 验证关键配置是否加载 - verification: { - DATABASE_URL: !!this.configService.get('DATABASE_URL'), - JWT_SECRET: !!this.configService.get('JWT_SECRET'), - PORT: !!this.configService.get('PORT'), - }, - }, - }; - } -} diff --git a/backend/src/config/config.controller.ts b/backend/src/config/config.controller.ts deleted file mode 100644 index fd76ec4..0000000 --- a/backend/src/config/config.controller.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, -} from '@nestjs/common'; -import { ConfigService } from './config.service'; -import { CreateConfigDto } from './dto/create-config.dto'; -import { UpdateConfigDto } from './dto/update-config.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; - -@Controller('config') -@UseGuards(JwtAuthGuard) -export class ConfigController { - constructor(private readonly configService: ConfigService) {} - - @Post() - create(@Body() createConfigDto: CreateConfigDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new Error('无法确定租户信息'); - } - return this.configService.create(createConfigDto, tenantId); - } - - @Get() - findAll( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Request() req?: any, - ) { - const tenantId = req?.tenantId || req?.user?.tenantId; - return this.configService.findAll( - page ? parseInt(page) : 1, - pageSize ? parseInt(pageSize) : 10, - tenantId, - ); - } - - @Get('key/:key') - findByKey(@Param('key') key: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.configService.findByKey(key, tenantId); - } - - @Get(':id') - findOne(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.configService.findOne(+id, tenantId); - } - - @Patch(':id') - update( - @Param('id') id: string, - @Body() updateConfigDto: UpdateConfigDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.configService.update(+id, updateConfigDto, tenantId); - } - - @Delete(':id') - remove(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.configService.remove(+id, tenantId); - } -} diff --git a/backend/src/config/config.module.ts b/backend/src/config/config.module.ts deleted file mode 100644 index 8976b08..0000000 --- a/backend/src/config/config.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ConfigService as SystemConfigService } from './config.service'; -import { ConfigController } from './config.controller'; -import { ConfigVerificationController } from './config-verification.controller'; - -@Module({ - controllers: [ConfigController, ConfigVerificationController], - providers: [SystemConfigService], -}) -export class ConfigModule {} diff --git a/backend/src/config/config.service.ts b/backend/src/config/config.service.ts deleted file mode 100644 index 326e582..0000000 --- a/backend/src/config/config.service.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateConfigDto } from './dto/create-config.dto'; -import { UpdateConfigDto } from './dto/update-config.dto'; - -@Injectable() -export class ConfigService { - constructor(private prisma: PrismaService) {} - - async create(createConfigDto: CreateConfigDto, tenantId: number) { - return this.prisma.config.create({ - data: { - ...createConfigDto, - tenantId, - }, - }); - } - - async findAll(page: number = 1, pageSize: number = 10, tenantId?: number) { - const skip = (page - 1) * pageSize; - const where = tenantId ? { tenantId } : {}; - - const [list, total] = await Promise.all([ - this.prisma.config.findMany({ - where, - skip, - take: pageSize, - }), - this.prisma.config.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - async findOne(id: number, tenantId?: number) { - const where: any = { id }; - if (tenantId) { - where.tenantId = tenantId; - } - - const config = await this.prisma.config.findFirst({ - where, - }); - - if (!config) { - throw new NotFoundException('配置不存在'); - } - - return config; - } - - async findByKey(key: string, tenantId?: number) { - if (!tenantId) { - throw new NotFoundException('无法确定租户信息'); - } - - return this.prisma.config.findFirst({ - where: { - key, - tenantId, - }, - }); - } - - async update(id: number, updateConfigDto: UpdateConfigDto, tenantId?: number) { - // 验证配置是否存在且属于该租户 - await this.findOne(id, tenantId); - - return this.prisma.config.update({ - where: { id }, - data: updateConfigDto, - }); - } - - async remove(id: number, tenantId?: number) { - // 验证配置是否存在且属于该租户 - await this.findOne(id, tenantId); - - return this.prisma.config.delete({ - where: { id }, - }); - } -} diff --git a/backend/src/config/dto/create-config.dto.ts b/backend/src/config/dto/create-config.dto.ts deleted file mode 100644 index 3ee1639..0000000 --- a/backend/src/config/dto/create-config.dto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IsString, IsOptional } from 'class-validator'; - -export class CreateConfigDto { - @IsString() - key: string; - - @IsString() - value: string; - - @IsString() - @IsOptional() - description?: string; -} diff --git a/backend/src/config/dto/update-config.dto.ts b/backend/src/config/dto/update-config.dto.ts deleted file mode 100644 index abebd8d..0000000 --- a/backend/src/config/dto/update-config.dto.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IsString, IsOptional } from 'class-validator'; - -export class UpdateConfigDto { - @IsString() - @IsOptional() - key?: string; - - @IsString() - @IsOptional() - value?: string; - - @IsString() - @IsOptional() - description?: string; -} diff --git a/backend/src/contests/analytics/analytics.controller.ts b/backend/src/contests/analytics/analytics.controller.ts deleted file mode 100644 index 5b72ca2..0000000 --- a/backend/src/contests/analytics/analytics.controller.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Controller, Get, Query, Request, UseGuards } from '@nestjs/common'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; -import { AnalyticsService } from './analytics.service'; - -@Controller('analytics') -@UseGuards(JwtAuthGuard) -export class AnalyticsController { - constructor(private readonly analyticsService: AnalyticsService) {} - - @Get('overview') - @RequirePermission('contest:read') - getOverview( - @Request() req, - @Query('timeRange') timeRange?: string, - @Query('contestId') contestId?: string, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.analyticsService.getOverview(tenantId, { - timeRange, - contestId: contestId ? parseInt(contestId) : undefined, - }); - } - - @Get('review') - @RequirePermission('contest:read') - getReviewAnalysis( - @Request() req, - @Query('contestId') contestId?: string, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.analyticsService.getReviewAnalysis(tenantId, { - contestId: contestId ? parseInt(contestId) : undefined, - }); - } -} diff --git a/backend/src/contests/analytics/analytics.module.ts b/backend/src/contests/analytics/analytics.module.ts deleted file mode 100644 index ff54b5f..0000000 --- a/backend/src/contests/analytics/analytics.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AnalyticsController } from './analytics.controller'; -import { AnalyticsService } from './analytics.service'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [AnalyticsController], - providers: [AnalyticsService], -}) -export class AnalyticsModule {} diff --git a/backend/src/contests/analytics/analytics.service.ts b/backend/src/contests/analytics/analytics.service.ts deleted file mode 100644 index 4f54d6f..0000000 --- a/backend/src/contests/analytics/analytics.service.ts +++ /dev/null @@ -1,296 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; - -@Injectable() -export class AnalyticsService { - constructor(private prisma: PrismaService) {} - - /** - * 检查活动是否对租户可见 - */ - private isContestVisibleToTenant(contest: any, tenantId: number): boolean { - if (contest.contestState !== 'published') return false; - if (!contest.contestTenants) return true; - try { - const ids = Array.isArray(contest.contestTenants) - ? contest.contestTenants - : JSON.parse(contest.contestTenants as string); - return ids.includes(tenantId); - } catch { return false; } - } - - /** - * 运营概览 - */ - async getOverview(tenantId: number, params: { timeRange?: string; contestId?: number }) { - const { contestId } = params; - - // 获取该租户可见的活动 - const allContests = await this.prisma.contest.findMany({ - where: { contestState: 'published' }, - select: { id: true, contestTenants: true, contestState: true, contestName: true }, - }); - let visibleContestIds = allContests - .filter(c => this.isContestVisibleToTenant(c, tenantId)) - .map(c => c.id); - - if (contestId) { - visibleContestIds = visibleContestIds.filter(id => id === contestId); - } - - const regWhere: any = { tenantId, contestId: { in: visibleContestIds } }; - const workWhere: any = { tenantId, contestId: { in: visibleContestIds }, validState: 1, isLatest: true }; - - // 核心指标 - const [totalRegistrations, passedRegistrations, totalWorks, reviewedWorks, awardedWorks] = await Promise.all([ - this.prisma.contestRegistration.count({ where: regWhere }), - this.prisma.contestRegistration.count({ where: { ...regWhere, registrationState: 'passed' } }), - this.prisma.contestWork.count({ where: workWhere }), - this.prisma.contestWork.count({ where: { ...workWhere, status: { in: ['accepted', 'awarded'] } } }), - this.prisma.contestWork.count({ where: { ...workWhere, awardName: { not: null } } }), - ]); - - // 漏斗数据 - const funnel = { - registered: totalRegistrations, - passed: passedRegistrations, - submitted: totalWorks, - reviewed: reviewedWorks, - awarded: awardedWorks, - }; - - // 月度趋势(最近6个月) - const sixMonthsAgo = new Date(); - sixMonthsAgo.setMonth(sixMonthsAgo.getMonth() - 5); - sixMonthsAgo.setDate(1); - sixMonthsAgo.setHours(0, 0, 0, 0); - - const registrationsByMonth = await this.prisma.$queryRawUnsafe(` - SELECT DATE_FORMAT(registration_time, '%Y-%m') as month, COUNT(*) as count - FROM t_contest_registration - WHERE tenant_id = ? AND contest_id IN (${visibleContestIds.join(',') || '0'}) - AND registration_time >= ? - GROUP BY month ORDER BY month - `, tenantId, sixMonthsAgo); - - const worksByMonth = await this.prisma.$queryRawUnsafe(` - SELECT DATE_FORMAT(submit_time, '%Y-%m') as month, COUNT(*) as count - FROM t_contest_work - WHERE tenant_id = ? AND contest_id IN (${visibleContestIds.join(',') || '0'}) - AND valid_state = 1 AND is_latest = 1 - AND submit_time >= ? - GROUP BY month ORDER BY month - `, tenantId, sixMonthsAgo); - - // 构建连续6个月数据 - const monthlyTrend: { month: string; registrations: number; works: number }[] = []; - for (let i = 0; i < 6; i++) { - const d = new Date(); - d.setMonth(d.getMonth() - 5 + i); - const m = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`; - const regRow = registrationsByMonth.find((r: any) => r.month === m); - const workRow = worksByMonth.find((r: any) => r.month === m); - monthlyTrend.push({ - month: m, - registrations: Number(regRow?.count || 0), - works: Number(workRow?.count || 0), - }); - } - - // 活动对比 - const contestComparison: any[] = []; - for (const cid of visibleContestIds) { - const contest = allContests.find(c => c.id === cid); - if (!contest) continue; - - const [regTotal, regPassed, worksTotal, worksReviewed, worksAwarded] = await Promise.all([ - this.prisma.contestRegistration.count({ where: { tenantId, contestId: cid } }), - this.prisma.contestRegistration.count({ where: { tenantId, contestId: cid, registrationState: 'passed' } }), - this.prisma.contestWork.count({ where: { tenantId, contestId: cid, validState: 1, isLatest: true } }), - this.prisma.contestWork.count({ where: { tenantId, contestId: cid, validState: 1, isLatest: true, status: { in: ['accepted', 'awarded'] } } }), - this.prisma.contestWork.count({ where: { tenantId, contestId: cid, validState: 1, isLatest: true, awardName: { not: null } } }), - ]); - - const avgScore = await this.prisma.contestWork.aggregate({ - where: { tenantId, contestId: cid, validState: 1, isLatest: true, finalScore: { not: null } }, - _avg: { finalScore: true }, - }); - - contestComparison.push({ - contestId: cid, - contestName: contest.contestName, - registrations: regTotal, - passRate: regTotal > 0 ? Math.round(regPassed / regTotal * 100) : 0, - submitRate: regPassed > 0 ? Math.round(worksTotal / regPassed * 100) : 0, - reviewRate: worksTotal > 0 ? Math.round(worksReviewed / worksTotal * 100) : 0, - awardRate: worksTotal > 0 ? Math.round(worksAwarded / worksTotal * 100) : 0, - avgScore: avgScore._avg.finalScore ? Number(Number(avgScore._avg.finalScore).toFixed(2)) : null, - }); - } - - return { - summary: { - totalContests: visibleContestIds.length, - totalRegistrations, - passedRegistrations, - totalWorks, - reviewedWorks, - awardedWorks, - }, - funnel, - monthlyTrend, - contestComparison, - }; - } - - /** - * 评审分析 - */ - async getReviewAnalysis(tenantId: number, params: { contestId?: number }) { - const { contestId } = params; - - // 获取可见活动 - const allContests = await this.prisma.contest.findMany({ - where: { contestState: 'published' }, - select: { id: true, contestTenants: true, contestState: true }, - }); - let visibleContestIds = allContests - .filter(c => this.isContestVisibleToTenant(c, tenantId)) - .map(c => c.id); - - if (contestId) { - visibleContestIds = visibleContestIds.filter(id => id === contestId); - } - - if (visibleContestIds.length === 0) { - return { - efficiency: { avgReviewDays: 0, dailyReviewCount: 0, pendingAssignments: 0, avgScoreStddev: 0 }, - judgeWorkload: [], - awardDistribution: [], - }; - } - - const contestIdList = visibleContestIds.join(','); - - // 评审效率 - const thirtyDaysAgo = new Date(); - thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); - - const [pendingAssignments, recentScoreCount] = await Promise.all([ - this.prisma.contestWorkJudgeAssignment.count({ - where: { contestId: { in: visibleContestIds }, status: 'assigned' }, - }), - this.prisma.contestWorkScore.count({ - where: { contestId: { in: visibleContestIds }, scoreTime: { gte: thirtyDaysAgo } }, - }), - ]); - - // 平均评审周期:从作品提交到第一次评分的天数 - let avgReviewDays = 0; - try { - const reviewDaysResult = await this.prisma.$queryRawUnsafe(` - SELECT AVG(DATEDIFF(s.score_time, w.submit_time)) as avg_days - FROM t_contest_work_score s - JOIN t_contest_work w ON s.work_id = w.id - WHERE s.contest_id IN (${contestIdList}) - AND w.valid_state = 1 - `); - avgReviewDays = reviewDaysResult[0]?.avg_days ? Number(Number(reviewDaysResult[0].avg_days).toFixed(1)) : 0; - } catch { /* */ } - - // 评分标准差(评委间一致性) - let avgScoreStddev = 0; - try { - const stddevResult = await this.prisma.$queryRawUnsafe(` - SELECT AVG(stddev_score) as avg_stddev - FROM ( - SELECT work_id, STDDEV(total_score) as stddev_score - FROM t_contest_work_score - WHERE contest_id IN (${contestIdList}) AND valid_state = 1 - GROUP BY work_id - HAVING COUNT(*) > 1 - ) sub - `); - avgScoreStddev = stddevResult[0]?.avg_stddev ? Number(Number(stddevResult[0].avg_stddev).toFixed(1)) : 0; - } catch { /* */ } - - // 评委工作量 - const judges = await this.prisma.contestJudge.findMany({ - where: { contestId: { in: visibleContestIds }, validState: 1 }, - include: { - judge: { select: { id: true, nickname: true, username: true } }, - }, - }); - - // 按评委去重 - const judgeMap = new Map(); - for (const j of judges) { - if (!judgeMap.has(j.judgeId)) { - judgeMap.set(j.judgeId, { - judgeId: j.judgeId, - judgeName: j.judge?.nickname || j.judge?.username || '-', - contestIds: new Set(), - }); - } - judgeMap.get(j.judgeId).contestIds.add(j.contestId); - } - - const judgeWorkload: any[] = []; - for (const [judgeId, info] of judgeMap) { - const [assignedCount, scoredCount, scores] = await Promise.all([ - this.prisma.contestWorkJudgeAssignment.count({ - where: { judgeId, contestId: { in: visibleContestIds } }, - }), - this.prisma.contestWorkScore.count({ - where: { judgeId, contestId: { in: visibleContestIds }, validState: 1 }, - }), - this.prisma.contestWorkScore.findMany({ - where: { judgeId, contestId: { in: visibleContestIds }, validState: 1 }, - select: { totalScore: true }, - }), - ]); - - const scoreValues = scores.map(s => Number(s.totalScore)); - const avg = scoreValues.length > 0 ? scoreValues.reduce((a, b) => a + b, 0) / scoreValues.length : 0; - const variance = scoreValues.length > 1 - ? scoreValues.reduce((sum, v) => sum + Math.pow(v - avg, 2), 0) / (scoreValues.length - 1) - : 0; - - judgeWorkload.push({ - judgeId, - judgeName: info.judgeName, - contestCount: info.contestIds.size, - assignedCount, - scoredCount, - completionRate: assignedCount > 0 ? Math.round(scoredCount / assignedCount * 100) : 0, - avgScore: scoreValues.length > 0 ? Number(avg.toFixed(2)) : null, - scoreStddev: scoreValues.length > 1 ? Number(Math.sqrt(variance).toFixed(2)) : 0, - }); - } - - // 奖项分布 - const awardGroups = await this.prisma.contestWork.groupBy({ - by: ['awardName'], - where: { tenantId, contestId: { in: visibleContestIds }, validState: 1, isLatest: true, awardName: { not: null } }, - _count: { id: true }, - }); - - const totalAwarded = awardGroups.reduce((sum, g) => sum + g._count.id, 0); - const awardDistribution = awardGroups.map(g => ({ - awardName: g.awardName, - count: g._count.id, - percentage: totalAwarded > 0 ? Math.round(g._count.id / totalAwarded * 100) : 0, - })); - - return { - efficiency: { - avgReviewDays, - dailyReviewCount: Number((recentScoreCount / 30).toFixed(1)), - pendingAssignments, - avgScoreStddev, - }, - judgeWorkload, - awardDistribution, - }; - } -} diff --git a/backend/src/contests/attachments/attachments.controller.ts b/backend/src/contests/attachments/attachments.controller.ts deleted file mode 100644 index 3a09189..0000000 --- a/backend/src/contests/attachments/attachments.controller.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - ParseIntPipe, -} from '@nestjs/common'; -import { AttachmentsService } from './attachments.service'; -import { CreateAttachmentDto } from './dto/create-attachment.dto'; -import { UpdateAttachmentDto } from './dto/update-attachment.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests/attachments') -@UseGuards(JwtAuthGuard) -export class AttachmentsController { - constructor(private readonly attachmentsService: AttachmentsService) {} - - @Post() - @RequirePermission('contest:update') - create(@Body() createAttachmentDto: CreateAttachmentDto, @Request() req) { - const creatorId = req.user?.id; - return this.attachmentsService.create(createAttachmentDto, creatorId); - } - - @Get('contest/:contestId') - @RequirePermission('contest:read') - findAll(@Param('contestId', ParseIntPipe) contestId: number) { - return this.attachmentsService.findAll(contestId); - } - - @Get(':id') - @RequirePermission('contest:read') - findOne(@Param('id', ParseIntPipe) id: number) { - return this.attachmentsService.findOne(id); - } - - @Patch(':id') - @RequirePermission('contest:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateAttachmentDto: UpdateAttachmentDto, - @Request() req, - ) { - const modifierId = req.user?.id; - return this.attachmentsService.update(id, updateAttachmentDto, modifierId); - } - - @Delete(':id') - @RequirePermission('contest:update') - remove(@Param('id', ParseIntPipe) id: number) { - return this.attachmentsService.remove(id); - } -} - diff --git a/backend/src/contests/attachments/attachments.module.ts b/backend/src/contests/attachments/attachments.module.ts deleted file mode 100644 index dc49f48..0000000 --- a/backend/src/contests/attachments/attachments.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AttachmentsService } from './attachments.service'; -import { AttachmentsController } from './attachments.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [AttachmentsController], - providers: [AttachmentsService], - exports: [AttachmentsService], -}) -export class AttachmentsModule {} - diff --git a/backend/src/contests/attachments/attachments.service.ts b/backend/src/contests/attachments/attachments.service.ts deleted file mode 100644 index 14fd9f3..0000000 --- a/backend/src/contests/attachments/attachments.service.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { - Injectable, - NotFoundException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateAttachmentDto } from './dto/create-attachment.dto'; -import { UpdateAttachmentDto } from './dto/update-attachment.dto'; - -@Injectable() -export class AttachmentsService { - constructor(private prisma: PrismaService) {} - - async create(createAttachmentDto: CreateAttachmentDto, creatorId?: number) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: createAttachmentDto.contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - const data: any = { - ...createAttachmentDto, - size: createAttachmentDto.size || '0', - }; - - if (creatorId) { - data.creator = creatorId; - } - - return this.prisma.contestAttachment.create({ - data, - include: { - contest: true, - }, - }); - } - - async findAll(contestId: number) { - return this.prisma.contestAttachment.findMany({ - where: { - contestId, - validState: 1, - }, - orderBy: { - createTime: 'desc', - }, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - }, - }); - } - - async findOne(id: number) { - const attachment = await this.prisma.contestAttachment.findFirst({ - where: { - id, - validState: 1, - }, - include: { - contest: true, - }, - }); - - if (!attachment) { - throw new NotFoundException('附件不存在'); - } - - return attachment; - } - - async update(id: number, updateAttachmentDto: UpdateAttachmentDto, modifierId?: number) { - const attachment = await this.findOne(id); - - const data: any = { ...updateAttachmentDto }; - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contestAttachment.update({ - where: { id }, - data, - include: { - contest: true, - }, - }); - } - - async remove(id: number) { - await this.findOne(id); - - // 软删除 - return this.prisma.contestAttachment.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } -} - diff --git a/backend/src/contests/attachments/dto/create-attachment.dto.ts b/backend/src/contests/attachments/dto/create-attachment.dto.ts deleted file mode 100644 index 05c1cc5..0000000 --- a/backend/src/contests/attachments/dto/create-attachment.dto.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { IsString, IsInt, IsOptional } from 'class-validator'; - -export class CreateAttachmentDto { - @IsInt() - contestId: number; - - @IsString() - fileName: string; - - @IsString() - fileUrl: string; - - @IsString() - @IsOptional() - format?: string; - - @IsString() - @IsOptional() - fileType?: string; - - @IsString() - @IsOptional() - size?: string; -} - diff --git a/backend/src/contests/attachments/dto/update-attachment.dto.ts b/backend/src/contests/attachments/dto/update-attachment.dto.ts deleted file mode 100644 index fca28cf..0000000 --- a/backend/src/contests/attachments/dto/update-attachment.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateAttachmentDto } from './create-attachment.dto'; - -export class UpdateAttachmentDto extends PartialType(CreateAttachmentDto) {} - diff --git a/backend/src/contests/contests.module.ts b/backend/src/contests/contests.module.ts deleted file mode 100644 index 4bac42a..0000000 --- a/backend/src/contests/contests.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ContestsModule as ContestsCoreModule } from './contests/contests.module'; -import { AttachmentsModule } from './attachments/attachments.module'; -import { ReviewRulesModule } from './review-rules/review-rules.module'; -import { RegistrationsModule } from './registrations/registrations.module'; -import { TeamsModule } from './teams/teams.module'; -import { WorksModule } from './works/works.module'; -import { ReviewsModule } from './reviews/reviews.module'; -import { NoticesModule } from './notices/notices.module'; -import { JudgesModule } from './judges/judges.module'; -import { ResultsModule } from './results/results.module'; -import { PresetCommentsModule } from './preset-comments/preset-comments.module'; - -@Module({ - imports: [ - // 子模块必须在 ContestsCoreModule 之前导入 - // 否则 /contests/:id 会先匹配,导致 /contests/notices 等路由失效 - AttachmentsModule, - ReviewRulesModule, - RegistrationsModule, - TeamsModule, - WorksModule, - ReviewsModule, - NoticesModule, - JudgesModule, - ResultsModule, - PresetCommentsModule, - // ContestsCoreModule 放在最后,因为它有通配符路由 /contests/:id - ContestsCoreModule, - ], - exports: [ - ContestsCoreModule, - AttachmentsModule, - ReviewRulesModule, - RegistrationsModule, - TeamsModule, - WorksModule, - ReviewsModule, - NoticesModule, - JudgesModule, - ResultsModule, - PresetCommentsModule, - ], -}) -export class ContestsModule {} - diff --git a/backend/src/contests/contests/contests.controller.ts b/backend/src/contests/contests/contests.controller.ts deleted file mode 100644 index 13b6fff..0000000 --- a/backend/src/contests/contests/contests.controller.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, - ParseIntPipe, - BadRequestException, -} from '@nestjs/common'; -import { ContestsService } from './contests.service'; -import { CreateContestDto } from './dto/create-contest.dto'; -import { UpdateContestDto } from './dto/update-contest.dto'; -import { QueryContestDto } from './dto/query-contest.dto'; -import { PublishContestDto } from './dto/publish-contest.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests') -@UseGuards(JwtAuthGuard) -export class ContestsController { - constructor(private readonly contestsService: ContestsService) {} - - @Post() - @RequirePermission('contest:create') - create(@Body() createContestDto: CreateContestDto, @Request() req) { - const creatorId = req.user?.userId; - return this.contestsService.create(createContestDto, creatorId); - } - - @Get('stats') - @RequirePermission('contest:read') - getStats(@Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.contestsService.getStats(tenantId); - } - - @Get('dashboard') - @RequirePermission('contest:read') - getDashboard(@Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.contestsService.getTenantDashboard(tenantId); - } - - @Get() - @RequirePermission('contest:read') - findAll(@Query() queryDto: QueryContestDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.contestsService.findAll(queryDto, tenantId); - } - - @Get('my-contests') - @RequirePermission('contest:read', 'contest:activity:read') - findMyContests(@Query() queryDto: QueryContestDto, @Request() req) { - const userId = req.user?.userId; - const tenantId = req.tenantId || req.user?.tenantId; - if (!userId) { - throw new BadRequestException('用户未登录'); - } - return this.contestsService.findMyContests(queryDto, userId, tenantId, queryDto.role); - } - - @Get(':id') - @RequirePermission('contest:read') - findOne(@Param('id', ParseIntPipe) id: number, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.contestsService.findOne(id, tenantId); - } - - @Patch(':id') - @RequirePermission('contest:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateContestDto: UpdateContestDto, - @Request() req, - ) { - const modifierId = req.user?.userId; - return this.contestsService.update(id, updateContestDto, modifierId); - } - - @Patch(':id/publish') - @RequirePermission('contest:publish') - publish( - @Param('id', ParseIntPipe) id: number, - @Body() publishDto: PublishContestDto, - @Request() req, - ) { - const modifierId = req.user?.userId; - return this.contestsService.publish(id, publishDto.contestState, modifierId); - } - - @Patch(':id/finish') - @RequirePermission('contest:update') - finish(@Param('id', ParseIntPipe) id: number, @Request() req) { - const modifierId = req.user?.userId; - return this.contestsService.finish(id, modifierId); - } - - @Patch(':id/reopen') - @RequirePermission('contest:update') - reopen(@Param('id', ParseIntPipe) id: number, @Request() req) { - const modifierId = req.user?.userId; - return this.contestsService.reopen(id, modifierId); - } - - @Delete(':id') - @RequirePermission('contest:delete') - remove(@Param('id', ParseIntPipe) id: number) { - return this.contestsService.remove(id); - } -} - diff --git a/backend/src/contests/contests/contests.module.ts b/backend/src/contests/contests/contests.module.ts deleted file mode 100644 index 7035985..0000000 --- a/backend/src/contests/contests/contests.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ContestsService } from './contests.service'; -import { ContestsController } from './contests.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [ContestsController], - providers: [ContestsService], - exports: [ContestsService], -}) -export class ContestsModule {} - diff --git a/backend/src/contests/contests/contests.service.ts b/backend/src/contests/contests/contests.service.ts deleted file mode 100644 index bb50543..0000000 --- a/backend/src/contests/contests/contests.service.ts +++ /dev/null @@ -1,1198 +0,0 @@ -import { - Injectable, - NotFoundException, - ConflictException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateContestDto } from './dto/create-contest.dto'; -import { UpdateContestDto } from './dto/update-contest.dto'; -import { QueryContestDto } from './dto/query-contest.dto'; - -@Injectable() -export class ContestsService { - constructor(private prisma: PrismaService) {} - - /** - * 检查活动是否对租户可见 - */ - private isContestVisibleToTenant(contest: any, tenantId: number): boolean { - // 如果活动未发布,对租户不可见 - if (contest.contestState !== 'published') { - return false; - } - - // 如果contestTenants为null,表示所有租户可见 - if (!contest.contestTenants) { - return true; - } - - // 解析JSON数组 - try { - const tenantIds = Array.isArray(contest.contestTenants) - ? contest.contestTenants - : JSON.parse(contest.contestTenants as string); - return tenantIds.includes(tenantId); - } catch { - return false; - } - } - - /** - * 验证时间顺序 - */ - private validateTimeOrder(dto: CreateContestDto | UpdateContestDto) { - const dtoAny = dto as any; - // 对于 UpdateContestDto,某些字段可能是 undefined,需要检查 - if ( - !dtoAny.registerStartTime || - !dtoAny.registerEndTime || - !dtoAny.submitStartTime || - !dtoAny.submitEndTime || - !dtoAny.reviewStartTime || - !dtoAny.reviewEndTime - ) { - // 如果缺少必需的时间字段,跳过验证(UpdateContestDto 可能只更新部分字段) - return; - } - - const times = { - registerStart: new Date(dtoAny.registerStartTime), - registerEnd: new Date(dtoAny.registerEndTime), - submitStart: new Date(dtoAny.submitStartTime), - submitEnd: new Date(dtoAny.submitEndTime), - reviewStart: new Date(dtoAny.reviewStartTime), - reviewEnd: new Date(dtoAny.reviewEndTime), - }; - - if (times.registerStart >= times.registerEnd) { - throw new BadRequestException('报名开始时间必须早于报名结束时间'); - } - - if (times.registerEnd >= times.submitStart) { - throw new BadRequestException('报名结束时间必须早于作品提交开始时间'); - } - - if (times.submitStart >= times.submitEnd) { - throw new BadRequestException('作品提交开始时间必须早于作品提交结束时间'); - } - - if (times.submitEnd >= times.reviewStart) { - throw new BadRequestException('作品提交结束时间必须早于评审开始时间'); - } - - if (times.reviewStart >= times.reviewEnd) { - throw new BadRequestException('评审开始时间必须早于评审结束时间'); - } - - if (dtoAny.resultPublishTime) { - const resultPublish = new Date(dtoAny.resultPublishTime); - if (times.reviewEnd >= resultPublish) { - throw new BadRequestException('评审结束时间必须早于结果发布时间'); - } - } - - if (dtoAny.startTime && dtoAny.endTime) { - const startTime = new Date(dtoAny.startTime); - const endTime = new Date(dtoAny.endTime); - if (startTime >= endTime) { - throw new BadRequestException('活动开始时间必须早于活动结束时间'); - } - } - } - - async create(createContestDto: CreateContestDto, creatorId?: number) { - // 检查活动名称是否已存在 - const existing = await this.prisma.contest.findUnique({ - where: { contestName: createContestDto.contestName }, - }); - - if (existing) { - throw new ConflictException('活动名称已存在'); - } - - // 验证时间顺序 - this.validateTimeOrder(createContestDto); - - const data: any = { - contestName: createContestDto.contestName, - contestType: createContestDto.contestType, - startTime: new Date(createContestDto.startTime), - endTime: new Date(createContestDto.endTime), - address: createContestDto.address, - content: createContestDto.content, - contestTenants: createContestDto.contestTenants - ? JSON.stringify(createContestDto.contestTenants) - : null, - coverUrl: createContestDto.coverUrl, - posterUrl: createContestDto.posterUrl, - contactName: createContestDto.contactName, - contactPhone: createContestDto.contactPhone, - contactQrcode: createContestDto.contactQrcode, - organizers: createContestDto.organizers ? [createContestDto.organizers] : null, - coOrganizers: createContestDto.coOrganizers ? [createContestDto.coOrganizers] : null, - sponsors: createContestDto.sponsors ? [createContestDto.sponsors] : null, - // 报名配置 - registerStartTime: new Date(createContestDto.registerStartTime), - registerEndTime: new Date(createContestDto.registerEndTime), - requireAudit: createContestDto.requireAudit ?? true, - allowedGrades: createContestDto.allowedGrades - ? JSON.stringify(createContestDto.allowedGrades) - : null, - allowedClasses: createContestDto.allowedClasses - ? JSON.stringify(createContestDto.allowedClasses) - : null, - teamMinMembers: createContestDto.teamMinMembers, - teamMaxMembers: createContestDto.teamMaxMembers, - // 作品配置 - submitRule: createContestDto.submitRule || 'once', - submitStartTime: new Date(createContestDto.submitStartTime), - submitEndTime: new Date(createContestDto.submitEndTime), - workType: createContestDto.workType, - workRequirement: createContestDto.workRequirement, - // 评审配置 - reviewRuleId: createContestDto.reviewRuleId || null, - reviewStartTime: new Date(createContestDto.reviewStartTime), - reviewEndTime: new Date(createContestDto.reviewEndTime), - resultPublishTime: createContestDto.resultPublishTime - ? new Date(createContestDto.resultPublishTime) - : null, - // 可见范围与定向推送 - visibility: createContestDto.visibility || 'designated', - targetCities: createContestDto.targetCities || null, - ageMin: createContestDto.ageMin || null, - ageMax: createContestDto.ageMax || null, - contestState: 'unpublished', - status: 'ongoing', - resultState: 'unpublished', - }; - - if (creatorId) { - data.creator = creatorId; - } - - return this.prisma.contest.create({ - data, - include: { - attachments: { - where: { validState: 1 }, - }, - reviewRule: true, - _count: { - select: { - registrations: true, - works: true, - teams: true, - judges: true, - }, - }, - }, - }); - } - - /** - * 判断活动当前所处阶段 - */ - private getContestStage(contest: any): string { - if (contest.contestState === 'unpublished') return 'unpublished'; - if (contest.status === 'finished') return 'finished'; - - const now = new Date(); - const regStart = contest.registerStartTime ? new Date(contest.registerStartTime) : null; - const regEnd = contest.registerEndTime ? new Date(contest.registerEndTime) : null; - const subStart = contest.submitStartTime ? new Date(contest.submitStartTime) : null; - const subEnd = contest.submitEndTime ? new Date(contest.submitEndTime) : null; - const revStart = contest.reviewStartTime ? new Date(contest.reviewStartTime) : null; - const revEnd = contest.reviewEndTime ? new Date(contest.reviewEndTime) : null; - - if (regStart && regEnd && now >= regStart && now <= regEnd) return 'registering'; - if (subStart && subEnd && now >= subStart && now <= subEnd) return 'submitting'; - if (revStart && revEnd && now >= revStart && now <= revEnd) return 'reviewing'; - - // 所有阶段都已过 - if (revEnd && now > revEnd) return 'finished'; - return 'published'; // 已发布但尚未到报名阶段 - } - - /** - * 活动统计(仅超管) - */ - async getStats(tenantId?: number) { - const contests = await this.prisma.contest.findMany({ - where: { validState: 1 }, - select: { - id: true, - contestState: true, - contestTenants: true, - status: true, - registerStartTime: true, - registerEndTime: true, - submitStartTime: true, - submitEndTime: true, - reviewStartTime: true, - reviewEndTime: true, - }, - }); - - // 如果有 tenantId,只统计该租户可见的活动 - const filtered = tenantId - ? contests.filter(c => this.isContestVisibleToTenant(c, tenantId)) - : contests; - - const result = { total: filtered.length, unpublished: 0, registering: 0, submitting: 0, reviewing: 0, finished: 0 }; - for (const c of filtered) { - const stage = this.getContestStage(c); - if (stage === 'unpublished') result.unpublished++; - else if (stage === 'registering') result.registering++; - else if (stage === 'submitting') result.submitting++; - else if (stage === 'reviewing') result.reviewing++; - else if (stage === 'finished') result.finished++; - } - return result; - } - - async findAll(queryDto: QueryContestDto, tenantId?: number) { - const { - page = 1, - pageSize = 10, - contestName, - contestState, - contestType, - visibility, - status, - stage, - creatorTenantId, - } = queryDto; - const skip = (page - 1) * pageSize; - - const where: any = { - validState: 1, - }; - - if (contestName) { - where.contestName = { - contains: contestName, - }; - } - - // stage 筛选中 unpublished 映射到 contestState - if (stage === 'unpublished') { - where.contestState = 'unpublished'; - } else if (stage === 'finished') { - where.status = 'finished'; - where.contestState = 'published'; - } else if (stage) { - // registering / submitting / reviewing — 需要应用层过滤,但先限定已发布 - where.contestState = 'published'; - } else { - // 无 stage 时保留原有逻辑 - if (contestState) { - where.contestState = contestState; - } - if (status) { - where.status = status; - } - } - - if (contestType) { - where.contestType = contestType; - } - - if (visibility) { - where.visibility = visibility; - } - - if (creatorTenantId) { - // 通过创建者的 tenantId 筛选:查出该租户下的用户 ID - where.creatorUser = { is: { tenantId: creatorTenantId } }; - } - - // 查询时多取数据,用于 stage 应用层过滤 - const needStageFilter = stage && !['unpublished', 'finished'].includes(stage); - const queryTake = needStageFilter ? pageSize * 5 : pageSize; - - // 先查询所有符合条件的活动 - const [allList, allTotal] = await Promise.all([ - this.prisma.contest.findMany({ - where, - skip: needStageFilter ? 0 : skip, // stage 过滤时从头查 - take: needStageFilter ? 500 : queryTake, - orderBy: { - createTime: 'desc', - }, - include: { - attachments: { - where: { validState: 1 }, - take: 5, - }, - reviewRule: true, - creatorUser: { - select: { tenantId: true, tenant: { select: { id: true, name: true, code: true } } }, - }, - _count: { - select: { - registrations: true, - works: true, - teams: true, - judges: true, - }, - }, - }, - }), - this.prisma.contest.count({ where }), - ]); - - // 应用层过滤:stage 和租户可见性 - let filteredList = allList; - let filteredTotal = allTotal; - - // stage 应用层过滤(registering / submitting / reviewing) - if (needStageFilter) { - filteredList = filteredList.filter((c) => this.getContestStage(c) === stage); - filteredTotal = filteredList.length; - filteredList = filteredList.slice(skip, skip + pageSize); - } - - if (tenantId) { - // 检查是否为超级租户 - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantId }, - select: { isSuper: true }, - }); - const isSuperTenant = tenant?.isSuper === 1; - - // 超级租户可以看到所有活动,普通租户只能看到已发布且在公开范围内的活动 - if (!isSuperTenant) { - filteredList = allList.filter((contest) => - this.isContestVisibleToTenant(contest, tenantId), - ); - // 重新计算总数(简化处理,实际应该用原生SQL) - filteredTotal = filteredList.length; - // 限制返回数量 - filteredList = filteredList.slice(0, pageSize); - } - } - - // 解析 contestTenants JSON 字符串为数组,并计算评审统计数据 - const parsedList = await Promise.all( - filteredList.map(async (contest) => { - // 计算总作品数(已提交或评审中的作品) - const totalWorksCount = await this.prisma.contestWork.count({ - where: { - contestId: contest.id, - status: { in: ['submitted', 'reviewing'] }, - isLatest: true, - validState: 1, - }, - }); - - // 计算已完成评审的作品数(有评分记录的作品) - const reviewedCount = await this.prisma.contestWork.count({ - where: { - contestId: contest.id, - status: { in: ['submitted', 'reviewing'] }, - isLatest: true, - validState: 1, - scores: { - some: { - validState: 1, - }, - }, - }, - }); - - // 提取创建者所属租户信息 - const creatorTenant = (contest as any).creatorUser?.tenant || null; - - return { - ...contest, - creatorUser: undefined, // 不暴露 creatorUser 详情 - creatorTenant, - stage: this.getContestStage(contest), - contestTenants: this.parseContestTenants(contest.contestTenants), - totalWorksCount, - reviewedCount, - // 覆盖 _count.works 为正确的统计数据(只统计 isLatest=true 且 validState=1 的作品) - _count: { - ...contest._count, - works: totalWorksCount, - }, - }; - }), - ); - - return { - list: parsedList, - total: filteredTotal, - page, - pageSize, - }; - } - - /** - * 解析 contestTenants JSON 字符串为数组 - */ - private parseContestTenants(contestTenants: any): number[] | null { - if (!contestTenants) { - return null; - } - try { - return Array.isArray(contestTenants) - ? contestTenants - : JSON.parse(contestTenants as string); - } catch { - return null; - } - } - - /** - * 获取我参与的活动列表 - * @param role 角色:student-学生报名的活动, teacher-教师指导的活动, judge-评委评审的活动 - */ - async findMyContests(queryDto: QueryContestDto, userId: number, tenantId?: number, role?: string) { - const { - page = 1, - pageSize = 10, - contestName, - contestState, - contestType, - status, - } = queryDto; - const skip = (page - 1) * pageSize; - - let contestIds: number[] = []; - - // 根据角色查询不同的活动 - if (role === 'judge') { - // 评委:查询作为评委参与的活动 - const judgeRecords = await this.prisma.contestJudge.findMany({ - where: { - judgeId: userId, - validState: 1, - }, - select: { - contestId: true, - }, - distinct: ['contestId'], - }); - contestIds = judgeRecords.map((r) => r.contestId); - } else if (role === 'teacher') { - // 教师:查询作为指导老师参与的活动 - // 1. 从报名指导老师关联表查询(个人参与) - const teacherRecords = await this.prisma.contestRegistrationTeacher.findMany({ - where: { - userId, - }, - select: { - registration: { - select: { - contestId: true, - }, - }, - }, - }); - const contestIdsFromRegistration = teacherRecords.map((r) => r.registration.contestId as number); - - // 2. 从团队成员表查询(团队参与,role='mentor') - const mentorRecords = await this.prisma.contestTeamMember.findMany({ - where: { - userId, - role: 'mentor', - }, - select: { - team: { - select: { - contestId: true, - }, - }, - }, - }); - const contestIdsFromTeam = mentorRecords.map((r) => r.team.contestId); - - // 合并去重 - contestIds = Array.from(new Set([...contestIdsFromRegistration, ...contestIdsFromTeam])); - } else { - // 学生/默认:查询报名的活动 - // 1. 从报名记录查询(个人参与报名或团队参与队长) - const registrationWhere: any = { - userId, - }; - - if (tenantId) { - registrationWhere.tenantId = tenantId; - } - - const registrations = await this.prisma.contestRegistration.findMany({ - where: registrationWhere, - select: { - contestId: true, - }, - distinct: ['contestId'], - }); - const contestIdsFromRegistration = registrations.map((r) => r.contestId); - - // 2. 从团队成员表查询(团队参与成员,role='leader' 或 'member') - const teamMemberWhere: any = { - userId, - role: { in: ['leader', 'member'] }, - }; - - if (tenantId) { - teamMemberWhere.tenantId = tenantId; - } - - const teamMembers = await this.prisma.contestTeamMember.findMany({ - where: teamMemberWhere, - select: { - team: { - select: { - contestId: true, - }, - }, - }, - }); - const contestIdsFromTeam = teamMembers.map((r) => r.team.contestId); - - // 合并去重 - contestIds = Array.from(new Set([...contestIdsFromRegistration, ...contestIdsFromTeam])); - } - - if (contestIds.length === 0) { - return { - list: [], - total: 0, - page, - pageSize, - }; - } - - const where: any = { - id: { in: contestIds }, - validState: 1, - }; - - if (contestName) { - where.contestName = { - contains: contestName, - }; - } - - if (contestState) { - where.contestState = contestState; - } - - if (status) { - where.status = status; - } - - if (contestType) { - where.contestType = contestType; - } - - const [list, total] = await Promise.all([ - this.prisma.contest.findMany({ - where, - skip, - take: pageSize, - orderBy: { - createTime: 'desc', - }, - include: { - attachments: { - where: { validState: 1 }, - take: 5, - }, - reviewRule: true, - registrations: { - where: { - userId, - tenantId: tenantId || undefined, - }, - select: { - id: true, - registrationState: true, - registrationTime: true, - }, - }, - _count: { - select: { - registrations: true, - works: true, - teams: true, - judges: true, - }, - }, - }, - }), - this.prisma.contest.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - async findOne(id: number, tenantId?: number) { - const where: any = { - id, - validState: 1, - }; - - const contest = await this.prisma.contest.findFirst({ - where, - include: { - attachments: { - where: { validState: 1 }, - }, - reviewRule: true, - notices: { - where: { validState: 1 }, - orderBy: [{ priority: 'desc' }, { publishTime: 'desc' }], - take: 10, - }, - _count: { - select: { - registrations: true, - works: true, - teams: true, - judges: true, - }, - }, - }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 租户过滤:检查活动是否对租户可见(超级租户可以查看所有活动) - if (tenantId) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantId }, - select: { isSuper: true }, - }); - const isSuperTenant = tenant?.isSuper === 1; - - if (!isSuperTenant && !this.isContestVisibleToTenant(contest, tenantId)) { - throw new NotFoundException('活动不存在或无权访问'); - } - } - - // 解析 contestTenants JSON 字符串为数组 - return { - ...contest, - contestTenants: this.parseContestTenants(contest.contestTenants), - }; - } - - async update( - id: number, - updateContestDto: UpdateContestDto, - modifierId?: number, - ) { - const contest = await this.prisma.contest.findUnique({ - where: { id }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 允许取消发布,即使有报名记录也可以(保留报名和作品数据) - - // 如果更新了活动名称,检查是否重复 - if ( - (updateContestDto as any).contestName && - (updateContestDto as any).contestName !== contest.contestName - ) { - const existing = await this.prisma.contest.findUnique({ - where: { contestName: (updateContestDto as any).contestName }, - }); - - if (existing) { - throw new ConflictException('活动名称已存在'); - } - } - - // 特殊处理:开始评审时的友好提示 - const dto = updateContestDto as any; - if (dto.reviewStartTime && Object.keys(dto).length === 1) { - const newReviewStartTime = new Date(dto.reviewStartTime); - if (newReviewStartTime < contest.submitEndTime) { - const submitEndTimeStr = contest.submitEndTime.toLocaleString('zh-CN', { - year: 'numeric', - month: '2-digit', - day: '2-digit', - hour: '2-digit', - minute: '2-digit', - }); - throw new BadRequestException( - `还未到评审时间,作品提交将于 ${submitEndTimeStr} 结束`, - ); - } - } - - // 验证时间顺序(如果提供了时间字段) - if ( - dto.registerStartTime || - dto.registerEndTime || - dto.submitStartTime || - dto.submitEndTime || - dto.reviewStartTime || - dto.reviewEndTime - ) { - // 合并现有数据和更新数据,确保所有必需字段都存在 - const mergedDto = { - registerStartTime: - (updateContestDto as any).registerStartTime || - contest.registerStartTime.toISOString(), - registerEndTime: - (updateContestDto as any).registerEndTime || - contest.registerEndTime.toISOString(), - submitStartTime: - (updateContestDto as any).submitStartTime || - contest.submitStartTime.toISOString(), - submitEndTime: - (updateContestDto as any).submitEndTime || - contest.submitEndTime.toISOString(), - reviewStartTime: - (updateContestDto as any).reviewStartTime || - contest.reviewStartTime.toISOString(), - reviewEndTime: - (updateContestDto as any).reviewEndTime || - contest.reviewEndTime.toISOString(), - resultPublishTime: - (updateContestDto as any).resultPublishTime || - contest.resultPublishTime?.toISOString(), - startTime: - (updateContestDto as any).startTime || - contest.startTime.toISOString(), - endTime: - (updateContestDto as any).endTime || contest.endTime.toISOString(), - } as CreateContestDto; - this.validateTimeOrder(mergedDto); - } - - const data: any = {}; - - if (dto.contestName !== undefined) { - data.contestName = dto.contestName; - } - if (dto.contestType !== undefined) { - data.contestType = dto.contestType; - } - if (dto.startTime !== undefined) { - data.startTime = new Date(dto.startTime); - } - if (dto.endTime !== undefined) { - data.endTime = new Date(dto.endTime); - } - if (dto.address !== undefined) { - data.address = dto.address; - } - if (dto.content !== undefined) { - data.content = dto.content; - } - if (dto.contestTenants !== undefined) { - data.contestTenants = dto.contestTenants - ? JSON.stringify(dto.contestTenants) - : null; - } - if (dto.coverUrl !== undefined) { - data.coverUrl = dto.coverUrl; - } - if (dto.posterUrl !== undefined) { - data.posterUrl = dto.posterUrl; - } - if (dto.contactName !== undefined) { - data.contactName = dto.contactName; - } - if (dto.contactPhone !== undefined) { - data.contactPhone = dto.contactPhone; - } - if (dto.contactQrcode !== undefined) { - data.contactQrcode = dto.contactQrcode; - } - if (dto.organizers !== undefined) { - data.organizers = dto.organizers ? [dto.organizers] : null; - } - if (dto.coOrganizers !== undefined) { - data.coOrganizers = dto.coOrganizers ? [dto.coOrganizers] : null; - } - if (dto.sponsors !== undefined) { - data.sponsors = dto.sponsors ? [dto.sponsors] : null; - } - // 报名配置 - if (dto.registerStartTime !== undefined) { - data.registerStartTime = new Date(dto.registerStartTime); - } - if (dto.registerEndTime !== undefined) { - data.registerEndTime = new Date(dto.registerEndTime); - } - if (dto.requireAudit !== undefined) { - data.requireAudit = dto.requireAudit; - } - if (dto.allowedGrades !== undefined) { - data.allowedGrades = dto.allowedGrades - ? JSON.stringify(dto.allowedGrades) - : null; - } - if (dto.allowedClasses !== undefined) { - data.allowedClasses = dto.allowedClasses - ? JSON.stringify(dto.allowedClasses) - : null; - } - if (dto.teamMinMembers !== undefined) { - data.teamMinMembers = dto.teamMinMembers; - } - if (dto.teamMaxMembers !== undefined) { - data.teamMaxMembers = dto.teamMaxMembers; - } - // 作品配置 - if (dto.submitRule !== undefined) { - data.submitRule = dto.submitRule; - } - if (dto.submitStartTime !== undefined) { - data.submitStartTime = new Date(dto.submitStartTime); - } - if (dto.submitEndTime !== undefined) { - data.submitEndTime = new Date(dto.submitEndTime); - } - if (dto.workType !== undefined) { - data.workType = dto.workType; - } - if (dto.workRequirement !== undefined) { - data.workRequirement = dto.workRequirement; - } - // 评审配置 - if (dto.reviewRuleId !== undefined) { - data.reviewRuleId = dto.reviewRuleId || null; - } - if (dto.reviewStartTime !== undefined) { - data.reviewStartTime = new Date(dto.reviewStartTime); - } - if (dto.reviewEndTime !== undefined) { - data.reviewEndTime = new Date(dto.reviewEndTime); - } - if (dto.resultPublishTime !== undefined) { - data.resultPublishTime = dto.resultPublishTime - ? new Date(dto.resultPublishTime) - : null; - } - if (dto.contestState !== undefined) { - data.contestState = dto.contestState; - } - // 可见范围与定向推送 - if (dto.visibility !== undefined) { - data.visibility = dto.visibility; - } - if (dto.targetCities !== undefined) { - data.targetCities = dto.targetCities; - } - if (dto.ageMin !== undefined) { - data.ageMin = dto.ageMin; - } - if (dto.ageMax !== undefined) { - data.ageMax = dto.ageMax; - } - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contest.update({ - where: { id }, - data, - include: { - attachments: { - where: { validState: 1 }, - }, - reviewRule: true, - _count: { - select: { - registrations: true, - works: true, - teams: true, - judges: true, - }, - }, - }, - }); - } - - async publish(id: number, contestState: string, modifierId?: number) { - const contest = await this.prisma.contest.findUnique({ - where: { id }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 允许取消发布,即使有报名记录也可以(保留报名和作品数据) - - const data: any = { - contestState, - }; - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contest.update({ - where: { id }, - data, - include: { - attachments: { - where: { validState: 1 }, - }, - reviewRule: true, - }, - }); - } - - async remove(id: number) { - const contest = await this.prisma.contest.findUnique({ - where: { id }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 使用事务删除活动及相关数据 - // 注意:作品和报名记录保留(用户仍可在自己的数据中看到) - return this.prisma.$transaction(async (tx) => { - // 1. 删除团队成员记录 - await tx.contestTeamMember.deleteMany({ - where: { - team: { - contestId: id, - }, - }, - }); - - // 2. 删除团队记录 - await tx.contestTeam.deleteMany({ - where: { contestId: id }, - }); - - // 3. 删除评委分配记录 - await tx.contestJudge.deleteMany({ - where: { contestId: id }, - }); - - // 4. 删除公告 - await tx.contestNotice.deleteMany({ - where: { contestId: id }, - }); - - // 5. 删除作品评分记录 - await tx.contestWorkScore.deleteMany({ - where: { contestId: id }, - }); - - // 6. 删除作品评委分配记录 - await tx.contestWorkJudgeAssignment.deleteMany({ - where: { contestId: id }, - }); - - // 7. 软删除活动(报名记录和作品保留,指向此软删除的活动) - return tx.contest.update({ - where: { id }, - data: { - validState: 2, - }, - }); - }); - } - - /** - * 标记活动为已完结 - */ - async finish(id: number, modifierId?: number) { - const contest = await this.prisma.contest.findUnique({ - where: { id }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 只有已发布的活动才能标记为完结 - if (contest.contestState !== 'published') { - throw new BadRequestException('只有已发布的活动才能标记为完结'); - } - - // 如果已经完结,不能重复操作 - if (contest.status === 'finished') { - throw new BadRequestException('活动已经完结'); - } - - const data: any = { - status: 'finished', - }; - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contest.update({ - where: { id }, - data, - include: { - attachments: { - where: { validState: 1 }, - }, - reviewRule: true, - _count: { - select: { - registrations: true, - works: true, - teams: true, - judges: true, - }, - }, - }, - }); - } - - /** - * 重新开启已完结的活动 - */ - async reopen(id: number, modifierId?: number) { - const contest = await this.prisma.contest.findUnique({ - where: { id }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - if (contest.status !== 'finished') { - throw new BadRequestException('只有已完结的活动才能重新开启'); - } - - const data: any = { - status: 'ongoing', - }; - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contest.update({ - where: { id }, - data, - include: { - attachments: { - where: { validState: 1 }, - }, - reviewRule: true, - _count: { - select: { - registrations: true, - works: true, - teams: true, - judges: true, - }, - }, - }, - }); - } - - /** 租户端仪表盘统计 */ - async getTenantDashboard(tenantId: number) { - const today = new Date(); - today.setHours(0, 0, 0, 0); - - // 获取该租户可见的活动 ID 列表 - const allContests = await this.prisma.contest.findMany({ - where: { contestState: 'published' }, - select: { id: true, contestTenants: true, contestState: true, status: true, endTime: true, submitEndTime: true, contestName: true }, - }); - const visibleContests = allContests.filter(c => this.isContestVisibleToTenant(c, tenantId)); - const contestIds = visibleContests.map(c => c.id); - const ongoingCount = visibleContests.filter(c => c.status === 'ongoing').length; - - const [totalContests, totalRegistrations, pendingRegistrations, totalWorks, todayRegistrations] = await Promise.all([ - Promise.resolve(contestIds.length), - this.prisma.contestRegistration.count({ - where: { tenantId, contestId: { in: contestIds } }, - }), - this.prisma.contestRegistration.count({ - where: { tenantId, contestId: { in: contestIds }, registrationState: 'pending' }, - }), - this.prisma.contestWork.count({ - where: { tenantId, contestId: { in: contestIds }, validState: 1 }, - }), - this.prisma.contestRegistration.count({ - where: { tenantId, contestId: { in: contestIds }, registrationTime: { gte: today } }, - }), - ]); - - // 最近活动列表(最多5个) - const recentContestIds = contestIds.slice(0, 5); - const recentContests = recentContestIds.length > 0 - ? await this.prisma.contest.findMany({ - where: { id: { in: recentContestIds } }, - select: { - id: true, - contestName: true, - status: true, - startTime: true, - endTime: true, - submitEndTime: true, - _count: { select: { registrations: true, works: true } }, - }, - orderBy: { createTime: 'desc' }, - }) - : []; - - // 待办提醒 - const todos: { type: string; message: string; link?: string }[] = []; - if (pendingRegistrations > 0) { - todos.push({ type: 'warning', message: `有 ${pendingRegistrations} 个待审核报名`, link: '/contests/registrations' }); - } - // 7天内即将结束的活动 - const sevenDaysLater = new Date(); - sevenDaysLater.setDate(sevenDaysLater.getDate() + 7); - for (const c of recentContests) { - if (c.status === 'ongoing' && c.endTime) { - const end = new Date(c.endTime); - if (end <= sevenDaysLater && end >= today) { - const days = Math.ceil((end.getTime() - Date.now()) / (1000 * 60 * 60 * 24)); - todos.push({ type: 'info', message: `活动「${c.contestName}」将在 ${days} 天后结束`, link: `/contests/${c.id}` }); - } - } - if (c.submitEndTime) { - const submitEnd = new Date(c.submitEndTime); - if (submitEnd <= sevenDaysLater && submitEnd >= today) { - const days = Math.ceil((submitEnd.getTime() - Date.now()) / (1000 * 60 * 60 * 24)); - todos.push({ type: 'warning', message: `活动「${c.contestName}」作品提交将在 ${days} 天后截止`, link: `/contests/${c.id}` }); - } - } - } - - // 机构信息 - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantId }, - select: { name: true, code: true, tenantType: true }, - }); - - return { - tenant, - totalContests, - ongoingContests: ongoingCount, - totalRegistrations, - pendingRegistrations, - totalWorks, - todayRegistrations, - recentContests, - todos, - }; - } -} diff --git a/backend/src/contests/contests/dto/create-contest.dto.ts b/backend/src/contests/contests/dto/create-contest.dto.ts deleted file mode 100644 index 55f6894..0000000 --- a/backend/src/contests/contests/dto/create-contest.dto.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { - IsString, - IsDateString, - IsOptional, - IsEnum, - IsArray, - IsInt, - IsBoolean, -} from 'class-validator'; - -export enum ContestType { - INDIVIDUAL = 'individual', - TEAM = 'team', -} - -export enum SubmitRule { - ONCE = 'once', - RESUBMIT = 'resubmit', -} - -export enum ContestStatus { - ONGOING = 'ongoing', - FINISHED = 'finished', -} - -export enum WorkType { - IMAGE = 'image', - VIDEO = 'video', - DOCUMENT = 'document', - CODE = 'code', - OTHER = 'other', -} - -export enum RegisterState { - OPEN = 'open', - CLOSED = 'closed', -} - -export enum Visibility { - PUBLIC = 'public', - TARGETED = 'targeted', - DESIGNATED = 'designated', - INTERNAL = 'internal', -} - -export class CreateContestDto { - @IsString() - contestName: string; - - @IsEnum(ContestType) - contestType: ContestType; - - @IsEnum(Visibility) - @IsOptional() - visibility?: Visibility; - - @IsArray() - @IsString({ each: true }) - @IsOptional() - targetCities?: string[]; // 定向推送目标城市 - - @IsInt() - @IsOptional() - ageMin?: number; // 最小年龄限制 - - @IsInt() - @IsOptional() - ageMax?: number; // 最大年龄限制 - - @IsDateString() - startTime: string; - - @IsDateString() - endTime: string; - - @IsString() - @IsOptional() - address?: string; - - @IsString() - @IsOptional() - content?: string; - - @IsArray() - @IsInt({ each: true }) - @IsOptional() - contestTenants?: number[]; - - @IsString() - @IsOptional() - coverUrl?: string; - - @IsString() - @IsOptional() - posterUrl?: string; - - @IsString() - @IsOptional() - contactName?: string; - - @IsString() - @IsOptional() - contactPhone?: string; - - @IsString() - @IsOptional() - contactQrcode?: string; - - @IsString() - @IsOptional() - organizers?: string; - - @IsString() - @IsOptional() - coOrganizers?: string; - - @IsString() - @IsOptional() - sponsors?: string; - - // 报名配置 - @IsDateString() - registerStartTime: string; - - @IsDateString() - registerEndTime: string; - - @IsEnum(RegisterState) - @IsOptional() - registerState?: RegisterState; - - @IsBoolean() - @IsOptional() - requireAudit?: boolean; - - @IsArray() - @IsInt({ each: true }) - @IsOptional() - allowedGrades?: number[]; - - @IsArray() - @IsInt({ each: true }) - @IsOptional() - allowedClasses?: number[]; - - @IsInt() - @IsOptional() - teamMinMembers?: number; - - @IsInt() - @IsOptional() - teamMaxMembers?: number; - - // 作品配置 - @IsEnum(SubmitRule) - @IsOptional() - submitRule?: SubmitRule; - - @IsDateString() - submitStartTime: string; - - @IsDateString() - submitEndTime: string; - - @IsEnum(WorkType) - @IsOptional() - workType?: WorkType; - - @IsString() - @IsOptional() - workRequirement?: string; - - // 评审配置 - @IsInt() - @IsOptional() - reviewRuleId?: number; - - @IsDateString() - reviewStartTime: string; - - @IsDateString() - reviewEndTime: string; - - @IsDateString() - @IsOptional() - resultPublishTime?: string; -} diff --git a/backend/src/contests/contests/dto/publish-contest.dto.ts b/backend/src/contests/contests/dto/publish-contest.dto.ts deleted file mode 100644 index a99364a..0000000 --- a/backend/src/contests/contests/dto/publish-contest.dto.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IsEnum } from 'class-validator'; -import { ContestState } from './query-contest.dto'; - -export class PublishContestDto { - @IsEnum(ContestState) - contestState: ContestState; -} - diff --git a/backend/src/contests/contests/dto/query-contest.dto.ts b/backend/src/contests/contests/dto/query-contest.dto.ts deleted file mode 100644 index 2808a7c..0000000 --- a/backend/src/contests/contests/dto/query-contest.dto.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { IsOptional, IsString, IsEnum, IsInt, Min, Max } from 'class-validator'; -import { Type } from 'class-transformer'; - -export enum ContestState { - UNPUBLISHED = 'unpublished', - PUBLISHED = 'published', -} - -export enum ContestStatus { - ONGOING = 'ongoing', - FINISHED = 'finished', -} - -export enum UserRole { - STUDENT = 'student', - TEACHER = 'teacher', - JUDGE = 'judge', -} - -export class QueryContestDto { - @IsInt() - @Min(1) - @Type(() => Number) - @IsOptional() - page?: number = 1; - - @IsInt() - @Min(1) - @Max(100) - @Type(() => Number) - @IsOptional() - pageSize?: number = 10; - - @IsString() - @IsOptional() - contestName?: string; - - @IsEnum(ContestState) - @IsOptional() - contestState?: ContestState; - - @IsEnum(ContestStatus) - @IsOptional() - status?: ContestStatus; - - @IsString() - @IsOptional() - contestType?: string; - - @IsString() - @IsOptional() - visibility?: string; - - @IsString() - @IsOptional() - stage?: string; // unpublished / registering / submitting / reviewing / finished - - @IsInt() - @Type(() => Number) - @IsOptional() - creatorTenantId?: number; // 按创建活动的租户筛选 - - @IsEnum(UserRole) - @IsOptional() - role?: UserRole; -} diff --git a/backend/src/contests/contests/dto/update-contest.dto.ts b/backend/src/contests/contests/dto/update-contest.dto.ts deleted file mode 100644 index 867552e..0000000 --- a/backend/src/contests/contests/dto/update-contest.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateContestDto } from './create-contest.dto'; - -export class UpdateContestDto extends PartialType(CreateContestDto) {} - diff --git a/backend/src/contests/judges/dto/create-judge.dto.ts b/backend/src/contests/judges/dto/create-judge.dto.ts deleted file mode 100644 index 7da14cd..0000000 --- a/backend/src/contests/judges/dto/create-judge.dto.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { IsInt, IsString, IsOptional, IsNumber, Min, Max } from 'class-validator'; - -export class CreateJudgeDto { - @IsInt() - contestId: number; - - @IsInt() - judgeId: number; - - @IsString() - @IsOptional() - specialty?: string; - - @IsNumber() - @Min(0) - @Max(1) - @IsOptional() - weight?: number; - - @IsString() - @IsOptional() - description?: string; -} - diff --git a/backend/src/contests/judges/dto/update-judge.dto.ts b/backend/src/contests/judges/dto/update-judge.dto.ts deleted file mode 100644 index a46e0d7..0000000 --- a/backend/src/contests/judges/dto/update-judge.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateJudgeDto } from './create-judge.dto'; - -export class UpdateJudgeDto extends PartialType(CreateJudgeDto) {} - diff --git a/backend/src/contests/judges/judges.controller.ts b/backend/src/contests/judges/judges.controller.ts deleted file mode 100644 index dedb7c2..0000000 --- a/backend/src/contests/judges/judges.controller.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - ParseIntPipe, -} from '@nestjs/common'; -import { JudgesService } from './judges.service'; -import { CreateJudgeDto } from './dto/create-judge.dto'; -import { UpdateJudgeDto } from './dto/update-judge.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests/judges') -@UseGuards(JwtAuthGuard) -export class JudgesController { - constructor(private readonly judgesService: JudgesService) {} - - @Post() - @RequirePermission('contest:update') - create(@Body() createJudgeDto: CreateJudgeDto, @Request() req) { - const creatorId = req.user?.id; - return this.judgesService.create(createJudgeDto, creatorId); - } - - @Get('contest/:contestId') - @RequirePermission('contest:read') - findAll(@Param('contestId', ParseIntPipe) contestId: number) { - return this.judgesService.findAll(contestId); - } - - @Get(':id') - @RequirePermission('contest:read') - findOne(@Param('id', ParseIntPipe) id: number) { - return this.judgesService.findOne(id); - } - - @Patch(':id') - @RequirePermission('contest:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateJudgeDto: UpdateJudgeDto, - @Request() req, - ) { - const modifierId = req.user?.id; - return this.judgesService.update(id, updateJudgeDto, modifierId); - } - - @Delete(':id') - @RequirePermission('contest:update') - remove(@Param('id', ParseIntPipe) id: number) { - return this.judgesService.remove(id); - } -} - diff --git a/backend/src/contests/judges/judges.module.ts b/backend/src/contests/judges/judges.module.ts deleted file mode 100644 index bd4dd9a..0000000 --- a/backend/src/contests/judges/judges.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { JudgesService } from './judges.service'; -import { JudgesController } from './judges.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [JudgesController], - providers: [JudgesService], - exports: [JudgesService], -}) -export class JudgesModule {} - diff --git a/backend/src/contests/judges/judges.service.ts b/backend/src/contests/judges/judges.service.ts deleted file mode 100644 index 5b991af..0000000 --- a/backend/src/contests/judges/judges.service.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { - Injectable, - NotFoundException, - ConflictException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateJudgeDto } from './dto/create-judge.dto'; -import { UpdateJudgeDto } from './dto/update-judge.dto'; - -@Injectable() -export class JudgesService { - constructor(private prisma: PrismaService) {} - - async create(createJudgeDto: CreateJudgeDto, creatorId?: number) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: createJudgeDto.contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 验证用户是否存在 - const user = await this.prisma.user.findUnique({ - where: { id: createJudgeDto.judgeId }, - }); - - if (!user) { - throw new NotFoundException('用户不存在'); - } - - // 检查是否已是评委 - const existing = await this.prisma.contestJudge.findFirst({ - where: { - contestId: createJudgeDto.contestId, - judgeId: createJudgeDto.judgeId, - validState: 1, - }, - }); - - if (existing) { - throw new ConflictException('该用户已是该活动的评委'); - } - - const data: any = { - contestId: createJudgeDto.contestId, - judgeId: createJudgeDto.judgeId, - specialty: createJudgeDto.specialty, - weight: createJudgeDto.weight, - description: createJudgeDto.description, - }; - - if (creatorId) { - data.creator = creatorId; - } - - return this.prisma.contestJudge.create({ - data, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - judge: { - select: { - id: true, - username: true, - nickname: true, - email: true, - phone: true, - gender: true, - status: true, - tenantId: true, - tenant: { - select: { - id: true, - name: true, - }, - }, - }, - }, - }, - }); - } - - async findAll(contestId: number) { - const judges = await this.prisma.contestJudge.findMany({ - where: { - contestId, - validState: 1, - }, - include: { - judge: { - select: { - id: true, - username: true, - nickname: true, - email: true, - phone: true, - gender: true, - status: true, - tenantId: true, - tenant: { - select: { - id: true, - name: true, - }, - }, - contestJudges: { - where: { - validState: 1, - contest: { - validState: 1, - status: 'ongoing', - }, - }, - select: { - contest: { - select: { - id: true, - contestName: true, - status: true, - }, - }, - }, - }, - }, - }, - }, - orderBy: { - createTime: 'desc', - }, - }); - - // 为每个评委添加统计数据 - const judgesWithCounts = await Promise.all( - judges.map(async (judge) => { - const [assignedCount, scoredCount] = await Promise.all([ - this.prisma.contestWorkJudgeAssignment.count({ - where: { - contestId, - judgeId: judge.judgeId, - }, - }), - this.prisma.contestWorkScore.count({ - where: { - contestId, - judgeId: judge.judgeId, - validState: 1, - }, - }), - ]); - - return { - ...judge, - _count: { - assignedContestWorks: assignedCount, - scoredContestWorks: scoredCount, - }, - }; - }), - ); - - return judgesWithCounts; - } - - async findOne(id: number) { - const judge = await this.prisma.contestJudge.findFirst({ - where: { - id, - validState: 1, - }, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - judge: { - select: { - id: true, - username: true, - nickname: true, - email: true, - phone: true, - gender: true, - status: true, - tenantId: true, - tenant: { - select: { - id: true, - name: true, - }, - }, - }, - }, - }, - }); - - if (!judge) { - throw new NotFoundException('评委记录不存在'); - } - - return judge; - } - - async update( - id: number, - updateJudgeDto: UpdateJudgeDto, - modifierId?: number, - ) { - await this.findOne(id); - - const data: any = { ...updateJudgeDto }; - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contestJudge.update({ - where: { id }, - data, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - judge: { - select: { - id: true, - username: true, - nickname: true, - email: true, - phone: true, - gender: true, - status: true, - tenantId: true, - tenant: { - select: { - id: true, - name: true, - }, - }, - }, - }, - }, - }); - } - - async remove(id: number) { - await this.findOne(id); - - // 软删除 - return this.prisma.contestJudge.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } -} diff --git a/backend/src/contests/notices/dto/create-notice.dto.ts b/backend/src/contests/notices/dto/create-notice.dto.ts deleted file mode 100644 index b60b459..0000000 --- a/backend/src/contests/notices/dto/create-notice.dto.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { IsString, IsInt, IsEnum, IsOptional, Min, Max } from 'class-validator'; - -export enum NoticeType { - SYSTEM = 'system', - MANUAL = 'manual', - URGENT = 'urgent', -} - -export class CreateNoticeDto { - @IsInt() - contestId: number; - - @IsString() - title: string; - - @IsString() - content: string; - - @IsEnum(NoticeType) - @IsOptional() - noticeType?: NoticeType; - - @IsInt() - @Min(0) - @Max(100) - @IsOptional() - priority?: number; -} - diff --git a/backend/src/contests/notices/dto/query-notice.dto.ts b/backend/src/contests/notices/dto/query-notice.dto.ts deleted file mode 100644 index bf10f40..0000000 --- a/backend/src/contests/notices/dto/query-notice.dto.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IsOptional, IsString, IsInt, Min, Max } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class QueryNoticeDto { - @IsInt() - @Min(1) - @Type(() => Number) - @IsOptional() - page?: number = 1; - - @IsInt() - @Min(1) - @Max(100) - @Type(() => Number) - @IsOptional() - pageSize?: number = 10; - - @IsString() - @IsOptional() - title?: string; - - @IsString() - @IsOptional() - publishDate?: string; - - @IsString() - @IsOptional() - publishStartDate?: string; - - @IsString() - @IsOptional() - publishEndDate?: string; -} - diff --git a/backend/src/contests/notices/dto/update-notice.dto.ts b/backend/src/contests/notices/dto/update-notice.dto.ts deleted file mode 100644 index abf7067..0000000 --- a/backend/src/contests/notices/dto/update-notice.dto.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { IsString, IsInt, IsEnum, IsOptional, IsDateString, Min, Max } from 'class-validator'; -import { NoticeType } from './create-notice.dto'; - -export class UpdateNoticeDto { - @IsInt() - @IsOptional() - contestId?: number; - - @IsString() - @IsOptional() - title?: string; - - @IsString() - @IsOptional() - content?: string; - - @IsEnum(NoticeType) - @IsOptional() - noticeType?: NoticeType; - - @IsInt() - @Min(0) - @Max(100) - @IsOptional() - priority?: number; - - @IsDateString() - @IsOptional() - publishTime?: string | null; -} - diff --git a/backend/src/contests/notices/notices.controller.ts b/backend/src/contests/notices/notices.controller.ts deleted file mode 100644 index bb18b23..0000000 --- a/backend/src/contests/notices/notices.controller.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, - ParseIntPipe, -} from '@nestjs/common'; -import { NoticesService } from './notices.service'; -import { CreateNoticeDto } from './dto/create-notice.dto'; -import { UpdateNoticeDto } from './dto/update-notice.dto'; -import { QueryNoticeDto } from './dto/query-notice.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests/notices') -@UseGuards(JwtAuthGuard) -export class NoticesController { - constructor(private readonly noticesService: NoticesService) {} - - @Post() - @RequirePermission('notice:create') - create(@Body() createNoticeDto: CreateNoticeDto, @Request() req) { - const creatorId = req.user?.id; - return this.noticesService.create(createNoticeDto, creatorId); - } - - @Get('contest/:contestId') - @RequirePermission('notice:read') - findAll(@Param('contestId', ParseIntPipe) contestId: number) { - return this.noticesService.findAll(contestId); - } - - @Get() - @RequirePermission('notice:read') - findAllNotices(@Query() queryDto: QueryNoticeDto) { - return this.noticesService.findAllNotices(queryDto); - } - - @Get(':id') - @RequirePermission('notice:read') - findOne(@Param('id', ParseIntPipe) id: number) { - return this.noticesService.findOne(id); - } - - @Patch(':id') - @RequirePermission('notice:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateNoticeDto: UpdateNoticeDto, - @Request() req, - ) { - const modifierId = req.user?.id; - return this.noticesService.update(id, updateNoticeDto, modifierId); - } - - @Delete(':id') - @RequirePermission('notice:delete') - remove(@Param('id', ParseIntPipe) id: number) { - return this.noticesService.remove(id); - } -} - diff --git a/backend/src/contests/notices/notices.module.ts b/backend/src/contests/notices/notices.module.ts deleted file mode 100644 index 6934b85..0000000 --- a/backend/src/contests/notices/notices.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { NoticesService } from './notices.service'; -import { NoticesController } from './notices.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [NoticesController], - providers: [NoticesService], - exports: [NoticesService], -}) -export class NoticesModule {} - diff --git a/backend/src/contests/notices/notices.service.ts b/backend/src/contests/notices/notices.service.ts deleted file mode 100644 index 96d2ea4..0000000 --- a/backend/src/contests/notices/notices.service.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { - Injectable, - NotFoundException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateNoticeDto } from './dto/create-notice.dto'; -import { UpdateNoticeDto } from './dto/update-notice.dto'; -import { QueryNoticeDto } from './dto/query-notice.dto'; - -@Injectable() -export class NoticesService { - constructor(private prisma: PrismaService) {} - - async create(createNoticeDto: CreateNoticeDto, creatorId?: number) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: createNoticeDto.contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - const data: any = { - contestId: createNoticeDto.contestId, - title: createNoticeDto.title, - content: createNoticeDto.content, - noticeType: createNoticeDto.noticeType || 'manual', - priority: createNoticeDto.priority || 0, - publishTime: null, // 创建时不自动发布 - }; - - if (creatorId) { - data.creator = creatorId; - } - - return this.prisma.contestNotice.create({ - data, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - }, - }); - } - - async findAll(contestId: number) { - return this.prisma.contestNotice.findMany({ - where: { - contestId, - validState: 1, - }, - orderBy: [ - { priority: 'desc' }, - { publishTime: 'desc' }, - ], - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - }, - }); - } - - async findAllNotices(queryDto: QueryNoticeDto) { - const { - page = 1, - pageSize = 10, - title, - publishDate, - publishStartDate, - publishEndDate, - } = queryDto as any; - - const where: any = { - validState: 1, - }; - - // 标题搜索 - if (title) { - where.title = { contains: title }; - } - - // 发布日期搜索(兼容单日期和范围) - if (publishStartDate || publishEndDate) { - where.publishTime = {}; - if (publishStartDate) where.publishTime.gte = new Date(publishStartDate); - if (publishEndDate) where.publishTime.lte = new Date(publishEndDate + ' 23:59:59'); - } else if (publishDate) { - const startDate = new Date(publishDate); - startDate.setHours(0, 0, 0, 0); - const endDate = new Date(publishDate); - endDate.setHours(23, 59, 59, 999); - where.publishTime = { gte: startDate, lte: endDate }; - } - - const skip = (page - 1) * pageSize; - - const [list, total] = await Promise.all([ - this.prisma.contestNotice.findMany({ - where, - orderBy: [ - { createTime: 'desc' }, - ], - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - }, - skip, - take: pageSize, - }), - this.prisma.contestNotice.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - async findOne(id: number) { - const notice = await this.prisma.contestNotice.findFirst({ - where: { - id, - validState: 1, - }, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - }, - }); - - if (!notice) { - throw new NotFoundException('公告不存在'); - } - - return notice; - } - - async update(id: number, updateNoticeDto: UpdateNoticeDto, modifierId?: number) { - await this.findOne(id); - - const data: any = { ...updateNoticeDto }; - - // 处理发布时间 - if (updateNoticeDto.publishTime !== undefined) { - data.publishTime = updateNoticeDto.publishTime === null ? null : new Date(updateNoticeDto.publishTime); - } - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contestNotice.update({ - where: { id }, - data, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - }, - }); - } - - async remove(id: number) { - await this.findOne(id); - - // 软删除 - return this.prisma.contestNotice.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } -} - diff --git a/backend/src/contests/preset-comments/dto/create-preset-comment.dto.ts b/backend/src/contests/preset-comments/dto/create-preset-comment.dto.ts deleted file mode 100644 index 3bcdaee..0000000 --- a/backend/src/contests/preset-comments/dto/create-preset-comment.dto.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IsInt, IsString, IsOptional, IsNumber, Min } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class CreatePresetCommentDto { - @IsInt() - contestId: number; - - @IsString() - content: string; - - @IsOptional() - @IsNumber() - @Type(() => Number) - score?: number; - - @IsOptional() - @IsInt() - @Min(0) - sortOrder?: number; -} diff --git a/backend/src/contests/preset-comments/dto/sync-preset-comments.dto.ts b/backend/src/contests/preset-comments/dto/sync-preset-comments.dto.ts deleted file mode 100644 index 646eb75..0000000 --- a/backend/src/contests/preset-comments/dto/sync-preset-comments.dto.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IsInt, IsArray, ArrayMinSize } from 'class-validator'; - -export class SyncPresetCommentsDto { - @IsInt() - sourceContestId: number; - - @IsArray() - @ArrayMinSize(1) - @IsInt({ each: true }) - targetContestIds: number[]; -} diff --git a/backend/src/contests/preset-comments/dto/update-preset-comment.dto.ts b/backend/src/contests/preset-comments/dto/update-preset-comment.dto.ts deleted file mode 100644 index b0d13a4..0000000 --- a/backend/src/contests/preset-comments/dto/update-preset-comment.dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { IsString, IsOptional, IsNumber, IsInt, Min } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class UpdatePresetCommentDto { - @IsOptional() - @IsString() - content?: string; - - @IsOptional() - @IsNumber() - @Type(() => Number) - score?: number; - - @IsOptional() - @IsInt() - @Min(0) - sortOrder?: number; -} diff --git a/backend/src/contests/preset-comments/preset-comments.controller.ts b/backend/src/contests/preset-comments/preset-comments.controller.ts deleted file mode 100644 index fb68b47..0000000 --- a/backend/src/contests/preset-comments/preset-comments.controller.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - ParseIntPipe, - Query, -} from '@nestjs/common'; -import { PresetCommentsService } from './preset-comments.service'; -import { CreatePresetCommentDto } from './dto/create-preset-comment.dto'; -import { UpdatePresetCommentDto } from './dto/update-preset-comment.dto'; -import { SyncPresetCommentsDto } from './dto/sync-preset-comments.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; - -@Controller('contests/preset-comments') -@UseGuards(JwtAuthGuard) -export class PresetCommentsController { - constructor(private readonly presetCommentsService: PresetCommentsService) {} - - @Post() - create(@Body() createDto: CreatePresetCommentDto, @Request() req) { - const judgeId = req.user?.userId; - return this.presetCommentsService.create(createDto, judgeId, judgeId); - } - - @Get() - findAll( - @Query('contestId', ParseIntPipe) contestId: number, - @Request() req, - ) { - const judgeId = req.user?.userId; - return this.presetCommentsService.findAll(contestId, judgeId); - } - - @Get('judge/contests') - getJudgeContests(@Request() req) { - const judgeId = req.user?.userId; - return this.presetCommentsService.getJudgeContests(judgeId); - } - - @Get(':id') - findOne(@Param('id', ParseIntPipe) id: number, @Request() req) { - const judgeId = req.user?.userId; - return this.presetCommentsService.findOne(id, judgeId); - } - - @Patch(':id') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateDto: UpdatePresetCommentDto, - @Request() req, - ) { - const judgeId = req.user?.userId; - return this.presetCommentsService.update(id, updateDto, judgeId, judgeId); - } - - @Delete(':id') - remove(@Param('id', ParseIntPipe) id: number, @Request() req) { - const judgeId = req.user?.userId; - return this.presetCommentsService.remove(id, judgeId); - } - - @Post('batch-delete') - batchDelete(@Body() body: { ids: number[] }, @Request() req) { - const judgeId = req.user?.userId; - return this.presetCommentsService.batchDelete(body.ids, judgeId); - } - - @Post('sync') - sync(@Body() syncDto: SyncPresetCommentsDto, @Request() req) { - const judgeId = req.user?.userId; - return this.presetCommentsService.sync(syncDto, judgeId, judgeId); - } - - @Post(':id/use') - incrementUseCount(@Param('id', ParseIntPipe) id: number, @Request() req) { - const judgeId = req.user?.userId; - return this.presetCommentsService.incrementUseCount(id, judgeId); - } -} diff --git a/backend/src/contests/preset-comments/preset-comments.module.ts b/backend/src/contests/preset-comments/preset-comments.module.ts deleted file mode 100644 index f37e528..0000000 --- a/backend/src/contests/preset-comments/preset-comments.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { PresetCommentsService } from './preset-comments.service'; -import { PresetCommentsController } from './preset-comments.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [PresetCommentsController], - providers: [PresetCommentsService], - exports: [PresetCommentsService], -}) -export class PresetCommentsModule {} diff --git a/backend/src/contests/preset-comments/preset-comments.service.ts b/backend/src/contests/preset-comments/preset-comments.service.ts deleted file mode 100644 index 9d9c730..0000000 --- a/backend/src/contests/preset-comments/preset-comments.service.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { - Injectable, - NotFoundException, - ForbiddenException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreatePresetCommentDto } from './dto/create-preset-comment.dto'; -import { UpdatePresetCommentDto } from './dto/update-preset-comment.dto'; -import { SyncPresetCommentsDto } from './dto/sync-preset-comments.dto'; - -@Injectable() -export class PresetCommentsService { - constructor(private prisma: PrismaService) {} - - async create( - createDto: CreatePresetCommentDto, - judgeId: number, - creatorId?: number, - ) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: createDto.contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 验证用户是否是该活动的评委 - const isJudge = await this.prisma.contestJudge.findFirst({ - where: { - contestId: createDto.contestId, - judgeId, - validState: 1, - }, - }); - - if (!isJudge) { - throw new ForbiddenException('您不是该活动的评委'); - } - - return this.prisma.presetComment.create({ - data: { - contestId: createDto.contestId, - judgeId, - content: createDto.content, - score: createDto.score, - sortOrder: createDto.sortOrder ?? 0, - creator: creatorId, - }, - }); - } - - async findAll(contestId: number, judgeId: number) { - return this.prisma.presetComment.findMany({ - where: { - contestId, - judgeId, - validState: 1, - }, - orderBy: [{ sortOrder: 'asc' }, { createTime: 'desc' }], - }); - } - - async findOne(id: number, judgeId: number) { - const comment = await this.prisma.presetComment.findFirst({ - where: { - id, - judgeId, - validState: 1, - }, - }); - - if (!comment) { - throw new NotFoundException('预设评语不存在'); - } - - return comment; - } - - async update( - id: number, - updateDto: UpdatePresetCommentDto, - judgeId: number, - modifierId?: number, - ) { - await this.findOne(id, judgeId); - - return this.prisma.presetComment.update({ - where: { id }, - data: { - ...updateDto, - modifier: modifierId, - }, - }); - } - - async remove(id: number, judgeId: number) { - await this.findOne(id, judgeId); - - return this.prisma.presetComment.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } - - async batchDelete(ids: number[], judgeId: number) { - // 验证所有评语都属于该评委 - const comments = await this.prisma.presetComment.findMany({ - where: { - id: { in: ids }, - judgeId, - validState: 1, - }, - }); - - if (comments.length !== ids.length) { - throw new ForbiddenException('部分评语不存在或无权操作'); - } - - return this.prisma.presetComment.updateMany({ - where: { - id: { in: ids }, - judgeId, - }, - data: { - validState: 2, - }, - }); - } - - async sync(syncDto: SyncPresetCommentsDto, judgeId: number, creatorId?: number) { - // 获取源活动的评语 - const sourceComments = await this.prisma.presetComment.findMany({ - where: { - contestId: syncDto.sourceContestId, - judgeId, - validState: 1, - }, - }); - - if (sourceComments.length === 0) { - throw new NotFoundException('源活动没有预设评语'); - } - - // 验证目标活动存在且当前用户是评委 - for (const targetContestId of syncDto.targetContestIds) { - const contest = await this.prisma.contest.findUnique({ - where: { id: targetContestId }, - }); - - if (!contest) { - throw new NotFoundException(`活动 ${targetContestId} 不存在`); - } - - const isJudge = await this.prisma.contestJudge.findFirst({ - where: { - contestId: targetContestId, - judgeId, - validState: 1, - }, - }); - - if (!isJudge) { - throw new ForbiddenException(`您不是活动 ${contest.contestName} 的评委`); - } - } - - // 为每个目标活动创建评语副本 - const results = []; - for (const targetContestId of syncDto.targetContestIds) { - for (const comment of sourceComments) { - const created = await this.prisma.presetComment.create({ - data: { - contestId: targetContestId, - judgeId, - content: comment.content, - score: comment.score, - sortOrder: comment.sortOrder, - creator: creatorId, - }, - }); - results.push(created); - } - } - - return { - message: '同步成功', - count: results.length, - }; - } - - async getJudgeContests(judgeId: number) { - const contestJudges = await this.prisma.contestJudge.findMany({ - where: { - judgeId, - validState: 1, - contest: { - validState: 1, - }, - }, - include: { - contest: { - select: { - id: true, - contestName: true, - contestState: true, - status: true, - }, - }, - }, - orderBy: { - createTime: 'desc', - }, - }); - - return contestJudges.map((cj) => cj.contest); - } - - async incrementUseCount(id: number, judgeId: number) { - await this.findOne(id, judgeId); - - return this.prisma.presetComment.update({ - where: { id }, - data: { - useCount: { - increment: 1, - }, - }, - }); - } -} diff --git a/backend/src/contests/registrations/dto/create-registration.dto.ts b/backend/src/contests/registrations/dto/create-registration.dto.ts deleted file mode 100644 index 43b5540..0000000 --- a/backend/src/contests/registrations/dto/create-registration.dto.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IsInt, IsString, IsOptional, IsEnum } from 'class-validator'; - -export enum RegistrationType { - INDIVIDUAL = 'individual', - TEAM = 'team', -} - -export class CreateRegistrationDto { - @IsInt() - contestId: number; - - @IsEnum(RegistrationType) - registrationType: RegistrationType; - - @IsInt() - @IsOptional() - teamId?: number; - - @IsInt() - userId: number; -} - diff --git a/backend/src/contests/registrations/dto/query-registration.dto.ts b/backend/src/contests/registrations/dto/query-registration.dto.ts deleted file mode 100644 index c68f2a2..0000000 --- a/backend/src/contests/registrations/dto/query-registration.dto.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { IsOptional, IsString, IsEnum, IsInt, Min, Max } from 'class-validator'; -import { Type } from 'class-transformer'; -import { RegistrationState } from './review-registration.dto'; - -export class QueryRegistrationDto { - @IsInt() - @Min(1) - @Type(() => Number) - @IsOptional() - page?: number = 1; - - @IsInt() - @Min(1) - @Max(100) - @Type(() => Number) - @IsOptional() - pageSize?: number = 10; - - @IsInt() - @Type(() => Number) - @IsOptional() - contestId?: number; - - @IsEnum(RegistrationState) - @IsOptional() - registrationState?: RegistrationState; - - @IsString() - @IsOptional() - registrationType?: string; - - @IsInt() - @Type(() => Number) - @IsOptional() - userId?: number; - - @IsString() - @IsOptional() - participantType?: string; // self / child - - @IsString() - @IsOptional() - keyword?: string; // 搜索参与者姓名、手机号、子女姓名 -} - diff --git a/backend/src/contests/registrations/dto/review-registration.dto.ts b/backend/src/contests/registrations/dto/review-registration.dto.ts deleted file mode 100644 index e9f7962..0000000 --- a/backend/src/contests/registrations/dto/review-registration.dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { IsEnum, IsString, IsOptional } from 'class-validator'; - -export enum RegistrationState { - PENDING = 'pending', - PASSED = 'passed', - REJECTED = 'rejected', - WITHDRAWN = 'withdrawn', -} - -export class ReviewRegistrationDto { - @IsEnum(RegistrationState) - registrationState: RegistrationState; - - @IsString() - @IsOptional() - reason?: string; -} - diff --git a/backend/src/contests/registrations/registrations.controller.ts b/backend/src/contests/registrations/registrations.controller.ts deleted file mode 100644 index 5643f5b..0000000 --- a/backend/src/contests/registrations/registrations.controller.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, - ParseIntPipe, - BadRequestException, -} from '@nestjs/common'; -import { RegistrationsService } from './registrations.service'; -import { CreateRegistrationDto } from './dto/create-registration.dto'; -import { ReviewRegistrationDto } from './dto/review-registration.dto'; -import { QueryRegistrationDto } from './dto/query-registration.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests/registrations') -@UseGuards(JwtAuthGuard) -export class RegistrationsController { - constructor(private readonly registrationsService: RegistrationsService) {} - - @Post() - @RequirePermission('contest:register') - create(@Body() createRegistrationDto: CreateRegistrationDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new BadRequestException('无法确定租户信息'); - } - const creatorId = req.user?.userId; - return this.registrationsService.create( - createRegistrationDto, - tenantId, - creatorId, - ); - } - - @Get('stats') - @RequirePermission('contest:read') - getStats(@Query('contestId') contestId?: string, @Request() req?) { - const tenantId = req?.tenantId || req?.user?.tenantId; - return this.registrationsService.getStats(contestId ? parseInt(contestId) : undefined, tenantId); - } - - @Get() - @RequirePermission('contest:read') - findAll(@Query() queryDto: QueryRegistrationDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.registrationsService.findAll(queryDto, tenantId); - } - - /** - * 获取当前用户在某活动中的报名记录(包括作为团队成员的情况) - */ - @Get('my/:contestId') - @RequirePermission('contest:read') - getMyRegistration( - @Param('contestId', ParseIntPipe) contestId: number, - @Request() req, - ) { - const userId = req.user?.userId; - if (!userId) { - throw new BadRequestException('用户未登录'); - } - return this.registrationsService.getMyRegistration(contestId, userId); - } - - @Get(':id') - @RequirePermission('contest:read') - findOne(@Param('id', ParseIntPipe) id: number, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.registrationsService.findOne(id, tenantId); - } - - @Patch(':id/review') - @RequirePermission('contest:update') - review( - @Param('id', ParseIntPipe) id: number, - @Body() reviewDto: ReviewRegistrationDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - const operatorId = req.user?.userId; - return this.registrationsService.review(id, reviewDto, operatorId, tenantId); - } - - @Patch(':id/revoke') - @RequirePermission('contest:update') - revokeReview(@Param('id', ParseIntPipe) id: number, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - const operatorId = req.user?.userId; - return this.registrationsService.revokeReview(id, operatorId, tenantId); - } - - @Post('batch-review') - @RequirePermission('contest:update') - batchReview( - @Body() dto: { ids: number[]; registrationState: string; reason?: string }, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - const operatorId = req.user?.userId; - return this.registrationsService.batchReview(dto.ids, dto.registrationState, operatorId, tenantId, dto.reason); - } - - @Post(':id/teachers') - @RequirePermission('contest:update') - addTeacher( - @Param('id', ParseIntPipe) id: number, - @Body() body: { teacherUserId: number }, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new BadRequestException('无法确定租户信息'); - } - const creatorId = req.user?.userId; - return this.registrationsService.addTeacher( - id, - body.teacherUserId, - tenantId, - creatorId, - ); - } - - @Delete(':id/teachers/:teacherUserId') - @RequirePermission('contest:update') - removeTeacher( - @Param('id', ParseIntPipe) id: number, - @Param('teacherUserId', ParseIntPipe) teacherUserId: number, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new BadRequestException('无法确定租户信息'); - } - return this.registrationsService.removeTeacher(id, teacherUserId, tenantId); - } - - @Delete(':id') - @RequirePermission('contest:update') - remove(@Param('id', ParseIntPipe) id: number, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.registrationsService.remove(id, tenantId); - } -} - diff --git a/backend/src/contests/registrations/registrations.module.ts b/backend/src/contests/registrations/registrations.module.ts deleted file mode 100644 index 932eab0..0000000 --- a/backend/src/contests/registrations/registrations.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { RegistrationsService } from './registrations.service'; -import { RegistrationsController } from './registrations.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [RegistrationsController], - providers: [RegistrationsService], - exports: [RegistrationsService], -}) -export class RegistrationsModule {} - diff --git a/backend/src/contests/registrations/registrations.service.ts b/backend/src/contests/registrations/registrations.service.ts deleted file mode 100644 index 155e41c..0000000 --- a/backend/src/contests/registrations/registrations.service.ts +++ /dev/null @@ -1,807 +0,0 @@ -import { - Injectable, - NotFoundException, - ConflictException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateRegistrationDto } from './dto/create-registration.dto'; -import { ReviewRegistrationDto } from './dto/review-registration.dto'; -import { QueryRegistrationDto } from './dto/query-registration.dto'; - -@Injectable() -export class RegistrationsService { - constructor(private prisma: PrismaService) {} - - async create( - createRegistrationDto: CreateRegistrationDto, - tenantId: number, - creatorId?: number, - ) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: createRegistrationDto.contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 检查活动是否已发布 - if (contest.contestState !== 'published') { - throw new BadRequestException('活动未发布,无法报名'); - } - - // 检查报名时间 - const now = new Date(); - if (now < contest.registerStartTime || now > contest.registerEndTime) { - throw new BadRequestException('不在报名时间范围内'); - } - - // 验证用户是否存在 - const user = await this.prisma.user.findUnique({ - where: { id: createRegistrationDto.userId }, - }); - - if (!user) { - throw new NotFoundException('用户不存在'); - } - - // 检查用户是否已报名(个人参与) - if (createRegistrationDto.registrationType === 'individual') { - const existing = await this.prisma.contestRegistration.findFirst({ - where: { - contestId: createRegistrationDto.contestId, - userId: createRegistrationDto.userId, - registrationType: 'individual', - }, - }); - - if (existing) { - throw new ConflictException('您已报名该活动'); - } - } - - // 团队参与验证 - if (createRegistrationDto.registrationType === 'team') { - if (!createRegistrationDto.teamId) { - throw new BadRequestException('团队参与必须指定团队ID'); - } - - const team = await this.prisma.contestTeam.findUnique({ - where: { id: createRegistrationDto.teamId }, - include: { - members: true, - }, - }); - - if (!team) { - throw new NotFoundException('团队不存在'); - } - - if (team.tenantId !== tenantId) { - throw new BadRequestException('团队不属于当前租户'); - } - - if (team.contestId !== createRegistrationDto.contestId) { - throw new BadRequestException('团队不属于该活动'); - } - - // 检查用户是否是团队成员 - const isMember = team.members.some( - (m) => m.userId === createRegistrationDto.userId, - ); - - if (!isMember) { - throw new BadRequestException('您不是该团队成员'); - } - } - - // 获取用户账号信息快照 - const accountNo = user.username; - const accountName = user.nickname; - - // 检查当前登录用户是否是老师,如果是则设置为指导老师(registrant) - let registrantId = createRegistrationDto.userId; - if (creatorId) { - // 检查创建者是否是老师(通过角色判断) - const creatorWithRoles = await this.prisma.user.findUnique({ - where: { id: creatorId }, - include: { - roles: { include: { role: true } }, - }, - }); - const isTeacher = creatorWithRoles?.roles?.some( - (ur) => ur.role.code === 'teacher', - ); - - // 如果创建者是老师,则设置为指导老师 - if (isTeacher) { - registrantId = creatorId; - } - } - - const data: any = { - contestId: createRegistrationDto.contestId, - tenantId, - registrationType: createRegistrationDto.registrationType, - teamId: createRegistrationDto.teamId || null, - teamName: - createRegistrationDto.registrationType === 'team' - ? (await this.prisma.contestTeam.findUnique({ - where: { id: createRegistrationDto.teamId }, - }))?.teamName - : null, - userId: createRegistrationDto.userId, - accountNo, - accountName, - registrationState: 'pending', - registrationTime: new Date(), - registrant: registrantId, - }; - - if (creatorId) { - data.creator = creatorId; - } - - // 使用事务创建报名记录和默认指导老师 - return this.prisma.$transaction(async (tx) => { - // 如果创建者是老师,先检查并创建默认指导老师关联 - let shouldCreateDefaultTeacher = false; - if (creatorId) { - const creator = await tx.user.findUnique({ - where: { id: creatorId }, - include: { roles: { include: { role: true } } }, - }); - const isTeacher = creator?.roles?.some( - (ur) => ur.role.code === 'teacher', - ); - if (isTeacher) { - shouldCreateDefaultTeacher = true; - } - } - - // 创建报名记录 - const registration = await tx.contestRegistration.create({ - data, - include: { - contest: { - select: { - id: true, - contestName: true, - contestType: true, - }, - }, - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - team: createRegistrationDto.registrationType === 'team' - ? { - include: { - members: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - } - : false, - }, - }); - - // 如果创建者是老师,自动添加为默认指导老师 - if (shouldCreateDefaultTeacher && creatorId) { - try { - await tx.contestRegistrationTeacher.create({ - data: { - registrationId: registration.id, - tenantId, - userId: creatorId, - isDefault: true, - creator: creatorId, - }, - }); - } catch (error) { - // 如果创建失败(可能是重复),记录日志但不影响主流程 - console.error('创建默认指导老师失败:', error); - } - } - - // 重新查询包含指导老师信息 - return tx.contestRegistration.findUnique({ - where: { id: registration.id }, - include: { - contest: { - select: { - id: true, - contestName: true, - contestType: true, - }, - }, - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - teachers: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - team: createRegistrationDto.registrationType === 'team' - ? { - include: { - members: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - } - : false, - }, - }); - }); - } - - /** - * 报名统计 - */ - async getStats(contestId?: number, tenantId?: number) { - const baseWhere: any = {}; - if (contestId) baseWhere.contestId = contestId; - if (tenantId) { - const tenant = await this.prisma.tenant.findUnique({ where: { id: tenantId }, select: { isSuper: true } }); - if (tenant?.isSuper !== 1) baseWhere.tenantId = tenantId; - } - - const [total, pending, passed, rejected] = await Promise.all([ - this.prisma.contestRegistration.count({ where: baseWhere }), - this.prisma.contestRegistration.count({ where: { ...baseWhere, registrationState: 'pending' } }), - this.prisma.contestRegistration.count({ where: { ...baseWhere, registrationState: 'passed' } }), - this.prisma.contestRegistration.count({ where: { ...baseWhere, registrationState: 'rejected' } }), - ]); - - return { total, pending, passed, rejected }; - } - - /** 撤销审核(恢复为待审核) */ - async revokeReview(id: number, operatorId?: number, tenantId?: number) { - const registration = await this.findOne(id, tenantId); - if (!['passed', 'rejected'].includes(registration.registrationState)) { - throw new BadRequestException('当前状态不支持撤销'); - } - - return this.prisma.contestRegistration.update({ - where: { id }, - data: { - registrationState: 'pending', - reason: null, - operator: operatorId, - operationDate: new Date(), - modifier: operatorId, - }, - }); - } - - /** 批量审核 */ - async batchReview(ids: number[], registrationState: string, operatorId?: number, tenantId?: number, reason?: string) { - if (!ids?.length) return { success: true, count: 0 }; - - const where: any = { id: { in: ids } }; - if (tenantId) { - const tenant = await this.prisma.tenant.findUnique({ where: { id: tenantId }, select: { isSuper: true } }); - if (tenant?.isSuper !== 1) where.tenantId = tenantId; - } - - const result = await this.prisma.contestRegistration.updateMany({ - where, - data: { - registrationState, - reason: reason || null, - operator: operatorId, - operationDate: new Date(), - }, - }); - - return { success: true, count: result.count }; - } - - async findAll(queryDto: QueryRegistrationDto, tenantId?: number) { - const { - page = 1, - pageSize = 10, - contestId, - registrationState, - registrationType, - userId, - participantType, - keyword, - } = queryDto; - const skip = (page - 1) * pageSize; - - const where: any = {}; - - // 检查当前租户是否为超级租户 - let isSuper = false; - if (tenantId) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantId }, - select: { isSuper: true }, - }); - isSuper = tenant?.isSuper === 1; - } - - // 超管可以看到所有报名记录(不区分租户) - // 普通租户只能看到自己租户的报名记录 - if (tenantId && !isSuper) { - where.tenantId = tenantId; - } - - if (contestId) { - where.contestId = contestId; - } - - if (registrationState) { - where.registrationState = registrationState; - } - - if (registrationType) { - where.registrationType = registrationType; - } - - if (userId) { - where.userId = userId; - } - - if (participantType) { - where.participantType = participantType; - } - - // 关键词搜索:参与者姓名、手机号、子女姓名 - if (keyword) { - where.OR = [ - { user: { nickname: { contains: keyword } } }, - { user: { phone: { contains: keyword } } }, - { accountName: { contains: keyword } }, - { child: { name: { contains: keyword } } }, - ]; - } - - const [list, total] = await Promise.all([ - this.prisma.contestRegistration.findMany({ - where, - skip, - take: pageSize, - orderBy: { - registrationTime: 'desc', - }, - include: { - contest: { - select: { - id: true, - contestName: true, - contestType: true, - }, - }, - user: { - include: { - tenant: { - select: { - id: true, - name: true, - }, - }, - }, - }, - child: { - select: { - id: true, - name: true, - grade: true, - city: true, - schoolName: true, - }, - }, - teachers: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - team: { - include: { - members: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }, - _count: { - select: { - works: true, - }, - }, - }, - }), - this.prisma.contestRegistration.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - async findOne(id: number, tenantId?: number) { - // 检查当前租户是否为超级租户 - let isSuper = false; - if (tenantId) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantId }, - select: { isSuper: true }, - }); - isSuper = tenant?.isSuper === 1; - } - - // 构建查询条件 - const where: any = { id }; - // 超管可以查看所有报名记录,普通租户只能查看自己租户的报名 - if (tenantId && !isSuper) { - where.tenantId = tenantId; - } - - const registration = await this.prisma.contestRegistration.findFirst({ - where, - include: { - contest: true, - user: { - include: { - tenant: { - select: { - id: true, - name: true, - }, - }, - }, - }, - team: { - include: { - members: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }, - teachers: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - works: { - where: { validState: 1 }, - orderBy: { - submitTime: 'desc', - }, - }, - }, - }); - - if (!registration) { - throw new NotFoundException('报名记录不存在'); - } - - return registration; - } - - async review( - id: number, - reviewDto: ReviewRegistrationDto, - operatorId: number, - tenantId?: number, - ) { - const registration = await this.findOne(id, tenantId); - - if (registration.registrationState !== 'pending') { - throw new BadRequestException('只能审核待审核状态的报名'); - } - - return this.prisma.contestRegistration.update({ - where: { id }, - data: { - registrationState: reviewDto.registrationState, - reason: reviewDto.reason, - operator: operatorId, - operationDate: new Date(), - modifier: operatorId, - }, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }); - } - - async remove(id: number, tenantId?: number) { - await this.findOne(id, tenantId); - - // 检查是否有作品 - const workCount = await this.prisma.contestWork.count({ - where: { registrationId: id }, - }); - - if (workCount > 0) { - throw new BadRequestException('该报名已有作品,无法删除'); - } - - return this.prisma.contestRegistration.delete({ - where: { id }, - }); - } - - async addTeacher( - registrationId: number, - teacherUserId: number, - tenantId: number, - creatorId?: number, - ) { - // 验证报名记录是否存在 - const registration = await this.prisma.contestRegistration.findFirst({ - where: { - id: registrationId, - tenantId, - }, - }); - - if (!registration) { - throw new NotFoundException('报名记录不存在'); - } - - // 验证用户是否是老师(通过角色判断) - const teacherUser = await this.prisma.user.findUnique({ - where: { id: teacherUserId }, - include: { roles: { include: { role: true } } }, - }); - const isTeacher = teacherUser?.roles?.some( - (ur) => ur.role.code === 'teacher', - ); - - if (!isTeacher) { - throw new BadRequestException('该用户不是老师'); - } - - // 检查是否已经添加过 - const existing = await this.prisma.contestRegistrationTeacher.findFirst({ - where: { - registrationId, - userId: teacherUserId, - tenantId, - }, - }); - - if (existing) { - throw new ConflictException('该老师已经添加过了'); - } - - // 添加指导老师 - return this.prisma.contestRegistrationTeacher.create({ - data: { - registrationId, - tenantId, - userId: teacherUserId, - isDefault: false, - creator: creatorId, - }, - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }); - } - - async removeTeacher( - registrationId: number, - teacherUserId: number, - tenantId: number, - ) { - // 查找指导老师记录 - const teacherRecord = await this.prisma.contestRegistrationTeacher.findFirst({ - where: { - registrationId, - userId: teacherUserId, - tenantId, - }, - }); - - if (!teacherRecord) { - throw new NotFoundException('指导老师记录不存在'); - } - - // 如果是默认指导老师,不能移除 - if (teacherRecord.isDefault) { - throw new BadRequestException('默认指导老师不能移除'); - } - - // 删除指导老师 - return this.prisma.contestRegistrationTeacher.delete({ - where: { id: teacherRecord.id }, - }); - } - - /** - * 获取用户在某活动中的报名记录(包括作为团队成员的情况) - * @param contestId 活动ID - * @param userId 用户ID - * @returns 报名记录或null - */ - async getMyRegistration(contestId: number, userId: number) { - try { - // 1. 先查询个人参与报名(直接按 userId 匹配) - const individualReg = await this.prisma.contestRegistration.findFirst({ - where: { - contestId, - userId, - registrationType: 'individual', - registrationState: 'passed', - }, - include: { - contest: { - select: { - id: true, - contestName: true, - contestType: true, - }, - }, - works: { - where: { validState: 1, isLatest: true }, - orderBy: { submitTime: 'desc' }, - }, - }, - }); - - if (individualReg) { - return individualReg; - } - - // 2. 查询用户所属的团队(该活动的) - const teamMemberships = await this.prisma.contestTeamMember.findMany({ - where: { - userId, - }, - select: { - teamId: true, - team: { - select: { - id: true, - contestId: true, - validState: true, - }, - }, - }, - }); - - // 过滤出该活动且有效的团队 - const validTeamIds = teamMemberships - .filter((m) => m.team?.contestId === contestId && m.team?.validState === 1) - .map((m) => m.teamId); - - if (validTeamIds.length === 0) { - return null; - } - - // 3. 通过团队ID查询团队报名记录 - const teamReg = await this.prisma.contestRegistration.findFirst({ - where: { - contestId, - teamId: { in: validTeamIds }, - registrationType: 'team', - registrationState: 'passed', - }, - include: { - contest: { - select: { - id: true, - contestName: true, - contestType: true, - }, - }, - team: { - include: { - members: { - where: { - role: { in: ['leader', 'member'] }, // 只查询队长和队员,不包含指导老师 - }, - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }, - works: { - where: { validState: 1, isLatest: true }, - orderBy: { submitTime: 'desc' }, - }, - }, - }); - - return teamReg; - } catch (error) { - console.error('getMyRegistration error:', error); - throw error; - } - } -} - diff --git a/backend/src/contests/results/dto/auto-set-awards.dto.ts b/backend/src/contests/results/dto/auto-set-awards.dto.ts deleted file mode 100644 index 56e7bd0..0000000 --- a/backend/src/contests/results/dto/auto-set-awards.dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { IsArray, IsNumber, IsString, Min, ValidateNested } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class AwardTierDto { - @IsString() - name: string; - - @IsNumber() - @Min(1) - count: number; -} - -export class AutoSetAwardsDto { - @IsArray() - @ValidateNested({ each: true }) - @Type(() => AwardTierDto) - awards: AwardTierDto[]; -} diff --git a/backend/src/contests/results/dto/batch-set-awards.dto.ts b/backend/src/contests/results/dto/batch-set-awards.dto.ts deleted file mode 100644 index 0220013..0000000 --- a/backend/src/contests/results/dto/batch-set-awards.dto.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IsArray, ValidateNested, IsNumber, IsString, IsIn, IsOptional } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class AwardItem { - @IsNumber() - workId: number; - - @IsString() - @IsIn(['first', 'second', 'third', 'excellent', 'none']) - awardLevel: string; - - @IsString() - @IsOptional() - awardName?: string; -} - -export class BatchSetAwardsDto { - @IsArray() - @ValidateNested({ each: true }) - @Type(() => AwardItem) - awards: AwardItem[]; -} diff --git a/backend/src/contests/results/dto/query-results.dto.ts b/backend/src/contests/results/dto/query-results.dto.ts deleted file mode 100644 index 2380e7d..0000000 --- a/backend/src/contests/results/dto/query-results.dto.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { IsOptional, IsString, IsInt, Min } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class QueryResultsDto { - @IsOptional() - @Type(() => Number) - @IsInt() - @Min(1) - page?: number = 1; - - @IsOptional() - @Type(() => Number) - @IsInt() - @Min(1) - pageSize?: number = 10; - - @IsOptional() - @IsString() - workNo?: string; - - @IsOptional() - @IsString() - accountNo?: string; -} diff --git a/backend/src/contests/results/dto/set-award.dto.ts b/backend/src/contests/results/dto/set-award.dto.ts deleted file mode 100644 index ad52984..0000000 --- a/backend/src/contests/results/dto/set-award.dto.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IsString, IsOptional } from 'class-validator'; - -export class SetAwardDto { - @IsString() - awardLevel: string; // 自定义奖项标识,如 "gold", "silver" 或自定义 - - @IsString() - @IsOptional() - awardName?: string; // 奖项显示名称,如 "金奖", "最佳创意奖" - - @IsString() - @IsOptional() - certificateUrl?: string; -} diff --git a/backend/src/contests/results/results.controller.ts b/backend/src/contests/results/results.controller.ts deleted file mode 100644 index 9d625d6..0000000 --- a/backend/src/contests/results/results.controller.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Query, - UseGuards, - ParseIntPipe, -} from '@nestjs/common'; -import { ResultsService } from './results.service'; -import { SetAwardDto } from './dto/set-award.dto'; -import { BatchSetAwardsDto } from './dto/batch-set-awards.dto'; -import { AutoSetAwardsDto } from './dto/auto-set-awards.dto'; -import { QueryResultsDto } from './dto/query-results.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests/results') -@UseGuards(JwtAuthGuard) -export class ResultsController { - constructor(private readonly resultsService: ResultsService) {} - - /** - * 计算所有作品的最终得分 - */ - @Post(':contestId/calculate-scores') - @RequirePermission('contest:update') - calculateAllFinalScores(@Param('contestId', ParseIntPipe) contestId: number) { - return this.resultsService.calculateAllFinalScores(contestId); - } - - /** - * 计算排名 - */ - @Post(':contestId/calculate-rankings') - @RequirePermission('contest:update') - calculateRankings(@Param('contestId', ParseIntPipe) contestId: number) { - return this.resultsService.calculateRankings(contestId); - } - - /** - * 设置单个作品奖项 - */ - @Patch('work/:workId/award') - @RequirePermission('contest:update') - setAward( - @Param('workId', ParseIntPipe) workId: number, - @Body() setAwardDto: SetAwardDto, - ) { - return this.resultsService.setAward(workId, setAwardDto); - } - - /** - * 批量设置奖项 - */ - @Post(':contestId/batch-set-awards') - @RequirePermission('contest:update') - batchSetAwards( - @Param('contestId', ParseIntPipe) contestId: number, - @Body() batchSetAwardsDto: BatchSetAwardsDto, - ) { - return this.resultsService.batchSetAwards(contestId, batchSetAwardsDto); - } - - /** - * 根据排名自动设置奖项 - */ - @Post(':contestId/auto-set-awards') - @RequirePermission('contest:update') - autoSetAwards( - @Param('contestId', ParseIntPipe) contestId: number, - @Body() autoSetAwardsDto: AutoSetAwardsDto, - ) { - return this.resultsService.autoSetAwards(contestId, autoSetAwardsDto); - } - - /** - * 发布成果 - */ - @Post(':contestId/publish') - @RequirePermission('contest:update') - publishResults(@Param('contestId', ParseIntPipe) contestId: number) { - return this.resultsService.publishResults(contestId); - } - - /** - * 撤回发布 - */ - @Post(':contestId/unpublish') - @RequirePermission('contest:update') - unpublishResults(@Param('contestId', ParseIntPipe) contestId: number) { - return this.resultsService.unpublishResults(contestId); - } - - /** - * 获取活动结果列表(作品列表) - */ - @Get(':contestId') - @RequirePermission('contest:read') - getResults( - @Param('contestId', ParseIntPipe) contestId: number, - @Query() queryDto: QueryResultsDto, - ) { - return this.resultsService.getResults(contestId, queryDto); - } - - /** - * 获取活动结果统计摘要 - */ - @Get(':contestId/summary') - @RequirePermission('contest:read') - getResultsSummary(@Param('contestId', ParseIntPipe) contestId: number) { - return this.resultsService.getResultsSummary(contestId); - } -} diff --git a/backend/src/contests/results/results.module.ts b/backend/src/contests/results/results.module.ts deleted file mode 100644 index 42d58d3..0000000 --- a/backend/src/contests/results/results.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ResultsService } from './results.service'; -import { ResultsController } from './results.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [ResultsController], - providers: [ResultsService], - exports: [ResultsService], -}) -export class ResultsModule {} diff --git a/backend/src/contests/results/results.service.ts b/backend/src/contests/results/results.service.ts deleted file mode 100644 index 6f9764c..0000000 --- a/backend/src/contests/results/results.service.ts +++ /dev/null @@ -1,685 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { SetAwardDto } from './dto/set-award.dto'; -import { BatchSetAwardsDto } from './dto/batch-set-awards.dto'; -import { QueryResultsDto } from './dto/query-results.dto'; - -@Injectable() -export class ResultsService { - constructor(private prisma: PrismaService) {} - - /** - * 计算活动所有作品的最终得分 - */ - async calculateAllFinalScores(contestId: number) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - include: { - reviewRule: true, - }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 获取所有有效作品 - const works = await this.prisma.contestWork.findMany({ - where: { - contestId, - validState: 1, - isLatest: true, - }, - include: { - scores: { - where: { validState: 1 }, - }, - }, - }); - - if (works.length === 0) { - return { - message: '没有需要计算的作品', - calculatedCount: 0, - }; - } - - const calculationRule = contest.reviewRule?.calculationRule || 'average'; - let calculatedCount = 0; - - // 获取评委权重(用于加权平均) - const judges = await this.prisma.contestJudge.findMany({ - where: { - contestId, - validState: 1, - }, - }); - const judgeWeights = new Map( - judges.map((j) => [j.judgeId, Number(j.weight || 1)]), - ); - - for (const work of works) { - if (work.scores.length === 0) { - continue; - } - - const scores = work.scores.map((s) => Number(s.totalScore)); - let finalScore = 0; - - switch (calculationRule) { - case 'average': - finalScore = scores.reduce((a, b) => a + b, 0) / scores.length; - break; - case 'max': - finalScore = Math.max(...scores); - break; - case 'min': - finalScore = Math.min(...scores); - break; - case 'weighted': - let totalWeight = 0; - let weightedSum = 0; - - work.scores.forEach((score) => { - const weight = judgeWeights.get(score.judgeId) || 1; - weightedSum += Number(score.totalScore) * weight; - totalWeight += weight; - }); - - finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0; - break; - default: - finalScore = scores.reduce((a, b) => a + b, 0) / scores.length; - } - - await this.prisma.contestWork.update({ - where: { id: work.id }, - data: { - finalScore: Number(finalScore.toFixed(2)), - }, - }); - - calculatedCount++; - } - - return { - message: `成功计算 ${calculatedCount} 件作品的最终得分`, - calculatedCount, - calculationRule, - }; - } - - /** - * 计算排名 - */ - async calculateRankings(contestId: number) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 获取所有有最终得分的作品,按得分降序排列 - const works = await this.prisma.contestWork.findMany({ - where: { - contestId, - validState: 1, - isLatest: true, - finalScore: { not: null }, - }, - orderBy: { - finalScore: 'desc', - }, - }); - - if (works.length === 0) { - return { - message: '没有需要排名的作品,请先计算最终得分', - rankedCount: 0, - }; - } - - // 计算排名(同分同名次) - let currentRank = 1; - let previousScore: number | null = null; - let sameScoreCount = 0; - - for (let i = 0; i < works.length; i++) { - const work = works[i]; - const currentScore = Number(work.finalScore); - - if (previousScore !== null && currentScore === previousScore) { - // 同分,保持相同排名 - sameScoreCount++; - } else { - // 不同分,更新排名(跳过同分数量) - currentRank = i + 1; - sameScoreCount = 0; - } - - await this.prisma.contestWork.update({ - where: { id: work.id }, - data: { - rank: currentRank, - }, - }); - - previousScore = currentScore; - } - - return { - message: `成功计算 ${works.length} 件作品的排名`, - rankedCount: works.length, - }; - } - - /** - * 设置单个作品奖项 - */ - async setAward(workId: number, setAwardDto: SetAwardDto) { - const work = await this.prisma.contestWork.findUnique({ - where: { id: workId }, - }); - - if (!work) { - throw new NotFoundException('作品不存在'); - } - - return this.prisma.contestWork.update({ - where: { id: workId }, - data: { - awardLevel: setAwardDto.awardLevel, - awardName: setAwardDto.awardName, - certificateUrl: setAwardDto.certificateUrl, - status: 'awarded', - }, - include: { - registration: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - team: { - select: { - id: true, - teamName: true, - }, - }, - }, - }, - }, - }); - } - - /** - * 批量设置奖项 - */ - async batchSetAwards(contestId: number, batchSetAwardsDto: BatchSetAwardsDto) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - const results = []; - - for (const award of batchSetAwardsDto.awards) { - const work = await this.prisma.contestWork.findFirst({ - where: { - id: award.workId, - contestId, - validState: 1, - }, - }); - - if (!work) { - results.push({ - workId: award.workId, - success: false, - error: '作品不存在', - }); - continue; - } - - await this.prisma.contestWork.update({ - where: { id: award.workId }, - data: { - awardLevel: award.awardLevel, - awardName: award.awardName, - status: 'awarded', - }, - }); - - results.push({ - workId: award.workId, - success: true, - }); - } - - return { - message: `批量设置完成`, - total: batchSetAwardsDto.awards.length, - successCount: results.filter((r) => r.success).length, - failedCount: results.filter((r) => !r.success).length, - results, - }; - } - - /** - * 根据排名自动设置奖项(支持自定义奖项) - */ - async autoSetAwards( - contestId: number, - awardConfig: { - awards: Array<{ name: string; count: number }>; - }, - ) { - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 获取已排名的作品 - const works = await this.prisma.contestWork.findMany({ - where: { - contestId, - validState: 1, - isLatest: true, - rank: { not: null }, - }, - orderBy: { - rank: 'asc', - }, - }); - - if (works.length === 0) { - throw new BadRequestException('没有已排名的作品,请先计算排名'); - } - - // 构建奖项分配表:按顺序展开 [{name, count}] 为 [name, name, ...] - const awardSlots: string[] = []; - for (const tier of (awardConfig.awards || [])) { - for (let i = 0; i < (tier.count || 0); i++) { - awardSlots.push(tier.name); - } - } - - let assignedCount = 0; - const awards: { workId: number; awardLevel: string; awardName: string }[] = []; - - for (let i = 0; i < works.length; i++) { - const work = works[i]; - const awardName = i < awardSlots.length ? awardSlots[i] : null; - - if (awardName) { - // awardLevel 用序号标识(tier_0, tier_1...),awardName 存自定义名称 - const tierIndex = awardConfig.awards.findIndex(t => t.name === awardName); - const awardLevel = `tier_${tierIndex}`; - - await this.prisma.contestWork.update({ - where: { id: work.id }, - data: { - awardLevel, - awardName, - status: 'awarded', - }, - }); - - awards.push({ - workId: work.id, - awardLevel, - awardName, - }); - - assignedCount++; - } - } - - return { - message: `自动设置奖项完成`, - assignedCount, - awards, - }; - } - - /** - * 发布成果 - */ - async publishResults(contestId: number) { - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - if (contest.resultState === 'published') { - throw new BadRequestException('成果已发布'); - } - - // 检查是否有已排名的作品 - const rankedWorks = await this.prisma.contestWork.count({ - where: { - contestId, - validState: 1, - isLatest: true, - rank: { not: null }, - }, - }); - - if (rankedWorks === 0) { - throw new BadRequestException('没有已排名的作品,请先计算排名'); - } - - // 更新活动状态 - const updatedContest = await this.prisma.contest.update({ - where: { id: contestId }, - data: { - resultState: 'published', - resultPublishTime: new Date(), - status: 'finished', - }, - }); - - return { - message: '成果发布成功', - contest: updatedContest, - publishTime: updatedContest.resultPublishTime, - }; - } - - /** - * 撤回发布 - */ - async unpublishResults(contestId: number) { - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - if (contest.resultState !== 'published') { - throw new BadRequestException('成果未发布'); - } - - const updatedContest = await this.prisma.contest.update({ - where: { id: contestId }, - data: { - resultState: 'unpublished', - resultPublishTime: null, - }, - }); - - return { - message: '已撤回成果发布', - contest: updatedContest, - }; - } - - /** - * 获取活动结果列表(作品列表) - */ - async getResults(contestId: number, queryDto: QueryResultsDto) { - const { page = 1, pageSize = 10, workNo, accountNo } = queryDto; - - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - include: { - reviewRule: true, - }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - const skip = (page - 1) * pageSize; - - // 构建查询条件 - const where: any = { - contestId, - validState: 1, - isLatest: true, - }; - - // 作品编号搜索 - if (workNo) { - where.workNo = { contains: workNo }; - } - - // 报名账号搜索(需要关联查询) - if (accountNo) { - where.registration = { - user: { - username: { contains: accountNo }, - }, - }; - } - - const [works, total] = await Promise.all([ - this.prisma.contestWork.findMany({ - where, - include: { - registration: { - include: { - user: { - include: { - tenant: { - select: { - id: true, - name: true, - }, - }, - }, - }, - team: { - select: { - id: true, - teamName: true, - }, - }, - teachers: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }, - scores: { - where: { validState: 1 }, - select: { - id: true, - totalScore: true, - judgeName: true, - scoreTime: true, - }, - }, - }, - orderBy: [ - { finalScore: 'desc' }, - ], - skip, - take: pageSize, - }), - this.prisma.contestWork.count({ where }), - ]); - - // 计算每个作品的评委平均分(用于显示) - const enrichedWorks = works.map((work) => { - let judgeScore: number | null = work.finalScore - ? Number(work.finalScore) - : null; - // 如果没有最终得分但有评分记录,则计算平均分作为评委评分 - if (judgeScore === null && work.scores && work.scores.length > 0) { - const totalScores = work.scores.reduce( - (sum, s) => sum + Number(s.totalScore), - 0, - ); - judgeScore = Number((totalScores / work.scores.length).toFixed(2)); - } - return { - ...work, - judgeScore, // 评委评分(平均分) - }; - }); - - return { - contest: { - id: contest.id, - contestName: contest.contestName, - resultState: contest.resultState, - resultPublishTime: contest.resultPublishTime, - }, - list: enrichedWorks, - total, - page, - pageSize, - }; - } - - /** - * 获取活动结果统计摘要 - */ - async getResultsSummary(contestId: number) { - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 获取总作品数 - const totalWorks = await this.prisma.contestWork.count({ - where: { - contestId, - validState: 1, - isLatest: true, - }, - }); - - // 获取已计分作品数 - const scoredWorks = await this.prisma.contestWork.count({ - where: { - contestId, - validState: 1, - isLatest: true, - finalScore: { not: null }, - }, - }); - - // 获取已排名作品数 - const rankedWorks = await this.prisma.contestWork.count({ - where: { - contestId, - validState: 1, - isLatest: true, - rank: { not: null }, - }, - }); - - // 获取已设奖作品数 - const awardedWorks = await this.prisma.contestWork.count({ - where: { - contestId, - validState: 1, - isLatest: true, - awardLevel: { not: null }, - }, - }); - - // 奖项分布 - const awardStats = await this.prisma.contestWork.groupBy({ - by: ['awardLevel'], - where: { - contestId, - validState: 1, - isLatest: true, - awardLevel: { not: null }, - }, - _count: { - id: true, - }, - }); - - const awardDistribution: Record = { - first: 0, - second: 0, - third: 0, - excellent: 0, - }; - awardStats.forEach((stat) => { - if (stat.awardLevel) { - awardDistribution[stat.awardLevel] = stat._count.id; - } - }); - - // 获取分数统计 - const scoreStats = await this.prisma.contestWork.aggregate({ - where: { - contestId, - validState: 1, - isLatest: true, - finalScore: { not: null }, - }, - _avg: { finalScore: true }, - _max: { finalScore: true }, - _min: { finalScore: true }, - }); - - return { - contest: { - id: contest.id, - contestName: contest.contestName, - resultState: contest.resultState, - resultPublishTime: contest.resultPublishTime, - }, - summary: { - totalWorks, - scoredWorks, - rankedWorks, - awardedWorks, - unscoredWorks: totalWorks - scoredWorks, - }, - awardDistribution, - scoreStats: { - avgScore: scoreStats._avg.finalScore - ? Number(scoreStats._avg.finalScore).toFixed(2) - : null, - maxScore: scoreStats._max.finalScore - ? Number(scoreStats._max.finalScore).toFixed(2) - : null, - minScore: scoreStats._min.finalScore - ? Number(scoreStats._min.finalScore).toFixed(2) - : null, - }, - }; - } -} diff --git a/backend/src/contests/review-rules/dto/create-review-rule.dto.ts b/backend/src/contests/review-rules/dto/create-review-rule.dto.ts deleted file mode 100644 index ed09aa3..0000000 --- a/backend/src/contests/review-rules/dto/create-review-rule.dto.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { IsString, IsInt, IsEnum, IsOptional, IsArray, Min, Max, ValidateNested, IsNumber } from 'class-validator'; -import { Type } from 'class-transformer'; - -export enum CalculationRule { - AVERAGE = 'average', - REMOVE_MAX_MIN = 'remove_max_min', - REMOVE_MIN = 'remove_min', -} - -/** - * 评审维度 - */ -export class ReviewDimensionDto { - @IsString() - name: string; // 维度名称 - - @IsNumber() - @Min(0) - @Max(100) - percentage: number; // 权重百分比(0-100) - - @IsString() - @IsOptional() - description?: string; // 评分标准说明 -} - -export class CreateReviewRuleDto { - @IsString() - ruleName: string; - - @IsString() - @IsOptional() - ruleDescription?: string; - - @IsInt() - @Min(1) - judgeCount: number; - - @IsArray() - @ValidateNested({ each: true }) - @Type(() => ReviewDimensionDto) - dimensions: ReviewDimensionDto[]; // 评审维度数组 - - @IsEnum(CalculationRule) - @IsOptional() - calculationRule?: CalculationRule; -} - diff --git a/backend/src/contests/review-rules/dto/update-review-rule.dto.ts b/backend/src/contests/review-rules/dto/update-review-rule.dto.ts deleted file mode 100644 index af58b84..0000000 --- a/backend/src/contests/review-rules/dto/update-review-rule.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateReviewRuleDto } from './create-review-rule.dto'; - -export class UpdateReviewRuleDto extends PartialType(CreateReviewRuleDto) {} - diff --git a/backend/src/contests/review-rules/review-rules.controller.ts b/backend/src/contests/review-rules/review-rules.controller.ts deleted file mode 100644 index bed2314..0000000 --- a/backend/src/contests/review-rules/review-rules.controller.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - ParseIntPipe, - Query, -} from '@nestjs/common'; -import { ReviewRulesService } from './review-rules.service'; -import { CreateReviewRuleDto } from './dto/create-review-rule.dto'; -import { UpdateReviewRuleDto } from './dto/update-review-rule.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; -import { CurrentTenantId } from '../../auth/decorators/current-tenant-id.decorator'; - -@Controller('contests/review-rules') -@UseGuards(JwtAuthGuard) -export class ReviewRulesController { - constructor(private readonly reviewRulesService: ReviewRulesService) {} - - /** - * 分页查询评审规则列表 - */ - @Get() - @RequirePermission('contest:read') - findAll( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('ruleName') ruleName?: string, - @CurrentTenantId() tenantId?: number, - ) { - return this.reviewRulesService.findAll( - tenantId, - page ? parseInt(page) : 1, - pageSize ? parseInt(pageSize) : 10, - ruleName, - ); - } - - /** - * 获取所有可用的评审规则(用于活动创建时选择) - */ - @Get('select') - @RequirePermission('contest:read') - findAllForSelect(@CurrentTenantId() tenantId?: number) { - return this.reviewRulesService.findAllForSelect(tenantId); - } - - /** - * 创建评审规则(独立创建,不关联活动) - */ - @Post() - @RequirePermission('contest:update') - create( - @Body() createReviewRuleDto: CreateReviewRuleDto, - @CurrentTenantId() tenantId?: number, - @Request() req?, - ) { - const creatorId = req?.user?.id; - return this.reviewRulesService.create(createReviewRuleDto, tenantId, creatorId); - } - - /** - * 根据ID查找评审规则 - */ - @Get(':id') - @RequirePermission('contest:read') - findById( - @Param('id', ParseIntPipe) id: number, - @CurrentTenantId() tenantId?: number, - ) { - return this.reviewRulesService.findById(id, tenantId); - } - - /** - * 更新评审规则 - */ - @Patch(':id') - @RequirePermission('contest:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateReviewRuleDto: UpdateReviewRuleDto, - @CurrentTenantId() tenantId?: number, - @Request() req?, - ) { - const modifierId = req?.user?.id; - return this.reviewRulesService.update(id, updateReviewRuleDto, tenantId, modifierId); - } - - /** - * 删除评审规则(软删除) - */ - @Delete(':id') - @RequirePermission('contest:update') - remove( - @Param('id', ParseIntPipe) id: number, - @CurrentTenantId() tenantId?: number, - ) { - return this.reviewRulesService.remove(id, tenantId); - } -} - diff --git a/backend/src/contests/review-rules/review-rules.module.ts b/backend/src/contests/review-rules/review-rules.module.ts deleted file mode 100644 index 53eb1bb..0000000 --- a/backend/src/contests/review-rules/review-rules.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ReviewRulesService } from './review-rules.service'; -import { ReviewRulesController } from './review-rules.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [ReviewRulesController], - providers: [ReviewRulesService], - exports: [ReviewRulesService], -}) -export class ReviewRulesModule {} - diff --git a/backend/src/contests/review-rules/review-rules.service.ts b/backend/src/contests/review-rules/review-rules.service.ts deleted file mode 100644 index 6f6d5b5..0000000 --- a/backend/src/contests/review-rules/review-rules.service.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateReviewRuleDto } from './dto/create-review-rule.dto'; -import { UpdateReviewRuleDto } from './dto/update-review-rule.dto'; - -@Injectable() -export class ReviewRulesService { - constructor(private prisma: PrismaService) {} - - /** - * 创建评审规则(独立创建,不关联活动) - */ - async create( - createReviewRuleDto: CreateReviewRuleDto, - tenantId?: number, - creatorId?: number, - ) { - if (!tenantId) { - throw new BadRequestException('租户ID不能为空'); - } - - const data: any = { - tenantId, - ruleName: createReviewRuleDto.ruleName, - ruleDescription: createReviewRuleDto.ruleDescription || null, - judgeCount: createReviewRuleDto.judgeCount, - dimensions: JSON.stringify(createReviewRuleDto.dimensions), - calculationRule: createReviewRuleDto.calculationRule || 'average', - }; - - if (creatorId) { - data.creator = creatorId; - } - - return this.prisma.contestReviewRule.create({ - data, - include: { - contests: { - select: { - id: true, - contestName: true, - }, - }, - }, - }); - } - - /** - * 根据ID查找评审规则 - */ - async findById(id: number, tenantId?: number) { - const where: any = { id, validState: 1 }; - if (tenantId) { - where.tenantId = tenantId; - } - - const rule = await this.prisma.contestReviewRule.findFirst({ - where, - include: { - contests: { - where: { validState: 1 }, - select: { - id: true, - contestName: true, - }, - }, - }, - }); - - if (!rule) { - throw new NotFoundException('评审规则不存在'); - } - - return rule; - } - - /** - * 更新评审规则 - */ - async update( - id: number, - updateReviewRuleDto: UpdateReviewRuleDto, - tenantId?: number, - modifierId?: number, - ) { - // 先验证规则存在 - await this.findById(id, tenantId); - - const data: any = {}; - - if (updateReviewRuleDto.ruleName !== undefined) { - data.ruleName = updateReviewRuleDto.ruleName; - } - if (updateReviewRuleDto.ruleDescription !== undefined) { - data.ruleDescription = updateReviewRuleDto.ruleDescription || null; - } - if (updateReviewRuleDto.judgeCount !== undefined) { - data.judgeCount = updateReviewRuleDto.judgeCount; - } - if (updateReviewRuleDto.dimensions !== undefined) { - data.dimensions = JSON.stringify(updateReviewRuleDto.dimensions); - } - if (updateReviewRuleDto.calculationRule !== undefined) { - data.calculationRule = updateReviewRuleDto.calculationRule; - } - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contestReviewRule.update({ - where: { id }, - data, - include: { - contests: { - where: { validState: 1 }, - select: { - id: true, - contestName: true, - }, - }, - }, - }); - } - - /** - * 删除评审规则(软删除) - */ - async remove(id: number, tenantId?: number) { - // 先验证规则存在 - const rule = await this.findById(id, tenantId); - - // 检查是否有活动在使用此规则 - const contestsUsingRule = await this.prisma.contest.count({ - where: { - reviewRuleId: id, - validState: 1, - }, - }); - - if (contestsUsingRule > 0) { - throw new NotFoundException( - `该规则正在被 ${contestsUsingRule} 个活动使用,无法删除`, - ); - } - - // 软删除 - return this.prisma.contestReviewRule.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } - - /** - * 分页查询评审规则列表 - */ - async findAll( - tenantId?: number, - page: number = 1, - pageSize: number = 10, - ruleName?: string, - ) { - const skip = (page - 1) * pageSize; - const where: any = { - validState: 1, - }; - - if (tenantId) { - where.tenantId = tenantId; - } - - if (ruleName) { - where.ruleName = { - contains: ruleName, - }; - } - - const [data, total] = await Promise.all([ - this.prisma.contestReviewRule.findMany({ - where, - skip, - take: pageSize, - include: { - contests: { - where: { validState: 1 }, - select: { - id: true, - contestName: true, - }, - }, - }, - orderBy: { - createTime: 'desc', - }, - }), - this.prisma.contestReviewRule.count({ where }), - ]); - - return { - list: data, - total, - page, - pageSize, - }; - } - - /** - * 获取所有可用的评审规则(用于活动创建时选择) - */ - async findAllForSelect(tenantId?: number) { - const where: any = { - validState: 1, - }; - - if (tenantId) { - where.tenantId = tenantId; - } - - return this.prisma.contestReviewRule.findMany({ - where, - select: { - id: true, - ruleName: true, - ruleDescription: true, - judgeCount: true, - calculationRule: true, - }, - orderBy: { - createTime: 'desc', - }, - }); - } -} diff --git a/backend/src/contests/reviews/dto/assign-work.dto.ts b/backend/src/contests/reviews/dto/assign-work.dto.ts deleted file mode 100644 index d22bfa1..0000000 --- a/backend/src/contests/reviews/dto/assign-work.dto.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IsInt, IsArray } from 'class-validator'; - -export class AssignWorkDto { - @IsInt() - workId: number; - - @IsArray() - @IsInt({ each: true }) - judgeIds: number[]; -} - diff --git a/backend/src/contests/reviews/dto/batch-assign.dto.ts b/backend/src/contests/reviews/dto/batch-assign.dto.ts deleted file mode 100644 index aa7b00e..0000000 --- a/backend/src/contests/reviews/dto/batch-assign.dto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IsArray, IsNumber, ArrayMinSize } from 'class-validator'; - -export class BatchAssignDto { - @IsArray() - @IsNumber({}, { each: true }) - @ArrayMinSize(1) - workIds: number[]; - - @IsArray() - @IsNumber({}, { each: true }) - @ArrayMinSize(1) - judgeIds: number[]; -} diff --git a/backend/src/contests/reviews/dto/create-score.dto.ts b/backend/src/contests/reviews/dto/create-score.dto.ts deleted file mode 100644 index 4779951..0000000 --- a/backend/src/contests/reviews/dto/create-score.dto.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { IsInt, IsArray, IsString, IsOptional, IsNumber, Min, Max } from 'class-validator'; - -export class CreateScoreDto { - @IsInt() - workId: number; - - @IsInt() - assignmentId: number; - - @IsArray() - @IsOptional() - dimensionScores?: Array<{ - name: string; - score: number; - maxScore: number; - }>; // 维度评分数组 - - @IsNumber() - @Min(0) - @Max(100) - totalScore: number; - - @IsString() - @IsOptional() - comments?: string; -} - diff --git a/backend/src/contests/reviews/reviews.controller.ts b/backend/src/contests/reviews/reviews.controller.ts deleted file mode 100644 index 836d5f4..0000000 --- a/backend/src/contests/reviews/reviews.controller.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Query, - UseGuards, - Request, - ParseIntPipe, -} from '@nestjs/common'; -import { ReviewsService } from './reviews.service'; -import { AssignWorkDto } from './dto/assign-work.dto'; -import { CreateScoreDto } from './dto/create-score.dto'; -import { BatchAssignDto } from './dto/batch-assign.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests/reviews') -@UseGuards(JwtAuthGuard) -export class ReviewsController { - constructor(private readonly reviewsService: ReviewsService) {} - - @Post('assign') - @RequirePermission('review:assign') - assignWork( - @Body() assignWorkDto: AssignWorkDto, - @Query('contestId', ParseIntPipe) contestId: number, - @Request() req, - ) { - const creatorId = req.user?.userId; - return this.reviewsService.assignWork(assignWorkDto, contestId, creatorId); - } - - @Post('batch-assign') - @RequirePermission('review:assign') - batchAssignWorks( - @Body() batchAssignDto: BatchAssignDto, - @Query('contestId', ParseIntPipe) contestId: number, - @Request() req, - ) { - const creatorId = req.user?.userId; - return this.reviewsService.batchAssignWorks( - contestId, - batchAssignDto.workIds, - batchAssignDto.judgeIds, - creatorId, - ); - } - - @Post('auto-assign') - @RequirePermission('review:assign') - autoAssignWorks( - @Query('contestId', ParseIntPipe) contestId: number, - @Request() req, - ) { - const creatorId = req.user?.userId; - return this.reviewsService.autoAssignWorks(contestId, creatorId); - } - - @Post('score') - @RequirePermission('review:score') - score(@Body() createScoreDto: CreateScoreDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new Error('无法确定租户信息'); - } - const judgeId = req.user?.userId; - if (!judgeId) { - throw new Error('无法确定评委信息'); - } - return this.reviewsService.score(createScoreDto, judgeId, tenantId); - } - - @Patch('score/:id') - @RequirePermission('review:score') - updateScore( - @Param('id', ParseIntPipe) scoreId: number, - @Body() updateScoreDto: Partial, - @Request() req, - ) { - const judgeId = req.user?.userId; - return this.reviewsService.updateScore(scoreId, updateScoreDto, judgeId); - } - - @Get('assigned') - @RequirePermission('review:read') - getAssignedWorks( - @Query('contestId', ParseIntPipe) contestId: number, - @Request() req, - ) { - const judgeId = req.user?.userId; - return this.reviewsService.getAssignedWorks(judgeId, contestId); - } - - @Get('judge/contests') - @RequirePermission('review:score') - getJudgeContests(@Request() req) { - const judgeId = req.user?.userId; - console.log('getJudgeContests - judgeId:', judgeId, 'user:', req.user); - if (!judgeId) { - throw new Error('无法确定评委信息'); - } - return this.reviewsService.getJudgeContests(judgeId); - } - - @Get('judge/contests/:contestId/works') - @RequirePermission('review:score') - getJudgeContestWorks( - @Param('contestId', ParseIntPipe) contestId: number, - @Query('page') page: string, - @Query('pageSize') pageSize: string, - @Query('workNo') workNo: string, - @Query('accountNo') accountNo: string, - @Query('reviewStatus') reviewStatus: string, - @Request() req, - ) { - const judgeId = req.user?.userId; - return this.reviewsService.getJudgeContestWorks(judgeId, contestId, { - page: page ? parseInt(page, 10) : 1, - pageSize: pageSize ? parseInt(pageSize, 10) : 10, - workNo, - accountNo, - reviewStatus, - }); - } - - @Get('progress/:contestId') - @RequirePermission('review:read') - getReviewProgress(@Param('contestId', ParseIntPipe) contestId: number) { - return this.reviewsService.getReviewProgress(contestId); - } - - @Get('work-status/:contestId') - @RequirePermission('review:read') - getWorkStatusStats(@Param('contestId', ParseIntPipe) contestId: number) { - return this.reviewsService.getWorkStatusStats(contestId); - } - - @Get('work/:workId/scores') - @RequirePermission('review:read') - getWorkScores(@Param('workId', ParseIntPipe) workId: number) { - return this.reviewsService.getWorkScores(workId); - } - - @Get('work/:workId/final-score') - @RequirePermission('review:read') - calculateFinalScore(@Param('workId', ParseIntPipe) workId: number) { - return this.reviewsService.calculateFinalScore(workId); - } -} - diff --git a/backend/src/contests/reviews/reviews.module.ts b/backend/src/contests/reviews/reviews.module.ts deleted file mode 100644 index 5c13612..0000000 --- a/backend/src/contests/reviews/reviews.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ReviewsService } from './reviews.service'; -import { ReviewsController } from './reviews.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [ReviewsController], - providers: [ReviewsService], - exports: [ReviewsService], -}) -export class ReviewsModule {} - diff --git a/backend/src/contests/reviews/reviews.service.ts b/backend/src/contests/reviews/reviews.service.ts deleted file mode 100644 index 3e87c6b..0000000 --- a/backend/src/contests/reviews/reviews.service.ts +++ /dev/null @@ -1,1043 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, - ConflictException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { AssignWorkDto } from './dto/assign-work.dto'; -import { CreateScoreDto } from './dto/create-score.dto'; - -@Injectable() -export class ReviewsService { - constructor(private prisma: PrismaService) {} - - async assignWork( - assignWorkDto: AssignWorkDto, - contestId: number, - creatorId?: number, - ) { - // 验证作品是否存在 - const work = await this.prisma.contestWork.findUnique({ - where: { id: assignWorkDto.workId }, - include: { - contest: true, - }, - }); - - if (!work) { - throw new NotFoundException('作品不存在'); - } - - if (work.contestId !== contestId) { - throw new BadRequestException('作品不属于该活动'); - } - - // 验证评委是否存在且是该活动的评委 - const judges = await this.prisma.contestJudge.findMany({ - where: { - contestId, - judgeId: { in: assignWorkDto.judgeIds }, - validState: 1, - }, - }); - - if (judges.length !== assignWorkDto.judgeIds.length) { - throw new BadRequestException('部分评委不存在或不是该活动的评委'); - } - - // 创建分配记录 - const assignments = []; - for (const judgeId of assignWorkDto.judgeIds) { - // 检查是否已分配 - const existing = await this.prisma.contestWorkJudgeAssignment.findFirst({ - where: { - workId: assignWorkDto.workId, - judgeId, - }, - }); - - if (existing) { - continue; // 跳过已分配的 - } - - const assignment = await this.prisma.contestWorkJudgeAssignment.create({ - data: { - contestId, - workId: assignWorkDto.workId, - judgeId, - status: 'assigned', - creator: creatorId, - }, - include: { - judge: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }); - - assignments.push(assignment); - } - - return assignments; - } - - async score( - createScoreDto: CreateScoreDto, - judgeId: number, - tenantId: number, - ) { - // 验证分配记录是否存在 - const assignment = await this.prisma.contestWorkJudgeAssignment.findFirst({ - where: { - id: createScoreDto.assignmentId, - judgeId, - }, - include: { - work: { - include: { - contest: true, - }, - }, - }, - }); - - if (!assignment) { - throw new NotFoundException('分配记录不存在'); - } - - if (assignment.workId !== createScoreDto.workId) { - throw new BadRequestException('作品ID不匹配'); - } - - // 检查评审时间 - const now = new Date(); - if ( - now < assignment.work.contest.reviewStartTime || - now > assignment.work.contest.reviewEndTime - ) { - throw new BadRequestException('不在评审时间范围内'); - } - - // 检查是否已评分 - const existingScore = await this.prisma.contestWorkScore.findFirst({ - where: { - assignmentId: createScoreDto.assignmentId, - validState: 1, - }, - }); - - if (existingScore) { - throw new ConflictException('该作品已评分,请使用更新接口'); - } - - // 获取评委信息 - const judge = await this.prisma.user.findUnique({ - where: { id: judgeId }, - }); - - // 创建评分记录 - const data: any = { - tenantId, - contestId: assignment.work.contestId, - workId: createScoreDto.workId, - assignmentId: createScoreDto.assignmentId, - judgeId, - judgeName: judge?.nickname || judge?.username || '', - dimensionScores: createScoreDto.dimensionScores || [], - totalScore: createScoreDto.totalScore, - comments: createScoreDto.comments || '', - scoreTime: new Date(), - creator: judgeId, - }; - - const score = await this.prisma.contestWorkScore.create({ - data, - include: { - work: { - select: { - id: true, - title: true, - workNo: true, - }, - }, - judge: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }); - - // 更新分配状态 - await this.prisma.contestWorkJudgeAssignment.update({ - where: { id: createScoreDto.assignmentId }, - data: { - status: 'completed', - }, - }); - - // 更新作品状态 - await this.prisma.contestWork.update({ - where: { id: createScoreDto.workId }, - data: { - status: 'reviewing', - }, - }); - - return score; - } - - async updateScore( - scoreId: number, - updateScoreDto: Partial, - judgeId: number, - ) { - const score = await this.prisma.contestWorkScore.findFirst({ - where: { - id: scoreId, - judgeId, - validState: 1, - }, - include: { - work: { - include: { - contest: true, - }, - }, - }, - }); - - if (!score) { - throw new NotFoundException('评分记录不存在'); - } - - // 检查评审时间 - const now = new Date(); - if ( - now < score.work.contest.reviewStartTime || - now > score.work.contest.reviewEndTime - ) { - throw new BadRequestException('不在评审时间范围内'); - } - - const data: any = {}; - - if (updateScoreDto.dimensionScores !== undefined) { - data.dimensionScores = JSON.stringify(updateScoreDto.dimensionScores); - } - if (updateScoreDto.totalScore !== undefined) { - data.totalScore = updateScoreDto.totalScore; - } - if (updateScoreDto.comments !== undefined) { - data.comments = updateScoreDto.comments; - } - - data.modifier = judgeId; - data.scoreTime = new Date(); - - return this.prisma.contestWorkScore.update({ - where: { id: scoreId }, - data, - include: { - work: { - select: { - id: true, - title: true, - workNo: true, - }, - }, - judge: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }); - } - - async getAssignedWorks(judgeId: number, contestId?: number) { - const where: any = { - judgeId, - }; - - if (contestId) { - where.contestId = contestId; - } - - return this.prisma.contestWorkJudgeAssignment.findMany({ - where, - include: { - work: { - include: { - registration: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - attachments: true, - }, - }, - scores: { - where: { validState: 1 }, - }, - }, - orderBy: { - assignmentTime: 'desc', - }, - }); - } - - // 获取评委参与的活动列表 - async getJudgeContests(judgeId: number) { - console.log('getJudgeContests - judgeId:', judgeId); - - // 获取评委参与的所有活动(通过作品分配表) - const assignments = await this.prisma.contestWorkJudgeAssignment.findMany({ - where: { - judgeId, - }, - select: { - contestId: true, - }, - distinct: ['contestId'], - }); - - console.log('getJudgeContests - assignments:', assignments); - const contestIds = assignments.map((a) => a.contestId); - - if (contestIds.length === 0) { - return []; - } - - // 获取活动详情和评审统计 - const contests = await this.prisma.contest.findMany({ - where: { - id: { in: contestIds }, - validState: 1, - }, - include: { - reviewRule: true, - }, - orderBy: { - createTime: 'desc', - }, - }); - - // 计算每个活动的评审进度 - const result = await Promise.all( - contests.map(async (contest) => { - // 获取分配给该评委的作品数量 - const totalAssigned = await this.prisma.contestWorkJudgeAssignment.count({ - where: { - contestId: contest.id, - judgeId, - }, - }); - - // 获取已评审的作品数量 - const reviewed = await this.prisma.contestWorkScore.count({ - where: { - contestId: contest.id, - judgeId, - validState: 1, - }, - }); - - return { - ...contest, - totalAssigned, - reviewed, - pending: totalAssigned - reviewed, - }; - }), - ); - - return result; - } - - // 获取评委在某个活动下分配的作品列表(带分页和搜索) - async getJudgeContestWorks( - judgeId: number, - contestId: number, - query: { - page?: number; - pageSize?: number; - workNo?: string; - accountNo?: string; - reviewStatus?: string; // 'reviewed' | 'pending' - }, - ) { - const { page = 1, pageSize = 10, workNo, accountNo, reviewStatus } = query; - - // 构建查询条件 - const where: any = { - judgeId, - contestId, - }; - - // 如果需要按评审状态筛选,需要特殊处理 - const allAssignments = await this.prisma.contestWorkJudgeAssignment.findMany({ - where, - include: { - work: { - include: { - registration: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }, - scores: { - where: { validState: 1 }, - orderBy: { scoreTime: 'desc' }, - take: 1, - }, - }, - orderBy: { - assignmentTime: 'desc', - }, - }); - - // 按 workId 去重,保留第一条(最新的) - const workIdSet = new Set(); - let assignments = allAssignments.filter((a) => { - if (workIdSet.has(a.workId)) { - return false; - } - workIdSet.add(a.workId); - return true; - }); - - // 应用搜索条件 - if (workNo) { - assignments = assignments.filter((a) => - a.work.workNo?.toLowerCase().includes(workNo.toLowerCase()), - ); - } - - if (accountNo) { - assignments = assignments.filter( - (a) => - a.work.registration?.user?.username - ?.toLowerCase() - .includes(accountNo.toLowerCase()) || - a.work.submitterAccountNo - ?.toLowerCase() - .includes(accountNo.toLowerCase()), - ); - } - - // 应用评审状态筛选 - if (reviewStatus === 'reviewed') { - assignments = assignments.filter((a) => a.scores.length > 0); - } else if (reviewStatus === 'pending') { - assignments = assignments.filter((a) => a.scores.length === 0); - } - - const total = assignments.length; - - // 分页 - const start = (page - 1) * pageSize; - const paginatedAssignments = assignments.slice(start, start + pageSize); - - // 转换为前端期望的格式 - const list = paginatedAssignments.map((assignment) => { - const latestScore = assignment.scores[0]; - return { - id: assignment.id, - workId: assignment.workId, - workNo: assignment.work.workNo, - accountNo: - assignment.work.submitterAccountNo || - assignment.work.registration?.user?.username || - '-', - nickname: assignment.work.registration?.user?.nickname || '-', - score: latestScore?.totalScore ?? null, - reviewStatus: latestScore ? 'reviewed' : 'pending', - assignmentTime: assignment.assignmentTime, - work: assignment.work, - }; - }); - - return { - list, - total, - page, - pageSize, - }; - } - - async getWorkScores(workId: number) { - // 获取分配给作品的所有评委及其评分记录 - const assignments = await this.prisma.contestWorkJudgeAssignment.findMany({ - where: { - workId, - }, - include: { - judge: { - select: { - id: true, - username: true, - nickname: true, - phone: true, - tenant: { - select: { - id: true, - name: true, - }, - }, - }, - }, - scores: { - where: { - validState: 1, - }, - orderBy: { - scoreTime: 'desc', - }, - take: 1, // 只取最新的有效评分 - }, - }, - orderBy: { - assignmentTime: 'desc', - }, - }); - - // 转换为前端期望的格式 - return assignments.map((assignment) => { - const latestScore = assignment.scores[0]; - return { - id: assignment.id, - assignmentId: assignment.id, - workId: assignment.workId, - judgeId: assignment.judgeId, - judge: assignment.judge, - totalScore: latestScore?.totalScore ?? null, - dimensionScores: latestScore?.dimensionScores ?? null, - scoreTime: latestScore?.scoreTime ?? null, - comments: latestScore?.comments ?? null, - status: assignment.status, - assignmentTime: assignment.assignmentTime, - }; - }); - } - - async calculateFinalScore(workId: number) { - const work = await this.prisma.contestWork.findUnique({ - where: { id: workId }, - include: { - contest: { - include: { - reviewRule: true, - }, - }, - scores: { - where: { validState: 1 }, - }, - }, - }); - - if (!work) { - throw new NotFoundException('作品不存在'); - } - - if (!work.contest.reviewRule) { - throw new BadRequestException('活动未配置评审规则'); - } - - if (work.scores.length === 0) { - return { - finalScore: 0, - scoreCount: 0, - calculationRule: work.contest.reviewRule.calculationRule, - }; - } - - const scores = work.scores.map((s) => Number(s.totalScore)); - const calculationRule = work.contest.reviewRule.calculationRule; - - let finalScore = 0; - - switch (calculationRule) { - case 'average': - finalScore = scores.reduce((a, b) => a + b, 0) / scores.length; - break; - case 'max': - finalScore = Math.max(...scores); - break; - case 'min': - finalScore = Math.min(...scores); - break; - case 'weighted': - // 加权平均需要从评委权重计算 - const judges = await this.prisma.contestJudge.findMany({ - where: { - contestId: work.contestId, - judgeId: { in: work.scores.map((s) => s.judgeId) }, - validState: 1, - }, - }); - - const judgeWeights = new Map( - judges.map((j) => [j.judgeId, Number(j.weight || 1)]), - ); - - let totalWeight = 0; - let weightedSum = 0; - - work.scores.forEach((score) => { - const weight = judgeWeights.get(score.judgeId) || 1; - weightedSum += Number(score.totalScore) * weight; - totalWeight += weight; - }); - - finalScore = totalWeight > 0 ? weightedSum / totalWeight : 0; - break; - default: - finalScore = scores.reduce((a, b) => a + b, 0) / scores.length; - } - - return { - finalScore: Number(finalScore.toFixed(2)), - scoreCount: scores.length, - calculationRule, - }; - } - - /** - * 获取活动评审进度统计 - */ - async getReviewProgress(contestId: number) { - // 获取活动信息 - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - include: { - reviewRule: true, - }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 获取所有作品 - const totalWorks = await this.prisma.contestWork.count({ - where: { - contestId, - validState: 1, - }, - }); - - // 获取已分配的作品数(去重) - const assignedWorkIds = await this.prisma.contestWorkJudgeAssignment.findMany({ - where: { contestId }, - select: { workId: true }, - distinct: ['workId'], - }); - const assignedWorksCount = assignedWorkIds.length; - - // 获取已完成评审的作品数(每个作品被至少一个评委评分) - const scoredWorkIds = await this.prisma.contestWorkScore.findMany({ - where: { - contestId, - validState: 1, - }, - select: { workId: true }, - distinct: ['workId'], - }); - const scoredWorksCount = scoredWorkIds.length; - - // 获取评委总数 - const totalJudges = await this.prisma.contestJudge.count({ - where: { - contestId, - validState: 1, - }, - }); - - // 获取总分配数和总评分数 - const totalAssignments = await this.prisma.contestWorkJudgeAssignment.count({ - where: { contestId }, - }); - - const totalScores = await this.prisma.contestWorkScore.count({ - where: { - contestId, - validState: 1, - }, - }); - - // 计算评审进度百分比 - const assignmentProgress = totalWorks > 0 ? Math.round((assignedWorksCount / totalWorks) * 100) : 0; - const scoringProgress = totalAssignments > 0 ? Math.round((totalScores / totalAssignments) * 100) : 0; - const overallProgress = totalWorks > 0 ? Math.round((scoredWorksCount / totalWorks) * 100) : 0; - - // 获取每个评委的进度 - const judges = await this.prisma.contestJudge.findMany({ - where: { - contestId, - validState: 1, - }, - include: { - judge: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }); - - const judgeProgress = await Promise.all( - judges.map(async (judge) => { - const assigned = await this.prisma.contestWorkJudgeAssignment.count({ - where: { - contestId, - judgeId: judge.judgeId, - }, - }); - - const scored = await this.prisma.contestWorkScore.count({ - where: { - contestId, - judgeId: judge.judgeId, - validState: 1, - }, - }); - - const pending = assigned - scored; - const progress = assigned > 0 ? Math.round((scored / assigned) * 100) : 0; - - return { - judgeId: judge.judgeId, - judgeName: judge.judge?.nickname || judge.judge?.username || '', - specialty: judge.specialty, - weight: judge.weight, - assignedCount: assigned, - scoredCount: scored, - pendingCount: pending, - progress, - }; - }), - ); - - // 获取待分配作品列表(未分配给任何评委的作品) - const unassignedWorks = await this.prisma.contestWork.findMany({ - where: { - contestId, - validState: 1, - id: { - notIn: assignedWorkIds.map((w) => w.workId), - }, - }, - select: { - id: true, - workNo: true, - title: true, - createTime: true, - registration: { - select: { - user: { - select: { - id: true, - nickname: true, - username: true, - }, - }, - team: { - select: { - id: true, - teamName: true, - }, - }, - }, - }, - }, - take: 10, - orderBy: { createTime: 'asc' }, - }); - - // 获取待评审分配(已分配但未评分的) - const pendingAssignments = await this.prisma.contestWorkJudgeAssignment.findMany({ - where: { - contestId, - status: { not: 'completed' }, - }, - include: { - work: { - select: { - id: true, - workNo: true, - title: true, - }, - }, - judge: { - select: { - id: true, - nickname: true, - username: true, - }, - }, - }, - take: 10, - orderBy: { assignmentTime: 'asc' }, - }); - - return { - contest: { - id: contest.id, - contestName: contest.contestName, - reviewStartTime: contest.reviewStartTime, - reviewEndTime: contest.reviewEndTime, - reviewRule: contest.reviewRule, - }, - summary: { - totalWorks, - assignedWorksCount, - scoredWorksCount, - unassignedWorksCount: totalWorks - assignedWorksCount, - totalJudges, - totalAssignments, - totalScores, - pendingScoresCount: totalAssignments - totalScores, - }, - progress: { - assignmentProgress, - scoringProgress, - overallProgress, - }, - judgeProgress, - unassignedWorks, - pendingAssignments: pendingAssignments.map((a) => ({ - id: a.id, - workId: a.work?.id, - workNo: a.work?.workNo, - workTitle: a.work?.title, - judgeId: a.judge?.id, - judgeName: a.judge?.nickname || a.judge?.username, - status: a.status, - assignmentTime: a.assignmentTime, - })), - }; - } - - /** - * 获取作品评审状态统计(按状态分组) - */ - async getWorkStatusStats(contestId: number) { - const statusGroups = await this.prisma.contestWork.groupBy({ - by: ['status'], - where: { - contestId, - validState: 1, - }, - _count: { - id: true, - }, - }); - - const statusMap: Record = {}; - statusGroups.forEach((g) => { - statusMap[g.status] = g._count.id; - }); - - return { - submitted: statusMap['submitted'] || 0, - reviewing: statusMap['reviewing'] || 0, - reviewed: statusMap['reviewed'] || 0, - awarded: statusMap['awarded'] || 0, - total: Object.values(statusMap).reduce((a, b) => a + b, 0), - }; - } - - /** - * 批量分配作品给评委 - */ - async batchAssignWorks( - contestId: number, - workIds: number[], - judgeIds: number[], - creatorId?: number, - ) { - // 验证活动 - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 验证评委 - const judges = await this.prisma.contestJudge.findMany({ - where: { - contestId, - judgeId: { in: judgeIds }, - validState: 1, - }, - }); - - if (judges.length !== judgeIds.length) { - throw new BadRequestException('部分评委不存在或不是该活动的评委'); - } - - // 验证作品 - const works = await this.prisma.contestWork.findMany({ - where: { - id: { in: workIds }, - contestId, - validState: 1, - }, - }); - - if (works.length !== workIds.length) { - throw new BadRequestException('部分作品不存在或不属于该活动'); - } - - // 批量创建分配 - const assignments = []; - for (const workId of workIds) { - for (const judgeId of judgeIds) { - // 检查是否已分配 - const existing = await this.prisma.contestWorkJudgeAssignment.findFirst({ - where: { workId, judgeId }, - }); - - if (existing) { - continue; - } - - const assignment = await this.prisma.contestWorkJudgeAssignment.create({ - data: { - contestId, - workId, - judgeId, - status: 'assigned', - creator: creatorId, - }, - }); - - assignments.push(assignment); - } - } - - return { - created: assignments.length, - skipped: workIds.length * judgeIds.length - assignments.length, - assignments, - }; - } - - /** - * 自动分配作品给评委(平均分配) - */ - async autoAssignWorks(contestId: number, creatorId?: number) { - // 获取未分配的作品 - const assignedWorkIds = await this.prisma.contestWorkJudgeAssignment.findMany({ - where: { contestId }, - select: { workId: true }, - distinct: ['workId'], - }); - - const unassignedWorks = await this.prisma.contestWork.findMany({ - where: { - contestId, - validState: 1, - id: { - notIn: assignedWorkIds.map((w) => w.workId), - }, - }, - }); - - if (unassignedWorks.length === 0) { - return { - message: '没有待分配的作品', - created: 0, - }; - } - - // 获取评委 - const judges = await this.prisma.contestJudge.findMany({ - where: { - contestId, - validState: 1, - }, - }); - - if (judges.length === 0) { - throw new BadRequestException('该活动没有评委'); - } - - // 获取活动的评审规则 - const contest = await this.prisma.contest.findUnique({ - where: { id: contestId }, - include: { reviewRule: true }, - }); - - // 每个作品分配的评委数量,默认3个 - // 注意:judgesPerWork 字段在数据库模型中不存在,使用默认值 - const judgesPerWork = 3; - - // 平均分配:每个作品分配给指定数量的评委 - const assignments = []; - let judgeIndex = 0; - - for (const work of unassignedWorks) { - const assignedJudges = new Set(); - let attempts = 0; - - while (assignedJudges.size < Math.min(judgesPerWork, judges.length) && attempts < judges.length * 2) { - const judge = judges[judgeIndex % judges.length]; - - if (!assignedJudges.has(judge.judgeId)) { - assignedJudges.add(judge.judgeId); - - const assignment = await this.prisma.contestWorkJudgeAssignment.create({ - data: { - contestId, - workId: work.id, - judgeId: judge.judgeId, - status: 'assigned', - creator: creatorId, - }, - }); - - assignments.push(assignment); - } - - judgeIndex++; - attempts++; - } - } - - return { - message: `成功分配 ${unassignedWorks.length} 个作品`, - worksCount: unassignedWorks.length, - created: assignments.length, - judgesPerWork: Math.min(judgesPerWork, judges.length), - }; - } -} diff --git a/backend/src/contests/teams/dto/create-team.dto.ts b/backend/src/contests/teams/dto/create-team.dto.ts deleted file mode 100644 index 7bf0bd0..0000000 --- a/backend/src/contests/teams/dto/create-team.dto.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { IsString, IsInt, IsOptional, Min, IsArray } from 'class-validator'; - -export class CreateTeamDto { - @IsInt() - contestId: number; - - @IsString() - teamName: string; - - @IsInt() - leaderId: number; - - @IsArray() - @IsInt({ each: true }) - @IsOptional() - memberIds?: number[]; - - @IsArray() - @IsInt({ each: true }) - @IsOptional() - teacherIds?: number[]; - - @IsInt() - @Min(1) - @IsOptional() - maxMembers?: number; -} - diff --git a/backend/src/contests/teams/dto/invite-member.dto.ts b/backend/src/contests/teams/dto/invite-member.dto.ts deleted file mode 100644 index 3e8e0e6..0000000 --- a/backend/src/contests/teams/dto/invite-member.dto.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IsInt, IsString, IsEnum, IsOptional } from 'class-validator'; - -export enum TeamMemberRole { - LEADER = 'leader', - MEMBER = 'member', - MENTOR = 'mentor', -} - -export class InviteMemberDto { - @IsInt() - userId: number; - - @IsEnum(TeamMemberRole) - @IsOptional() - role?: TeamMemberRole; -} - diff --git a/backend/src/contests/teams/dto/update-team.dto.ts b/backend/src/contests/teams/dto/update-team.dto.ts deleted file mode 100644 index 19384f8..0000000 --- a/backend/src/contests/teams/dto/update-team.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateTeamDto } from './create-team.dto'; - -export class UpdateTeamDto extends PartialType(CreateTeamDto) {} - diff --git a/backend/src/contests/teams/teams.controller.ts b/backend/src/contests/teams/teams.controller.ts deleted file mode 100644 index 56df69b..0000000 --- a/backend/src/contests/teams/teams.controller.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - ParseIntPipe, - BadRequestException, -} from '@nestjs/common'; -import { TeamsService } from './teams.service'; -import { CreateTeamDto } from './dto/create-team.dto'; -import { UpdateTeamDto } from './dto/update-team.dto'; -import { InviteMemberDto } from './dto/invite-member.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests/teams') -@UseGuards(JwtAuthGuard) -export class TeamsController { - constructor(private readonly teamsService: TeamsService) {} - - @Post() - @RequirePermission('team:create') - create(@Body() createTeamDto: CreateTeamDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new BadRequestException('无法确定租户信息'); - } - const creatorId = req.user?.userId; - return this.teamsService.create(createTeamDto, tenantId, creatorId); - } - - @Get('contest/:contestId') - @RequirePermission('team:read') - findAll( - @Param('contestId', ParseIntPipe) contestId: number, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.teamsService.findAll(contestId, tenantId); - } - - @Get(':id') - @RequirePermission('team:read') - findOne(@Param('id', ParseIntPipe) id: number, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.teamsService.findOne(id, tenantId); - } - - @Patch(':id') - @RequirePermission('team:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateTeamDto: UpdateTeamDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new BadRequestException('无法确定租户信息'); - } - const modifierId = req.user?.userId; - return this.teamsService.update(id, updateTeamDto, tenantId, modifierId); - } - - @Post(':id/members') - @RequirePermission('team:update') - inviteMember( - @Param('id', ParseIntPipe) teamId: number, - @Body() inviteMemberDto: InviteMemberDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new BadRequestException('无法确定租户信息'); - } - const creatorId = req.user?.userId; - return this.teamsService.inviteMember( - teamId, - inviteMemberDto, - tenantId, - creatorId, - ); - } - - @Delete(':id/members/:userId') - @RequirePermission('team:update') - removeMember( - @Param('id', ParseIntPipe) teamId: number, - @Param('userId', ParseIntPipe) userId: number, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new BadRequestException('无法确定租户信息'); - } - return this.teamsService.removeMember(teamId, userId, tenantId); - } - - @Delete(':id') - @RequirePermission('team:delete') - remove(@Param('id', ParseIntPipe) id: number, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new BadRequestException('无法确定租户信息'); - } - return this.teamsService.remove(id, tenantId); - } -} - diff --git a/backend/src/contests/teams/teams.module.ts b/backend/src/contests/teams/teams.module.ts deleted file mode 100644 index 3697cbd..0000000 --- a/backend/src/contests/teams/teams.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TeamsService } from './teams.service'; -import { TeamsController } from './teams.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [TeamsController], - providers: [TeamsService], - exports: [TeamsService], -}) -export class TeamsModule {} - diff --git a/backend/src/contests/teams/teams.service.ts b/backend/src/contests/teams/teams.service.ts deleted file mode 100644 index 24ede3a..0000000 --- a/backend/src/contests/teams/teams.service.ts +++ /dev/null @@ -1,522 +0,0 @@ -import { - Injectable, - NotFoundException, - ConflictException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateTeamDto } from './dto/create-team.dto'; -import { UpdateTeamDto } from './dto/update-team.dto'; -import { InviteMemberDto } from './dto/invite-member.dto'; - -@Injectable() -export class TeamsService { - constructor(private prisma: PrismaService) {} - - async create( - createTeamDto: CreateTeamDto, - tenantId: number, - creatorId?: number, - ) { - // 验证活动是否存在 - const contest = await this.prisma.contest.findUnique({ - where: { id: createTeamDto.contestId }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在'); - } - - // 检查活动类型 - if (contest.contestType !== 'team') { - throw new BadRequestException('该活动不是团队参与'); - } - - // 检查团队名称是否已存在(同一活动、同一租户内) - const existing = await this.prisma.contestTeam.findFirst({ - where: { - tenantId, - contestId: createTeamDto.contestId, - teamName: createTeamDto.teamName, - validState: 1, - }, - }); - - if (existing) { - throw new ConflictException('团队名称已存在'); - } - - // 验证队长用户是否存在 - const leader = await this.prisma.user.findUnique({ - where: { id: createTeamDto.leaderId }, - }); - - if (!leader) { - throw new NotFoundException('队长用户不存在'); - } - - if (leader.tenantId !== tenantId) { - throw new BadRequestException('队长不属于当前租户'); - } - - // 使用事务创建团队和报名记录 - return this.prisma.$transaction(async (tx) => { - // 创建团队 - const data: any = { - tenantId, - contestId: createTeamDto.contestId, - teamName: createTeamDto.teamName, - leaderUserId: createTeamDto.leaderId, - maxMembers: createTeamDto.maxMembers, - }; - - if (creatorId) { - data.creator = creatorId; - } - - const team = await tx.contestTeam.create({ - data, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - leader: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }); - - // 自动添加队长为成员 - await tx.contestTeamMember.create({ - data: { - tenantId, - teamId: team.id, - userId: createTeamDto.leaderId, - role: 'leader', - creator: creatorId, - }, - }); - - // 添加其他队员(排除队长) - if (createTeamDto.memberIds && createTeamDto.memberIds.length > 0) { - const memberIdsToAdd = createTeamDto.memberIds.filter( - (id) => id !== createTeamDto.leaderId, - ); - for (const memberId of memberIdsToAdd) { - await tx.contestTeamMember.create({ - data: { - tenantId, - teamId: team.id, - userId: memberId, - role: 'member', - creator: creatorId, - }, - }); - } - } - - // 添加指导老师 - if (createTeamDto.teacherIds && createTeamDto.teacherIds.length > 0) { - for (const teacherId of createTeamDto.teacherIds) { - await tx.contestTeamMember.create({ - data: { - tenantId, - teamId: team.id, - userId: teacherId, - role: 'mentor', - creator: creatorId, - }, - }); - } - } - - // 自动创建团队报名记录 - const accountNo = leader.username; - const accountName = leader.nickname; - - await tx.contestRegistration.create({ - data: { - contestId: createTeamDto.contestId, - tenantId, - registrationType: 'team', - teamId: team.id, - teamName: createTeamDto.teamName, - userId: createTeamDto.leaderId, - accountNo, - accountName, - registrationState: 'pending', - registrationTime: new Date(), - registrant: creatorId || createTeamDto.leaderId, - creator: creatorId, - }, - }); - - // 返回完整的团队信息 - return tx.contestTeam.findUnique({ - where: { id: team.id }, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - leader: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - members: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - _count: { - select: { - members: true, - }, - }, - }, - }); - }); - } - - async findAll(contestId: number, tenantId?: number) { - const where: any = { - contestId, - validState: 1, - }; - - if (tenantId) { - where.tenantId = tenantId; - } - - const teams = await this.prisma.contestTeam.findMany({ - where, - orderBy: { - createTime: 'desc', - }, - include: { - leader: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - members: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - registrations: { - select: { - id: true, - registrationState: true, - }, - take: 1, - }, - _count: { - select: { - members: true, - registrations: true, - }, - }, - }, - }); - - // 将报名状态扁平化到团队对象上 - return teams.map((team) => ({ - ...team, - registrationState: team.registrations?.[0]?.registrationState || 'pending', - registrationId: team.registrations?.[0]?.id, - })); - } - - async findOne(id: number, tenantId?: number, strictTenantCheck = false) { - const where: any = { - id, - validState: 1, - }; - - // 只有明确要求严格租户检查时才限制 tenantId - // 通过 ID 查询单个团队时,ID 已经是唯一的,不需要再限制 tenantId - if (tenantId && strictTenantCheck) { - where.tenantId = tenantId; - } - - const team = await this.prisma.contestTeam.findFirst({ - where, - include: { - contest: { - select: { - id: true, - contestName: true, - contestType: true, - }, - }, - leader: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - members: { - where: { - role: { in: ['leader', 'member'] }, // 只查询队长和队员,不包含指导老师 - }, - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - registrations: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }); - - if (!team) { - throw new NotFoundException('团队不存在'); - } - - return team; - } - - async update( - id: number, - updateTeamDto: UpdateTeamDto, - tenantId: number, - modifierId?: number, - ) { - const team = await this.findOne(id, tenantId); - - // 检查团队名称是否重复 - if (updateTeamDto.teamName && updateTeamDto.teamName !== team.teamName) { - const existing = await this.prisma.contestTeam.findFirst({ - where: { - tenantId, - contestId: team.contestId, - teamName: updateTeamDto.teamName, - validState: 1, - id: { not: id }, - }, - }); - - if (existing) { - throw new ConflictException('团队名称已存在'); - } - } - - const data: any = {}; - - if (updateTeamDto.teamName !== undefined) { - data.teamName = updateTeamDto.teamName; - } - if (updateTeamDto.maxMembers !== undefined) { - data.maxMembers = updateTeamDto.maxMembers; - } - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.contestTeam.update({ - where: { id }, - data, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - leader: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - members: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }); - } - - async inviteMember( - teamId: number, - inviteMemberDto: InviteMemberDto, - tenantId: number, - creatorId?: number, - ) { - const team = await this.findOne(teamId, tenantId); - - // 检查成员数量限制 - const memberCount = await this.prisma.contestTeamMember.count({ - where: { teamId }, - }); - - if (team.maxMembers && memberCount >= team.maxMembers) { - throw new BadRequestException('团队人数已达上限'); - } - - // 验证用户是否存在 - const user = await this.prisma.user.findUnique({ - where: { id: inviteMemberDto.userId }, - }); - - if (!user) { - throw new NotFoundException('用户不存在'); - } - - if (user.tenantId !== tenantId) { - throw new BadRequestException('用户不属于当前租户'); - } - - // 检查是否已是成员 - const existing = await this.prisma.contestTeamMember.findFirst({ - where: { - tenantId, - teamId, - userId: inviteMemberDto.userId, - }, - }); - - if (existing) { - throw new ConflictException('用户已是团队成员'); - } - - // 检查用户是否已加入其他团队(同一活动) - const otherTeam = await this.prisma.contestTeamMember.findFirst({ - where: { - tenantId, - userId: inviteMemberDto.userId, - team: { - contestId: team.contestId, - validState: 1, - }, - }, - }); - - if (otherTeam) { - throw new ConflictException('用户已加入其他团队'); - } - - return this.prisma.contestTeamMember.create({ - data: { - tenantId, - teamId, - userId: inviteMemberDto.userId, - role: inviteMemberDto.role || 'member', - creator: creatorId, - }, - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - team: { - select: { - id: true, - teamName: true, - }, - }, - }, - }); - } - - async removeMember(teamId: number, userId: number, tenantId: number) { - const team = await this.findOne(teamId, tenantId); - - // 不能移除队长 - if (team.leaderUserId === userId) { - throw new BadRequestException('不能移除队长'); - } - - const member = await this.prisma.contestTeamMember.findFirst({ - where: { - tenantId, - teamId, - userId, - }, - }); - - if (!member) { - throw new NotFoundException('成员不存在'); - } - - return this.prisma.contestTeamMember.delete({ - where: { id: member.id }, - }); - } - - async remove(teamId: number, tenantId: number) { - const team = await this.findOne(teamId, tenantId); - - // 检查是否有报名记录 - const registrationCount = await this.prisma.contestRegistration.count({ - where: { teamId }, - }); - - if (registrationCount > 0) { - throw new BadRequestException('团队已有报名记录,无法删除'); - } - - // 软删除 - return this.prisma.contestTeam.update({ - where: { id: teamId }, - data: { - validState: 2, - }, - }); - } -} - diff --git a/backend/src/contests/works/dto/query-guided-work.dto.ts b/backend/src/contests/works/dto/query-guided-work.dto.ts deleted file mode 100644 index 80431b8..0000000 --- a/backend/src/contests/works/dto/query-guided-work.dto.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IsOptional, IsString, IsInt, Min, Max } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class QueryGuidedWorkDto { - @IsInt() - @Min(1) - @Type(() => Number) - @IsOptional() - page?: number = 1; - - @IsInt() - @Min(1) - @Max(100) - @Type(() => Number) - @IsOptional() - pageSize?: number = 10; - - @IsInt() - @Type(() => Number) - @IsOptional() - contestId?: number; - - @IsString() - @IsOptional() - workNo?: string; - - @IsString() - @IsOptional() - playerName?: string; - - @IsString() - @IsOptional() - accountNo?: string; -} diff --git a/backend/src/contests/works/dto/query-work.dto.ts b/backend/src/contests/works/dto/query-work.dto.ts deleted file mode 100644 index f643a88..0000000 --- a/backend/src/contests/works/dto/query-work.dto.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { IsOptional, IsString, IsEnum, IsInt, Min, Max } from 'class-validator'; -import { Type } from 'class-transformer'; - -export enum WorkStatus { - SUBMITTED = 'submitted', - LOCKED = 'locked', - REVIEWING = 'reviewing', - ACCEPTED = 'accepted', - REJECTED = 'rejected', -} - -export class QueryWorkDto { - @IsInt() - @Min(1) - @Type(() => Number) - @IsOptional() - page?: number = 1; - - @IsInt() - @Min(1) - @Max(100) - @Type(() => Number) - @IsOptional() - pageSize?: number = 10; - - @IsInt() - @Type(() => Number) - @IsOptional() - contestId?: number; - - @IsInt() - @Type(() => Number) - @IsOptional() - registrationId?: number; - - @IsEnum(WorkStatus) - @IsOptional() - status?: WorkStatus; - - @IsString() - @IsOptional() - title?: string; - - @IsString() - @IsOptional() - workNo?: string; - - @IsString() - @IsOptional() - username?: string; - - @IsString() - @IsOptional() - keyword?: string; // 搜索作品编号、提交者姓名 - - @IsString() - @IsOptional() - name?: string; // 选手/队伍名称 - - @IsString() - @IsOptional() - assignStatus?: string; // assigned / unassigned - - @IsInt() - @Type(() => Number) - @IsOptional() - tenantId?: number; - - @IsString() - @IsOptional() - submitStartTime?: string; - - @IsString() - @IsOptional() - submitEndTime?: string; -} - diff --git a/backend/src/contests/works/dto/submit-work.dto.ts b/backend/src/contests/works/dto/submit-work.dto.ts deleted file mode 100644 index edafde6..0000000 --- a/backend/src/contests/works/dto/submit-work.dto.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { IsString, IsInt, IsOptional, IsObject, IsArray, ValidateNested } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class AttachmentDto { - @IsString() - fileName: string; - - @IsString() - fileUrl: string; - - @IsString() - @IsOptional() - fileType?: string; - - @IsString() - @IsOptional() - size?: string; -} - -export class SubmitWorkDto { - @IsInt() - registrationId: number; - - @IsString() - title: string; - - @IsString() - @IsOptional() - description?: string; - - @IsArray() - @IsString({ each: true }) - @IsOptional() - files?: string[]; - - @IsString() - @IsOptional() - previewUrl?: string; - - @IsArray() - @IsString({ each: true }) - @IsOptional() - previewUrls?: string[]; - - @IsObject() - @IsOptional() - aiModelMeta?: any; - - @IsArray() - @ValidateNested({ each: true }) - @Type(() => AttachmentDto) - @IsOptional() - attachments?: AttachmentDto[]; -} - diff --git a/backend/src/contests/works/works.controller.ts b/backend/src/contests/works/works.controller.ts deleted file mode 100644 index 25ee695..0000000 --- a/backend/src/contests/works/works.controller.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Param, - Delete, - Query, - UseGuards, - Request, - ParseIntPipe, -} from '@nestjs/common'; -import { WorksService } from './works.service'; -import { SubmitWorkDto } from './dto/submit-work.dto'; -import { QueryWorkDto } from './dto/query-work.dto'; -import { QueryGuidedWorkDto } from './dto/query-guided-work.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; - -@Controller('contests/works') -@UseGuards(JwtAuthGuard) -export class WorksController { - constructor(private readonly worksService: WorksService) {} - - @Post('submit') - @RequirePermission('work:submit') - submit(@Body() submitWorkDto: SubmitWorkDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new Error('无法确定租户信息'); - } - const submitterUserId = req.user?.userId; - if (!submitterUserId) { - throw new Error('无法确定提交人信息'); - } - return this.worksService.submit(submitWorkDto, tenantId, submitterUserId); - } - - @Get('stats') - @RequirePermission('work:read') - getStats(@Query('contestId') contestId?: string) { - return this.worksService.getStats(contestId ? parseInt(contestId) : undefined); - } - - @Get() - @RequirePermission('work:read') - findAll(@Query() queryDto: QueryWorkDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.worksService.findAll(queryDto, tenantId); - } - - /** - * 获取教师指导的作品列表 - */ - @Get('guided') - @RequirePermission('activity:read') - findGuidedWorks( - @Query() queryDto: QueryGuidedWorkDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - const teacherUserId = req.user?.userId; - if (!teacherUserId) { - throw new Error('无法确定教师信息'); - } - return this.worksService.findGuidedWorks(queryDto, tenantId, teacherUserId); - } - - @Get(':id') - @RequirePermission('work:read') - findOne(@Param('id', ParseIntPipe) id: number, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.worksService.findOne(id, tenantId); - } - - @Get('registration/:registrationId/versions') - @RequirePermission('work:read') - getVersions( - @Param('registrationId', ParseIntPipe) registrationId: number, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.worksService.getVersions(registrationId, tenantId); - } - - @Delete(':id') - @RequirePermission('work:update') - remove(@Param('id', ParseIntPipe) id: number, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.worksService.remove(id, tenantId); - } -} diff --git a/backend/src/contests/works/works.module.ts b/backend/src/contests/works/works.module.ts deleted file mode 100644 index 6eb59e3..0000000 --- a/backend/src/contests/works/works.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { WorksService } from './works.service'; -import { WorksController } from './works.controller'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [WorksController], - providers: [WorksService], - exports: [WorksService], -}) -export class WorksModule {} - diff --git a/backend/src/contests/works/works.service.ts b/backend/src/contests/works/works.service.ts deleted file mode 100644 index 162becd..0000000 --- a/backend/src/contests/works/works.service.ts +++ /dev/null @@ -1,718 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, - ConflictException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { SubmitWorkDto } from './dto/submit-work.dto'; -import { QueryWorkDto } from './dto/query-work.dto'; - -@Injectable() -export class WorksService { - constructor(private prisma: PrismaService) {} - - async submit( - submitWorkDto: SubmitWorkDto, - tenantId: number, - submitterUserId: number, - ) { - // 验证报名记录是否存在 - const registration = await this.prisma.contestRegistration.findUnique({ - where: { id: submitWorkDto.registrationId }, - include: { - contest: true, - }, - }); - - if (!registration) { - throw new NotFoundException('报名记录不存在'); - } - - if (registration.tenantId !== tenantId) { - throw new BadRequestException('报名记录不属于当前租户'); - } - - // 检查报名状态 - if (registration.registrationState !== 'passed') { - throw new BadRequestException('报名未通过审核,无法提交作品'); - } - - // 检查提交时间 - const now = new Date(); - if ( - now < registration.contest.submitStartTime || - now > registration.contest.submitEndTime - ) { - throw new BadRequestException('不在作品提交时间范围内'); - } - - // 检查提交规则 - const existingWorks = await this.prisma.contestWork.findMany({ - where: { - registrationId: submitWorkDto.registrationId, - validState: 1, - }, - orderBy: { - version: 'desc', - }, - }); - - if ( - registration.contest.submitRule === 'once' && - existingWorks.length > 0 - ) { - throw new ConflictException('该活动只允许提交一次作品'); - } - - // 如果已有作品,将旧版本标记为非最新 - if (existingWorks.length > 0) { - await this.prisma.contestWork.updateMany({ - where: { - registrationId: submitWorkDto.registrationId, - validState: 1, - }, - data: { - isLatest: false, - }, - }); - } - - // 生成作品编号 - const workNo = await this.generateWorkNo(registration.contestId, tenantId); - - // 获取提交人信息(必须包含租户ID以确保多租户隔离) - if (!submitterUserId) { - throw new BadRequestException('提交人ID不能为空'); - } - - const submitter = await this.prisma.user.findFirst({ - where: { - id: submitterUserId, - tenantId, - validState: 1, - }, - }); - - if (!submitter) { - throw new NotFoundException('提交人不存在或不属于当前租户'); - } - - // 创建新版本作品 - const data: any = { - tenantId, - contestId: registration.contestId, - registrationId: submitWorkDto.registrationId, - workNo, - title: submitWorkDto.title, - description: submitWorkDto.description, - files: submitWorkDto.files || null, - version: existingWorks.length > 0 ? existingWorks[0].version + 1 : 1, - isLatest: true, - status: 'submitted', - submitTime: new Date(), - submitterUserId, - submitterAccountNo: submitter?.username, - submitSource: 'student', // 可以根据实际情况判断 - previewUrl: submitWorkDto.previewUrl, - previewUrls: submitWorkDto.previewUrls || null, - aiModelMeta: submitWorkDto.aiModelMeta || null, - creator: submitterUserId, - }; - - // 使用事务创建作品和附件 - return this.prisma.$transaction(async (tx) => { - const work = await tx.contestWork.create({ - data, - }); - - // 创建附件记录 - if (submitWorkDto.attachments && submitWorkDto.attachments.length > 0) { - for (const attachment of submitWorkDto.attachments) { - await tx.contestWorkAttachment.create({ - data: { - tenantId, - contestId: registration.contestId, - workId: work.id, - fileName: attachment.fileName, - fileUrl: attachment.fileUrl, - fileType: attachment.fileType, - size: attachment.size, - creator: submitterUserId, - }, - }); - } - } - - // 返回完整的作品信息 - return tx.contestWork.findUnique({ - where: { id: work.id }, - include: { - contest: { - select: { - id: true, - contestName: true, - }, - }, - registration: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - attachments: true, - }, - }); - }); - } - - /** - * 生成作品编号 - */ - private async generateWorkNo( - contestId: number, - tenantId: number, - ): Promise { - const prefix = `WORK-${contestId}-${tenantId}-`; - const count = await this.prisma.contestWork.count({ - where: { - contestId, - tenantId, - }, - }); - - return `${prefix}${String(count + 1).padStart(6, '0')}`; - } - - /** - * 作品统计(仅超管) - */ - async getStats(contestId?: number) { - const baseWhere: any = { validState: 1, isLatest: true }; - if (contestId) baseWhere.contestId = contestId; - - const [total, submitted, reviewing] = await Promise.all([ - this.prisma.contestWork.count({ where: baseWhere }), - this.prisma.contestWork.count({ where: { ...baseWhere, status: 'submitted' } }), - this.prisma.contestWork.count({ where: { ...baseWhere, status: 'reviewing' } }), - ]); - - // reviewed = 有评分记录的作品 - const reviewed = await this.prisma.contestWork.count({ - where: { - ...baseWhere, - scores: { some: { validState: 1 } }, - }, - }); - - return { total, submitted: total - reviewing - reviewed, reviewing, reviewed }; - } - - async findAll(queryDto: QueryWorkDto, tenantId?: number) { - const { - page = 1, - pageSize = 10, - contestId, - registrationId, - status, - title, - workNo, - username, - keyword, - } = queryDto; - const skip = (page - 1) * pageSize; - - // 检查是否为超级租户 - let isSuper = false; - if (tenantId) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantId }, - select: { isSuper: true }, - }); - isSuper = tenant?.isSuper === 1; - } - - const where: any = { - validState: 1, - isLatest: true, // 默认只查询最新版本 - }; - - // 超级租户可以看到所有作品,普通租户只能看到自己租户的作品 - if (tenantId && !isSuper) { - where.tenantId = tenantId; - } - - if (contestId) { - where.contestId = contestId; - } - - if (registrationId) { - where.registrationId = registrationId; - } - - if (status) { - where.status = status; - } - - if (title) { - where.title = { - contains: title, - }; - } - - if (workNo) { - where.workNo = { - contains: workNo, - }; - } - - if (username) { - where.OR = [ - { - submitterAccountNo: { - contains: username, - }, - }, - { - registration: { - user: { - username: { - contains: username, - }, - }, - }, - }, - ]; - } - - // keyword: 搜索作品编号、提交者姓名 - if (keyword && !username) { - where.OR = [ - { workNo: { contains: keyword } }, - { submitterAccountNo: { contains: keyword } }, - { registration: { user: { nickname: { contains: keyword } } } }, - { registration: { user: { username: { contains: keyword } } } }, - { registration: { team: { teamName: { contains: keyword } } } }, - ]; - } - - // 选手/队伍名称搜索 - if (queryDto.name) { - const nameWhere = [ - { registration: { user: { nickname: { contains: queryDto.name } } } }, - { registration: { team: { teamName: { contains: queryDto.name } } } }, - ]; - where.OR = where.OR ? [...where.OR, ...nameWhere] : nameWhere; - } - - // 分配状态筛选 - if (queryDto.assignStatus === 'assigned') { - where.assignments = { some: {} }; - } else if (queryDto.assignStatus === 'unassigned') { - where.assignments = { none: {} }; - } - - // 指定租户筛选(超管用) - if (queryDto.tenantId) { - where.tenantId = queryDto.tenantId; - } - - // 递交时间范围 - if (queryDto.submitStartTime || queryDto.submitEndTime) { - where.submitTime = {}; - if (queryDto.submitStartTime) where.submitTime.gte = new Date(queryDto.submitStartTime); - if (queryDto.submitEndTime) where.submitTime.lte = new Date(queryDto.submitEndTime + ' 23:59:59'); - } - - const [list, total] = await Promise.all([ - this.prisma.contestWork.findMany({ - where, - skip, - take: pageSize, - orderBy: { - submitTime: 'desc', - }, - include: { - contest: { - select: { - id: true, - contestName: true, - reviewRuleId: true, - reviewRule: { - select: { - judgeCount: true, - }, - }, - }, - }, - registration: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - team: { - select: { - id: true, - teamName: true, - }, - }, - }, - }, - attachments: true, - scores: { - where: { validState: 1 }, - select: { - id: true, - totalScore: true, - }, - }, - assignments: { - include: { - judge: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - _count: { - select: { - scores: true, - assignments: true, - }, - }, - }, - }), - this.prisma.contestWork.count({ where }), - ]); - - // 计算评审统计数据 - const enrichedList = list.map((work) => { - const reviewedCount = work._count?.scores || 0; - const totalJudgesCount = - work.contest?.reviewRule?.judgeCount || work._count?.assignments || 0; - - // 计算平均分 - let averageScore: number | null = null; - if (work.scores && work.scores.length > 0) { - const totalScore = work.scores.reduce( - (sum, score) => sum + Number(score.totalScore || 0), - 0, - ); - averageScore = totalScore / work.scores.length; - } - - return { - ...work, - reviewedCount, - totalJudgesCount, - averageScore, - }; - }); - - return { - list: enrichedList, - total, - page, - pageSize, - }; - } - - async findOne(id: number, tenantId?: number) { - // 检查是否为超级租户 - let isSuper = false; - if (tenantId) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantId }, - select: { isSuper: true }, - }); - isSuper = tenant?.isSuper === 1; - } - - const where: any = { - id, - validState: 1, - }; - - // 超级租户可以查看所有作品 - if (tenantId && !isSuper) { - where.tenantId = tenantId; - } - - const work = await this.prisma.contestWork.findFirst({ - where, - include: { - contest: true, - registration: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - team: { - include: { - members: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }, - }, - }, - attachments: true, - assignments: { - include: { - judge: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - scores: { - where: { validState: 1 }, - include: { - judge: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - }, - }); - - if (!work) { - throw new NotFoundException('作品不存在'); - } - - return work; - } - - async getVersions(registrationId: number, tenantId?: number) { - const where: any = { - registrationId, - validState: 1, - }; - - if (tenantId) { - where.tenantId = tenantId; - } - - return this.prisma.contestWork.findMany({ - where, - orderBy: { - version: 'desc', - }, - include: { - attachments: true, - _count: { - select: { - scores: true, - }, - }, - }, - }); - } - - async remove(id: number, tenantId?: number) { - await this.findOne(id, tenantId); - - // 检查是否已有评分 - const scoreCount = await this.prisma.contestWorkScore.count({ - where: { workId: id }, - }); - - if (scoreCount > 0) { - throw new BadRequestException('作品已有评分,无法删除'); - } - - // 软删除 - return this.prisma.contestWork.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } - - /** - * 获取教师指导的作品列表 - * @param queryDto 查询参数 - * @param tenantId 租户ID - * @param teacherUserId 教师用户ID - */ - async findGuidedWorks( - queryDto: { - page?: number; - pageSize?: number; - contestId?: number; - workNo?: string; - playerName?: string; - accountNo?: string; - }, - tenantId: number, - teacherUserId: number, - ) { - const { - page = 1, - pageSize = 10, - contestId, - workNo, - playerName, - accountNo, - } = queryDto; - const skip = (page - 1) * pageSize; - - // 首先获取该教师指导的所有报名记录ID - const teacherRegistrations = await this.prisma.contestRegistrationTeacher.findMany({ - where: { - userId: teacherUserId, - ...(tenantId && { tenantId }), - }, - select: { - registrationId: true, - }, - }); - - const registrationIds = teacherRegistrations.map((r) => r.registrationId); - - if (registrationIds.length === 0) { - return { - list: [], - total: 0, - page, - pageSize, - }; - } - - // 构建查询条件 - const where: any = { - validState: 1, - isLatest: true, - registrationId: { in: registrationIds }, - }; - - if (contestId) { - where.contestId = Number(contestId); - } - - if (workNo) { - where.workNo = { - contains: workNo, - }; - } - - // 处理选手姓名和报名账号的查询 - if (playerName || accountNo) { - const userConditions: any = {}; - if (playerName) { - userConditions.nickname = { contains: playerName }; - } - if (accountNo) { - userConditions.username = { contains: accountNo }; - } - where.registration = { - user: userConditions, - }; - } - - const [list, total] = await Promise.all([ - this.prisma.contestWork.findMany({ - where, - skip, - take: pageSize, - orderBy: { - submitTime: 'desc', - }, - include: { - contest: { - select: { - id: true, - contestName: true, - reviewRuleId: true, - reviewRule: { - select: { - judgeCount: true, - }, - }, - }, - }, - registration: { - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }, - scores: { - where: { validState: 1 }, - select: { - id: true, - totalScore: true, - }, - }, - _count: { - select: { - scores: true, - assignments: true, - }, - }, - }, - }), - this.prisma.contestWork.count({ where }), - ]); - - // 计算评审进度 - const enrichedList = list.map((work) => { - const reviewedCount = work._count?.scores || 0; - const totalJudgesCount = - work.contest?.reviewRule?.judgeCount || work._count?.assignments || 0; - - return { - ...work, - reviewedCount, - totalJudgesCount, - reviewProgress: totalJudgesCount > 0 - ? `${reviewedCount}/${totalJudgesCount}` - : '未分配', - }; - }); - - return { - list: enrichedList, - total, - page, - pageSize, - }; - } -} diff --git a/backend/src/dict/dict.controller.ts b/backend/src/dict/dict.controller.ts deleted file mode 100644 index a1cdd7e..0000000 --- a/backend/src/dict/dict.controller.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, -} from '@nestjs/common'; -import { DictService } from './dict.service'; -import { CreateDictDto } from './dto/create-dict.dto'; -import { UpdateDictDto } from './dto/update-dict.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; - -@Controller('dict') -@UseGuards(JwtAuthGuard) -export class DictController { - constructor(private readonly dictService: DictService) {} - - @Post() - create(@Body() createDictDto: CreateDictDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new Error('无法确定租户信息'); - } - return this.dictService.create(createDictDto, tenantId); - } - - @Get() - findAll( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Request() req?: any, - ) { - const tenantId = req?.tenantId || req?.user?.tenantId; - return this.dictService.findAll( - page ? parseInt(page) : 1, - pageSize ? parseInt(pageSize) : 10, - tenantId, - ); - } - - @Get('code/:code') - findByCode(@Param('code') code: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.dictService.findByCode(code, tenantId); - } - - @Get(':id') - findOne(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.dictService.findOne(+id, tenantId); - } - - @Patch(':id') - update( - @Param('id') id: string, - @Body() updateDictDto: UpdateDictDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.dictService.update(+id, updateDictDto, tenantId); - } - - @Delete(':id') - remove(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.dictService.remove(+id, tenantId); - } -} diff --git a/backend/src/dict/dict.module.ts b/backend/src/dict/dict.module.ts deleted file mode 100644 index aada389..0000000 --- a/backend/src/dict/dict.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; -import { DictService } from './dict.service'; -import { DictController } from './dict.controller'; - -@Module({ - controllers: [DictController], - providers: [DictService], -}) -export class DictModule {} diff --git a/backend/src/dict/dict.service.ts b/backend/src/dict/dict.service.ts deleted file mode 100644 index 6fe5f5d..0000000 --- a/backend/src/dict/dict.service.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateDictDto } from './dto/create-dict.dto'; -import { UpdateDictDto } from './dto/update-dict.dto'; - -@Injectable() -export class DictService { - constructor(private prisma: PrismaService) {} - - async create(createDictDto: CreateDictDto, tenantId: number) { - return this.prisma.dict.create({ - data: { - ...createDictDto, - tenantId, - }, - }); - } - - async findAll(page: number = 1, pageSize: number = 10, tenantId?: number) { - const skip = (page - 1) * pageSize; - const where = tenantId ? { tenantId } : {}; - - const [list, total] = await Promise.all([ - this.prisma.dict.findMany({ - where, - skip, - take: pageSize, - include: { - items: { - orderBy: { - sort: 'asc', - }, - }, - }, - }), - this.prisma.dict.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - async findOne(id: number, tenantId?: number) { - const where: any = { id }; - if (tenantId) { - where.tenantId = tenantId; - } - - const dict = await this.prisma.dict.findFirst({ - where, - include: { - items: { - orderBy: { - sort: 'asc', - }, - }, - }, - }); - - if (!dict) { - throw new NotFoundException('字典不存在'); - } - - return dict; - } - - async findByCode(code: string, tenantId?: number) { - if (!tenantId) { - throw new NotFoundException('无法确定租户信息'); - } - - return this.prisma.dict.findFirst({ - where: { - code, - tenantId, - }, - include: { - items: { - where: { - validState: 1, - }, - orderBy: { - sort: 'asc', - }, - }, - }, - }); - } - - async update(id: number, updateDictDto: UpdateDictDto, tenantId?: number) { - // 验证字典是否存在且属于该租户 - await this.findOne(id, tenantId); - - return this.prisma.dict.update({ - where: { id }, - data: updateDictDto, - }); - } - - async remove(id: number, tenantId?: number) { - // 验证字典是否存在且属于该租户 - await this.findOne(id, tenantId); - - return this.prisma.dict.delete({ - where: { id }, - }); - } -} diff --git a/backend/src/dict/dto/create-dict.dto.ts b/backend/src/dict/dto/create-dict.dto.ts deleted file mode 100644 index c9d8c0a..0000000 --- a/backend/src/dict/dto/create-dict.dto.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IsString, IsOptional } from 'class-validator'; - -export class CreateDictDto { - @IsString() - name: string; - - @IsString() - code: string; - - @IsString() - @IsOptional() - description?: string; -} diff --git a/backend/src/dict/dto/update-dict.dto.ts b/backend/src/dict/dto/update-dict.dto.ts deleted file mode 100644 index ea80bb5..0000000 --- a/backend/src/dict/dto/update-dict.dto.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IsString, IsOptional } from 'class-validator'; - -export class UpdateDictDto { - @IsString() - @IsOptional() - name?: string; - - @IsString() - @IsOptional() - code?: string; - - @IsString() - @IsOptional() - description?: string; -} diff --git a/backend/src/homework/homework.module.ts b/backend/src/homework/homework.module.ts deleted file mode 100644 index 6c085a0..0000000 --- a/backend/src/homework/homework.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Module } from '@nestjs/common'; -import { HomeworksModule } from './homeworks/homeworks.module'; -import { SubmissionsModule } from './submissions/submissions.module'; -import { HomeworkReviewRulesModule } from './review-rules/review-rules.module'; -import { HomeworkScoresModule } from './scores/scores.module'; - -@Module({ - imports: [ - HomeworksModule, - SubmissionsModule, - HomeworkReviewRulesModule, - HomeworkScoresModule, - ], - exports: [ - HomeworksModule, - SubmissionsModule, - HomeworkReviewRulesModule, - HomeworkScoresModule, - ], -}) -export class HomeworkModule {} diff --git a/backend/src/homework/homeworks/dto/create-homework.dto.ts b/backend/src/homework/homeworks/dto/create-homework.dto.ts deleted file mode 100644 index 689c23e..0000000 --- a/backend/src/homework/homeworks/dto/create-homework.dto.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - IsString, - IsOptional, - IsArray, - IsDateString, - IsInt, - ValidateNested, -} from 'class-validator'; -import { Type } from 'class-transformer'; - -export class AttachmentDto { - @IsString() - fileName: string; - - @IsString() - fileUrl: string; - - @IsOptional() - @IsString() - size?: string; -} - -export class CreateHomeworkDto { - @IsString() - name: string; - - @IsOptional() - @IsString() - content?: string; - - @IsDateString() - submitStartTime: string; - - @IsDateString() - submitEndTime: string; - - @IsOptional() - @IsArray() - @ValidateNested({ each: true }) - @Type(() => AttachmentDto) - attachments?: AttachmentDto[]; - - @IsOptional() - @IsArray() - @IsInt({ each: true }) - publishScope?: number[]; - - @IsOptional() - @IsInt() - reviewRuleId?: number; -} diff --git a/backend/src/homework/homeworks/dto/query-homework.dto.ts b/backend/src/homework/homeworks/dto/query-homework.dto.ts deleted file mode 100644 index b8700ff..0000000 --- a/backend/src/homework/homeworks/dto/query-homework.dto.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { IsOptional, IsString, IsInt, IsDateString } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class QueryHomeworkDto { - @IsOptional() - @Type(() => Number) - @IsInt() - page?: number = 1; - - @IsOptional() - @Type(() => Number) - @IsInt() - pageSize?: number = 10; - - @IsOptional() - @IsString() - name?: string; - - @IsOptional() - @IsString() - status?: string; - - @IsOptional() - @IsDateString() - submitStartTime?: string; - - @IsOptional() - @IsDateString() - submitEndTime?: string; -} diff --git a/backend/src/homework/homeworks/dto/update-homework.dto.ts b/backend/src/homework/homeworks/dto/update-homework.dto.ts deleted file mode 100644 index 6fb4474..0000000 --- a/backend/src/homework/homeworks/dto/update-homework.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateHomeworkDto } from './create-homework.dto'; - -export class UpdateHomeworkDto extends PartialType(CreateHomeworkDto) {} diff --git a/backend/src/homework/homeworks/homeworks.controller.ts b/backend/src/homework/homeworks/homeworks.controller.ts deleted file mode 100644 index e84f427..0000000 --- a/backend/src/homework/homeworks/homeworks.controller.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - ParseIntPipe, - Query, -} from '@nestjs/common'; -import { HomeworksService } from './homeworks.service'; -import { CreateHomeworkDto } from './dto/create-homework.dto'; -import { UpdateHomeworkDto } from './dto/update-homework.dto'; -import { QueryHomeworkDto } from './dto/query-homework.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; -import { CurrentTenantId } from '../../auth/decorators/current-tenant-id.decorator'; - -@Controller('homework/homeworks') -@UseGuards(JwtAuthGuard) -export class HomeworksController { - constructor(private readonly homeworksService: HomeworksService) {} - - /** - * 分页查询作业列表 - */ - @Get() - @RequirePermission('homework:read') - findAll( - @Query() queryDto: QueryHomeworkDto, - @CurrentTenantId() tenantId?: number, - ) { - return this.homeworksService.findAll(queryDto, tenantId); - } - - /** - * 获取我的作业列表(学生端) - * 只返回已发布且对当前学生可见的作业,包含提交状态 - */ - @Get('my') - @RequirePermission('homework-submission:create', 'homework-submission:read') - findMyHomeworks( - @Query() queryDto: QueryHomeworkDto, - @CurrentTenantId() tenantId: number, - @Request() req, - ) { - const userId = req?.user?.userId; - return this.homeworksService.findMyHomeworks(queryDto, tenantId, userId); - } - - /** - * 创建作业 - */ - @Post() - @RequirePermission('homework:create') - create( - @Body() createHomeworkDto: CreateHomeworkDto, - @CurrentTenantId() tenantId: number, - @Request() req?, - ) { - const creatorId = req?.user?.id; - return this.homeworksService.create(createHomeworkDto, tenantId, creatorId); - } - - /** - * 根据ID查找作业 - */ - @Get(':id') - @RequirePermission('homework:read', 'homework:student:read') - findById( - @Param('id', ParseIntPipe) id: number, - @CurrentTenantId() tenantId?: number, - ) { - return this.homeworksService.findById(id, tenantId); - } - - /** - * 更新作业 - */ - @Patch(':id') - @RequirePermission('homework:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateHomeworkDto: UpdateHomeworkDto, - @CurrentTenantId() tenantId?: number, - @Request() req?, - ) { - const modifierId = req?.user?.id; - return this.homeworksService.update(id, updateHomeworkDto, tenantId, modifierId); - } - - /** - * 发布作业 - */ - @Post(':id/publish') - @RequirePermission('homework:update') - publish( - @Param('id', ParseIntPipe) id: number, - @Body('publishScope') publishScope: number[], - @CurrentTenantId() tenantId?: number, - @Request() req?, - ) { - const modifierId = req?.user?.id; - return this.homeworksService.publish(id, publishScope, tenantId, modifierId); - } - - /** - * 取消发布作业 - */ - @Post(':id/unpublish') - @RequirePermission('homework:update') - unpublish( - @Param('id', ParseIntPipe) id: number, - @CurrentTenantId() tenantId?: number, - @Request() req?, - ) { - const modifierId = req?.user?.id; - return this.homeworksService.unpublish(id, tenantId, modifierId); - } - - /** - * 删除作业(软删除) - */ - @Delete(':id') - @RequirePermission('homework:delete') - remove( - @Param('id', ParseIntPipe) id: number, - @CurrentTenantId() tenantId?: number, - ) { - return this.homeworksService.remove(id, tenantId); - } -} diff --git a/backend/src/homework/homeworks/homeworks.module.ts b/backend/src/homework/homeworks/homeworks.module.ts deleted file mode 100644 index ef601a6..0000000 --- a/backend/src/homework/homeworks/homeworks.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { HomeworksController } from './homeworks.controller'; -import { HomeworksService } from './homeworks.service'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [HomeworksController], - providers: [HomeworksService], - exports: [HomeworksService], -}) -export class HomeworksModule {} diff --git a/backend/src/homework/homeworks/homeworks.service.ts b/backend/src/homework/homeworks/homeworks.service.ts deleted file mode 100644 index 81866c6..0000000 --- a/backend/src/homework/homeworks/homeworks.service.ts +++ /dev/null @@ -1,430 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateHomeworkDto } from './dto/create-homework.dto'; -import { UpdateHomeworkDto } from './dto/update-homework.dto'; -import { QueryHomeworkDto } from './dto/query-homework.dto'; - -@Injectable() -export class HomeworksService { - constructor(private prisma: PrismaService) {} - - /** - * 创建作业 - */ - async create( - createHomeworkDto: CreateHomeworkDto, - tenantId: number, - creatorId?: number, - ) { - const data: any = { - tenantId, - name: createHomeworkDto.name, - content: createHomeworkDto.content || null, - submitStartTime: new Date(createHomeworkDto.submitStartTime), - submitEndTime: new Date(createHomeworkDto.submitEndTime), - status: 'unpublished', - }; - - if (createHomeworkDto.attachments) { - data.attachments = JSON.stringify(createHomeworkDto.attachments); - } - - if (createHomeworkDto.publishScope) { - data.publishScope = JSON.stringify(createHomeworkDto.publishScope); - } - - if (createHomeworkDto.reviewRuleId) { - data.reviewRuleId = createHomeworkDto.reviewRuleId; - } - - if (creatorId) { - data.creator = creatorId; - } - - return this.prisma.homework.create({ - data, - include: { - reviewRule: { - select: { - id: true, - name: true, - }, - }, - }, - }); - } - - /** - * 根据ID查找作业 - */ - async findById(id: number, tenantId?: number) { - const where: any = { id, validState: 1 }; - if (tenantId) { - where.tenantId = tenantId; - } - - const homework = await this.prisma.homework.findFirst({ - where, - include: { - reviewRule: { - select: { - id: true, - name: true, - description: true, - criteria: true, - }, - }, - _count: { - select: { - submissions: true, - }, - }, - }, - }); - - if (!homework) { - throw new NotFoundException('作业不存在'); - } - - return homework; - } - - /** - * 更新作业 - */ - async update( - id: number, - updateHomeworkDto: UpdateHomeworkDto, - tenantId?: number, - modifierId?: number, - ) { - const homework = await this.findById(id, tenantId); - - // 已发布的作业不能修改 - if (homework.status === 'published') { - throw new BadRequestException('已发布的作业不能修改'); - } - - const data: any = {}; - - if (updateHomeworkDto.name !== undefined) { - data.name = updateHomeworkDto.name; - } - if (updateHomeworkDto.content !== undefined) { - data.content = updateHomeworkDto.content; - } - if (updateHomeworkDto.submitStartTime !== undefined) { - data.submitStartTime = new Date(updateHomeworkDto.submitStartTime); - } - if (updateHomeworkDto.submitEndTime !== undefined) { - data.submitEndTime = new Date(updateHomeworkDto.submitEndTime); - } - if (updateHomeworkDto.attachments !== undefined) { - data.attachments = JSON.stringify(updateHomeworkDto.attachments); - } - if (updateHomeworkDto.publishScope !== undefined) { - data.publishScope = JSON.stringify(updateHomeworkDto.publishScope); - } - if (updateHomeworkDto.reviewRuleId !== undefined) { - data.reviewRuleId = updateHomeworkDto.reviewRuleId; - } - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.homework.update({ - where: { id }, - data, - include: { - reviewRule: { - select: { - id: true, - name: true, - }, - }, - }, - }); - } - - /** - * 发布作业 - */ - async publish(id: number, publishScope: number[], tenantId?: number, modifierId?: number) { - const homework = await this.findById(id, tenantId); - - if (homework.status === 'published') { - throw new BadRequestException('作业已发布'); - } - - if (!publishScope || publishScope.length === 0) { - throw new BadRequestException('请选择公开范围'); - } - - return this.prisma.homework.update({ - where: { id }, - data: { - status: 'published', - publishTime: new Date(), - publishScope: JSON.stringify(publishScope), - modifier: modifierId, - }, - }); - } - - /** - * 取消发布作业 - */ - async unpublish(id: number, tenantId?: number, modifierId?: number) { - const homework = await this.findById(id, tenantId); - - if (homework.status === 'unpublished') { - throw new BadRequestException('作业未发布'); - } - - // 检查是否有提交记录 - const submissionCount = await this.prisma.homeworkSubmission.count({ - where: { - homeworkId: id, - validState: 1, - }, - }); - - if (submissionCount > 0) { - throw new BadRequestException('已有学生提交作业,无法取消发布'); - } - - return this.prisma.homework.update({ - where: { id }, - data: { - status: 'unpublished', - publishTime: null, - modifier: modifierId, - }, - }); - } - - /** - * 删除作业(软删除) - */ - async remove(id: number, tenantId?: number) { - const homework = await this.findById(id, tenantId); - - // 检查是否有提交记录 - const submissionCount = await this.prisma.homeworkSubmission.count({ - where: { - homeworkId: id, - validState: 1, - }, - }); - - if (submissionCount > 0) { - throw new BadRequestException('已有学生提交作业,无法删除'); - } - - return this.prisma.homework.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } - - /** - * 分页查询作业列表 - */ - async findAll(queryDto: QueryHomeworkDto, tenantId?: number) { - const { page = 1, pageSize = 10, name, status, submitStartTime, submitEndTime } = queryDto; - const skip = (page - 1) * pageSize; - - const where: any = { - validState: 1, - }; - - if (tenantId) { - where.tenantId = tenantId; - } - - if (name) { - where.name = { - contains: name, - }; - } - - if (status) { - where.status = status; - } - - if (submitStartTime && submitEndTime) { - where.submitStartTime = { - gte: new Date(submitStartTime), - }; - where.submitEndTime = { - lte: new Date(submitEndTime), - }; - } - - const [data, total] = await Promise.all([ - this.prisma.homework.findMany({ - where, - skip, - take: pageSize, - include: { - reviewRule: { - select: { - id: true, - name: true, - }, - }, - _count: { - select: { - submissions: true, - }, - }, - }, - orderBy: { - createTime: 'desc', - }, - }), - this.prisma.homework.count({ where }), - ]); - - // 解析 publishScope 并获取班级名称 - const list = await Promise.all( - data.map(async (homework) => { - let publishScopeNames: string[] = []; - if (homework.publishScope) { - try { - const classIds = typeof homework.publishScope === 'string' - ? JSON.parse(homework.publishScope) - : homework.publishScope; - - // 注意:学校模块已剥离,班级名称暂不可用 - if (Array.isArray(classIds) && classIds.length > 0) { - publishScopeNames = classIds.map((id) => `班级${id}`); - } - } catch (e) { - // 解析失败,保持空数组 - } - } - return { - ...homework, - publishScopeNames, - }; - }), - ); - - return { - list, - total, - page, - pageSize, - }; - } - - /** - * 获取我的作业列表(学生端) - * 只返回已发布且对当前学生可见的作业,包含提交状态 - */ - async findMyHomeworks(queryDto: QueryHomeworkDto, tenantId: number, userId: number) { - const { page = 1, pageSize = 10, name } = queryDto; - const skip = (page - 1) * pageSize; - - // 注意: 学校模块已剥离,班级过滤暂不可用 - const studentClassId: number | undefined = undefined; - - // 构建查询条件 - const where: any = { - tenantId, - validState: 1, - status: 'published', - }; - - if (name) { - where.name = { - contains: name, - }; - } - - // 查询所有已发布的作业 - const allHomeworks = await this.prisma.homework.findMany({ - where, - orderBy: { - createTime: 'desc', - }, - include: { - reviewRule: { - select: { - id: true, - name: true, - }, - }, - }, - }); - - // 过滤出对当前学生可见的作业(根据 publishScope) - const visibleHomeworks = allHomeworks.filter((homework) => { - if (!homework.publishScope) { - // 没有设置公开范围,不可见 - return false; - } - - try { - const classIds = typeof homework.publishScope === 'string' - ? JSON.parse(homework.publishScope) - : homework.publishScope; - - if (!Array.isArray(classIds) || classIds.length === 0) { - return false; - } - - // 检查学生班级是否在公开范围内 - return studentClassId && classIds.includes(studentClassId); - } catch { - return false; - } - }); - - const total = visibleHomeworks.length; - const pagedHomeworks = visibleHomeworks.slice(skip, skip + pageSize); - - // 获取学生对这些作业的提交记录 - const homeworkIds = pagedHomeworks.map((h) => h.id); - const submissions = await this.prisma.homeworkSubmission.findMany({ - where: { - homeworkId: { in: homeworkIds }, - studentId: userId, - validState: 1, - }, - select: { - id: true, - homeworkId: true, - workName: true, - submitTime: true, - totalScore: true, - }, - }); - - // 构建提交记录映射 - const submissionMap = new Map( - submissions.map((s) => [s.homeworkId, s]), - ); - - // 组装返回数据 - const list = pagedHomeworks.map((homework) => ({ - ...homework, - submission: submissionMap.get(homework.id) || null, - })); - - return { - list, - total, - page, - pageSize, - }; - } -} diff --git a/backend/src/homework/review-rules/dto/create-review-rule.dto.ts b/backend/src/homework/review-rules/dto/create-review-rule.dto.ts deleted file mode 100644 index 52d63d0..0000000 --- a/backend/src/homework/review-rules/dto/create-review-rule.dto.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - IsString, - IsOptional, - IsArray, - ValidateNested, - IsNumber, -} from 'class-validator'; -import { Type } from 'class-transformer'; - -export class CriterionDto { - @IsString() - name: string; - - @IsNumber() - maxScore: number; - - @IsOptional() - @IsString() - description?: string; -} - -export class CreateHomeworkReviewRuleDto { - @IsString() - name: string; - - @IsOptional() - @IsString() - description?: string; - - @IsArray() - @ValidateNested({ each: true }) - @Type(() => CriterionDto) - criteria: CriterionDto[]; -} diff --git a/backend/src/homework/review-rules/dto/update-review-rule.dto.ts b/backend/src/homework/review-rules/dto/update-review-rule.dto.ts deleted file mode 100644 index e45a83c..0000000 --- a/backend/src/homework/review-rules/dto/update-review-rule.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateHomeworkReviewRuleDto } from './create-review-rule.dto'; - -export class UpdateHomeworkReviewRuleDto extends PartialType(CreateHomeworkReviewRuleDto) {} diff --git a/backend/src/homework/review-rules/review-rules.controller.ts b/backend/src/homework/review-rules/review-rules.controller.ts deleted file mode 100644 index 2f3daa2..0000000 --- a/backend/src/homework/review-rules/review-rules.controller.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - ParseIntPipe, - Query, -} from '@nestjs/common'; -import { HomeworkReviewRulesService } from './review-rules.service'; -import { CreateHomeworkReviewRuleDto } from './dto/create-review-rule.dto'; -import { UpdateHomeworkReviewRuleDto } from './dto/update-review-rule.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; -import { CurrentTenantId } from '../../auth/decorators/current-tenant-id.decorator'; - -@Controller('homework/review-rules') -@UseGuards(JwtAuthGuard) -export class HomeworkReviewRulesController { - constructor(private readonly reviewRulesService: HomeworkReviewRulesService) {} - - /** - * 分页查询评审规则列表 - */ - @Get() - @RequirePermission('homework:read') - findAll( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('name') name?: string, - @CurrentTenantId() tenantId?: number, - ) { - return this.reviewRulesService.findAll( - tenantId, - page ? parseInt(page) : 1, - pageSize ? parseInt(pageSize) : 10, - name, - ); - } - - /** - * 获取所有可用的评审规则(用于作业创建时选择) - */ - @Get('select') - @RequirePermission('homework:read') - findAllForSelect(@CurrentTenantId() tenantId?: number) { - return this.reviewRulesService.findAllForSelect(tenantId); - } - - /** - * 创建评审规则 - */ - @Post() - @RequirePermission('homework:update') - create( - @Body() createDto: CreateHomeworkReviewRuleDto, - @CurrentTenantId() tenantId: number, - @Request() req?, - ) { - const creatorId = req?.user?.id; - return this.reviewRulesService.create(createDto, tenantId, creatorId); - } - - /** - * 根据ID查找评审规则 - */ - @Get(':id') - @RequirePermission('homework:read') - findById( - @Param('id', ParseIntPipe) id: number, - @CurrentTenantId() tenantId?: number, - ) { - return this.reviewRulesService.findById(id, tenantId); - } - - /** - * 更新评审规则 - */ - @Patch(':id') - @RequirePermission('homework:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateDto: UpdateHomeworkReviewRuleDto, - @CurrentTenantId() tenantId?: number, - @Request() req?, - ) { - const modifierId = req?.user?.id; - return this.reviewRulesService.update(id, updateDto, tenantId, modifierId); - } - - /** - * 删除评审规则(软删除) - */ - @Delete(':id') - @RequirePermission('homework:update') - remove( - @Param('id', ParseIntPipe) id: number, - @CurrentTenantId() tenantId?: number, - ) { - return this.reviewRulesService.remove(id, tenantId); - } -} diff --git a/backend/src/homework/review-rules/review-rules.module.ts b/backend/src/homework/review-rules/review-rules.module.ts deleted file mode 100644 index 1127ddf..0000000 --- a/backend/src/homework/review-rules/review-rules.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { HomeworkReviewRulesController } from './review-rules.controller'; -import { HomeworkReviewRulesService } from './review-rules.service'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [HomeworkReviewRulesController], - providers: [HomeworkReviewRulesService], - exports: [HomeworkReviewRulesService], -}) -export class HomeworkReviewRulesModule {} diff --git a/backend/src/homework/review-rules/review-rules.service.ts b/backend/src/homework/review-rules/review-rules.service.ts deleted file mode 100644 index 1ec7229..0000000 --- a/backend/src/homework/review-rules/review-rules.service.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateHomeworkReviewRuleDto } from './dto/create-review-rule.dto'; -import { UpdateHomeworkReviewRuleDto } from './dto/update-review-rule.dto'; - -@Injectable() -export class HomeworkReviewRulesService { - constructor(private prisma: PrismaService) {} - - /** - * 创建评审规则 - */ - async create( - createDto: CreateHomeworkReviewRuleDto, - tenantId: number, - creatorId?: number, - ) { - const data: any = { - tenantId, - name: createDto.name, - description: createDto.description || null, - criteria: JSON.stringify(createDto.criteria), - }; - - if (creatorId) { - data.creator = creatorId; - } - - return this.prisma.homeworkReviewRule.create({ - data, - include: { - homeworks: { - where: { validState: 1 }, - select: { - id: true, - name: true, - }, - }, - }, - }); - } - - /** - * 根据ID查找评审规则 - */ - async findById(id: number, tenantId?: number) { - const where: any = { id, validState: 1 }; - if (tenantId) { - where.tenantId = tenantId; - } - - const rule = await this.prisma.homeworkReviewRule.findFirst({ - where, - include: { - homeworks: { - where: { validState: 1 }, - select: { - id: true, - name: true, - }, - }, - }, - }); - - if (!rule) { - throw new NotFoundException('评审规则不存在'); - } - - return rule; - } - - /** - * 更新评审规则 - */ - async update( - id: number, - updateDto: UpdateHomeworkReviewRuleDto, - tenantId?: number, - modifierId?: number, - ) { - await this.findById(id, tenantId); - - const data: any = {}; - - if (updateDto.name !== undefined) { - data.name = updateDto.name; - } - if (updateDto.description !== undefined) { - data.description = updateDto.description || null; - } - if (updateDto.criteria !== undefined) { - data.criteria = JSON.stringify(updateDto.criteria); - } - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.homeworkReviewRule.update({ - where: { id }, - data, - include: { - homeworks: { - where: { validState: 1 }, - select: { - id: true, - name: true, - }, - }, - }, - }); - } - - /** - * 删除评审规则(软删除) - */ - async remove(id: number, tenantId?: number) { - await this.findById(id, tenantId); - - // 检查是否有作业在使用此规则 - const homeworksUsingRule = await this.prisma.homework.count({ - where: { - reviewRuleId: id, - validState: 1, - }, - }); - - if (homeworksUsingRule > 0) { - throw new BadRequestException( - `该规则正在被 ${homeworksUsingRule} 个作业使用,无法删除`, - ); - } - - return this.prisma.homeworkReviewRule.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } - - /** - * 分页查询评审规则列表 - */ - async findAll( - tenantId?: number, - page: number = 1, - pageSize: number = 10, - name?: string, - ) { - const skip = (page - 1) * pageSize; - const where: any = { - validState: 1, - }; - - if (tenantId) { - where.tenantId = tenantId; - } - - if (name) { - where.name = { - contains: name, - }; - } - - const [data, total] = await Promise.all([ - this.prisma.homeworkReviewRule.findMany({ - where, - skip, - take: pageSize, - include: { - homeworks: { - where: { validState: 1 }, - select: { - id: true, - name: true, - }, - }, - }, - orderBy: { - createTime: 'desc', - }, - }), - this.prisma.homeworkReviewRule.count({ where }), - ]); - - return { - list: data, - total, - page, - pageSize, - }; - } - - /** - * 获取所有可用的评审规则(用于作业创建时选择) - */ - async findAllForSelect(tenantId?: number) { - const where: any = { - validState: 1, - }; - - if (tenantId) { - where.tenantId = tenantId; - } - - return this.prisma.homeworkReviewRule.findMany({ - where, - select: { - id: true, - name: true, - description: true, - criteria: true, - }, - orderBy: { - createTime: 'desc', - }, - }); - } -} diff --git a/backend/src/homework/scores/dto/create-score.dto.ts b/backend/src/homework/scores/dto/create-score.dto.ts deleted file mode 100644 index efc4ff6..0000000 --- a/backend/src/homework/scores/dto/create-score.dto.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - IsInt, - IsOptional, - IsString, - IsArray, - ValidateNested, - IsNumber, -} from 'class-validator'; -import { Type } from 'class-transformer'; - -export class DimensionScoreDto { - @IsString() - name: string; - - @IsNumber() - score: number; - - @IsNumber() - maxScore: number; -} - -export class CreateHomeworkScoreDto { - @IsInt() - submissionId: number; - - @IsArray() - @ValidateNested({ each: true }) - @Type(() => DimensionScoreDto) - dimensionScores: DimensionScoreDto[]; - - @IsOptional() - @IsString() - comments?: string; -} diff --git a/backend/src/homework/scores/scores.controller.ts b/backend/src/homework/scores/scores.controller.ts deleted file mode 100644 index 94d2b08..0000000 --- a/backend/src/homework/scores/scores.controller.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { - Controller, - Post, - Body, - Param, - UseGuards, - Request, - ParseIntPipe, -} from '@nestjs/common'; -import { HomeworkScoresService } from './scores.service'; -import { CreateHomeworkScoreDto } from './dto/create-score.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; -import { CurrentTenantId } from '../../auth/decorators/current-tenant-id.decorator'; - -@Controller('homework/scores') -@UseGuards(JwtAuthGuard) -export class HomeworkScoresController { - constructor(private readonly scoresService: HomeworkScoresService) {} - - /** - * 提交评分 - */ - @Post() - @RequirePermission('homework:update') - create( - @Body() createDto: CreateHomeworkScoreDto, - @CurrentTenantId() tenantId: number, - @Request() req, - ) { - const reviewerId = req.user.id; - return this.scoresService.create(createDto, tenantId, reviewerId); - } - - /** - * 标记作品违规 - */ - @Post(':submissionId/violation') - @RequirePermission('homework:update') - markViolation( - @Param('submissionId', ParseIntPipe) submissionId: number, - @Body('reason') reason: string, - @CurrentTenantId() tenantId: number, - @Request() req, - ) { - const reviewerId = req.user.id; - return this.scoresService.markViolation(submissionId, tenantId, reviewerId, reason); - } - - /** - * 重置评分 - */ - @Post(':submissionId/reset') - @RequirePermission('homework:update') - resetScore( - @Param('submissionId', ParseIntPipe) submissionId: number, - @CurrentTenantId() tenantId: number, - @Request() req, - ) { - const reviewerId = req.user.id; - return this.scoresService.resetScore(submissionId, tenantId, reviewerId); - } -} diff --git a/backend/src/homework/scores/scores.module.ts b/backend/src/homework/scores/scores.module.ts deleted file mode 100644 index 0d62d4c..0000000 --- a/backend/src/homework/scores/scores.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { HomeworkScoresController } from './scores.controller'; -import { HomeworkScoresService } from './scores.service'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [HomeworkScoresController], - providers: [HomeworkScoresService], - exports: [HomeworkScoresService], -}) -export class HomeworkScoresModule {} diff --git a/backend/src/homework/scores/scores.service.ts b/backend/src/homework/scores/scores.service.ts deleted file mode 100644 index e7acfe0..0000000 --- a/backend/src/homework/scores/scores.service.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { CreateHomeworkScoreDto } from './dto/create-score.dto'; - -@Injectable() -export class HomeworkScoresService { - constructor(private prisma: PrismaService) {} - - /** - * 提交评分 - */ - async create( - createDto: CreateHomeworkScoreDto, - tenantId: number, - reviewerId: number, - ) { - // 验证提交记录存在 - const submission = await this.prisma.homeworkSubmission.findFirst({ - where: { - id: createDto.submissionId, - tenantId, - validState: 1, - }, - }); - - if (!submission) { - throw new NotFoundException('提交记录不存在'); - } - - // 检查是否已经评过分 - const existingScore = await this.prisma.homeworkScore.findFirst({ - where: { - submissionId: createDto.submissionId, - reviewerId, - validState: 1, - }, - }); - - if (existingScore) { - throw new BadRequestException('您已经对该作品进行过评分'); - } - - // 计算总分 - const totalScore = createDto.dimensionScores.reduce( - (sum, item) => sum + item.score, - 0, - ); - - // 创建评分记录 - const score = await this.prisma.homeworkScore.create({ - data: { - tenantId, - submissionId: createDto.submissionId, - reviewerId, - dimensionScores: JSON.stringify(createDto.dimensionScores), - totalScore, - comments: createDto.comments || null, - scoreTime: new Date(), - creator: reviewerId, - }, - }); - - // 更新提交记录的总分和状态 - await this.updateSubmissionScore(createDto.submissionId); - - return score; - } - - /** - * 更新提交记录的总分 - */ - private async updateSubmissionScore(submissionId: number) { - // 获取该提交记录的所有有效评分 - const scores = await this.prisma.homeworkScore.findMany({ - where: { - submissionId, - validState: 1, - }, - }); - - if (scores.length === 0) { - return; - } - - // 计算平均分 - const totalScore = - scores.reduce((sum, s) => sum + Number(s.totalScore), 0) / scores.length; - - // 更新提交记录 - await this.prisma.homeworkSubmission.update({ - where: { id: submissionId }, - data: { - totalScore, - status: 'reviewed', - }, - }); - } - - /** - * 标记作品违规 - */ - async markViolation( - submissionId: number, - tenantId: number, - reviewerId: number, - reason?: string, - ) { - const submission = await this.prisma.homeworkSubmission.findFirst({ - where: { - id: submissionId, - tenantId, - validState: 1, - }, - }); - - if (!submission) { - throw new NotFoundException('提交记录不存在'); - } - - return this.prisma.homeworkSubmission.update({ - where: { id: submissionId }, - data: { - status: 'rejected', - modifier: reviewerId, - }, - }); - } - - /** - * 重置评分(删除当前用户对该作品的评分) - */ - async resetScore(submissionId: number, tenantId: number, reviewerId: number) { - const score = await this.prisma.homeworkScore.findFirst({ - where: { - submissionId, - reviewerId, - tenantId, - validState: 1, - }, - }); - - if (!score) { - throw new NotFoundException('评分记录不存在'); - } - - // 软删除评分记录 - await this.prisma.homeworkScore.update({ - where: { id: score.id }, - data: { - validState: 2, - }, - }); - - // 重新计算提交记录的总分 - await this.updateSubmissionScore(submissionId); - - // 检查是否还有评分,没有则将状态改为pending - const remainingScores = await this.prisma.homeworkScore.count({ - where: { - submissionId, - validState: 1, - }, - }); - - if (remainingScores === 0) { - await this.prisma.homeworkSubmission.update({ - where: { id: submissionId }, - data: { - status: 'pending', - totalScore: null, - }, - }); - } - - return { message: '评分已重置' }; - } -} diff --git a/backend/src/homework/submissions/dto/create-submission.dto.ts b/backend/src/homework/submissions/dto/create-submission.dto.ts deleted file mode 100644 index 58a1db5..0000000 --- a/backend/src/homework/submissions/dto/create-submission.dto.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { IsNumber, IsString, IsOptional, IsArray } from 'class-validator'; - -export class HomeworkFileDto { - @IsString() - fileName: string; - - @IsString() - fileUrl: string; - - @IsOptional() - @IsString() - size?: string; -} - -export class CreateSubmissionDto { - @IsNumber() - homeworkId: number; - - @IsString() - workName: string; - - @IsOptional() - @IsString() - workDescription?: string; - - @IsOptional() - @IsArray() - files?: HomeworkFileDto[]; -} diff --git a/backend/src/homework/submissions/dto/query-submission.dto.ts b/backend/src/homework/submissions/dto/query-submission.dto.ts deleted file mode 100644 index 3169925..0000000 --- a/backend/src/homework/submissions/dto/query-submission.dto.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { IsOptional, IsString, IsInt, IsArray } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class QuerySubmissionDto { - @IsOptional() - @Type(() => Number) - @IsInt() - page?: number = 1; - - @IsOptional() - @Type(() => Number) - @IsInt() - pageSize?: number = 10; - - @IsOptional() - @Type(() => Number) - @IsInt() - homeworkId?: number; - - @IsOptional() - @IsString() - workNo?: string; - - @IsOptional() - @IsString() - workName?: string; - - @IsOptional() - @IsString() - studentAccount?: string; - - @IsOptional() - @IsString() - studentName?: string; - - @IsOptional() - @IsString() - status?: string; - - @IsOptional() - @IsArray() - @Type(() => Number) - classIds?: number[]; - - @IsOptional() - @Type(() => Number) - @IsInt() - gradeId?: number; -} diff --git a/backend/src/homework/submissions/submissions.controller.ts b/backend/src/homework/submissions/submissions.controller.ts deleted file mode 100644 index 1368d27..0000000 --- a/backend/src/homework/submissions/submissions.controller.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Param, - UseGuards, - ParseIntPipe, - Query, - Request, -} from '@nestjs/common'; -import { SubmissionsService } from './submissions.service'; -import { QuerySubmissionDto } from './dto/query-submission.dto'; -import { CreateSubmissionDto } from './dto/create-submission.dto'; -import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../../auth/decorators/require-permission.decorator'; -import { CurrentTenantId } from '../../auth/decorators/current-tenant-id.decorator'; - -@Controller('homework/submissions') -@UseGuards(JwtAuthGuard) -export class SubmissionsController { - constructor(private readonly submissionsService: SubmissionsService) {} - - /** - * 分页查询提交记录列表 - */ - @Get() - @RequirePermission('homework:read') - findAll( - @Query() queryDto: QuerySubmissionDto, - @CurrentTenantId() tenantId?: number, - ) { - return this.submissionsService.findAll(queryDto, tenantId); - } - - /** - * 获取班级树结构(用于左侧筛选) - */ - @Get('class-tree') - @RequirePermission('homework:read') - getClassTree(@CurrentTenantId() tenantId: number) { - return this.submissionsService.getClassTree(tenantId); - } - - /** - * 获取当前用户对某作业的提交记录 - */ - @Get('my/:homeworkId') - @RequirePermission('homework:read', 'homework:student:read') - getMySubmission( - @Param('homeworkId', ParseIntPipe) homeworkId: number, - @Request() req: any, - @CurrentTenantId() tenantId: number, - ) { - return this.submissionsService.findByStudentAndHomework( - req.user.userId, - homeworkId, - tenantId, - ); - } - - /** - * 学生提交作业 - */ - @Post() - @RequirePermission('homework:read', 'homework:student:read') - submit( - @Body() createDto: CreateSubmissionDto, - @Request() req: any, - @CurrentTenantId() tenantId: number, - ) { - return this.submissionsService.create(createDto, req.user.userId, tenantId); - } - - /** - * 根据ID查找提交记录详情 - */ - @Get(':id') - @RequirePermission('homework:read') - findById( - @Param('id', ParseIntPipe) id: number, - @CurrentTenantId() tenantId?: number, - ) { - return this.submissionsService.findById(id, tenantId); - } -} diff --git a/backend/src/homework/submissions/submissions.module.ts b/backend/src/homework/submissions/submissions.module.ts deleted file mode 100644 index 4be5e54..0000000 --- a/backend/src/homework/submissions/submissions.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { SubmissionsController } from './submissions.controller'; -import { SubmissionsService } from './submissions.service'; -import { PrismaModule } from '../../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [SubmissionsController], - providers: [SubmissionsService], - exports: [SubmissionsService], -}) -export class SubmissionsModule {} diff --git a/backend/src/homework/submissions/submissions.service.ts b/backend/src/homework/submissions/submissions.service.ts deleted file mode 100644 index d9a4ffb..0000000 --- a/backend/src/homework/submissions/submissions.service.ts +++ /dev/null @@ -1,331 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, - ConflictException, -} from '@nestjs/common'; -import { PrismaService } from '../../prisma/prisma.service'; -import { QuerySubmissionDto } from './dto/query-submission.dto'; -import { CreateSubmissionDto } from './dto/create-submission.dto'; - -@Injectable() -export class SubmissionsService { - constructor(private prisma: PrismaService) {} - - /** - * 根据ID查找提交记录 - */ - async findById(id: number, tenantId?: number) { - const where: any = { id, validState: 1 }; - if (tenantId) { - where.tenantId = tenantId; - } - - const submission = await this.prisma.homeworkSubmission.findFirst({ - where, - include: { - homework: { - select: { - id: true, - name: true, - reviewRuleId: true, - reviewRule: { - select: { - id: true, - name: true, - criteria: true, - }, - }, - }, - }, - student: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - scores: { - where: { validState: 1 }, - include: { - reviewer: { - select: { - id: true, - nickname: true, - }, - }, - }, - }, - }, - }); - - if (!submission) { - throw new NotFoundException('提交记录不存在'); - } - - return submission; - } - - /** - * 分页查询提交记录列表 - */ - async findAll(queryDto: QuerySubmissionDto, tenantId?: number) { - const { - page = 1, - pageSize = 10, - homeworkId, - workNo, - workName, - studentAccount, - studentName, - status, - classIds, - gradeId, - } = queryDto; - const skip = (page - 1) * pageSize; - - const where: any = { - validState: 1, - }; - - if (tenantId) { - where.tenantId = tenantId; - } - - if (homeworkId) { - where.homeworkId = homeworkId; - } - - if (workNo) { - where.workNo = { - contains: workNo, - }; - } - - if (workName) { - where.workName = { - contains: workName, - }; - } - - if (studentAccount || studentName) { - where.student = {}; - - if (studentAccount) { - where.student.username = { - contains: studentAccount, - }; - } - - if (studentName) { - where.student.nickname = { - contains: studentName, - }; - } - } - - if (status) { - where.status = status; - } - - const [data, total] = await Promise.all([ - this.prisma.homeworkSubmission.findMany({ - where, - skip, - take: pageSize, - include: { - homework: { - select: { - id: true, - name: true, - }, - }, - student: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - _count: { - select: { - scores: true, - }, - }, - }, - orderBy: { - submitTime: 'desc', - }, - }), - this.prisma.homeworkSubmission.count({ where }), - ]); - - return { - list: data, - total, - page, - pageSize, - }; - } - - /** - * 获取班级树结构(用于左侧筛选) - * 注意:学校模块已剥离,班级树暂不可用 - */ - async getClassTree(_tenantId: number) { - return []; - } - - /** - * 根据学生ID和作业ID查找提交记录 - */ - async findByStudentAndHomework( - studentId: number, - homeworkId: number, - tenantId: number, - ) { - const submission = await this.prisma.homeworkSubmission.findFirst({ - where: { - studentId, - homeworkId, - tenantId, - validState: 1, - }, - include: { - homework: { - select: { - id: true, - name: true, - reviewRuleId: true, - reviewRule: { - select: { - id: true, - name: true, - criteria: true, - }, - }, - }, - }, - scores: { - where: { validState: 1 }, - include: { - reviewer: { - select: { - id: true, - nickname: true, - }, - }, - }, - }, - }, - }); - - if (!submission) { - throw new NotFoundException('未找到提交记录'); - } - - return submission; - } - - /** - * 创建提交记录(学生提交作业) - */ - async create( - createDto: CreateSubmissionDto, - studentId: number, - tenantId: number, - ) { - const { homeworkId, workName, workDescription, files } = createDto; - - // 检查作业是否存在且已发布 - const homework = await this.prisma.homework.findFirst({ - where: { - id: homeworkId, - tenantId, - validState: 1, - status: 'published', - }, - }); - - if (!homework) { - throw new NotFoundException('作业不存在或未发布'); - } - - // 检查是否在提交时间范围内 - const now = new Date(); - if (now < new Date(homework.submitStartTime)) { - throw new BadRequestException('作业提交尚未开始'); - } - if (now > new Date(homework.submitEndTime)) { - throw new BadRequestException('作业提交已截止'); - } - - // 检查学生是否已提交 - const existingSubmission = await this.prisma.homeworkSubmission.findFirst({ - where: { - homeworkId, - studentId, - tenantId, - validState: 1, - }, - }); - - if (existingSubmission) { - throw new ConflictException('您已提交过该作业'); - } - - // 生成作品编号 - const workNo = await this.generateWorkNo(tenantId); - - // 创建提交记录 - const submission = await this.prisma.homeworkSubmission.create({ - data: { - tenantId, - homeworkId, - studentId, - workNo, - workName, - workDescription, - files: files ? JSON.stringify(files) : null, - submitTime: now, - status: 'pending', - creator: studentId, - modifier: studentId, - createTime: now, - modifyTime: now, - validState: 1, - }, - include: { - homework: { - select: { - id: true, - name: true, - }, - }, - }, - }); - - return submission; - } - - /** - * 生成作品编号 - */ - private async generateWorkNo(tenantId: number): Promise { - const today = new Date(); - const dateStr = today.toISOString().slice(0, 10).replace(/-/g, ''); - - // 获取今天的提交数量 - const count = await this.prisma.homeworkSubmission.count({ - where: { - tenantId, - workNo: { - startsWith: `HW${dateStr}`, - }, - }, - }); - - const seq = String(count + 1).padStart(4, '0'); - return `HW${dateStr}${seq}`; - } -} diff --git a/backend/src/judges-management/dto/create-judge.dto.ts b/backend/src/judges-management/dto/create-judge.dto.ts deleted file mode 100644 index 7e6b1e5..0000000 --- a/backend/src/judges-management/dto/create-judge.dto.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { IsString, IsOptional, IsEnum } from 'class-validator'; -import { Gender, UserStatus } from '../../users/dto/create-user.dto'; - -export class CreateJudgeDto { - @IsString() - nickname: string; - - @IsEnum(Gender) - gender: Gender; - - @IsString() - organization: string; - - @IsString() - phone: string; - - @IsString() - password: string; - - @IsString() - @IsOptional() - username?: string; - - @IsString() - @IsOptional() - email?: string; - - @IsString() - @IsOptional() - avatar?: string; - - @IsEnum(UserStatus) - @IsOptional() - status?: UserStatus; -} diff --git a/backend/src/judges-management/dto/query-judge.dto.ts b/backend/src/judges-management/dto/query-judge.dto.ts deleted file mode 100644 index 3136aea..0000000 --- a/backend/src/judges-management/dto/query-judge.dto.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { IsString, IsOptional, IsInt, IsEnum } from 'class-validator'; -import { Type } from 'class-transformer'; -import { UserStatus } from '../../users/dto/create-user.dto'; - -export class QueryJudgeDto { - @IsInt() - @IsOptional() - @Type(() => Number) - page?: number = 1; - - @IsInt() - @IsOptional() - @Type(() => Number) - pageSize?: number = 10; - - @IsString() - @IsOptional() - organization?: string; - - @IsString() - @IsOptional() - nickname?: string; - - @IsString() - @IsOptional() - username?: string; - - @IsEnum(UserStatus) - @IsOptional() - status?: UserStatus; -} diff --git a/backend/src/judges-management/dto/update-judge.dto.ts b/backend/src/judges-management/dto/update-judge.dto.ts deleted file mode 100644 index 533555f..0000000 --- a/backend/src/judges-management/dto/update-judge.dto.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { IsString, IsOptional, IsEnum } from 'class-validator'; -import { Gender, UserStatus } from '../../users/dto/create-user.dto'; - -export class UpdateJudgeDto { - @IsString() - @IsOptional() - nickname?: string; - - @IsEnum(Gender) - @IsOptional() - gender?: Gender; - - @IsString() - @IsOptional() - organization?: string; - - @IsString() - @IsOptional() - phone?: string; - - @IsString() - @IsOptional() - password?: string; - - @IsString() - @IsOptional() - username?: string; - - @IsString() - @IsOptional() - email?: string; - - @IsString() - @IsOptional() - avatar?: string; - - @IsEnum(UserStatus) - @IsOptional() - status?: UserStatus; -} diff --git a/backend/src/judges-management/judges-management.controller.ts b/backend/src/judges-management/judges-management.controller.ts deleted file mode 100644 index bb9aafd..0000000 --- a/backend/src/judges-management/judges-management.controller.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, - ParseIntPipe, -} from '@nestjs/common'; -import { JudgesManagementService } from './judges-management.service'; -import { CreateJudgeDto } from './dto/create-judge.dto'; -import { UpdateJudgeDto } from './dto/update-judge.dto'; -import { QueryJudgeDto } from './dto/query-judge.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; -import { RequirePermission } from '../auth/decorators/require-permission.decorator'; - -@Controller('judges-management') -@UseGuards(JwtAuthGuard) -export class JudgesManagementController { - constructor(private readonly judgesManagementService: JudgesManagementService) {} - - /** - * 创建评委 - */ - @Post() - @RequirePermission('judge:create') - create(@Body() createJudgeDto: CreateJudgeDto, @Request() req) { - const creatorId = req.user?.id; - return this.judgesManagementService.create(createJudgeDto, creatorId); - } - - /** - * 查询评委列表 - */ - @Get() - @RequirePermission('judge:read') - findAll(@Query() queryDto: QueryJudgeDto) { - return this.judgesManagementService.findAll(queryDto); - } - - /** - * 获取评委详情 - */ - @Get(':id') - @RequirePermission('judge:read') - findOne(@Param('id', ParseIntPipe) id: number) { - return this.judgesManagementService.findOne(id); - } - - /** - * 更新评委信息 - */ - @Patch(':id') - @RequirePermission('judge:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateJudgeDto: UpdateJudgeDto, - @Request() req, - ) { - const modifierId = req.user?.id; - return this.judgesManagementService.update(id, updateJudgeDto, modifierId); - } - - /** - * 删除评委 - */ - @Delete(':id') - @RequirePermission('judge:delete') - remove(@Param('id', ParseIntPipe) id: number) { - return this.judgesManagementService.remove(id); - } - - /** - * 冻结评委 - */ - @Patch(':id/freeze') - @RequirePermission('judge:update') - freeze(@Param('id', ParseIntPipe) id: number) { - return this.judgesManagementService.toggleStatus(id, 'disabled'); - } - - /** - * 解冻评委 - */ - @Patch(':id/unfreeze') - @RequirePermission('judge:update') - unfreeze(@Param('id', ParseIntPipe) id: number) { - return this.judgesManagementService.toggleStatus(id, 'enabled'); - } - - /** - * 批量删除评委 - */ - @Post('batch-delete') - @RequirePermission('judge:delete') - batchRemove(@Body() body: { ids: number[] }) { - return this.judgesManagementService.batchRemove(body.ids); - } -} diff --git a/backend/src/judges-management/judges-management.module.ts b/backend/src/judges-management/judges-management.module.ts deleted file mode 100644 index 3d7f3d8..0000000 --- a/backend/src/judges-management/judges-management.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { JudgesManagementController } from './judges-management.controller'; -import { JudgesManagementService } from './judges-management.service'; -import { PrismaModule } from '../prisma/prisma.module'; - -@Module({ - imports: [PrismaModule], - controllers: [JudgesManagementController], - providers: [JudgesManagementService], - exports: [JudgesManagementService], -}) -export class JudgesManagementModule {} diff --git a/backend/src/judges-management/judges-management.service.ts b/backend/src/judges-management/judges-management.service.ts deleted file mode 100644 index d21432f..0000000 --- a/backend/src/judges-management/judges-management.service.ts +++ /dev/null @@ -1,372 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateJudgeDto } from './dto/create-judge.dto'; -import { UpdateJudgeDto } from './dto/update-judge.dto'; -import { QueryJudgeDto } from './dto/query-judge.dto'; -import * as bcrypt from 'bcrypt'; - -const JUDGE_ROLE_CODE = 'judge'; - -@Injectable() -export class JudgesManagementService { - constructor(private prisma: PrismaService) {} - - /** - * 获取超级租户ID(评委统一存储在超级租户下) - */ - private async getSuperTenantId(): Promise { - const superTenant = await this.prisma.tenant.findFirst({ - where: { - isSuper: 1, - validState: 1, - }, - }); - - if (!superTenant) { - throw new BadRequestException('系统未配置超级租户'); - } - - return superTenant.id; - } - - /** - * 确保评委角色存在,如果不存在则创建 - */ - private async ensureJudgeRole(tenantId: number): Promise { - let role = await this.prisma.role.findFirst({ - where: { - code: JUDGE_ROLE_CODE, - tenantId, - }, - }); - - if (!role) { - role = await this.prisma.role.create({ - data: { - tenantId, - name: '评委', - code: JUDGE_ROLE_CODE, - description: '活动评委角色', - }, - }); - } - - return role.id; - } - - /** - * 创建评委 - */ - async create(createJudgeDto: CreateJudgeDto, creatorId?: number) { - const { organization, password, ...userData } = createJudgeDto; - - // 评委统一存储在超级租户下 - const superTenantId = await this.getSuperTenantId(); - - // 确保评委角色存在 - const judgeRoleId = await this.ensureJudgeRole(superTenantId); - - // 生成用户名(如果没有提供) - let username = createJudgeDto.username; - if (!username) { - // 使用手机号作为默认用户名 - username = createJudgeDto.phone; - } - - // 检查用户名是否已存在(在超级租户下) - const existingUser = await this.prisma.user.findFirst({ - where: { - username, - tenantId: superTenantId, - }, - }); - - if (existingUser) { - throw new BadRequestException('用户名已存在'); - } - - // 加密密码 - const hashedPassword = await bcrypt.hash(password, 10); - - // 创建用户并分配评委角色 - const user = await this.prisma.user.create({ - data: { - ...userData, - username, - tenantId: superTenantId, - organization, // 使用独立的所属单位字段 - password: hashedPassword, - status: createJudgeDto.status || 'enabled', - creator: creatorId, - roles: { - create: { - roleId: judgeRoleId, - }, - }, - }, - include: { - roles: { - include: { - role: true, - }, - }, - }, - }); - - return user; - } - - /** - * 查询评委列表 - */ - async findAll(queryDto: QueryJudgeDto) { - const { page = 1, pageSize = 10, organization, nickname, username, status } = queryDto; - const skip = (page - 1) * pageSize; - - // 构建查询条件:必须有评委角色 - const where: any = { - validState: 1, - roles: { - some: { - role: { - code: JUDGE_ROLE_CODE, - }, - }, - }, - }; - - if (organization) { - where.organization = { - contains: organization, - }; - } - - if (nickname) { - where.nickname = { - contains: nickname, - }; - } - - if (username) { - where.username = { - contains: username, - }; - } - - if (status) { - where.status = status; - } - - const [list, total] = await Promise.all([ - this.prisma.user.findMany({ - where, - skip, - take: pageSize, - include: { - roles: { - include: { - role: true, - }, - }, - // 获取关联的进行中活动 - contestJudges: { - where: { - validState: 1, - contest: { - validState: 1, - status: 'ongoing', - }, - }, - include: { - contest: { - select: { - id: true, - contestName: true, - status: true, - }, - }, - }, - }, - }, - orderBy: { createTime: 'desc' }, - }), - this.prisma.user.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - /** - * 获取评委详情 - */ - async findOne(id: number) { - const user = await this.prisma.user.findFirst({ - where: { - id, - validState: 1, - roles: { - some: { - role: { - code: JUDGE_ROLE_CODE, - }, - }, - }, - }, - include: { - roles: { - include: { - role: true, - }, - }, - contestJudges: { - where: { - validState: 1, - }, - include: { - contest: { - select: { - id: true, - contestName: true, - status: true, - contestState: true, - }, - }, - }, - }, - }, - }); - - if (!user) { - throw new NotFoundException('评委不存在'); - } - - return user; - } - - /** - * 更新评委信息 - */ - async update(id: number, updateJudgeDto: UpdateJudgeDto, modifierId?: number) { - // 验证评委存在 - await this.findOne(id); - - const data: any = { ...updateJudgeDto }; - - // 如果更新密码,需要加密 - if (updateJudgeDto.password) { - data.password = await bcrypt.hash(updateJudgeDto.password, 10); - } - - if (modifierId) { - data.modifier = modifierId; - } - - return this.prisma.user.update({ - where: { id }, - data, - include: { - roles: { - include: { - role: true, - }, - }, - }, - }); - } - - /** - * 删除评委(软删除) - */ - async remove(id: number) { - // 验证评委存在 - const judge = await this.findOne(id); - - // 检查是否有关联的进行中活动 - const ongoingContests = await this.prisma.contestJudge.count({ - where: { - judgeId: id, - validState: 1, - contest: { - validState: 1, - status: 'ongoing', - }, - }, - }); - - if (ongoingContests > 0) { - throw new BadRequestException('该评委正在参与进行中的活动,无法删除'); - } - - return this.prisma.user.update({ - where: { id }, - data: { - validState: 2, - }, - }); - } - - /** - * 冻结/解冻评委 - */ - async toggleStatus(id: number, status: 'enabled' | 'disabled') { - // 验证评委存在 - await this.findOne(id); - - return this.prisma.user.update({ - where: { id }, - data: { - status, - }, - }); - } - - /** - * 批量删除评委 - */ - async batchRemove(ids: number[]) { - // 检查是否有评委正在参与进行中的活动 - const judgesWithOngoingContests = await this.prisma.contestJudge.findMany({ - where: { - judgeId: { in: ids }, - validState: 1, - contest: { - validState: 1, - status: 'ongoing', - }, - }, - select: { - judgeId: true, - }, - }); - - if (judgesWithOngoingContests.length > 0) { - throw new BadRequestException('部分评委正在参与进行中的活动,无法删除'); - } - - return this.prisma.user.updateMany({ - where: { - id: { in: ids }, - validState: 1, - roles: { - some: { - role: { - code: JUDGE_ROLE_CODE, - }, - }, - }, - }, - data: { - validState: 2, - }, - }); - } -} diff --git a/backend/src/logs/dto/create-log.dto.ts b/backend/src/logs/dto/create-log.dto.ts deleted file mode 100644 index b697312..0000000 --- a/backend/src/logs/dto/create-log.dto.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IsNumber, IsString, IsOptional } from 'class-validator'; - -export class CreateLogDto { - @IsOptional() - @IsNumber() - userId?: number; - - @IsString() - action: string; - - @IsOptional() - @IsString() - content?: string; - - @IsOptional() - @IsString() - ip?: string; - - @IsOptional() - @IsString() - userAgent?: string; -} diff --git a/backend/src/logs/dto/query-log.dto.ts b/backend/src/logs/dto/query-log.dto.ts deleted file mode 100644 index b63786a..0000000 --- a/backend/src/logs/dto/query-log.dto.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { IsNumber, IsString, IsOptional, IsDateString } from 'class-validator'; -import { Type } from 'class-transformer'; - -export class QueryLogDto { - @IsOptional() - @Type(() => Number) - @IsNumber() - page?: number = 1; - - @IsOptional() - @Type(() => Number) - @IsNumber() - pageSize?: number = 20; - - @IsOptional() - @Type(() => Number) - @IsNumber() - userId?: number; - - @IsOptional() - @IsString() - action?: string; - - @IsOptional() - @IsString() - keyword?: string; - - @IsOptional() - @IsString() - ip?: string; - - @IsOptional() - @IsDateString() - startTime?: string; - - @IsOptional() - @IsDateString() - endTime?: string; -} diff --git a/backend/src/logs/logs.controller.ts b/backend/src/logs/logs.controller.ts deleted file mode 100644 index 8586480..0000000 --- a/backend/src/logs/logs.controller.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - Controller, - Get, - Post, - Delete, - Body, - Param, - Query, - ParseIntPipe, -} from '@nestjs/common'; -import { LogsService } from './logs.service'; -import { QueryLogDto } from './dto/query-log.dto'; -import { RequirePermission } from '../auth/decorators/require-permission.decorator'; - -@Controller('logs') -export class LogsController { - constructor(private readonly logsService: LogsService) {} - - /** - * 查询日志列表(分页) - */ - @Get() - @RequirePermission('log:read') - async findAll(@Query() queryLogDto: QueryLogDto) { - return this.logsService.findAll(queryLogDto); - } - - /** - * 获取日志统计信息 - */ - @Get('statistics') - @RequirePermission('log:read') - async getStatistics(@Query('days') days?: string) { - const daysNum = days ? parseInt(days, 10) : 7; - return this.logsService.getStatistics(daysNum); - } - - /** - * 查询单条日志详情 - */ - @Get(':id') - @RequirePermission('log:read') - async findOne(@Param('id', ParseIntPipe) id: number) { - return this.logsService.findOne(id); - } - - /** - * 批量删除日志 - */ - @Delete() - @RequirePermission('log:delete') - async remove(@Body('ids') ids: number[]) { - return this.logsService.remove(ids); - } - - /** - * 清理过期日志 - */ - @Post('clean') - @RequirePermission('log:delete') - async cleanOldLogs(@Body('daysToKeep') daysToKeep?: number) { - return this.logsService.cleanOldLogs(daysToKeep || 90); - } -} diff --git a/backend/src/logs/logs.module.ts b/backend/src/logs/logs.module.ts deleted file mode 100644 index 9d780d4..0000000 --- a/backend/src/logs/logs.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module, Global } from '@nestjs/common'; -import { LogsService } from './logs.service'; -import { LogsController } from './logs.controller'; -import { PrismaModule } from '../prisma/prisma.module'; - -@Global() // 设为全局模块,让 LoggingInterceptor 可以注入 LogsService -@Module({ - imports: [PrismaModule], - controllers: [LogsController], - providers: [LogsService], - exports: [LogsService], -}) -export class LogsModule {} diff --git a/backend/src/logs/logs.service.ts b/backend/src/logs/logs.service.ts deleted file mode 100644 index 6fe36ba..0000000 --- a/backend/src/logs/logs.service.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateLogDto } from './dto/create-log.dto'; -import { QueryLogDto } from './dto/query-log.dto'; - -@Injectable() -export class LogsService { - constructor(private prisma: PrismaService) {} - - /** - * 创建日志记录 - */ - async create(createLogDto: CreateLogDto) { - return this.prisma.log.create({ - data: { - userId: createLogDto.userId, - action: createLogDto.action, - content: createLogDto.content, - ip: createLogDto.ip, - userAgent: createLogDto.userAgent, - }, - }); - } - - /** - * 查询日志列表(分页) - */ - async findAll(queryLogDto: QueryLogDto) { - const { - page = 1, - pageSize = 20, - userId, - action, - keyword, - ip, - startTime, - endTime, - } = queryLogDto; - - const skip = (page - 1) * pageSize; - - // 构建查询条件 - const where: any = {}; - - if (userId) { - where.userId = userId; - } - - if (action) { - where.action = { - contains: action, - }; - } - - if (keyword) { - where.OR = [ - { action: { contains: keyword } }, - { content: { contains: keyword } }, - ]; - } - - if (ip) { - where.ip = { - contains: ip, - }; - } - - // 时间范围筛选 - if (startTime || endTime) { - where.createTime = {}; - if (startTime) { - where.createTime.gte = new Date(startTime); - } - if (endTime) { - where.createTime.lte = new Date(endTime); - } - } - - const [list, total] = await Promise.all([ - this.prisma.log.findMany({ - where, - skip, - take: pageSize, - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - orderBy: { createTime: 'desc' }, - }), - this.prisma.log.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - /** - * 查询单条日志详情 - */ - async findOne(id: number) { - return this.prisma.log.findUnique({ - where: { id }, - include: { - user: { - select: { - id: true, - username: true, - nickname: true, - }, - }, - }, - }); - } - - /** - * 删除日志(支持批量删除) - */ - async remove(ids: number[]) { - return this.prisma.log.deleteMany({ - where: { - id: { in: ids }, - }, - }); - } - - /** - * 清理过期日志(默认保留90天) - */ - async cleanOldLogs(daysToKeep: number = 90) { - const cutoffDate = new Date(); - cutoffDate.setDate(cutoffDate.getDate() - daysToKeep); - - const result = await this.prisma.log.deleteMany({ - where: { - createTime: { - lt: cutoffDate, - }, - }, - }); - - return { - deleted: result.count, - cutoffDate, - }; - } - - /** - * 获取日志统计信息 - */ - async getStatistics(days: number = 7) { - const startDate = new Date(); - startDate.setDate(startDate.getDate() - days); - startDate.setHours(0, 0, 0, 0); - - // 总日志数 - const totalCount = await this.prisma.log.count(); - - // 近N天日志数 - const recentCount = await this.prisma.log.count({ - where: { - createTime: { - gte: startDate, - }, - }, - }); - - // 按操作类型统计(取前10) - const actionStats = await this.prisma.log.groupBy({ - by: ['action'], - _count: { - action: true, - }, - where: { - createTime: { - gte: startDate, - }, - }, - orderBy: { - _count: { - action: 'desc', - }, - }, - take: 10, - }); - - // 按天统计近N天的日志数量 - const dailyStats = await this.prisma.$queryRaw` - SELECT - DATE(create_time) as date, - COUNT(*) as count - FROM logs - WHERE create_time >= ${startDate} - GROUP BY DATE(create_time) - ORDER BY date DESC - ` as Array<{ date: Date; count: bigint }>; - - return { - totalCount, - recentCount, - days, - actionStats: actionStats.map((item) => ({ - action: item.action, - count: item._count.action, - })), - dailyStats: dailyStats.map((item) => ({ - date: item.date, - count: Number(item.count), - })), - }; - } - - /** - * 获取用户操作日志 - */ - async getUserLogs(userId: number, page: number = 1, pageSize: number = 20) { - return this.findAll({ userId, page, pageSize }); - } -} diff --git a/backend/src/main.ts b/backend/src/main.ts deleted file mode 100644 index d3628c3..0000000 --- a/backend/src/main.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { NestFactory } from '@nestjs/core'; -import { ValidationPipe } from '@nestjs/common'; -import { AppModule } from './app.module'; -import { ConfigService } from '@nestjs/config'; - -async function bootstrap() { - const app = await NestFactory.create(AppModule); - - // Enable CORS - app.enableCors({ - origin: true, - credentials: true, - }); - - // Global prefix - app.setGlobalPrefix('api'); - - // Global validation pipe - app.useGlobalPipes( - new ValidationPipe({ - whitelist: true, - forbidNonWhitelisted: true, - transform: true, - }), - ); - - const configService = app.get(ConfigService); - const port = configService.get('PORT') || 3001; - await app.listen(port); - console.log(`Application is running on: http://localhost:${port}`); -} - -bootstrap(); diff --git a/backend/src/menus/dto/create-menu.dto.ts b/backend/src/menus/dto/create-menu.dto.ts deleted file mode 100644 index 12d5350..0000000 --- a/backend/src/menus/dto/create-menu.dto.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { IsString, IsOptional, IsInt, IsNumber } from 'class-validator'; - -export class CreateMenuDto { - @IsString() - name: string; - - @IsString() - @IsOptional() - path?: string; - - @IsString() - @IsOptional() - icon?: string; - - @IsString() - @IsOptional() - component?: string; - - @IsNumber() - @IsOptional() - parentId?: number; - - @IsString() - @IsOptional() - permission?: string; - - @IsInt() - @IsOptional() - sort?: number; -} diff --git a/backend/src/menus/dto/update-menu.dto.ts b/backend/src/menus/dto/update-menu.dto.ts deleted file mode 100644 index 98b809e..0000000 --- a/backend/src/menus/dto/update-menu.dto.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { IsString, IsOptional, IsInt, IsNumber } from 'class-validator'; - -export class UpdateMenuDto { - @IsString() - @IsOptional() - name?: string; - - @IsString() - @IsOptional() - path?: string; - - @IsString() - @IsOptional() - icon?: string; - - @IsString() - @IsOptional() - component?: string; - - @IsNumber() - @IsOptional() - parentId?: number; - - @IsString() - @IsOptional() - permission?: string; - - @IsInt() - @IsOptional() - sort?: number; -} diff --git a/backend/src/menus/menus.controller.ts b/backend/src/menus/menus.controller.ts deleted file mode 100644 index ee02062..0000000 --- a/backend/src/menus/menus.controller.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, -} from '@nestjs/common'; -import { MenusService } from './menus.service'; -import { CreateMenuDto } from './dto/create-menu.dto'; -import { UpdateMenuDto } from './dto/update-menu.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; - -@Controller('menus') -@UseGuards(JwtAuthGuard) -export class MenusController { - constructor(private readonly menusService: MenusService) {} - - @Post() - create(@Body() createMenuDto: CreateMenuDto) { - return this.menusService.create(createMenuDto); - } - - @Get() - findAll() { - return this.menusService.findAll(); - } - - @Get('user-menus') - getUserMenus(@Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new Error('无法确定租户信息'); - } - return this.menusService.findUserMenus(req.user.userId, tenantId); - } - - @Get(':id') - findOne(@Param('id') id: string) { - return this.menusService.findOne(+id); - } - - @Patch(':id') - update(@Param('id') id: string, @Body() updateMenuDto: UpdateMenuDto) { - return this.menusService.update(+id, updateMenuDto); - } - - @Delete(':id') - remove(@Param('id') id: string) { - return this.menusService.remove(+id); - } -} diff --git a/backend/src/menus/menus.module.ts b/backend/src/menus/menus.module.ts deleted file mode 100644 index 22deb68..0000000 --- a/backend/src/menus/menus.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; -import { MenusService } from './menus.service'; -import { MenusController } from './menus.controller'; -import { AuthModule } from '../auth/auth.module'; - -@Module({ - imports: [AuthModule], - controllers: [MenusController], - providers: [MenusService], -}) -export class MenusModule {} diff --git a/backend/src/menus/menus.service.ts b/backend/src/menus/menus.service.ts deleted file mode 100644 index e593f33..0000000 --- a/backend/src/menus/menus.service.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateMenuDto } from './dto/create-menu.dto'; -import { UpdateMenuDto } from './dto/update-menu.dto'; -import { AuthService } from '../auth/auth.service'; - -@Injectable() -export class MenusService { - constructor( - private prisma: PrismaService, - private authService: AuthService, - ) {} - - async create(createMenuDto: CreateMenuDto) { - return this.prisma.menu.create({ - data: createMenuDto, - }); - } - - async findAll() { - return this.prisma.menu.findMany({ - where: { - parentId: null, - }, - include: { - children: { - orderBy: { - sort: 'asc', - }, - }, - }, - orderBy: { - sort: 'asc', - }, - }); - } - - async findOne(id: number) { - const menu = await this.prisma.menu.findUnique({ - where: { id }, - include: { - children: true, - parent: true, - }, - }); - - if (!menu) { - throw new NotFoundException('菜单不存在'); - } - - return menu; - } - - async update(id: number, updateMenuDto: UpdateMenuDto) { - return this.prisma.menu.update({ - where: { id }, - data: updateMenuDto, - }); - } - - async remove(id: number) { - return this.prisma.menu.delete({ - where: { id }, - }); - } - - /** - * 获取当前用户的菜单(根据权限过滤) - * @param userId 用户ID - * @param tenantId 租户ID - * @returns 过滤后的菜单树 - */ - async findUserMenus(userId: number, tenantId: number) { - // 获取用户角色,检查是否为超级管理员 - const userRoles = await this.authService.getUserRoles(userId); - const isSuperAdmin = userRoles.includes('super_admin'); - - // 获取用户的所有权限 - const userPermissions = await this.authService.getUserPermissions(userId); - - // 获取租户分配的菜单ID - const tenantMenus = await this.prisma.tenantMenu.findMany({ - where: { tenantId }, - }); - const menuIds = tenantMenus.map((tm) => tm.menuId); - - if (menuIds.length === 0) { - return []; - } - - // 获取租户分配的所有菜单(包括父菜单) - const allMenus = await this.prisma.menu.findMany({ - where: { - OR: [ - { id: { in: menuIds } }, - { children: { some: { id: { in: menuIds } } } }, - ], - validState: 1, // 只获取有效的菜单 - }, - orderBy: { - sort: 'asc', - }, - }); - - // 构建树形结构 - const buildTree = (menus: any[], parentId: number | null = null): any[] => { - return menus - .filter((menu) => menu.parentId === parentId) - .map((menu) => ({ - ...menu, - children: buildTree(menus, menu.id), - })); - }; - - // 先构建树 - const menuTree = buildTree(allMenus); - - // 过滤菜单:只有用户拥有菜单对应权限的菜单才会显示 - // 超级管理员跳过权限过滤 - const filterMenus = (menus: any[]): any[] => { - return menus - .map((menu) => { - // 先递归处理子菜单 - let filteredChildren: any[] = []; - if (menu.children && menu.children.length > 0) { - filteredChildren = filterMenus(menu.children); - } - - // 超级管理员:只要有path或有子菜单就显示 - if (isSuperAdmin) { - const hasPath = menu.path && menu.path.trim() !== ''; - const hasChildren = filteredChildren.length > 0; - if (!hasPath && !hasChildren) { - return null; - } - const filtered = { ...menu }; - if (hasChildren) { - filtered.children = filteredChildren; - } - return filtered; - } - - // 检查菜单是否有权限要求 - const hasPermissionField = - menu.permission && menu.permission.trim() !== ''; - - // 如果菜单有权限要求,检查用户是否有该权限 - if (hasPermissionField) { - if (!userPermissions.includes(menu.permission)) { - // 用户没有该权限,但如果有可见的子菜单,保留父菜单 - if (filteredChildren.length > 0) { - return { ...menu, children: filteredChildren }; - } - return null; // 过滤掉 - } - } - - // 如果菜单没有设置权限(父级目录),则根据子菜单是否有可见的来决定 - if (!hasPermissionField) { - // 没有子菜单且没有权限配置,通常是不完整的配置,过滤掉 - if (filteredChildren.length === 0 && (!menu.path || menu.path.trim() === '')) { - return null; - } - // 有子菜单,保留父菜单 - if (filteredChildren.length > 0) { - return { ...menu, children: filteredChildren }; - } - // 没有子菜单但有 path,说明是叶子节点,需要权限但没配置,过滤掉 - return null; - } - - // 用户有权限,返回菜单 - const filtered = { ...menu }; - if (filteredChildren.length > 0) { - filtered.children = filteredChildren; - } - return filtered; - }) - .filter((menu) => menu !== null); - }; - - // 过滤菜单树 - const filteredTree = filterMenus(menuTree); - - // 移除没有子菜单且没有path的父菜单(空菜单) - const removeEmptyParents = (menus: any[]): any[] => { - return menus - .map((menu) => { - const hasChildren = menu.children && menu.children.length > 0; - const hasPath = menu.path && menu.path.trim() !== ''; - - // 如果有子菜单,递归处理 - if (hasChildren) { - const processedChildren = removeEmptyParents(menu.children); - // 如果处理后还有子菜单,保留此菜单 - if (processedChildren.length > 0) { - return { - ...menu, - children: processedChildren, - }; - } - // 如果处理后没有子菜单,但有path,保留此菜单(作为叶子节点) - if (hasPath) { - return { - ...menu, - children: [], - }; - } - // 既没有子菜单也没有path,移除 - return null; - } - - // 叶子节点,保留 - return menu; - }) - .filter((menu) => menu !== null); - }; - - return removeEmptyParents(filteredTree); - } -} diff --git a/backend/src/oss/oss.module.ts b/backend/src/oss/oss.module.ts deleted file mode 100644 index 2495a7b..0000000 --- a/backend/src/oss/oss.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module, Global } from '@nestjs/common'; -import { OssService } from './oss.service'; - -@Global() // 全局模块,其他模块无需导入即可使用 -@Module({ - providers: [OssService], - exports: [OssService], -}) -export class OssModule {} diff --git a/backend/src/oss/oss.service.ts b/backend/src/oss/oss.service.ts deleted file mode 100644 index 732d6ce..0000000 --- a/backend/src/oss/oss.service.ts +++ /dev/null @@ -1,376 +0,0 @@ -import { Injectable, BadRequestException, Logger } from '@nestjs/common'; -import { ConfigService } from '@nestjs/config'; -import COS from 'cos-nodejs-sdk-v5'; -import * as path from 'path'; -import * as fs from 'fs'; -import * as os from 'os'; -import { randomBytes } from 'crypto'; -import axios from 'axios'; -import AdmZip from 'adm-zip'; - -@Injectable() -export class OssService { - private readonly logger = new Logger(OssService.name); - private client: COS | null = null; - private readonly bucket: string; - private readonly region: string; - private readonly enabled: boolean; - - constructor(private configService: ConfigService) { - const secretId = this.configService.get('COS_SECRET_ID'); - const secretKey = this.configService.get('COS_SECRET_KEY'); - this.bucket = this.configService.get('COS_BUCKET') || ''; - this.region = this.configService.get('COS_REGION') || 'ap-guangzhou'; - - // 检查是否配置了 COS - this.enabled = !!(secretId && secretKey && this.bucket); - - if (this.enabled) { - this.client = new COS({ - SecretId: secretId, - SecretKey: secretKey, - }); - console.log('腾讯云 COS 已启用,Bucket:', this.bucket, 'Region:', this.region); - } else { - console.log('腾讯云 COS 未配置,将使用本地存储'); - } - } - - /** - * 检查 COS 是否启用 - */ - isEnabled(): boolean { - return this.enabled; - } - - /** - * 上传文件到 COS - * @param file 文件 Buffer 或 Stream - * @param originalName 原始文件名 - * @param tenantId 租户ID(可选,用于目录隔离) - * @param userId 用户ID(可选,用于目录隔离) - * @returns 文件访问URL - */ - async uploadFile( - file: Buffer | NodeJS.ReadableStream, - originalName: string, - tenantId?: number, - userId?: number, - ): Promise<{ url: string; fileName: string; ossPath: string }> { - if (!this.enabled || !this.client) { - throw new BadRequestException('COS 服务未启用'); - } - - // 生成唯一文件名,图片和文件分开存储 - const fileExt = path.extname(originalName).toLowerCase(); - const uniqueId = randomBytes(16).toString('hex'); - - // 判断是否为图片 - const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.svg']; - const isImage = imageExts.includes(fileExt); - - // 图片: img/{id}.ext, 文件: file/{id}.ext - const cosPath = isImage ? `img/${uniqueId}${fileExt}` : `file/${uniqueId}${fileExt}`; - - try { - // 上传到 COS - await new Promise((resolve, reject) => { - this.client!.putObject( - { - Bucket: this.bucket, - Region: this.region, - Key: cosPath, - Body: file as Buffer, - }, - (err, data) => { - if (err) { - reject(err); - } else { - resolve(data); - } - }, - ); - }); - - // 构建访问URL - const url = `https://${this.bucket}.cos.${this.region}.myqcloud.com/${cosPath}`; - - // 返回文件信息 - return { - url, - fileName: originalName, - ossPath: cosPath, - }; - } catch (error: any) { - console.error('COS 上传失败:', error); - throw new BadRequestException(`文件上传失败: ${error.message}`); - } - } - - /** - * 删除 COS 文件 - * @param ossPath COS 文件路径 - */ - async deleteFile(ossPath: string): Promise { - if (!this.enabled || !this.client) { - throw new BadRequestException('COS 服务未启用'); - } - - try { - await new Promise((resolve, reject) => { - this.client!.deleteObject( - { - Bucket: this.bucket, - Region: this.region, - Key: ossPath, - }, - (err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }, - ); - }); - } catch (error: any) { - console.error('COS 删除失败:', error); - throw new BadRequestException(`文件删除失败: ${error.message}`); - } - } - - /** - * 获取文件的签名 URL(用于私有 Bucket) - * @param ossPath COS 文件路径 - * @param expires 过期时间(秒),默认 3600 - */ - async getSignedUrl(ossPath: string, expires: number = 3600): Promise { - if (!this.enabled || !this.client) { - throw new BadRequestException('COS 服务未启用'); - } - - try { - const url = this.client.getObjectUrl( - { - Bucket: this.bucket, - Region: this.region, - Key: ossPath, - Sign: true, - Expires: expires, - }, - ); - return url; - } catch (error: any) { - console.error('获取签名 URL 失败:', error); - throw new BadRequestException(`获取文件链接失败: ${error.message}`); - } - } - - /** - * 检查文件是否存在 - * @param ossPath COS 文件路径 - */ - async exists(ossPath: string): Promise { - if (!this.enabled || !this.client) { - return false; - } - - try { - await new Promise((resolve, reject) => { - this.client!.headObject( - { - Bucket: this.bucket, - Region: this.region, - Key: ossPath, - }, - (err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }, - ); - }); - return true; - } catch (error: any) { - if (error.statusCode === 404) { - return false; - } - throw error; - } - } - - /** - * 从URL下载文件到Buffer - * @param url 文件URL - * @returns 文件Buffer - */ - private async downloadFromUrl(url: string): Promise { - this.logger.log(`开始下载文件: ${url.substring(0, 100)}...`); - const response = await axios.get(url, { - responseType: 'arraybuffer', - timeout: 120000, // 2分钟超时 - }); - this.logger.log(`文件下载完成,大小: ${response.data.length} 字节`); - return Buffer.from(response.data); - } - - /** - * 上传AI 3D模型文件到COS - * 支持ZIP格式(会解压提取GLB)和直接的GLB格式 - * @param url 模型文件URL - * @param taskId 任务ID(用于目录隔离) - * @param index 文件索引(多个文件时区分) - * @returns 上传后的COS URL - */ - async uploadAI3DModel( - url: string, - taskId: number, - index: number = 0, - ): Promise<{ modelUrl: string; ossPath: string }> { - if (!this.enabled || !this.client) { - throw new BadRequestException('COS 服务未启用'); - } - - try { - // 下载文件 - const fileBuffer = await this.downloadFromUrl(url); - - // 检查是否是ZIP文件 - const isZip = url.toLowerCase().includes('.zip') || - (fileBuffer[0] === 0x50 && fileBuffer[1] === 0x4b); // ZIP magic number - - let modelBuffer: Buffer; - let modelExt = '.glb'; - - if (isZip) { - this.logger.log('检测到ZIP文件,开始解压...'); - // 解压ZIP文件 - const zip = new AdmZip(fileBuffer); - const zipEntries = zip.getEntries(); - - // 打印ZIP中的所有文件,便于调试 - const fileNames = zipEntries.map(e => e.entryName); - this.logger.log(`ZIP包含文件: ${fileNames.join(', ')}`); - - // 按优先级查找3D模型文件 - const modelFormats = ['.glb', '.gltf', '.obj', '.fbx', '.stl', '.usdz', '.usdc']; - let modelEntry: any = null; - - for (const format of modelFormats) { - modelEntry = zipEntries.find(entry => - entry.entryName.toLowerCase().endsWith(format) - ); - if (modelEntry) { - modelExt = format; - break; - } - } - - if (!modelEntry) { - throw new Error(`ZIP文件中未找到3D模型文件,包含: ${fileNames.join(', ')}`); - } - - this.logger.log(`在ZIP中找到模型文件: ${modelEntry.entryName}`); - modelBuffer = modelEntry.getData(); - } else { - // 直接是GLB/GLTF文件 - modelBuffer = fileBuffer; - if (url.toLowerCase().includes('.gltf')) { - modelExt = '.gltf'; - } - } - - // 生成COS路径(简化:3d/{taskId}.glb 或 3d/{taskId}_1.glb) - const cosPath = index === 0 ? `3d/${taskId}${modelExt}` : `3d/${taskId}_${index}${modelExt}`; - - // 上传到COS - await new Promise((resolve, reject) => { - this.client!.putObject( - { - Bucket: this.bucket, - Region: this.region, - Key: cosPath, - Body: modelBuffer, - }, - (err, data) => { - if (err) { - reject(err); - } else { - resolve(data); - } - }, - ); - }); - - const modelUrl = `https://${this.bucket}.cos.${this.region}.myqcloud.com/${cosPath}`; - this.logger.log(`模型文件上传成功: ${modelUrl}`); - - return { modelUrl, ossPath: cosPath }; - } catch (error: any) { - this.logger.error(`上传AI 3D模型失败: ${error.message}`, error.stack); - throw new BadRequestException(`模型文件上传失败: ${error.message}`); - } - } - - /** - * 上传AI 3D预览图到COS - * @param url 预览图URL - * @param taskId 任务ID(用于目录隔离) - * @param index 文件索引(多个文件时区分) - * @returns 上传后的COS URL - */ - async uploadAI3DPreview( - url: string, - taskId: number, - index: number = 0, - ): Promise<{ previewUrl: string; ossPath: string }> { - if (!this.enabled || !this.client) { - throw new BadRequestException('COS 服务未启用'); - } - - try { - // 下载文件 - const fileBuffer = await this.downloadFromUrl(url); - - // 从URL中提取扩展名 - let ext = '.png'; - const urlPath = new URL(url).pathname; - const urlExt = path.extname(urlPath).toLowerCase(); - if (['.jpg', '.jpeg', '.png', '.webp'].includes(urlExt)) { - ext = urlExt; - } - - // 生成COS路径(简化:3d/{taskId}_p.png 或 3d/{taskId}_p1.png) - const cosPath = index === 0 ? `3d/${taskId}_p${ext}` : `3d/${taskId}_p${index}${ext}`; - - // 上传到COS - await new Promise((resolve, reject) => { - this.client!.putObject( - { - Bucket: this.bucket, - Region: this.region, - Key: cosPath, - Body: fileBuffer, - }, - (err, data) => { - if (err) { - reject(err); - } else { - resolve(data); - } - }, - ); - }); - - const previewUrl = `https://${this.bucket}.cos.${this.region}.myqcloud.com/${cosPath}`; - this.logger.log(`预览图上传成功: ${previewUrl}`); - - return { previewUrl, ossPath: cosPath }; - } catch (error: any) { - this.logger.error(`上传AI 3D预览图失败: ${error.message}`, error.stack); - throw new BadRequestException(`预览图上传失败: ${error.message}`); - } - } -} diff --git a/backend/src/permissions/dto/create-permission.dto.ts b/backend/src/permissions/dto/create-permission.dto.ts deleted file mode 100644 index 03d70e8..0000000 --- a/backend/src/permissions/dto/create-permission.dto.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IsString, IsOptional } from 'class-validator'; - -export class CreatePermissionDto { - @IsString() - name: string; - - @IsString() - code: string; - - @IsString() - resource: string; - - @IsString() - action: string; - - @IsString() - @IsOptional() - description?: string; -} - diff --git a/backend/src/permissions/dto/update-permission.dto.ts b/backend/src/permissions/dto/update-permission.dto.ts deleted file mode 100644 index db8bf43..0000000 --- a/backend/src/permissions/dto/update-permission.dto.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { IsString, IsOptional } from 'class-validator'; - -export class UpdatePermissionDto { - @IsString() - @IsOptional() - name?: string; - - @IsString() - @IsOptional() - code?: string; - - @IsString() - @IsOptional() - resource?: string; - - @IsString() - @IsOptional() - action?: string; - - @IsString() - @IsOptional() - description?: string; -} - diff --git a/backend/src/permissions/permissions.controller.ts b/backend/src/permissions/permissions.controller.ts deleted file mode 100644 index 0ae0929..0000000 --- a/backend/src/permissions/permissions.controller.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, -} from '@nestjs/common'; -import { PermissionsService } from './permissions.service'; -import { CreatePermissionDto } from './dto/create-permission.dto'; -import { UpdatePermissionDto } from './dto/update-permission.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; -import { Roles } from '../auth/decorators/roles.decorator'; - -@Controller('permissions') -@UseGuards(JwtAuthGuard) -export class PermissionsController { - constructor(private readonly permissionsService: PermissionsService) {} - - @Post() - @Roles('super_admin') - create(@Body() createPermissionDto: CreatePermissionDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new Error('无法确定租户信息'); - } - return this.permissionsService.create(createPermissionDto, tenantId); - } - - @Get() - findAll( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Request() req?: any, - ) { - const tenantId = req?.tenantId || req?.user?.tenantId; - return this.permissionsService.findAll( - page ? parseInt(page) : 1, - pageSize ? parseInt(pageSize) : 10, - tenantId, - ); - } - - @Get(':id') - findOne(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.permissionsService.findOne(+id, tenantId); - } - - @Patch(':id') - @Roles('super_admin') - update( - @Param('id') id: string, - @Body() updatePermissionDto: UpdatePermissionDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.permissionsService.update(+id, updatePermissionDto, tenantId); - } - - @Delete(':id') - @Roles('super_admin') - remove(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.permissionsService.remove(+id, tenantId); - } -} diff --git a/backend/src/permissions/permissions.module.ts b/backend/src/permissions/permissions.module.ts deleted file mode 100644 index 0070355..0000000 --- a/backend/src/permissions/permissions.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Module } from '@nestjs/common'; -import { PermissionsService } from './permissions.service'; -import { PermissionsController } from './permissions.controller'; - -@Module({ - controllers: [PermissionsController], - providers: [PermissionsService], - exports: [PermissionsService], -}) -export class PermissionsModule {} - diff --git a/backend/src/permissions/permissions.service.ts b/backend/src/permissions/permissions.service.ts deleted file mode 100644 index 0591759..0000000 --- a/backend/src/permissions/permissions.service.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreatePermissionDto } from './dto/create-permission.dto'; -import { UpdatePermissionDto } from './dto/update-permission.dto'; - -@Injectable() -export class PermissionsService { - constructor(private prisma: PrismaService) {} - - async create(createPermissionDto: CreatePermissionDto, tenantId: number) { - try { - return await this.prisma.permission.create({ - data: { - ...createPermissionDto, - tenantId, - modifyTime: new Date(), - }, - }); - } catch (error: any) { - console.error('创建权限失败:', error); - if (error.code === 'P2002') { - throw new BadRequestException('权限编码或资源操作组合已存在'); - } - throw error; - } - } - - async findAll(page: number = 1, pageSize: number = 10, tenantId?: number) { - const skip = (page - 1) * pageSize; - const where = tenantId ? { tenantId } : {}; - - const [list, total] = await Promise.all([ - this.prisma.permission.findMany({ - where, - skip, - take: pageSize, - orderBy: { - createTime: 'desc', - }, - }), - this.prisma.permission.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - async findOne(id: number, tenantId?: number) { - const where: any = { id }; - if (tenantId) { - where.tenantId = tenantId; - } - - const permission = await this.prisma.permission.findFirst({ - where, - }); - - if (!permission) { - throw new NotFoundException('权限不存在'); - } - - return permission; - } - - async update(id: number, updatePermissionDto: UpdatePermissionDto, tenantId?: number) { - // 检查权限是否存在 - await this.findOne(id, tenantId); - - return this.prisma.permission.update({ - where: { id }, - data: updatePermissionDto, - }); - } - - async remove(id: number, tenantId?: number) { - // 检查权限是否存在 - await this.findOne(id, tenantId); - - return this.prisma.permission.delete({ - where: { id }, - }); - } -} diff --git a/backend/src/prisma/prisma.module.ts b/backend/src/prisma/prisma.module.ts deleted file mode 100644 index 858e295..0000000 --- a/backend/src/prisma/prisma.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module, Global } from '@nestjs/common'; -import { PrismaService } from './prisma.service'; - -@Global() -@Module({ - providers: [PrismaService], - exports: [PrismaService], -}) -export class PrismaModule {} diff --git a/backend/src/prisma/prisma.service.ts b/backend/src/prisma/prisma.service.ts deleted file mode 100644 index 265ef79..0000000 --- a/backend/src/prisma/prisma.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; -import { PrismaClient } from '@prisma/client'; - -@Injectable() -export class PrismaService - extends PrismaClient - implements OnModuleInit, OnModuleDestroy -{ - async onModuleInit() { - await this.$connect(); - } - - async onModuleDestroy() { - await this.$disconnect(); - } -} diff --git a/backend/src/public/content-review.controller.ts b/backend/src/public/content-review.controller.ts deleted file mode 100644 index 492592b..0000000 --- a/backend/src/public/content-review.controller.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { - Controller, Get, Post, Param, Query, Body, - ParseIntPipe, UseGuards, Request, -} from '@nestjs/common'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; -import { ContentReviewService } from './content-review.service'; - -@Controller('content-review') -@UseGuards(JwtAuthGuard) -export class ContentReviewController { - constructor(private readonly reviewService: ContentReviewService) {} - - // ========== 作品审核 ========== - - @Get('works/stats') - getWorkStats() { - return this.reviewService.getWorkStats(); - } - - @Get('works') - getWorkQueue( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('status') status?: string, - @Query('keyword') keyword?: string, - @Query('startTime') startTime?: string, - @Query('endTime') endTime?: string, - @Query('sortBy') sortBy?: string, - @Query('isRecommended') isRecommended?: string, - ) { - return this.reviewService.getWorkQueue({ - page: page ? parseInt(page) : 1, - pageSize: pageSize ? parseInt(pageSize) : 10, - status, - keyword, - startTime, - endTime, - sortBy, - isRecommended: isRecommended === '1', - }); - } - - @Get('works/:id') - getWorkDetail(@Param('id', ParseIntPipe) id: number) { - return this.reviewService.getWorkDetail(id); - } - - @Post('works/batch-approve') - batchApprove(@Request() req, @Body() dto: { ids: number[] }) { - return this.reviewService.batchApprove(dto.ids || [], req.user.userId); - } - - @Post('works/batch-reject') - batchReject(@Request() req, @Body() dto: { ids: number[]; reason: string }) { - return this.reviewService.batchReject(dto.ids || [], req.user.userId, dto.reason); - } - - @Post('works/:id/approve') - approveWork( - @Param('id', ParseIntPipe) id: number, - @Request() req, - @Body() dto: { note?: string }, - ) { - return this.reviewService.approve(id, req.user.userId, dto.note); - } - - @Post('works/:id/reject') - rejectWork( - @Param('id', ParseIntPipe) id: number, - @Request() req, - @Body() dto: { reason: string; note?: string }, - ) { - return this.reviewService.reject(id, req.user.userId, dto.reason, dto.note); - } - - @Post('works/:id/revoke') - revokeWork(@Param('id', ParseIntPipe) id: number, @Request() req) { - return this.reviewService.revoke(id, req.user.userId); - } - - @Post('works/:id/takedown') - takedownWork( - @Param('id', ParseIntPipe) id: number, - @Request() req, - @Body() dto: { reason: string }, - ) { - return this.reviewService.takedown(id, req.user.userId, dto.reason); - } - - @Post('works/:id/restore') - restoreWork(@Param('id', ParseIntPipe) id: number, @Request() req) { - return this.reviewService.restore(id, req.user.userId); - } - - @Post('works/:id/recommend') - toggleRecommend(@Param('id', ParseIntPipe) id: number) { - return this.reviewService.toggleRecommend(id); - } - - // ========== 作品管理 ========== - - @Get('management/stats') - getManagementStats() { - return this.reviewService.getManagementStats(); - } - - // ========== 审核日志 ========== - - @Get('logs') - getLogs( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('workId') workId?: string, - ) { - return this.reviewService.getLogs({ - page: page ? parseInt(page) : 1, - pageSize: pageSize ? parseInt(pageSize) : 20, - workId: workId ? parseInt(workId) : undefined, - }); - } -} diff --git a/backend/src/public/content-review.service.ts b/backend/src/public/content-review.service.ts deleted file mode 100644 index 4de6682..0000000 --- a/backend/src/public/content-review.service.ts +++ /dev/null @@ -1,367 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; - -@Injectable() -export class ContentReviewService { - constructor(private prisma: PrismaService) {} - - /** 审核统计 */ - async getWorkStats() { - const today = new Date(); - today.setHours(0, 0, 0, 0); - - const [pending, todayReviewed, todayApproved, todayRejected] = await Promise.all([ - this.prisma.userWork.count({ where: { status: 'pending_review', isDeleted: 0 } }), - this.prisma.contentReviewLog.count({ where: { targetType: 'work', createTime: { gte: today } } }), - this.prisma.contentReviewLog.count({ where: { targetType: 'work', action: 'approve', createTime: { gte: today } } }), - this.prisma.contentReviewLog.count({ where: { targetType: 'work', action: 'reject', createTime: { gte: today } } }), - ]); - - return { pending, todayReviewed, todayApproved, todayRejected }; - } - - /** 审核队列列表 */ - async getWorkQueue(params: { - page?: number; - pageSize?: number; - status?: string; - keyword?: string; - startTime?: string; - endTime?: string; - sortBy?: string; - isRecommended?: boolean; - }) { - const { page = 1, pageSize = 10, status, keyword, startTime, endTime, sortBy, isRecommended } = params; - const skip = (page - 1) * pageSize; - - const where: any = { isDeleted: 0 }; - if (status) { - if (status === 'published,taken_down') { - where.status = { in: ['published', 'taken_down'] }; - } else { - where.status = status; - } - } else { - where.status = { in: ['pending_review', 'published', 'rejected', 'taken_down'] }; - } - - if (isRecommended) { - where.isRecommended = true; - } - - if (keyword) { - where.OR = [ - { title: { contains: keyword } }, - { creator: { nickname: { contains: keyword } } }, - ]; - } - - if (startTime) where.createTime = { ...where.createTime, gte: new Date(startTime) }; - if (endTime) where.createTime = { ...where.createTime, lte: new Date(endTime + ' 23:59:59') }; - - // 排序 - let orderBy: any = { createTime: 'desc' }; - if (sortBy === 'hot') orderBy = [{ likeCount: 'desc' }, { viewCount: 'desc' }]; - else if (sortBy === 'views') orderBy = { viewCount: 'desc' }; - else if (sortBy === 'latest') orderBy = { publishTime: 'desc' }; - - const [list, total] = await Promise.all([ - this.prisma.userWork.findMany({ - where, - skip, - take: pageSize, - orderBy, - include: { - creator: { select: { id: true, nickname: true, avatar: true, username: true, userType: true } }, - tags: { include: { tag: { select: { id: true, name: true } } } }, - _count: { select: { pages: true } }, - }, - }), - this.prisma.userWork.count({ where }), - ]); - - return { list, total, page, pageSize }; - } - - /** 审核详情(含绘本分页) */ - async getWorkDetail(workId: number) { - const work = await this.prisma.userWork.findUnique({ - where: { id: workId }, - include: { - pages: { orderBy: { pageNo: 'asc' } }, - creator: { select: { id: true, nickname: true, avatar: true, username: true, userType: true } }, - tags: { include: { tag: true } }, - _count: { select: { pages: true, likes: true, favorites: true, comments: true } }, - }, - }); - - if (!work) throw new NotFoundException('作品不存在'); - return work; - } - - /** 通过 */ - async approve(workId: number, operatorId: number, note?: string) { - const work = await this.prisma.userWork.findUnique({ where: { id: workId } }); - if (!work) throw new NotFoundException('作品不存在'); - - return this.prisma.$transaction(async (tx) => { - await tx.userWork.update({ - where: { id: workId }, - data: { - status: 'published', - reviewTime: new Date(), - reviewerId: operatorId, - reviewNote: note || null, - publishTime: new Date(), - }, - }); - - await tx.contentReviewLog.create({ - data: { - targetType: 'work', - targetId: workId, - workId, - action: 'approve', - note, - operatorId, - }, - }); - - return { success: true }; - }); - } - - /** 批量通过 */ - async batchApprove(workIds: number[], operatorId: number) { - const works = await this.prisma.userWork.findMany({ - where: { id: { in: workIds }, status: 'pending_review', isDeleted: 0 }, - select: { id: true }, - }); - - if (works.length === 0) return { success: true, count: 0 }; - - const ids = works.map(w => w.id); - const now = new Date(); - - await this.prisma.$transaction(async (tx) => { - await tx.userWork.updateMany({ - where: { id: { in: ids } }, - data: { status: 'published', reviewTime: now, reviewerId: operatorId, publishTime: now }, - }); - - await tx.contentReviewLog.createMany({ - data: ids.map(id => ({ - targetType: 'work', - targetId: id, - workId: id, - action: 'approve', - note: '批量审核通过', - operatorId, - })), - }); - }); - - return { success: true, count: ids.length }; - } - - /** 批量拒绝 */ - async batchReject(workIds: number[], operatorId: number, reason: string) { - const works = await this.prisma.userWork.findMany({ - where: { id: { in: workIds }, status: 'pending_review', isDeleted: 0 }, - select: { id: true }, - }); - - if (works.length === 0) return { success: true, count: 0 }; - - const ids = works.map(w => w.id); - const now = new Date(); - - await this.prisma.$transaction(async (tx) => { - await tx.userWork.updateMany({ - where: { id: { in: ids } }, - data: { status: 'rejected', reviewTime: now, reviewerId: operatorId, reviewNote: reason }, - }); - - await tx.contentReviewLog.createMany({ - data: ids.map(id => ({ - targetType: 'work', - targetId: id, - workId: id, - action: 'reject', - reason, - note: '批量审核拒绝', - operatorId, - })), - }); - }); - - return { success: true, count: ids.length }; - } - - /** 拒绝 */ - async reject(workId: number, operatorId: number, reason: string, note?: string) { - const work = await this.prisma.userWork.findUnique({ where: { id: workId } }); - if (!work) throw new NotFoundException('作品不存在'); - - return this.prisma.$transaction(async (tx) => { - await tx.userWork.update({ - where: { id: workId }, - data: { - status: 'rejected', - reviewTime: new Date(), - reviewerId: operatorId, - reviewNote: reason, - }, - }); - - await tx.contentReviewLog.create({ - data: { - targetType: 'work', - targetId: workId, - workId, - action: 'reject', - reason, - note, - operatorId, - }, - }); - - return { success: true }; - }); - } - - /** 下架 */ - async takedown(workId: number, operatorId: number, reason: string) { - const work = await this.prisma.userWork.findUnique({ where: { id: workId } }); - if (!work) throw new NotFoundException('作品不存在'); - - return this.prisma.$transaction(async (tx) => { - await tx.userWork.update({ - where: { id: workId }, - data: { status: 'taken_down', reviewNote: reason, isRecommended: false }, - }); - - await tx.contentReviewLog.create({ - data: { - targetType: 'work', - targetId: workId, - workId, - action: 'takedown', - reason, - operatorId, - }, - }); - - return { success: true }; - }); - } - - /** 恢复 */ - async restore(workId: number, operatorId: number) { - const work = await this.prisma.userWork.findUnique({ where: { id: workId } }); - if (!work) throw new NotFoundException('作品不存在'); - - return this.prisma.$transaction(async (tx) => { - await tx.userWork.update({ - where: { id: workId }, - data: { status: 'published' }, - }); - - await tx.contentReviewLog.create({ - data: { - targetType: 'work', - targetId: workId, - workId, - action: 'restore', - operatorId, - }, - }); - - return { success: true }; - }); - } - - /** 推荐/取消推荐 */ - async toggleRecommend(workId: number) { - const work = await this.prisma.userWork.findUnique({ where: { id: workId } }); - if (!work) throw new NotFoundException('作品不存在'); - - return this.prisma.userWork.update({ - where: { id: workId }, - data: { isRecommended: !work.isRecommended }, - }); - } - - /** 撤销审核(恢复为待审核) */ - async revoke(workId: number, operatorId: number) { - const work = await this.prisma.userWork.findUnique({ where: { id: workId } }); - if (!work) throw new NotFoundException('作品不存在'); - if (!['published', 'rejected'].includes(work.status)) { - throw new NotFoundException('当前状态不支持撤销'); - } - - return this.prisma.$transaction(async (tx) => { - await tx.userWork.update({ - where: { id: workId }, - data: { - status: 'pending_review', - reviewTime: null, - reviewerId: null, - reviewNote: null, - publishTime: work.status === 'published' ? null : work.publishTime, - }, - }); - - await tx.contentReviewLog.create({ - data: { - targetType: 'work', - targetId: workId, - workId, - action: 'revoke', - note: '撤销审核操作', - operatorId, - }, - }); - - return { success: true }; - }); - } - - /** 作品管理统计 */ - async getManagementStats() { - const today = new Date(); - today.setHours(0, 0, 0, 0); - - const [total, todayNew, totalViews, takenDown] = await Promise.all([ - this.prisma.userWork.count({ where: { status: 'published', isDeleted: 0 } }), - this.prisma.userWork.count({ where: { status: 'published', publishTime: { gte: today }, isDeleted: 0 } }), - this.prisma.userWork.aggregate({ where: { status: 'published', isDeleted: 0 }, _sum: { viewCount: true } }), - this.prisma.userWork.count({ where: { status: 'taken_down', isDeleted: 0 } }), - ]); - - return { total, todayNew, totalViews: totalViews._sum.viewCount || 0, takenDown }; - } - - /** 审核日志 */ - async getLogs(params: { page?: number; pageSize?: number; workId?: number }) { - const { page = 1, pageSize = 20, workId } = params; - const skip = (page - 1) * pageSize; - const where: any = {}; - if (workId) where.workId = workId; - - const [list, total] = await Promise.all([ - this.prisma.contentReviewLog.findMany({ - where, - skip, - take: pageSize, - orderBy: { createTime: 'desc' }, - include: { - operator: { select: { id: true, nickname: true } }, - }, - }), - this.prisma.contentReviewLog.count({ where }), - ]); - - return { list, total, page, pageSize }; - } -} diff --git a/backend/src/public/creation.service.ts b/backend/src/public/creation.service.ts deleted file mode 100644 index a820ca8..0000000 --- a/backend/src/public/creation.service.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { - Injectable, - NotFoundException, -} from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { UserWorksService } from './user-works.service'; - -/** - * 创作流程服务 - * - * 管理 AI 创作请求的生命周期:提交 → 生成中 → 完成/失败 - * AI 服务由同事提供,此模块做中间层对接 - * - * P0 阶段:用简单的数据库记录模拟异步流程 - * 后续对接真实 AI 服务时替换 callAiService 方法即可 - */ -@Injectable() -export class CreationService { - constructor( - private prisma: PrismaService, - private userWorksService: UserWorksService, - ) {} - - /** - * 提交创作请求 - */ - async submit(userId: number, dto: { - originalImageUrl: string; - voiceInputUrl?: string; - textInput?: string; - }) { - // 创建一个 draft 状态的作品记录,作为创作任务的载体 - const work = await this.prisma.userWork.create({ - data: { - userId, - title: '创作中...', - status: 'draft', - visibility: 'private', - originalImageUrl: dto.originalImageUrl, - voiceInputUrl: dto.voiceInputUrl || null, - textInput: dto.textInput || null, - aiMeta: { status: 'generating', submittedAt: new Date().toISOString() }, - }, - }); - - // TODO: 调用同事的 AI 服务,传入 originalImageUrl + voiceInputUrl/textInput - // AI 服务返回一个任务 ID,异步生成绘本 - // 这里模拟异步过程:实际对接时替换为真实 API 调用 - // - // 示例: - // const aiResult = await this.callAiService({ - // imageUrl: dto.originalImageUrl, - // voiceUrl: dto.voiceInputUrl, - // text: dto.textInput, - // }); - // - // 将 aiResult.taskId 存入 aiMeta - - return { - id: work.id, - status: 'generating', - message: '创作请求已提交,正在生成绘本...', - }; - } - - /** - * 查询创作进度 - */ - async getStatus(workId: number, userId: number) { - const work = await this.prisma.userWork.findFirst({ - where: { id: workId, userId, isDeleted: 0 }, - select: { - id: true, - title: true, - status: true, - aiMeta: true, - createTime: true, - }, - }); - - if (!work) throw new NotFoundException('创作任务不存在'); - - const aiMeta = work.aiMeta as any; - return { - id: work.id, - status: aiMeta?.status || work.status, - title: work.title, - createdAt: work.createTime, - }; - } - - /** - * AI 生成完成后的回调(由 AI 服务或定时任务调用) - * 将生成结果写入作品库 - */ - async completeGeneration(workId: number, result: { - title: string; - coverUrl: string; - pages: Array<{ - pageNo: number; - imageUrl: string; - text: string; - audioUrl?: string; - }>; - aiMeta?: any; - }) { - return this.prisma.$transaction(async (tx) => { - // 更新作品基本信息 - await tx.userWork.update({ - where: { id: workId }, - data: { - title: result.title, - coverUrl: result.coverUrl, - status: 'draft', - aiMeta: { - ...(result.aiMeta || {}), - status: 'completed', - completedAt: new Date().toISOString(), - }, - }, - }); - - // 写入绘本分页 - if (result.pages.length > 0) { - // 先清除旧分页 - await tx.userWorkPage.deleteMany({ where: { workId } }); - await tx.userWorkPage.createMany({ - data: result.pages.map((p) => ({ - workId, - pageNo: p.pageNo, - imageUrl: p.imageUrl, - text: p.text, - audioUrl: p.audioUrl || null, - })), - }); - } - - return { id: workId, status: 'completed' }; - }); - } - - /** - * 获取创作结果 - */ - async getResult(workId: number, userId: number) { - return this.userWorksService.findOne(workId, userId); - } - - /** - * 创作历史 - */ - async getHistory(userId: number, params: { page?: number; pageSize?: number }) { - const { page = 1, pageSize = 10 } = params; - const skip = (page - 1) * pageSize; - - const where = { - userId, - isDeleted: 0, - originalImageUrl: { not: null }, // 只查有原画的(即通过创作流程创建的) - }; - - const [list, total] = await Promise.all([ - this.prisma.userWork.findMany({ - where: where as any, - skip, - take: pageSize, - orderBy: { createTime: 'desc' }, - select: { - id: true, - title: true, - coverUrl: true, - status: true, - originalImageUrl: true, - aiMeta: true, - createTime: true, - _count: { select: { pages: true } }, - }, - }), - this.prisma.userWork.count({ where: where as any }), - ]); - - return { list, total, page, pageSize }; - } -} diff --git a/backend/src/public/dto/child.dto.ts b/backend/src/public/dto/child.dto.ts deleted file mode 100644 index 3703e39..0000000 --- a/backend/src/public/dto/child.dto.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - IsString, - IsNotEmpty, - IsOptional, - IsDateString, - MaxLength, -} from 'class-validator'; - -export class CreateChildDto { - @IsString() - @IsNotEmpty({ message: '子女姓名不能为空' }) - @MaxLength(50, { message: '姓名最多50个字符' }) - name: string; - - @IsString() - @IsOptional() - gender?: string; - - @IsDateString({}, { message: '出生日期格式不正确' }) - @IsOptional() - birthday?: string; - - @IsString() - @IsOptional() - @MaxLength(20) - grade?: string; - - @IsString() - @IsOptional() - @MaxLength(50) - city?: string; - - @IsString() - @IsOptional() - @MaxLength(100) - schoolName?: string; -} - -export class UpdateChildDto { - @IsString() - @IsOptional() - @MaxLength(50) - name?: string; - - @IsString() - @IsOptional() - gender?: string; - - @IsDateString({}, { message: '出生日期格式不正确' }) - @IsOptional() - birthday?: string; - - @IsString() - @IsOptional() - @MaxLength(20) - grade?: string; - - @IsString() - @IsOptional() - @MaxLength(50) - city?: string; - - @IsString() - @IsOptional() - @MaxLength(100) - schoolName?: string; -} diff --git a/backend/src/public/dto/register.dto.ts b/backend/src/public/dto/register.dto.ts deleted file mode 100644 index 5470568..0000000 --- a/backend/src/public/dto/register.dto.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - IsString, - IsNotEmpty, - IsOptional, - MinLength, - MaxLength, - Matches, -} from 'class-validator'; - -export class PublicRegisterDto { - @IsString() - @IsNotEmpty({ message: '用户名不能为空' }) - @MinLength(4, { message: '用户名至少4个字符' }) - @MaxLength(20, { message: '用户名最多20个字符' }) - @Matches(/^[a-zA-Z0-9_]+$/, { message: '用户名只能包含字母、数字和下划线' }) - username: string; - - @IsString() - @IsNotEmpty({ message: '密码不能为空' }) - @MinLength(6, { message: '密码至少6个字符' }) - @MaxLength(20, { message: '密码最多20个字符' }) - password: string; - - @IsString() - @IsNotEmpty({ message: '昵称不能为空' }) - @MinLength(2, { message: '昵称至少2个字符' }) - @MaxLength(20, { message: '昵称最多20个字符' }) - nickname: string; - - @IsString() - @IsOptional() - phone?: string; - - @IsString() - @IsOptional() - city?: string; -} - -export class PublicLoginDto { - @IsString() - @IsNotEmpty({ message: '用户名不能为空' }) - username: string; - - @IsString() - @IsNotEmpty({ message: '密码不能为空' }) - password: string; -} diff --git a/backend/src/public/dto/registration.dto.ts b/backend/src/public/dto/registration.dto.ts deleted file mode 100644 index 1b4b568..0000000 --- a/backend/src/public/dto/registration.dto.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { - IsInt, - IsNotEmpty, - IsOptional, - IsString, - IsEnum, -} from 'class-validator'; - -export class PublicRegisterActivityDto { - @IsInt() - @IsNotEmpty({ message: '活动ID不能为空' }) - contestId: number; - - @IsEnum(['self', 'child'], { message: '参与者类型只能是 self 或 child' }) - @IsNotEmpty() - participantType: 'self' | 'child'; - - @IsInt() - @IsOptional() - childId?: number; - - @IsString() - @IsOptional() - remark?: string; -} diff --git a/backend/src/public/gallery.service.ts b/backend/src/public/gallery.service.ts deleted file mode 100644 index ce62b1d..0000000 --- a/backend/src/public/gallery.service.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; - -@Injectable() -export class GalleryService { - constructor(private prisma: PrismaService) {} - - /** 作品广场列表(已审核通过的公开作品) */ - async getGalleryList(params: { - page?: number; - pageSize?: number; - tagId?: number; - category?: string; - sortBy?: string; - keyword?: string; - }) { - const { page = 1, pageSize = 12, tagId, category, sortBy = 'latest', keyword } = params; - const skip = (page - 1) * pageSize; - - const where: any = { - status: 'published', - visibility: 'public', - isDeleted: 0, - }; - - if (keyword) { - where.OR = [ - { title: { contains: keyword } }, - { description: { contains: keyword } }, - ]; - } - - if (tagId) { - where.tags = { some: { tagId } }; - } - - if (category) { - where.tags = { - ...where.tags, - some: { ...where.tags?.some, tag: { category } }, - }; - } - - const orderBy: any = sortBy === 'hot' - ? [{ likeCount: 'desc' }, { viewCount: 'desc' }] - : sortBy === 'views' - ? { viewCount: 'desc' } - : { publishTime: 'desc' }; - - const [list, total] = await Promise.all([ - this.prisma.userWork.findMany({ - where, - skip, - take: pageSize, - orderBy, - include: { - creator: { select: { id: true, nickname: true, avatar: true } }, - tags: { include: { tag: { select: { id: true, name: true } } } }, - _count: { select: { pages: true, likes: true, comments: true } }, - }, - }), - this.prisma.userWork.count({ where }), - ]); - - return { list, total, page, pageSize }; - } - - /** 广场作品详情(增加浏览量) */ - async getGalleryDetail(id: number) { - const work = await this.prisma.userWork.findFirst({ - where: { id, status: 'published', visibility: 'public', isDeleted: 0 }, - include: { - pages: { orderBy: { pageNo: 'asc' } }, - creator: { select: { id: true, nickname: true, avatar: true, username: true } }, - tags: { include: { tag: true } }, - _count: { select: { pages: true, likes: true, favorites: true, comments: true } }, - }, - }); - - if (!work) throw new NotFoundException('作品不存在'); - - // 异步增加浏览量 - this.prisma.userWork.update({ - where: { id }, - data: { viewCount: { increment: 1 } }, - }).catch(() => {}); - - return work; - } - - /** 推荐作品列表 */ - async getRecommendedWorks(limit = 10) { - return this.prisma.userWork.findMany({ - where: { - isRecommended: true, - status: 'published', - visibility: 'public', - isDeleted: 0, - }, - take: limit, - orderBy: [{ likeCount: 'desc' }, { publishTime: 'desc' }], - include: { - creator: { select: { id: true, nickname: true, avatar: true } }, - }, - }); - } - - /** 某用户的公开作品列表 */ - async getUserPublicWorks(userId: number, params: { page?: number; pageSize?: number }) { - const { page = 1, pageSize = 12 } = params; - const skip = (page - 1) * pageSize; - - const where = { - userId, - status: 'published', - visibility: 'public', - isDeleted: 0, - }; - - const [list, total] = await Promise.all([ - this.prisma.userWork.findMany({ - where, - skip, - take: pageSize, - orderBy: { publishTime: 'desc' }, - include: { - tags: { include: { tag: { select: { id: true, name: true } } } }, - _count: { select: { pages: true, likes: true } }, - }, - }), - this.prisma.userWork.count({ where }), - ]); - - return { list, total, page, pageSize }; - } -} diff --git a/backend/src/public/interaction.service.ts b/backend/src/public/interaction.service.ts deleted file mode 100644 index 7d60ef4..0000000 --- a/backend/src/public/interaction.service.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; - -@Injectable() -export class InteractionService { - constructor(private prisma: PrismaService) {} - - /** 点赞/取消点赞(toggle) */ - async toggleLike(userId: number, workId: number) { - // 校验作品存在且已发布 - await this.ensureWorkExists(workId); - - const existing = await this.prisma.userWorkLike.findUnique({ - where: { userId_workId: { userId, workId } }, - }); - - if (existing) { - await this.prisma.$transaction([ - this.prisma.userWorkLike.delete({ - where: { id: existing.id }, - }), - this.prisma.userWork.update({ - where: { id: workId }, - data: { likeCount: { decrement: 1 } }, - }), - ]); - const work = await this.prisma.userWork.findUnique({ - where: { id: workId }, - select: { likeCount: true }, - }); - return { liked: false, likeCount: work.likeCount }; - } else { - await this.prisma.$transaction([ - this.prisma.userWorkLike.create({ - data: { userId, workId }, - }), - this.prisma.userWork.update({ - where: { id: workId }, - data: { likeCount: { increment: 1 } }, - }), - ]); - const work = await this.prisma.userWork.findUnique({ - where: { id: workId }, - select: { likeCount: true }, - }); - return { liked: true, likeCount: work.likeCount }; - } - } - - /** 收藏/取消收藏(toggle) */ - async toggleFavorite(userId: number, workId: number) { - await this.ensureWorkExists(workId); - - const existing = await this.prisma.userWorkFavorite.findUnique({ - where: { userId_workId: { userId, workId } }, - }); - - if (existing) { - await this.prisma.$transaction([ - this.prisma.userWorkFavorite.delete({ - where: { id: existing.id }, - }), - this.prisma.userWork.update({ - where: { id: workId }, - data: { favoriteCount: { decrement: 1 } }, - }), - ]); - const work = await this.prisma.userWork.findUnique({ - where: { id: workId }, - select: { favoriteCount: true }, - }); - return { favorited: false, favoriteCount: work.favoriteCount }; - } else { - await this.prisma.$transaction([ - this.prisma.userWorkFavorite.create({ - data: { userId, workId }, - }), - this.prisma.userWork.update({ - where: { id: workId }, - data: { favoriteCount: { increment: 1 } }, - }), - ]); - const work = await this.prisma.userWork.findUnique({ - where: { id: workId }, - select: { favoriteCount: true }, - }); - return { favorited: true, favoriteCount: work.favoriteCount }; - } - } - - /** 查询当前用户对某作品的交互状态 */ - async getInteractionStatus(userId: number, workId: number) { - const [like, favorite] = await Promise.all([ - this.prisma.userWorkLike.findUnique({ - where: { userId_workId: { userId, workId } }, - }), - this.prisma.userWorkFavorite.findUnique({ - where: { userId_workId: { userId, workId } }, - }), - ]); - return { liked: !!like, favorited: !!favorite }; - } - - /** 我的收藏列表 */ - async getMyFavorites(userId: number, query: { page?: number; pageSize?: number }) { - const page = query.page || 1; - const pageSize = query.pageSize || 12; - const skip = (page - 1) * pageSize; - - const where = { - userId, - work: { status: 'published', isDeleted: 0 }, - }; - - const [list, total] = await Promise.all([ - this.prisma.userWorkFavorite.findMany({ - where, - skip, - take: pageSize, - orderBy: { createTime: 'desc' }, - include: { - work: { - select: { - id: true, - title: true, - coverUrl: true, - likeCount: true, - viewCount: true, - favoriteCount: true, - creator: { select: { id: true, nickname: true, avatar: true } }, - }, - }, - }, - }), - this.prisma.userWorkFavorite.count({ where }), - ]); - - return { list, total, page, pageSize }; - } - - /** 批量查询交互状态(用于列表页) */ - async batchGetInteractionStatus(userId: number, workIds: number[]) { - if (!workIds.length) return {}; - - const [likes, favorites] = await Promise.all([ - this.prisma.userWorkLike.findMany({ - where: { userId, workId: { in: workIds } }, - select: { workId: true }, - }), - this.prisma.userWorkFavorite.findMany({ - where: { userId, workId: { in: workIds } }, - select: { workId: true }, - }), - ]); - - const likedSet = new Set(likes.map(l => l.workId)); - const favoritedSet = new Set(favorites.map(f => f.workId)); - - const result: Record = {}; - for (const id of workIds) { - result[id] = { liked: likedSet.has(id), favorited: favoritedSet.has(id) }; - } - return result; - } - - private async ensureWorkExists(workId: number) { - const work = await this.prisma.userWork.findFirst({ - where: { id: workId, status: 'published', isDeleted: 0 }, - select: { id: true }, - }); - if (!work) throw new NotFoundException('作品不存在或未发布'); - } -} diff --git a/backend/src/public/public.controller.ts b/backend/src/public/public.controller.ts deleted file mode 100644 index 9367855..0000000 --- a/backend/src/public/public.controller.ts +++ /dev/null @@ -1,473 +0,0 @@ -import { - Controller, - Get, - Post, - Put, - Delete, - Body, - Param, - Query, - Request, - ParseIntPipe, - UseGuards, -} from '@nestjs/common'; -import { AuthGuard } from '@nestjs/passport'; -import { PublicService } from './public.service'; -import { UserWorksService } from './user-works.service'; -import { CreationService } from './creation.service'; -import { TagsService } from './tags.service'; -import { GalleryService } from './gallery.service'; -import { InteractionService } from './interaction.service'; -import { PublicRegisterDto, PublicLoginDto } from './dto/register.dto'; -import { CreateChildDto, UpdateChildDto } from './dto/child.dto'; -import { PublicRegisterActivityDto } from './dto/registration.dto'; -import { Public } from '../auth/decorators/public.decorator'; - -@Controller('public') -export class PublicController { - constructor( - private readonly publicService: PublicService, - private readonly userWorksService: UserWorksService, - private readonly creationService: CreationService, - private readonly tagsService: TagsService, - private readonly galleryService: GalleryService, - private readonly interactionService: InteractionService, - ) {} - - // ==================== 注册 & 登录(公开接口) ==================== - - @Public() - @Post('auth/register') - async register(@Body() dto: PublicRegisterDto) { - return this.publicService.register(dto); - } - - @Public() - @Post('auth/login') - async login(@Body() dto: PublicLoginDto) { - return this.publicService.login(dto); - } - - // ==================== 个人信息(需要登录) ==================== - - @UseGuards(AuthGuard('jwt')) - @Get('mine/profile') - async getProfile(@Request() req) { - return this.publicService.getUserInfo(req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Put('mine/profile') - async updateProfile( - @Request() req, - @Body() data: { nickname?: string; city?: string; avatar?: string; gender?: string }, - ) { - return this.publicService.updateProfile(req.user.userId, data); - } - - // ==================== 子女管理(需要登录) ==================== - - @UseGuards(AuthGuard('jwt')) - @Get('mine/children') - async getChildren(@Request() req) { - return this.publicService.getChildren(req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Post('mine/children') - async createChild(@Request() req, @Body() dto: CreateChildDto) { - return this.publicService.createChild(req.user.userId, dto); - } - - @UseGuards(AuthGuard('jwt')) - @Get('mine/children/:id') - async getChild(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.publicService.getChild(req.user.userId, id); - } - - @UseGuards(AuthGuard('jwt')) - @Put('mine/children/:id') - async updateChild( - @Request() req, - @Param('id', ParseIntPipe) id: number, - @Body() dto: UpdateChildDto, - ) { - return this.publicService.updateChild(req.user.userId, id, dto); - } - - @UseGuards(AuthGuard('jwt')) - @Delete('mine/children/:id') - async deleteChild(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.publicService.deleteChild(req.user.userId, id); - } - - // ==================== 子女独立账号管理(需要登录) ==================== - - @UseGuards(AuthGuard('jwt')) - @Post('children/create-account') - async createChildAccount(@Request() req, @Body() dto: { - username: string; - password: string; - nickname: string; - gender?: string; - birthday?: string; - city?: string; - avatar?: string; - relationship?: string; - }) { - return this.publicService.createChildAccount(req.user.userId, dto); - } - - @UseGuards(AuthGuard('jwt')) - @Get('children/accounts') - async getChildAccounts(@Request() req) { - return this.publicService.getChildAccounts(req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Post('auth/switch-child') - async switchToChild(@Request() req, @Body() dto: { childUserId: number }) { - return this.publicService.switchToChild(req.user.userId, dto.childUserId); - } - - @UseGuards(AuthGuard('jwt')) - @Put('children/accounts/:id') - async updateChildAccount( - @Request() req, - @Param('id', ParseIntPipe) id: number, - @Body() dto: { - nickname?: string; - password?: string; - gender?: string; - birthday?: string; - city?: string; - avatar?: string; - controlMode?: string; - }, - ) { - return this.publicService.updateChildAccount(req.user.userId, id, dto); - } - - @UseGuards(AuthGuard('jwt')) - @Get('mine/parent-info') - async getParentInfo(@Request() req) { - return this.publicService.getParentInfo(req.user.userId); - } - - // ==================== 作品提交(需要登录) ==================== - - @UseGuards(AuthGuard('jwt')) - @Get('activities/:id/my-registration') - async getMyRegistration(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.publicService.getMyRegistration(req.user.userId, id); - } - - @UseGuards(AuthGuard('jwt')) - @Post('activities/:id/submit-work') - async submitWork( - @Request() req, - @Param('id', ParseIntPipe) id: number, - @Body() data: { registrationId: number; title: string; description?: string; files?: string[]; previewUrl?: string; attachments?: any[] }, - ) { - return this.publicService.submitWork(req.user.userId, data); - } - - // ==================== 报名(需要登录) ==================== - - @UseGuards(AuthGuard('jwt')) - @Post('activities/:id/register') - async registerActivity( - @Request() req, - @Param('id', ParseIntPipe) id: number, - @Body() dto: PublicRegisterActivityDto, - ) { - dto.contestId = id; - return this.publicService.registerActivity(req.user.userId, dto); - } - - // ==================== 我的报名 & 作品(需要登录) ==================== - - @UseGuards(AuthGuard('jwt')) - @Get('mine/registrations') - async getMyRegistrations( - @Request() req, - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - ) { - return this.publicService.getMyRegistrations(req.user.userId, { - page: page ? parseInt(page, 10) : 1, - pageSize: pageSize ? parseInt(pageSize, 10) : 10, - }); - } - - @UseGuards(AuthGuard('jwt')) - @Get('mine/works') - async getMyWorks( - @Request() req, - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - ) { - return this.publicService.getMyWorks(req.user.userId, { - page: page ? parseInt(page, 10) : 1, - pageSize: pageSize ? parseInt(pageSize, 10) : 10, - }); - } - - // ==================== 公众用户管理(超管端使用) ==================== - - @UseGuards(AuthGuard('jwt')) - @Get('users') - async getPublicUsers( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('keyword') keyword?: string, - ) { - return this.publicService.getPublicUsers({ - page: page ? parseInt(page, 10) : 1, - pageSize: pageSize ? parseInt(pageSize, 10) : 10, - keyword, - }); - } - - @UseGuards(AuthGuard('jwt')) - @Get('users/:id') - async getPublicUserDetail(@Param('id', ParseIntPipe) id: number) { - return this.publicService.getPublicUserDetail(id); - } - - // ==================== 活动浏览(公开接口) ==================== - - @Public() - @Get('activities') - async getActivities( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('keyword') keyword?: string, - @Query('contestType') contestType?: string, - @Request() req?, - ) { - // 尝试从 JWT 获取用户 ID(未登录用户为 undefined) - const userId = req?.user?.userId; - return this.publicService.getPublicActivities( - { - page: page ? parseInt(page, 10) : 1, - pageSize: pageSize ? parseInt(pageSize, 10) : 12, - keyword, - contestType, - }, - userId, - ); - } - - @Public() - @Get('activities/:id') - async getActivityDetail(@Param('id', ParseIntPipe) id: number) { - return this.publicService.getActivityDetail(id); - } - - // ==================== 用户作品库 ==================== - - @UseGuards(AuthGuard('jwt')) - @Post('works') - async createUserWork(@Request() req, @Body() dto: any) { - return this.userWorksService.create(req.user.userId, dto); - } - - @UseGuards(AuthGuard('jwt')) - @Get('works') - async getUserWorksList( - @Request() req, - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('status') status?: string, - @Query('keyword') keyword?: string, - ) { - return this.userWorksService.findMyWorks(req.user.userId, { - page: page ? parseInt(page) : 1, - pageSize: pageSize ? parseInt(pageSize) : 10, - status, - keyword, - }); - } - - @UseGuards(AuthGuard('jwt')) - @Get('works/:id') - async getUserWork(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.userWorksService.findOne(id, req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Put('works/:id') - async updateUserWork( - @Request() req, - @Param('id', ParseIntPipe) id: number, - @Body() dto: any, - ) { - return this.userWorksService.update(id, req.user.userId, dto); - } - - @UseGuards(AuthGuard('jwt')) - @Delete('works/:id') - async deleteUserWork(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.userWorksService.remove(id, req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Post('works/:id/publish') - async publishUserWork(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.userWorksService.publish(id, req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Get('works/:id/pages') - async getUserWorkPages(@Param('id', ParseIntPipe) id: number) { - return this.userWorksService.getPages(id); - } - - @UseGuards(AuthGuard('jwt')) - @Post('works/:id/pages') - async saveUserWorkPages( - @Request() req, - @Param('id', ParseIntPipe) id: number, - @Body() dto: { pages: Array<{ pageNo: number; imageUrl?: string; text?: string; audioUrl?: string }> }, - ) { - return this.userWorksService.savePages(id, req.user.userId, dto.pages); - } - - // ==================== AI 创作流程 ==================== - - @UseGuards(AuthGuard('jwt')) - @Post('creation/submit') - async submitCreation(@Request() req, @Body() dto: { - originalImageUrl: string; - voiceInputUrl?: string; - textInput?: string; - }) { - return this.creationService.submit(req.user.userId, dto); - } - - @UseGuards(AuthGuard('jwt')) - @Get('creation/:id/status') - async getCreationStatus(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.creationService.getStatus(id, req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Get('creation/:id/result') - async getCreationResult(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.creationService.getResult(id, req.user.userId); - } - - @UseGuards(AuthGuard('jwt')) - @Get('creation/history') - async getCreationHistory( - @Request() req, - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - ) { - return this.creationService.getHistory(req.user.userId, { - page: page ? parseInt(page) : 1, - pageSize: pageSize ? parseInt(pageSize) : 10, - }); - } - - // ==================== 标签(公众端) ==================== - - @Public() - @Get('tags') - async getPublicTags() { - return this.tagsService.getPublicTags(); - } - - @Public() - @Get('tags/hot') - async getHotTags() { - return this.tagsService.getHotTags(); - } - - // ==================== 作品广场(公众端) ==================== - - @Public() - @Get('gallery') - async getGalleryList( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('tagId') tagId?: string, - @Query('category') category?: string, - @Query('sortBy') sortBy?: string, - @Query('keyword') keyword?: string, - ) { - return this.galleryService.getGalleryList({ - page: page ? parseInt(page) : 1, - pageSize: pageSize ? parseInt(pageSize) : 12, - tagId: tagId ? parseInt(tagId) : undefined, - category, - sortBy, - keyword, - }); - } - - @Public() - @Get('gallery/recommended') - async getRecommendedWorks() { - return this.galleryService.getRecommendedWorks(); - } - - @Public() - @Get('gallery/:id') - async getGalleryDetail(@Param('id', ParseIntPipe) id: number) { - return this.galleryService.getGalleryDetail(id); - } - - @Public() - @Get('users/:id/works') - async getUserPublicWorks( - @Param('id', ParseIntPipe) id: number, - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - ) { - return this.galleryService.getUserPublicWorks(id, { - page: page ? parseInt(page) : 1, - pageSize: pageSize ? parseInt(pageSize) : 12, - }); - } - - // ==================== 点赞 & 收藏(需要登录) ==================== - - @UseGuards(AuthGuard('jwt')) - @Post('works/batch-interaction') - async batchInteraction(@Request() req, @Body() body: { workIds: number[] }) { - return this.interactionService.batchGetInteractionStatus(req.user.userId, body.workIds || []); - } - - @UseGuards(AuthGuard('jwt')) - @Post('works/:id/like') - async toggleLike(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.interactionService.toggleLike(req.user.userId, id); - } - - @UseGuards(AuthGuard('jwt')) - @Post('works/:id/favorite') - async toggleFavorite(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.interactionService.toggleFavorite(req.user.userId, id); - } - - @UseGuards(AuthGuard('jwt')) - @Get('works/:id/interaction') - async getInteraction(@Request() req, @Param('id', ParseIntPipe) id: number) { - return this.interactionService.getInteractionStatus(req.user.userId, id); - } - - @UseGuards(AuthGuard('jwt')) - @Get('mine/favorites') - async getMyFavorites( - @Request() req, - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - ) { - return this.interactionService.getMyFavorites(req.user.userId, { - page: page ? parseInt(page, 10) : 1, - pageSize: pageSize ? parseInt(pageSize, 10) : 12, - }); - } -} diff --git a/backend/src/public/public.module.ts b/backend/src/public/public.module.ts deleted file mode 100644 index d962b3e..0000000 --- a/backend/src/public/public.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Module } from '@nestjs/common'; -import { JwtModule } from '@nestjs/jwt'; -import { ConfigService } from '@nestjs/config'; -import { PublicController } from './public.controller'; -import { TagsController } from './tags.controller'; -import { ContentReviewController } from './content-review.controller'; -import { PublicService } from './public.service'; -import { UserWorksService } from './user-works.service'; -import { CreationService } from './creation.service'; -import { TagsService } from './tags.service'; -import { GalleryService } from './gallery.service'; -import { ContentReviewService } from './content-review.service'; -import { InteractionService } from './interaction.service'; -import { PrismaModule } from '../prisma/prisma.module'; - -@Module({ - imports: [ - PrismaModule, - JwtModule.registerAsync({ - inject: [ConfigService], - useFactory: (config: ConfigService) => ({ - secret: config.get('JWT_SECRET') || 'your-secret-key', - signOptions: { expiresIn: '7d' }, - }), - }), - ], - controllers: [PublicController, TagsController, ContentReviewController], - providers: [PublicService, UserWorksService, CreationService, TagsService, GalleryService, ContentReviewService, InteractionService], - exports: [PublicService, UserWorksService, CreationService, TagsService, GalleryService, ContentReviewService, InteractionService], -}) -export class PublicModule {} diff --git a/backend/src/public/public.service.ts b/backend/src/public/public.service.ts deleted file mode 100644 index b9ac873..0000000 --- a/backend/src/public/public.service.ts +++ /dev/null @@ -1,1209 +0,0 @@ -import { - Injectable, - ConflictException, - UnauthorizedException, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { JwtService } from '@nestjs/jwt'; -import { PrismaService } from '../prisma/prisma.service'; -import * as bcrypt from 'bcrypt'; -import { PublicRegisterDto, PublicLoginDto } from './dto/register.dto'; -import { CreateChildDto, UpdateChildDto } from './dto/child.dto'; -import { PublicRegisterActivityDto } from './dto/registration.dto'; - -// 公众租户编码(系统内置) -const PUBLIC_TENANT_CODE = 'public'; - -@Injectable() -export class PublicService { - constructor( - private prisma: PrismaService, - private jwtService: JwtService, - ) {} - - /** - * 获取公众租户 ID - */ - private async getPublicTenantId(): Promise { - const tenant = await this.prisma.tenant.findUnique({ - where: { code: PUBLIC_TENANT_CODE }, - }); - if (!tenant) { - throw new BadRequestException('公众租户未初始化,请联系管理员'); - } - return tenant.id; - } - - /** - * 获取公众用户角色 ID - */ - private async getPublicRoleId(tenantId: number): Promise { - const role = await this.prisma.role.findFirst({ - where: { tenantId, code: 'public_user' }, - }); - if (!role) { - throw new BadRequestException('公众用户角色未初始化,请联系管理员'); - } - return role.id; - } - - // ==================== 注册 & 登录 ==================== - - /** - * 公众用户注册 - */ - async register(dto: PublicRegisterDto) { - const tenantId = await this.getPublicTenantId(); - - // 检查用户名是否已存在(在公众租户内) - const existingUser = await this.prisma.user.findFirst({ - where: { username: dto.username, tenantId }, - }); - if (existingUser) { - throw new ConflictException('用户名已被注册'); - } - - // 检查手机号是否已被使用 - if (dto.phone) { - const existingPhone = await this.prisma.user.findFirst({ - where: { phone: dto.phone }, - }); - if (existingPhone) { - throw new ConflictException('该手机号已被注册'); - } - } - - const hashedPassword = await bcrypt.hash(dto.password, 10); - const roleId = await this.getPublicRoleId(tenantId); - - const user = await this.prisma.user.create({ - data: { - tenantId, - username: dto.username, - password: hashedPassword, - nickname: dto.nickname, - phone: dto.phone || null, - city: dto.city || null, - userSource: 'self_registered', - roles: { - create: [{ roleId }], - }, - }, - include: { - roles: { - include: { - role: { - include: { - permissions: { include: { permission: true } }, - }, - }, - }, - }, - }, - }); - - // 注册成功后自动登录,返回 token - return this.generateLoginResponse(user, tenantId); - } - - /** - * 公众用户登录 - */ - async login(dto: PublicLoginDto) { - const tenantId = await this.getPublicTenantId(); - - const user = await this.prisma.user.findFirst({ - where: { username: dto.username, tenantId }, - include: { - roles: { - include: { - role: { - include: { - permissions: { include: { permission: true } }, - }, - }, - }, - }, - }, - }); - - if (!user) { - throw new UnauthorizedException('用户名或密码错误'); - } - - const isPasswordValid = await bcrypt.compare(dto.password, user.password); - if (!isPasswordValid) { - throw new UnauthorizedException('用户名或密码错误'); - } - - if (user.status !== 'enabled') { - throw new UnauthorizedException('账号已被禁用'); - } - - return this.generateLoginResponse(user, tenantId); - } - - /** - * 生成登录响应(token + 用户信息) - */ - private async generateLoginResponse(user: any, tenantId: number) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantId }, - }); - - // 如果是子女账号,查找家长关系 - let parentUserId: number | null = null; - if (user.userType === 'child') { - const parentRelation = await this.prisma.userParentChild.findFirst({ - where: { childUserId: user.id }, - }); - parentUserId = parentRelation?.parentUserId || null; - } - - const payload = { - username: user.username, - sub: user.id, - tenantId, - userType: user.userType || 'adult', - parentUserId, - }; - - const permissions = new Set(); - user.roles?.forEach((ur: any) => { - ur.role.permissions?.forEach((rp: any) => { - permissions.add(rp.permission.code); - }); - }); - - return { - token: this.jwtService.sign(payload), - user: { - id: user.id, - username: user.username, - nickname: user.nickname, - phone: user.phone, - city: user.city, - avatar: user.avatar, - tenantId, - tenantCode: tenant?.code, - userSource: user.userSource, - userType: user.userType || 'adult', - parentUserId, - roles: user.roles?.map((ur: any) => ur.role.code) || [], - permissions: Array.from(permissions), - }, - }; - } - - /** - * 获取公众用户信息 - */ - async getUserInfo(userId: number) { - const user = await this.prisma.user.findUnique({ - where: { id: userId }, - include: { - roles: { - include: { - role: { - include: { - permissions: { include: { permission: true } }, - }, - }, - }, - }, - children: { - where: { isDeleted: 0 }, - orderBy: { createTime: 'desc' }, - }, - }, - }); - - if (!user) { - throw new NotFoundException('用户不存在'); - } - - const permissions = new Set(); - user.roles?.forEach((ur: any) => { - ur.role.permissions?.forEach((rp: any) => { - permissions.add(rp.permission.code); - }); - }); - - return { - id: user.id, - username: user.username, - nickname: user.nickname, - phone: user.phone, - city: user.city, - avatar: user.avatar, - birthday: user.birthday, - gender: user.gender, - userSource: user.userSource, - roles: user.roles?.map((ur: any) => ur.role.code) || [], - permissions: Array.from(permissions), - children: user.children, - childrenCount: user.children.length, - }; - } - - /** - * 更新公众用户个人信息 - */ - async updateProfile( - userId: number, - data: { nickname?: string; city?: string; avatar?: string; gender?: string }, - ) { - return this.prisma.user.update({ - where: { id: userId }, - data, - select: { - id: true, - username: true, - nickname: true, - phone: true, - city: true, - avatar: true, - gender: true, - }, - }); - } - - // ==================== 子女管理 ==================== - - /** - * 获取子女列表 - */ - async getChildren(parentId: number) { - return this.prisma.child.findMany({ - where: { parentId, isDeleted: 0 }, - orderBy: { createTime: 'desc' }, - }); - } - - /** - * 添加子女 - */ - async createChild(parentId: number, dto: CreateChildDto) { - return this.prisma.child.create({ - data: { - parentId, - name: dto.name, - gender: dto.gender || null, - birthday: dto.birthday ? new Date(dto.birthday) : null, - grade: dto.grade || null, - city: dto.city || null, - schoolName: dto.schoolName || null, - }, - }); - } - - /** - * 获取单个子女详情 - */ - async getChild(parentId: number, childId: number) { - const child = await this.prisma.child.findFirst({ - where: { id: childId, parentId, isDeleted: 0 }, - }); - if (!child) { - throw new NotFoundException('子女信息不存在'); - } - return child; - } - - /** - * 更新子女信息 - */ - async updateChild(parentId: number, childId: number, dto: UpdateChildDto) { - // 验证子女归属 - await this.getChild(parentId, childId); - - const data: any = {}; - if (dto.name !== undefined) data.name = dto.name; - if (dto.gender !== undefined) data.gender = dto.gender; - if (dto.birthday !== undefined) - data.birthday = dto.birthday ? new Date(dto.birthday) : null; - if (dto.grade !== undefined) data.grade = dto.grade; - if (dto.city !== undefined) data.city = dto.city; - if (dto.schoolName !== undefined) data.schoolName = dto.schoolName; - - return this.prisma.child.update({ - where: { id: childId }, - data, - }); - } - - /** - * 删除子女(软删除) - */ - async deleteChild(parentId: number, childId: number) { - // 验证子女归属 - await this.getChild(parentId, childId); - - // 检查是否有关联的报名记录 - const registrations = await this.prisma.contestRegistration.count({ - where: { childId }, - }); - - await this.prisma.child.update({ - where: { id: childId }, - data: { isDeleted: 1 }, - }); - - return { - message: '删除成功', - hasRegistrations: registrations > 0, - registrationCount: registrations, - }; - } - - // ==================== 活动相关 ==================== - - /** - * 获取公众可见的活动列表 - * 支持 public(全量)和 targeted(按城市/年龄定向)两种可见性 - */ - async getPublicActivities( - query: { - page?: number; - pageSize?: number; - keyword?: string; - contestType?: string; - }, - userId?: number, - ) { - const page = query.page || 1; - const pageSize = query.pageSize || 12; - const skip = (page - 1) * pageSize; - - // 基础条件:已发布 + 有效 - const where: any = { - visibility: { in: ['public', 'targeted'] }, - contestState: 'published', - validState: 1, - }; - - if (query.keyword) { - where.contestName = { contains: query.keyword }; - } - - if (query.contestType) { - where.contestType = query.contestType; - } - - const selectFields = { - id: true, - contestName: true, - contestType: true, - contestState: true, - status: true, - startTime: true, - endTime: true, - coverUrl: true, - posterUrl: true, - registerStartTime: true, - registerEndTime: true, - submitStartTime: true, - submitEndTime: true, - organizers: true, - visibility: true, - targetCities: true, - ageMin: true, - ageMax: true, - }; - - const [allList, allTotal] = await Promise.all([ - this.prisma.contest.findMany({ - where, - orderBy: { createTime: 'desc' }, - select: selectFields, - }), - this.prisma.contest.count({ where }), - ]); - - // 获取用户画像用于 targeted 过滤 - let userCity: string | null = null; - let childCities: string[] = []; - if (userId) { - const user = await this.prisma.user.findUnique({ - where: { id: userId }, - select: { city: true }, - }); - userCity = user?.city || null; - - const children = await this.prisma.child.findMany({ - where: { parentId: userId, isDeleted: 0 }, - select: { city: true }, - }); - childCities = children.map((c) => c.city).filter(Boolean) as string[]; - } - - // 过滤 targeted 活动 - const filteredList = allList.filter((contest) => { - if (contest.visibility === 'public') return true; - - // targeted: 检查城市匹配 - if (contest.targetCities && Array.isArray(contest.targetCities) && (contest.targetCities as string[]).length > 0) { - const targets = contest.targetCities as string[]; - const allUserCities = [userCity, ...childCities].filter(Boolean) as string[]; - if (allUserCities.length === 0) return false; // 未登录或无城市信息,不展示 - const match = allUserCities.some((c) => targets.some((t) => c.includes(t) || t.includes(c))); - if (!match) return false; - } - - return true; - }); - - const total = filteredList.length; - const list = filteredList.slice(skip, skip + pageSize); - - return { list, total, page, pageSize }; - } - - /** - * 获取活动详情(支持 public + targeted) - */ - async getActivityDetail(id: number) { - const contest = await this.prisma.contest.findFirst({ - where: { - id, - visibility: { in: ['public', 'targeted'] }, - contestState: 'published', - validState: 1, - }, - include: { - attachments: { - where: { validState: 1 }, - select: { - id: true, - fileName: true, - fileUrl: true, - size: true, - fileType: true, - }, - }, - notices: { - where: { validState: 1 }, - orderBy: { createTime: 'desc' }, - select: { - id: true, - title: true, - content: true, - publishTime: true, - createTime: true, - }, - }, - }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在或未公开'); - } - - return contest; - } - - // ==================== 公众用户管理(超管端) ==================== - - /** - * 获取公众用户列表(自注册用户) - */ - async getPublicUsers(query: { - page?: number; - pageSize?: number; - keyword?: string; - }) { - const page = query.page || 1; - const pageSize = query.pageSize || 10; - const skip = (page - 1) * pageSize; - - const where: any = { - userSource: 'self_registered', - }; - - if (query.keyword) { - where.OR = [ - { username: { contains: query.keyword } }, - { nickname: { contains: query.keyword } }, - { phone: { contains: query.keyword } }, - { city: { contains: query.keyword } }, - ]; - } - - const [list, total] = await Promise.all([ - this.prisma.user.findMany({ - where, - skip, - take: pageSize, - orderBy: { createTime: 'desc' }, - select: { - id: true, - username: true, - nickname: true, - phone: true, - city: true, - gender: true, - avatar: true, - status: true, - createTime: true, - _count: { - select: { - children: { where: { isDeleted: 0 } }, - contestRegistrations: true, - }, - }, - }, - }), - this.prisma.user.count({ where }), - ]); - - return { - list: list.map((u) => ({ - ...u, - childrenCount: u._count.children, - registrationCount: u._count.contestRegistrations, - _count: undefined, - })), - total, - page, - pageSize, - }; - } - - /** - * 获取公众用户详情(含子女和报名记录) - */ - async getPublicUserDetail(userId: number) { - const user = await this.prisma.user.findUnique({ - where: { id: userId }, - include: { - children: { - where: { isDeleted: 0 }, - orderBy: { createTime: 'desc' }, - }, - contestRegistrations: { - orderBy: { registrationTime: 'desc' }, - take: 20, - include: { - contest: { - select: { id: true, contestName: true, contestType: true }, - }, - child: { - select: { id: true, name: true }, - }, - }, - }, - }, - }); - - if (!user || user.userSource !== 'self_registered') { - throw new NotFoundException('公众用户不存在'); - } - - const { password, ...result } = user; - return result; - } - - // ==================== 作品提交 ==================== - - /** - * 获取公众用户在某活动中的报名记录(用于作品提交) - */ - async getMyRegistration(userId: number, contestId: number) { - const registration = await this.prisma.contestRegistration.findFirst({ - where: { - userId, - contestId, - registrationState: 'passed', - }, - include: { - contest: { - select: { - id: true, - contestName: true, - submitStartTime: true, - submitEndTime: true, - submitRule: true, - }, - }, - child: { - select: { id: true, name: true }, - }, - works: { - where: { validState: 1 }, - select: { - id: true, - title: true, - previewUrl: true, - createTime: true, - }, - orderBy: { createTime: 'desc' }, - }, - }, - }); - return registration; - } - - /** - * 公众用户提交作品 - */ - async submitWork( - userId: number, - data: { - registrationId: number; - title: string; - description?: string; - files?: string[]; - previewUrl?: string; - attachments?: { fileName: string; fileUrl: string; fileType?: string; size?: string }[]; - }, - ) { - const tenantId = await this.getPublicTenantId(); - - // 验证报名记录 - const registration = await this.prisma.contestRegistration.findUnique({ - where: { id: data.registrationId }, - include: { contest: true }, - }); - - if (!registration || registration.userId !== userId) { - throw new NotFoundException('报名记录不存在'); - } - - if (registration.registrationState !== 'passed') { - throw new BadRequestException('报名未通过审核,无法提交作品'); - } - - // 检查提交时间 - const now = new Date(); - if (now < registration.contest.submitStartTime || now > registration.contest.submitEndTime) { - throw new BadRequestException('当前不在作品提交时间范围内'); - } - - // 检查提交规则 - if (registration.contest.submitRule === 'once') { - const existing = await this.prisma.contestWork.findFirst({ - where: { registrationId: data.registrationId, validState: 1 }, - }); - if (existing) { - throw new ConflictException('该活动只允许提交一次作品'); - } - } - - // 生成作品编号 - const workCount = await this.prisma.contestWork.count({ - where: { contestId: registration.contestId }, - }); - const workNo = `W${String(workCount + 1).padStart(4, '0')}`; - - // 查找用户信息 - const user = await this.prisma.user.findUnique({ where: { id: userId } }); - - // 创建作品 - const work = await this.prisma.contestWork.create({ - data: { - tenantId, - contestId: registration.contestId, - registrationId: data.registrationId, - workNo, - title: data.title, - description: data.description || null, - files: data.files || [], - previewUrl: data.previewUrl || null, - version: 1, - isLatest: true, - status: 'submitted', - submitTime: now, - submitterUserId: userId, - submitterAccountNo: user?.username || '', - submitSource: 'public', - creator: userId, - }, - }); - - // 创建附件记录 - if (data.attachments?.length) { - await this.prisma.contestWorkAttachment.createMany({ - data: data.attachments.map((att) => ({ - tenantId, - contestId: registration.contestId, - workId: work.id, - fileName: att.fileName, - fileUrl: att.fileUrl, - fileType: att.fileType || null, - size: att.size || '0', - creator: userId, - })), - }); - } - - return work; - } - - // ==================== 报名 ==================== - - /** - * 公众用户报名活动 - */ - async registerActivity(userId: number, dto: PublicRegisterActivityDto) { - const tenantId = await this.getPublicTenantId(); - - // 验证活动存在且公开 - const contest = await this.prisma.contest.findFirst({ - where: { - id: dto.contestId, - visibility: { in: ['public', 'targeted'] }, - contestState: 'published', - validState: 1, - }, - }); - - if (!contest) { - throw new NotFoundException('活动不存在或未公开'); - } - - // 验证报名时间 - const now = new Date(); - if (now < contest.registerStartTime || now > contest.registerEndTime) { - throw new BadRequestException('当前不在报名时间范围内'); - } - - // 获取用户信息 - const user = await this.prisma.user.findUnique({ where: { id: userId } }); - if (!user) throw new NotFoundException('用户不存在'); - - // 年龄校验(如果活动设置了年龄限制) - if (contest.ageMin || contest.ageMax) { - // 确定参与者的生日 - let participantBirthday: Date | null = null; - if (dto.participantType === 'child' && dto.childId) { - const childInfo = await this.prisma.child.findFirst({ - where: { id: dto.childId, parentId: userId, isDeleted: 0 }, - }); - participantBirthday = childInfo?.birthday || null; - } else { - participantBirthday = user.birthday || null; - } - - if (participantBirthday) { - const age = Math.floor( - (now.getTime() - participantBirthday.getTime()) / (365.25 * 24 * 60 * 60 * 1000), - ); - if (contest.ageMin && age < contest.ageMin) { - throw new BadRequestException(`参与者年龄不符合要求(最低 ${contest.ageMin} 岁)`); - } - if (contest.ageMax && age > contest.ageMax) { - throw new BadRequestException(`参与者年龄不符合要求(最高 ${contest.ageMax} 岁)`); - } - } - } - - // 如果是代子女报名,验证子女归属 - let child = null; - if (dto.participantType === 'child') { - if (!dto.childId) { - throw new BadRequestException('代子女报名时必须选择子女'); - } - child = await this.prisma.child.findFirst({ - where: { id: dto.childId, parentId: userId, isDeleted: 0 }, - }); - if (!child) { - throw new NotFoundException('子女信息不存在'); - } - - // 检查该子女是否已报名此活动 - const existingChildReg = await this.prisma.contestRegistration.findFirst({ - where: { - contestId: dto.contestId, - childId: dto.childId, - registrationState: { not: 'withdrawn' }, - }, - }); - if (existingChildReg) { - throw new ConflictException('该子女已报名此活动'); - } - } else { - // 检查用户自己是否已报名此活动 - const existingSelfReg = await this.prisma.contestRegistration.findFirst({ - where: { - contestId: dto.contestId, - userId, - participantType: 'self', - registrationState: { not: 'withdrawn' }, - }, - }); - if (existingSelfReg) { - throw new ConflictException('您已报名此活动'); - } - } - - // 创建报名记录 - const accountName = - dto.participantType === 'child' ? child.name : user.nickname; - - const registration = await this.prisma.contestRegistration.create({ - data: { - contestId: dto.contestId, - tenantId, - registrationType: 'individual', - userId, - accountNo: user.username, - accountName, - participantType: dto.participantType, - childId: dto.childId || null, - registrant: userId, - registrationState: contest.requireAudit ? 'pending' : 'passed', - registrationTime: now, - }, - include: { - contest: { - select: { contestName: true }, - }, - child: true, - }, - }); - - return registration; - } - - // ==================== 我的报名 ==================== - - /** - * 获取我的报名列表 - */ - async getMyRegistrations( - userId: number, - query: { page?: number; pageSize?: number }, - ) { - const page = query.page || 1; - const pageSize = query.pageSize || 10; - const skip = (page - 1) * pageSize; - - const where = { - userId, - registrationState: { not: 'withdrawn' as const }, - }; - - const [list, total] = await Promise.all([ - this.prisma.contestRegistration.findMany({ - where, - skip, - take: pageSize, - orderBy: { registrationTime: 'desc' }, - include: { - contest: { - select: { - id: true, - contestName: true, - contestType: true, - coverUrl: true, - startTime: true, - endTime: true, - status: true, - submitStartTime: true, - submitEndTime: true, - resultState: true, - }, - }, - child: { - select: { - id: true, - name: true, - grade: true, - }, - }, - works: { - where: { validState: 1 }, - select: { - id: true, - title: true, - previewUrl: true, - createTime: true, - attachments: { - select: { - id: true, - fileName: true, - fileUrl: true, - fileType: true, - }, - take: 1, - }, - }, - orderBy: { createTime: 'desc' }, - }, - }, - }), - this.prisma.contestRegistration.count({ where }), - ]); - - return { list, total, page, pageSize }; - } - - // ==================== 我的作品 ==================== - - /** - * 获取我的作品列表 - */ - async getMyWorks( - userId: number, - query: { page?: number; pageSize?: number }, - ) { - const page = query.page || 1; - const pageSize = query.pageSize || 10; - const skip = (page - 1) * pageSize; - - // 查询该用户提交的所有作品(包括代子女提交的) - const where = { - registration: { userId }, - validState: 1, - }; - - const [list, total] = await Promise.all([ - this.prisma.contestWork.findMany({ - where, - skip, - take: pageSize, - orderBy: { createTime: 'desc' }, - include: { - contest: { - select: { - id: true, - contestName: true, - coverUrl: true, - }, - }, - registration: { - select: { - participantType: true, - child: { - select: { id: true, name: true }, - }, - }, - }, - attachments: { - select: { - id: true, - fileName: true, - fileUrl: true, - fileType: true, - }, - }, - }, - }), - this.prisma.contestWork.count({ where }), - ]); - - return { list, total, page, pageSize }; - } - - // ==================== 子女账号管理 ==================== - - /** - * 家长为子女创建独立账号 - */ - async createChildAccount(parentUserId: number, dto: { - username: string; - password: string; - nickname: string; - gender?: string; - birthday?: string; - city?: string; - avatar?: string; - relationship?: string; - }) { - const tenantId = await this.getPublicTenantId(); - - // 验证家长身份 - const parent = await this.prisma.user.findUnique({ where: { id: parentUserId } }); - if (!parent || parent.userType !== 'adult') { - throw new BadRequestException('仅家长账号可创建子女账号'); - } - - // 检查用户名是否已存在 - const existing = await this.prisma.user.findFirst({ - where: { username: dto.username, tenantId }, - }); - if (existing) { - throw new ConflictException('用户名已被注册'); - } - - const hashedPassword = await bcrypt.hash(dto.password, 10); - const roleId = await this.getPublicRoleId(tenantId); - - // 事务:创建子女 User + 创建家长-子女关联 - const result = await this.prisma.$transaction(async (tx) => { - const childUser = await tx.user.create({ - data: { - tenantId, - username: dto.username, - password: hashedPassword, - nickname: dto.nickname, - gender: dto.gender || null, - birthday: dto.birthday ? new Date(dto.birthday) : null, - city: dto.city || null, - avatar: dto.avatar || null, - userSource: 'child_migrated', - userType: 'child', - roles: { create: [{ roleId }] }, - }, - }); - - await tx.userParentChild.create({ - data: { - parentUserId, - childUserId: childUser.id, - relationship: dto.relationship || null, - controlMode: 'open', - }, - }); - - return childUser; - }); - - return { - id: result.id, - username: result.username, - nickname: result.nickname, - avatar: result.avatar, - userType: result.userType, - }; - } - - /** - * 获取家长创建的子女账号列表 - */ - async getChildAccounts(parentUserId: number) { - const relations = await this.prisma.userParentChild.findMany({ - where: { parentUserId }, - include: { - child: { - select: { - id: true, - username: true, - nickname: true, - avatar: true, - gender: true, - birthday: true, - city: true, - status: true, - userType: true, - createTime: true, - }, - }, - }, - }); - - return relations.map((r) => ({ - ...r.child, - relationship: r.relationship, - controlMode: r.controlMode, - })); - } - - /** - * 家长切换到子女身份(签发子女 JWT) - */ - async switchToChild(parentUserId: number, childUserId: number) { - // 验证家长-子女关系 - const relation = await this.prisma.userParentChild.findFirst({ - where: { parentUserId, childUserId }, - }); - if (!relation) { - throw new BadRequestException('该子女不属于当前家长'); - } - - // 获取子女用户信息 - const childUser = await this.prisma.user.findUnique({ - where: { id: childUserId }, - include: { - roles: { - include: { - role: { - include: { - permissions: { include: { permission: true } }, - }, - }, - }, - }, - }, - }); - - if (!childUser || childUser.status !== 'enabled') { - throw new BadRequestException('子女账号不存在或已被禁用'); - } - - const tenantId = childUser.tenantId; - return this.generateLoginResponse(childUser, tenantId); - } - - /** - * 家长更新子女账号信息 - */ - async updateChildAccount(parentUserId: number, childUserId: number, dto: { - nickname?: string; - password?: string; - gender?: string; - birthday?: string; - city?: string; - avatar?: string; - controlMode?: string; - }) { - // 验证家长-子女关系 - const relation = await this.prisma.userParentChild.findFirst({ - where: { parentUserId, childUserId }, - }); - if (!relation) { - throw new BadRequestException('该子女不属于当前家长'); - } - - const updateData: any = {}; - if (dto.nickname !== undefined) updateData.nickname = dto.nickname; - if (dto.gender !== undefined) updateData.gender = dto.gender; - if (dto.birthday !== undefined) updateData.birthday = dto.birthday ? new Date(dto.birthday) : null; - if (dto.city !== undefined) updateData.city = dto.city; - if (dto.avatar !== undefined) updateData.avatar = dto.avatar; - if (dto.password) { - updateData.password = await bcrypt.hash(dto.password, 10); - } - - // 更新用户信息 - if (Object.keys(updateData).length > 0) { - await this.prisma.user.update({ - where: { id: childUserId }, - data: updateData, - }); - } - - // 更新管控模式 - if (dto.controlMode) { - await this.prisma.userParentChild.updateMany({ - where: { parentUserId, childUserId }, - data: { controlMode: dto.controlMode }, - }); - } - - return { success: true }; - } - - /** - * 子女查看自己的家长信息 - */ - async getParentInfo(childUserId: number) { - const relation = await this.prisma.userParentChild.findFirst({ - where: { childUserId }, - include: { - parent: { - select: { - id: true, - nickname: true, - avatar: true, - }, - }, - }, - }); - - return relation - ? { parentId: relation.parentUserId, nickname: relation.parent.nickname, avatar: relation.parent.avatar, relationship: relation.relationship } - : null; - } -} diff --git a/backend/src/public/tags.controller.ts b/backend/src/public/tags.controller.ts deleted file mode 100644 index 921d6cb..0000000 --- a/backend/src/public/tags.controller.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - Controller, Get, Post, Put, Delete, Patch, - Body, Param, ParseIntPipe, UseGuards, -} from '@nestjs/common'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; -import { TagsService } from './tags.service'; - -@Controller('tags') -@UseGuards(JwtAuthGuard) -export class TagsController { - constructor(private readonly tagsService: TagsService) {} - - @Get() - getAdminList() { - return this.tagsService.getAdminList(); - } - - @Post() - create(@Body() dto: { name: string; category?: string; color?: string; sort?: number }) { - return this.tagsService.create(dto); - } - - @Put(':id') - update( - @Param('id', ParseIntPipe) id: number, - @Body() dto: { name?: string; category?: string; color?: string; sort?: number; status?: string }, - ) { - return this.tagsService.update(id, dto); - } - - @Post('batch-sort') - batchSort(@Body() dto: { items: { id: number; sort: number }[] }) { - return this.tagsService.batchUpdateSort(dto.items || []); - } - - @Delete(':id') - remove(@Param('id', ParseIntPipe) id: number) { - return this.tagsService.remove(id); - } - - @Patch(':id/status') - toggleStatus(@Param('id', ParseIntPipe) id: number) { - return this.tagsService.toggleStatus(id); - } - - @Get('categories') - getCategories() { - return this.tagsService.getCategories(); - } -} diff --git a/backend/src/public/tags.service.ts b/backend/src/public/tags.service.ts deleted file mode 100644 index 9ecba9f..0000000 --- a/backend/src/public/tags.service.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; - -@Injectable() -export class TagsService { - constructor(private prisma: PrismaService) {} - - // ==================== 公众端 ==================== - - /** 获取启用的标签列表(用户端选标签用) */ - async getPublicTags() { - return this.prisma.workTag.findMany({ - where: { status: 'enabled' }, - orderBy: [{ sort: 'asc' }, { usageCount: 'desc' }], - select: { id: true, name: true, category: true, usageCount: true }, - }); - } - - /** 热门标签(按使用次数排序,取前 20) */ - async getHotTags() { - return this.prisma.workTag.findMany({ - where: { status: 'enabled', usageCount: { gt: 0 } }, - orderBy: { usageCount: 'desc' }, - take: 20, - select: { id: true, name: true, category: true, usageCount: true }, - }); - } - - // ==================== 超管端 ==================== - - /** 标签管理列表(含使用统计) */ - async getAdminList() { - return this.prisma.workTag.findMany({ - orderBy: [{ category: 'asc' }, { sort: 'asc' }], - }); - } - - /** 创建标签 */ - async create(dto: { name: string; category?: string; color?: string; sort?: number }) { - const existing = await this.prisma.workTag.findFirst({ where: { name: dto.name } }); - if (existing) throw new BadRequestException('标签名已存在'); - - return this.prisma.workTag.create({ - data: { - name: dto.name, - category: dto.category || null, - color: dto.color || null, - sort: dto.sort || 0, - }, - }); - } - - /** 编辑标签 */ - async update(id: number, dto: { name?: string; category?: string; color?: string; sort?: number; status?: string }) { - const tag = await this.prisma.workTag.findUnique({ where: { id } }); - if (!tag) throw new NotFoundException('标签不存在'); - - if (dto.name && dto.name !== tag.name) { - const dup = await this.prisma.workTag.findFirst({ where: { name: dto.name } }); - if (dup) throw new BadRequestException('标签名已存在'); - } - - return this.prisma.workTag.update({ - where: { id }, - data: { - name: dto.name ?? tag.name, - category: dto.category !== undefined ? dto.category : tag.category, - color: dto.color !== undefined ? dto.color : tag.color, - sort: dto.sort !== undefined ? dto.sort : tag.sort, - status: dto.status ?? tag.status, - }, - }); - } - - /** 批量更新排序 */ - async batchUpdateSort(items: { id: number; sort: number }[]) { - await this.prisma.$transaction( - items.map(item => - this.prisma.workTag.update({ where: { id: item.id }, data: { sort: item.sort } }), - ), - ); - return { success: true }; - } - - /** 删除标签 */ - async remove(id: number) { - const tag = await this.prisma.workTag.findUnique({ where: { id } }); - if (!tag) throw new NotFoundException('标签不存在'); - if (tag.usageCount > 0) throw new BadRequestException('该标签已被使用,无法删除,请先禁用'); - - return this.prisma.workTag.delete({ where: { id } }); - } - - /** 启用/禁用标签 */ - async toggleStatus(id: number) { - const tag = await this.prisma.workTag.findUnique({ where: { id } }); - if (!tag) throw new NotFoundException('标签不存在'); - - return this.prisma.workTag.update({ - where: { id }, - data: { status: tag.status === 'enabled' ? 'disabled' : 'enabled' }, - }); - } - - /** 获取标签分类列表 */ - async getCategories() { - const tags = await this.prisma.workTag.findMany({ - where: { category: { not: null } }, - select: { category: true }, - distinct: ['category'], - }); - return tags.map((t) => t.category).filter(Boolean); - } -} diff --git a/backend/src/public/user-works.service.ts b/backend/src/public/user-works.service.ts deleted file mode 100644 index 79e2104..0000000 --- a/backend/src/public/user-works.service.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; - -@Injectable() -export class UserWorksService { - constructor(private prisma: PrismaService) {} - - /** - * 创建作品(AI 生成完毕后调用) - */ - async create(userId: number, dto: { - title: string; - coverUrl?: string; - description?: string; - visibility?: string; - originalImageUrl?: string; - voiceInputUrl?: string; - textInput?: string; - aiMeta?: any; - pages?: Array<{ pageNo: number; imageUrl?: string; text?: string; audioUrl?: string }>; - tagIds?: number[]; - }) { - return this.prisma.$transaction(async (tx) => { - const work = await tx.userWork.create({ - data: { - userId, - title: dto.title, - coverUrl: dto.coverUrl || null, - description: dto.description || null, - visibility: dto.visibility || 'private', - status: 'draft', - originalImageUrl: dto.originalImageUrl || null, - voiceInputUrl: dto.voiceInputUrl || null, - textInput: dto.textInput || null, - aiMeta: dto.aiMeta || null, - }, - }); - - // 创建绘本分页 - if (dto.pages && dto.pages.length > 0) { - await tx.userWorkPage.createMany({ - data: dto.pages.map((p) => ({ - workId: work.id, - pageNo: p.pageNo, - imageUrl: p.imageUrl || null, - text: p.text || null, - audioUrl: p.audioUrl || null, - })), - }); - } - - // 关联标签 - if (dto.tagIds && dto.tagIds.length > 0) { - await tx.workTagRelation.createMany({ - data: dto.tagIds.map((tagId) => ({ - workId: work.id, - tagId, - })), - }); - // 更新标签使用次数 - await tx.workTag.updateMany({ - where: { id: { in: dto.tagIds } }, - data: { usageCount: { increment: 1 } }, - }); - } - - return this.findOne(work.id, userId); - }); - } - - /** - * 获取我的作品列表 - */ - async findMyWorks(userId: number, params: { - page?: number; - pageSize?: number; - status?: string; - keyword?: string; - }) { - const { page = 1, pageSize = 10, status, keyword } = params; - const skip = (page - 1) * pageSize; - - const where: any = { userId, isDeleted: 0 }; - if (status) where.status = status; - if (keyword) { - where.OR = [ - { title: { contains: keyword } }, - { description: { contains: keyword } }, - ]; - } - - const [list, total] = await Promise.all([ - this.prisma.userWork.findMany({ - where, - skip, - take: pageSize, - orderBy: { createTime: 'desc' }, - include: { - tags: { include: { tag: true } }, - _count: { select: { pages: true } }, - }, - }), - this.prisma.userWork.count({ where }), - ]); - - return { list, total, page, pageSize }; - } - - /** - * 获取作品详情(含分页内容) - */ - async findOne(workId: number, userId?: number) { - const where: any = { id: workId, isDeleted: 0 }; - // 非作者只能看已发布的 - if (userId) { - // 作者可以看自己所有状态的作品 - } else { - where.status = 'published'; - where.visibility = 'public'; - } - - const work = await this.prisma.userWork.findFirst({ - where: userId ? { id: workId, isDeleted: 0, userId } : where, - include: { - pages: { orderBy: { pageNo: 'asc' } }, - tags: { include: { tag: true } }, - creator: { - select: { id: true, nickname: true, avatar: true, username: true }, - }, - _count: { select: { pages: true, likes: true, favorites: true, comments: true } }, - }, - }); - - if (!work) { - throw new NotFoundException('作品不存在'); - } - - return work; - } - - /** - * 更新作品信息 - */ - async update(workId: number, userId: number, dto: { - title?: string; - description?: string; - coverUrl?: string; - visibility?: string; - tagIds?: number[]; - }) { - const work = await this.prisma.userWork.findFirst({ - where: { id: workId, userId, isDeleted: 0 }, - }); - if (!work) throw new NotFoundException('作品不存在'); - - const updateData: any = {}; - if (dto.title !== undefined) updateData.title = dto.title; - if (dto.description !== undefined) updateData.description = dto.description; - if (dto.coverUrl !== undefined) updateData.coverUrl = dto.coverUrl; - if (dto.visibility !== undefined) updateData.visibility = dto.visibility; - - return this.prisma.$transaction(async (tx) => { - if (Object.keys(updateData).length > 0) { - await tx.userWork.update({ where: { id: workId }, data: updateData }); - } - - // 更新标签 - if (dto.tagIds !== undefined) { - // 获取旧标签 - const oldTags = await tx.workTagRelation.findMany({ where: { workId } }); - const oldTagIds = oldTags.map((t) => t.tagId); - - // 删除旧标签关联 - await tx.workTagRelation.deleteMany({ where: { workId } }); - // 旧标签使用次数减 1 - if (oldTagIds.length > 0) { - await tx.workTag.updateMany({ - where: { id: { in: oldTagIds } }, - data: { usageCount: { decrement: 1 } }, - }); - } - - // 创建新标签关联 - if (dto.tagIds.length > 0) { - await tx.workTagRelation.createMany({ - data: dto.tagIds.map((tagId) => ({ workId, tagId })), - }); - await tx.workTag.updateMany({ - where: { id: { in: dto.tagIds } }, - data: { usageCount: { increment: 1 } }, - }); - } - } - - return this.findOne(workId, userId); - }); - } - - /** - * 发布作品(进入审核队列) - */ - async publish(workId: number, userId: number) { - const work = await this.prisma.userWork.findFirst({ - where: { id: workId, userId, isDeleted: 0 }, - }); - if (!work) throw new NotFoundException('作品不存在'); - if (work.status !== 'draft' && work.status !== 'rejected') { - throw new BadRequestException('只有草稿或被拒绝的作品才能提交发布'); - } - - return this.prisma.userWork.update({ - where: { id: workId }, - data: { - status: 'pending_review', - visibility: work.visibility === 'private' ? 'public' : work.visibility, - }, - }); - } - - /** - * 删除作品(软删除) - */ - async remove(workId: number, userId: number) { - const work = await this.prisma.userWork.findFirst({ - where: { id: workId, userId, isDeleted: 0 }, - }); - if (!work) throw new NotFoundException('作品不存在'); - - return this.prisma.userWork.update({ - where: { id: workId }, - data: { isDeleted: 1 }, - }); - } - - /** - * 保存/更新绘本分页数据 - */ - async savePages(workId: number, userId: number, pages: Array<{ - pageNo: number; - imageUrl?: string; - text?: string; - audioUrl?: string; - }>) { - const work = await this.prisma.userWork.findFirst({ - where: { id: workId, userId, isDeleted: 0 }, - }); - if (!work) throw new NotFoundException('作品不存在'); - - return this.prisma.$transaction(async (tx) => { - // 删除旧分页 - await tx.userWorkPage.deleteMany({ where: { workId } }); - // 创建新分页 - await tx.userWorkPage.createMany({ - data: pages.map((p) => ({ - workId, - pageNo: p.pageNo, - imageUrl: p.imageUrl || null, - text: p.text || null, - audioUrl: p.audioUrl || null, - })), - }); - - return tx.userWorkPage.findMany({ - where: { workId }, - orderBy: { pageNo: 'asc' }, - }); - }); - } - - /** - * 获取绘本分页数据 - */ - async getPages(workId: number) { - return this.prisma.userWorkPage.findMany({ - where: { workId }, - orderBy: { pageNo: 'asc' }, - }); - } -} diff --git a/backend/src/roles/dto/create-role.dto.ts b/backend/src/roles/dto/create-role.dto.ts deleted file mode 100644 index 90011d5..0000000 --- a/backend/src/roles/dto/create-role.dto.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { IsString, IsOptional, IsArray, IsNumber } from 'class-validator'; - -export class CreateRoleDto { - @IsString() - name: string; - - @IsString() - code: string; - - @IsString() - @IsOptional() - description?: string; - - @IsArray() - @IsNumber({}, { each: true }) - @IsOptional() - permissionIds?: number[]; -} diff --git a/backend/src/roles/dto/update-role.dto.ts b/backend/src/roles/dto/update-role.dto.ts deleted file mode 100644 index c65cc55..0000000 --- a/backend/src/roles/dto/update-role.dto.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IsString, IsOptional, IsArray, IsNumber } from 'class-validator'; - -export class UpdateRoleDto { - @IsString() - @IsOptional() - name?: string; - - @IsString() - @IsOptional() - code?: string; - - @IsString() - @IsOptional() - description?: string; - - @IsArray() - @IsNumber({}, { each: true }) - @IsOptional() - permissionIds?: number[]; -} diff --git a/backend/src/roles/roles.controller.ts b/backend/src/roles/roles.controller.ts deleted file mode 100644 index a1a8693..0000000 --- a/backend/src/roles/roles.controller.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, -} from '@nestjs/common'; -import { RolesService } from './roles.service'; -import { CreateRoleDto } from './dto/create-role.dto'; -import { UpdateRoleDto } from './dto/update-role.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; - -@Controller('roles') -@UseGuards(JwtAuthGuard) -export class RolesController { - constructor(private readonly rolesService: RolesService) {} - - @Post() - create(@Body() createRoleDto: CreateRoleDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new Error('无法确定租户信息'); - } - return this.rolesService.create(createRoleDto, tenantId); - } - - @Get() - findAll( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Request() req?: any, - ) { - const tenantId = req?.tenantId || req?.user?.tenantId; - return this.rolesService.findAll( - page ? parseInt(page) : 1, - pageSize ? parseInt(pageSize) : 10, - tenantId, - ); - } - - @Get(':id') - findOne(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.rolesService.findOne(+id, tenantId); - } - - @Patch(':id') - update( - @Param('id') id: string, - @Body() updateRoleDto: UpdateRoleDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.rolesService.update(+id, updateRoleDto, tenantId); - } - - @Delete(':id') - remove(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.rolesService.remove(+id, tenantId); - } -} diff --git a/backend/src/roles/roles.module.ts b/backend/src/roles/roles.module.ts deleted file mode 100644 index ee77acd..0000000 --- a/backend/src/roles/roles.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { RolesService } from './roles.service'; -import { RolesController } from './roles.controller'; - -@Module({ - controllers: [RolesController], - providers: [RolesService], - exports: [RolesService], -}) -export class RolesModule {} diff --git a/backend/src/roles/roles.service.ts b/backend/src/roles/roles.service.ts deleted file mode 100644 index 11143eb..0000000 --- a/backend/src/roles/roles.service.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateRoleDto } from './dto/create-role.dto'; -import { UpdateRoleDto } from './dto/update-role.dto'; - -@Injectable() -export class RolesService { - constructor(private prisma: PrismaService) {} - - async create(createRoleDto: CreateRoleDto, tenantId: number) { - const { permissionIds, ...roleData } = createRoleDto; - - // 验证权限是否属于该租户 - if (permissionIds && permissionIds.length > 0) { - const permissions = await this.prisma.permission.findMany({ - where: { - id: { in: permissionIds }, - tenantId, - }, - }); - if (permissions.length !== permissionIds.length) { - throw new NotFoundException('部分权限不存在或不属于该租户'); - } - } - - return this.prisma.role.create({ - data: { - ...roleData, - tenantId, - permissions: - permissionIds && permissionIds.length > 0 - ? { - create: permissionIds.map((permissionId) => ({ - permissionId, - })), - } - : undefined, - }, - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }); - } - - async findAll(page: number = 1, pageSize: number = 10, tenantId?: number) { - const skip = (page - 1) * pageSize; - const where = tenantId ? { tenantId } : {}; - - const [list, total] = await Promise.all([ - this.prisma.role.findMany({ - where, - skip, - take: pageSize, - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }), - this.prisma.role.count({ where }), - ]); - - return { - list, - total, - page, - pageSize, - }; - } - - async findOne(id: number, tenantId?: number) { - const where: any = { id }; - if (tenantId) { - where.tenantId = tenantId; - } - - const role = await this.prisma.role.findFirst({ - where, - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }); - - if (!role) { - throw new NotFoundException('角色不存在'); - } - - return role; - } - - async update(id: number, updateRoleDto: UpdateRoleDto, tenantId?: number) { - const { permissionIds, ...roleData } = updateRoleDto; - - // 验证角色是否存在且属于该租户 - await this.findOne(id, tenantId); - - const data: any = { ...roleData }; - - // 如果提供了 permissionIds,更新权限关联 - if (permissionIds !== undefined && tenantId) { - // 验证权限是否属于该租户 - const permissions = await this.prisma.permission.findMany({ - where: { - id: { in: permissionIds }, - tenantId, - }, - }); - if (permissions.length !== permissionIds.length) { - throw new NotFoundException('部分权限不存在或不属于该租户'); - } - - // 先删除所有现有权限关联 - await this.prisma.rolePermission.deleteMany({ - where: { roleId: id }, - }); - - // 创建新的权限关联 - if (permissionIds.length > 0) { - data.permissions = { - create: permissionIds.map((permissionId) => ({ - permissionId, - })), - }; - } - } - - return this.prisma.role.update({ - where: { id }, - data, - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }); - } - - async remove(id: number, tenantId?: number) { - // 验证角色是否存在且属于该租户 - await this.findOne(id, tenantId); - - return this.prisma.role.delete({ - where: { id }, - }); - } -} diff --git a/backend/src/tenants/decorators/tenant.decorator.ts b/backend/src/tenants/decorators/tenant.decorator.ts deleted file mode 100644 index 5783aef..0000000 --- a/backend/src/tenants/decorators/tenant.decorator.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { createParamDecorator, ExecutionContext } from '@nestjs/common'; - -export const Tenant = createParamDecorator( - (data: unknown, ctx: ExecutionContext) => { - const request = ctx.switchToHttp().getRequest(); - return request.tenant; - }, -); - -export const TenantId = createParamDecorator( - (data: unknown, ctx: ExecutionContext) => { - const request = ctx.switchToHttp().getRequest(); - return request.tenantId; - }, -); - diff --git a/backend/src/tenants/dto/create-tenant.dto.ts b/backend/src/tenants/dto/create-tenant.dto.ts deleted file mode 100644 index 22deba5..0000000 --- a/backend/src/tenants/dto/create-tenant.dto.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - IsString, - IsOptional, - IsArray, - IsNumber, - IsInt, - Min, - Max, -} from 'class-validator'; - -export class CreateTenantDto { - @IsString() - name: string; - - @IsString() - code: string; // 租户编码,用于访问链接 - - @IsString() - @IsOptional() - domain?: string; // 租户域名(可选) - - @IsString() - @IsOptional() - description?: string; - - @IsString() - @IsOptional() - tenantType?: string; // 租户类型:library/kindergarten/school/institution/other - - @IsArray() - @IsNumber({}, { each: true }) - @IsOptional() - menuIds?: number[]; // 分配的菜单ID列表 -} - diff --git a/backend/src/tenants/dto/update-tenant.dto.ts b/backend/src/tenants/dto/update-tenant.dto.ts deleted file mode 100644 index 8abf756..0000000 --- a/backend/src/tenants/dto/update-tenant.dto.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { IsString, IsOptional, IsArray, IsNumber, IsInt, Min, Max } from 'class-validator'; - -export class UpdateTenantDto { - @IsString() - @IsOptional() - name?: string; - - @IsString() - @IsOptional() - code?: string; - - @IsString() - @IsOptional() - domain?: string; - - @IsString() - @IsOptional() - description?: string; - - @IsInt() - @Min(0) - @Max(2) - @IsOptional() - validState?: number; - - @IsArray() - @IsNumber({}, { each: true }) - @IsOptional() - menuIds?: number[]; // 分配的菜单ID列表 -} - diff --git a/backend/src/tenants/guards/tenant.guard.ts b/backend/src/tenants/guards/tenant.guard.ts deleted file mode 100644 index b852312..0000000 --- a/backend/src/tenants/guards/tenant.guard.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { - Injectable, - CanActivate, - ExecutionContext, - BadRequestException, - UnauthorizedException, -} from '@nestjs/common'; -import { Reflector } from '@nestjs/core'; -import { PrismaService } from '../../prisma/prisma.service'; - -export const TENANT_KEY = 'tenant'; -export const SetTenant = () => Reflector.createDecorator(); - -@Injectable() -export class TenantGuard implements CanActivate { - constructor( - private prisma: PrismaService, - private reflector: Reflector, - ) {} - - async canActivate(context: ExecutionContext): Promise { - const request = context.switchToHttp().getRequest(); - - // 从请求头获取租户信息 - const tenantCode = request.headers['x-tenant-code']; - const tenantId = request.headers['x-tenant-id']; - const host = request.headers['host']; - - let tenantIdValue: number | null = null; - - // 方式1: 从请求头获取租户ID - if (tenantId) { - tenantIdValue = parseInt(tenantId, 10); - } - // 方式2: 从请求头获取租户编码 - else if (tenantCode) { - const tenant = await this.prisma.tenant.findUnique({ - where: { code: tenantCode }, - }); - if (!tenant) { - throw new BadRequestException('租户不存在'); - } - tenantIdValue = tenant.id; - } - // 方式3: 从子域名获取租户(如果配置了domain) - else if (host) { - const subdomain = host.split('.')[0]; - if (subdomain && subdomain !== 'www' && subdomain !== 'localhost') { - const tenant = await this.prisma.tenant.findFirst({ - where: { - OR: [ - { code: subdomain }, - { domain: subdomain }, - ], - }, - }); - if (tenant) { - tenantIdValue = tenant.id; - } - } - } - // 方式4: 从JWT token中获取(如果用户已登录) - else if (request.user?.tenantId) { - tenantIdValue = request.user.tenantId; - } - - // 如果找到了租户,验证租户是否有效 - if (tenantIdValue) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id: tenantIdValue }, - }); - - if (!tenant) { - throw new BadRequestException('租户不存在'); - } - - if (tenant.validState !== 1) { - throw new BadRequestException('租户已失效'); - } - - // 将租户信息附加到请求对象 - request.tenant = tenant; - request.tenantId = tenantIdValue; - } - - return true; - } -} - diff --git a/backend/src/tenants/tenants.controller.ts b/backend/src/tenants/tenants.controller.ts deleted file mode 100644 index 40ae333..0000000 --- a/backend/src/tenants/tenants.controller.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - UseGuards, - Request, - Query, - ParseIntPipe, -} from '@nestjs/common'; -import { TenantsService } from './tenants.service'; -import { CreateTenantDto } from './dto/create-tenant.dto'; -import { UpdateTenantDto } from './dto/update-tenant.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; -import { PermissionsGuard } from '../auth/guards/permissions.guard'; -import { RequirePermission } from '../auth/decorators/require-permission.decorator'; - -@Controller('tenants') -@UseGuards(JwtAuthGuard, PermissionsGuard) -export class TenantsController { - constructor(private readonly tenantsService: TenantsService) {} - - @Post() - @RequirePermission('tenant:create') - create(@Body() createTenantDto: CreateTenantDto, @Request() req) { - const userId = req.user?.userId; - const currentTenantId = req.user?.tenantId; - return this.tenantsService.create(createTenantDto, userId, currentTenantId); - } - - @Get() - @RequirePermission('tenant:read') - findAll( - @Query('page', new ParseIntPipe({ optional: true })) page: number = 1, - @Query('pageSize', new ParseIntPipe({ optional: true })) pageSize: number = 10, - @Query('keyword') keyword?: string, - @Query('tenantType') tenantType?: string, - ) { - return this.tenantsService.findAll({ page, pageSize, keyword, tenantType }); - } - - @Patch(':id/status') - @RequirePermission('tenant:update') - toggleStatus(@Param('id', ParseIntPipe) id: number, @Request() req) { - return this.tenantsService.toggleStatus(id, req.user?.tenantId); - } - - @Get('my-tenant') - getMyTenant(@Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.tenantsService.findOne(tenantId); - } - - @Patch('my-tenant') - updateMyTenant(@Request() req, @Body() dto: { name?: string; description?: string }) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.tenantsService.updateTenantInfo(tenantId, dto); - } - - @Get(':id') - @RequirePermission('tenant:read') - findOne(@Param('id', ParseIntPipe) id: number) { - return this.tenantsService.findOne(id); - } - - @Patch(':id') - @RequirePermission('tenant:update') - update( - @Param('id', ParseIntPipe) id: number, - @Body() updateTenantDto: UpdateTenantDto, - @Request() req, - ) { - const userId = req.user?.userId; - const currentTenantId = req.user?.tenantId; - return this.tenantsService.update( - id, - updateTenantDto, - userId, - currentTenantId, - ); - } - - @Delete(':id') - @RequirePermission('tenant:delete') - remove(@Param('id', ParseIntPipe) id: number, @Request() req) { - const currentTenantId = req.user?.tenantId; - return this.tenantsService.remove(id, currentTenantId); - } - - @Get(':id/menus') - @RequirePermission('tenant:read') - getTenantMenus(@Param('id', ParseIntPipe) id: number) { - return this.tenantsService.getTenantMenus(id); - } -} diff --git a/backend/src/tenants/tenants.module.ts b/backend/src/tenants/tenants.module.ts deleted file mode 100644 index 152a414..0000000 --- a/backend/src/tenants/tenants.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TenantsService } from './tenants.service'; -import { TenantsController } from './tenants.controller'; -import { PrismaModule } from '../prisma/prisma.module'; -import { AuthModule } from '../auth/auth.module'; - -@Module({ - imports: [PrismaModule, AuthModule], - controllers: [TenantsController], - providers: [TenantsService], - exports: [TenantsService], -}) -export class TenantsModule {} diff --git a/backend/src/tenants/tenants.service.ts b/backend/src/tenants/tenants.service.ts deleted file mode 100644 index c13adb1..0000000 --- a/backend/src/tenants/tenants.service.ts +++ /dev/null @@ -1,381 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, - ForbiddenException, -} from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateTenantDto } from './dto/create-tenant.dto'; -import { UpdateTenantDto } from './dto/update-tenant.dto'; - -@Injectable() -export class TenantsService { - constructor(private prisma: PrismaService) {} - - /** - * 检查当前用户所属租户是否为超级租户 - */ - private async checkSuperTenant(currentTenantId?: number): Promise { - if (!currentTenantId) { - throw new ForbiddenException('无法确定当前租户信息'); - } - - const currentTenant = await this.prisma.tenant.findUnique({ - where: { id: currentTenantId }, - }); - - if (!currentTenant) { - throw new ForbiddenException('当前租户不存在'); - } - - if (currentTenant.isSuper !== 1) { - throw new ForbiddenException('只有超级租户才能操作租户管理'); - } - } - - async create( - createTenantDto: CreateTenantDto, - creatorId?: number, - currentTenantId?: number, - ) { - // 检查是否为超级租户 - await this.checkSuperTenant(currentTenantId); - - const { menuIds, ...tenantData } = createTenantDto; - - // 检查租户编码是否已存在 - const existingTenant = await this.prisma.tenant.findUnique({ - where: { code: tenantData.code }, - }); - if (existingTenant) { - throw new BadRequestException('租户编码已存在'); - } - - // 如果提供了域名,检查域名是否已存在 - if (tenantData.domain) { - const existingDomain = await this.prisma.tenant.findUnique({ - where: { domain: tenantData.domain }, - }); - if (existingDomain) { - throw new BadRequestException('租户域名已存在'); - } - } - - return this.prisma.tenant.create({ - data: { - ...tenantData, - creator: creatorId, - menus: - menuIds && menuIds.length > 0 - ? { - create: menuIds.map((menuId) => ({ - menuId, - })), - } - : undefined, - }, - include: { - menus: { - include: { - menu: true, - }, - }, - }, - }); - } - - // 系统内部租户编码(不在机构列表中展示) - private readonly INTERNAL_TENANT_CODES = ['super', 'public', 'school', 'teacher', 'student', 'judge']; - - async findAll(params: { page?: number; pageSize?: number; keyword?: string; tenantType?: string } = {}) { - const { page = 1, pageSize = 10, keyword, tenantType } = params; - const skip = (page - 1) * pageSize; - - const where: any = { - code: { notIn: this.INTERNAL_TENANT_CODES }, - validState: { not: undefined }, - }; - if (keyword) { - where.OR = [ - { name: { contains: keyword } }, - { code: { contains: keyword } }, - ]; - } - if (tenantType) { - where.tenantType = tenantType; - } - - const [list, total] = await Promise.all([ - this.prisma.tenant.findMany({ - where, - skip, - take: pageSize, - include: { - _count: { - select: { - users: true, - roles: true, - }, - }, - }, - orderBy: { - createTime: 'desc', - }, - }), - this.prisma.tenant.count({ where }), - ]); - - return { list, total, page, pageSize }; - } - - /** 机构管理员自助更新机构信息(仅名称和描述) */ - async updateTenantInfo(tenantId: number, dto: { name?: string; description?: string }) { - const tenant = await this.prisma.tenant.findUnique({ where: { id: tenantId } }); - if (!tenant) throw new NotFoundException('租户不存在'); - - const data: any = {}; - if (dto.name !== undefined) data.name = dto.name; - if (dto.description !== undefined) data.description = dto.description; - - return this.prisma.tenant.update({ - where: { id: tenantId }, - data, - }); - } - - /** 切换租户启用/停用状态 */ - async toggleStatus(id: number, currentTenantId?: number) { - await this.checkSuperTenant(currentTenantId); - const tenant = await this.prisma.tenant.findUnique({ where: { id } }); - if (!tenant) throw new NotFoundException('租户不存在'); - if (tenant.isSuper === 1) throw new BadRequestException('不能停用超级租户'); - - return this.prisma.tenant.update({ - where: { id }, - data: { validState: tenant.validState === 1 ? 2 : 1 }, - }); - } - - async findOne(id: number) { - const tenant = await this.prisma.tenant.findUnique({ - where: { id }, - include: { - menus: { - include: { - menu: true, - }, - }, - _count: { - select: { - users: true, - roles: true, - }, - }, - }, - }); - - if (!tenant) { - throw new NotFoundException('租户不存在'); - } - - return tenant; - } - - async findByCode(code: string) { - return this.prisma.tenant.findUnique({ - where: { code }, - include: { - menus: { - include: { - menu: true, - }, - }, - }, - }); - } - - async findByDomain(domain: string) { - return this.prisma.tenant.findUnique({ - where: { domain }, - include: { - menus: { - include: { - menu: true, - }, - }, - }, - }); - } - - async update( - id: number, - updateTenantDto: UpdateTenantDto, - modifierId?: number, - currentTenantId?: number, - ) { - // 检查是否为超级租户 - await this.checkSuperTenant(currentTenantId); - - const { menuIds, ...tenantData } = updateTenantDto; - - // 检查租户是否存在 - await this.findOne(id); - - // 如果更新了code,检查是否冲突 - if (tenantData.code) { - const existingTenant = await this.prisma.tenant.findFirst({ - where: { - code: tenantData.code, - id: { not: id }, - }, - }); - if (existingTenant) { - throw new BadRequestException('租户编码已存在'); - } - } - - // 如果更新了domain,检查是否冲突 - if (tenantData.domain) { - const existingDomain = await this.prisma.tenant.findFirst({ - where: { - domain: tenantData.domain, - id: { not: id }, - }, - }); - if (existingDomain) { - throw new BadRequestException('租户域名已存在'); - } - } - - const data: any = { - ...tenantData, - modifier: modifierId, - }; - - // 如果提供了 menuIds,更新菜单关联 - if (menuIds !== undefined) { - // 先删除所有现有菜单关联 - await this.prisma.tenantMenu.deleteMany({ - where: { tenantId: id }, - }); - - // 创建新的菜单关联 - if (menuIds.length > 0) { - data.menus = { - create: menuIds.map((menuId) => ({ - menuId, - })), - }; - } - } - - return this.prisma.tenant.update({ - where: { id }, - data, - include: { - menus: { - include: { - menu: true, - }, - }, - }, - }); - } - - async remove(id: number, currentTenantId?: number) { - // 检查是否为超级租户 - await this.checkSuperTenant(currentTenantId); - - // 检查租户是否存在 - await this.findOne(id); - - // 检查要删除的租户是否为超级租户 - const tenant = await this.prisma.tenant.findUnique({ - where: { id }, - }); - if (tenant?.isSuper === 1) { - throw new BadRequestException('不能删除超级租户'); - } - - return this.prisma.tenant.delete({ - where: { id }, - }); - } - - /** - * 获取租户的菜单树(根据租户分配的菜单) - */ - async getTenantMenus(tenantId: number) { - const tenant = await this.findOne(tenantId); - - if (!tenant) { - throw new NotFoundException('租户不存在'); - } - - // 获取租户分配的所有菜单ID - const tenantMenus = await this.prisma.tenantMenu.findMany({ - where: { tenantId }, - include: { - menu: true, - }, - }); - - const menuIds = tenantMenus.map((tm) => tm.menuId); - - if (menuIds.length === 0) { - return []; - } - - // 获取所有菜单(包括父菜单,因为子菜单可能被分配) - const allMenus = await this.prisma.menu.findMany({ - where: { - OR: [ - { id: { in: menuIds } }, - { children: { some: { id: { in: menuIds } } } }, - ], - validState: 1, - }, - orderBy: { - sort: 'asc', - }, - }); - - // 构建树形结构 - const buildTree = (menus: any[], parentId: number | null = null): any[] => { - return menus - .filter((menu) => menu.parentId === parentId) - .map((menu) => ({ - ...menu, - children: buildTree(menus, menu.id), - })); - }; - - const menuTree = buildTree(allMenus); - - // 过滤:只保留被分配的菜单及其父菜单 - const filterMenus = (menus: any[]): any[] => { - return menus - .filter((menu) => { - // 如果菜单被分配,保留 - if (menuIds.includes(menu.id)) { - return true; - } - // 如果有子菜单被分配,保留 - if (menu.children && menu.children.length > 0) { - const filteredChildren = filterMenus(menu.children); - return filteredChildren.length > 0; - } - return false; - }) - .map((menu) => { - const filtered = { ...menu }; - if (menu.children && menu.children.length > 0) { - filtered.children = filterMenus(menu.children); - } - return filtered; - }); - }; - - return filterMenus(menuTree); - } -} diff --git a/backend/src/upload/upload.controller.ts b/backend/src/upload/upload.controller.ts deleted file mode 100644 index 654a037..0000000 --- a/backend/src/upload/upload.controller.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - Controller, - Post, - UseInterceptors, - UploadedFile, - UseGuards, - Request, - BadRequestException, -} from '@nestjs/common'; -import { FileInterceptor } from '@nestjs/platform-express'; -import { memoryStorage } from 'multer'; -import { UploadService } from './upload.service'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; - -@Controller('upload') -export class UploadController { - constructor(private readonly uploadService: UploadService) {} - - @Post() - @UseGuards(JwtAuthGuard) - @UseInterceptors( - FileInterceptor('file', { - storage: memoryStorage(), - limits: { - fileSize: 100 * 1024 * 1024, // 限制文件大小为 100MB - }, - }), - ) - async uploadFile( - @UploadedFile() file: Express.Multer.File, - @Request() req, - ): Promise<{ url: string; fileName: string; size: number }> { - if (!file) { - throw new BadRequestException('请选择要上传的文件'); - } - - const tenantId = req.tenantId || req.user?.tenantId; - const userId = req.user?.userId; - - const result = await this.uploadService.uploadFile(file, tenantId, userId); - - return { - url: result.url, - fileName: result.fileName, - size: result.size, - }; - } -} - diff --git a/backend/src/upload/upload.module.ts b/backend/src/upload/upload.module.ts deleted file mode 100644 index ed562e3..0000000 --- a/backend/src/upload/upload.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { UploadController } from './upload.controller'; -import { UploadService } from './upload.service'; -import { OssModule } from '../oss/oss.module'; - -@Module({ - imports: [OssModule], - controllers: [UploadController], - providers: [UploadService], - exports: [UploadService], -}) -export class UploadModule {} - diff --git a/backend/src/upload/upload.service.ts b/backend/src/upload/upload.service.ts deleted file mode 100644 index 09c7d9f..0000000 --- a/backend/src/upload/upload.service.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Injectable, BadRequestException } from '@nestjs/common'; -import { OssService } from '../oss/oss.service'; - -@Injectable() -export class UploadService { - constructor(private ossService: OssService) { - if (!this.ossService.isEnabled()) { - console.warn('警告: COS 未配置,文件上传功能可能无法正常使用'); - } - } - - async uploadFile( - file: Express.Multer.File, - tenantId?: number, - userId?: number, - ): Promise<{ url: string; fileName: string; size: number }> { - if (!file) { - throw new BadRequestException('文件不存在'); - } - - if (!this.ossService.isEnabled()) { - throw new BadRequestException('文件存储服务未配置,请联系管理员'); - } - - const result = await this.ossService.uploadFile( - file.buffer, - file.originalname, - tenantId, - userId, - ); - - return { - url: result.url, - fileName: result.fileName, - size: file.size, - }; - } -} diff --git a/backend/src/users/dto/create-user.dto.ts b/backend/src/users/dto/create-user.dto.ts deleted file mode 100644 index bb8b7d3..0000000 --- a/backend/src/users/dto/create-user.dto.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { - IsString, - IsEmail, - IsOptional, - IsArray, - IsNumber, - IsEnum, -} from 'class-validator'; - -export enum Gender { - MALE = 'male', - FEMALE = 'female', -} - -export enum UserStatus { - ENABLED = 'enabled', - DISABLED = 'disabled', -} - -export class CreateUserDto { - @IsString() - username: string; - - @IsString() - password: string; - - @IsString() - nickname: string; - - @IsEmail() - @IsOptional() - email?: string; - - @IsString() - @IsOptional() - phone?: string; - - @IsEnum(Gender) - @IsOptional() - gender?: Gender; - - @IsString() - @IsOptional() - avatar?: string; - - @IsEnum(UserStatus) - @IsOptional() - status?: UserStatus; - - @IsArray() - @IsNumber({}, { each: true }) - @IsOptional() - roleIds?: number[]; -} diff --git a/backend/src/users/dto/update-user.dto.ts b/backend/src/users/dto/update-user.dto.ts deleted file mode 100644 index 90ab69e..0000000 --- a/backend/src/users/dto/update-user.dto.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { IsString, IsEmail, IsOptional, IsArray, IsNumber, IsEnum } from 'class-validator'; -import { Gender, UserStatus } from './create-user.dto'; - -export class UpdateUserDto { - @IsString() - @IsOptional() - username?: string; - - @IsString() - @IsOptional() - password?: string; - - @IsString() - @IsOptional() - nickname?: string; - - @IsEmail() - @IsOptional() - email?: string; - - @IsString() - @IsOptional() - phone?: string; - - @IsEnum(Gender) - @IsOptional() - gender?: Gender; - - @IsString() - @IsOptional() - avatar?: string; - - @IsEnum(UserStatus) - @IsOptional() - status?: UserStatus; - - @IsArray() - @IsNumber({}, { each: true }) - @IsOptional() - roleIds?: number[]; -} diff --git a/backend/src/users/users.controller.ts b/backend/src/users/users.controller.ts deleted file mode 100644 index 6b5be89..0000000 --- a/backend/src/users/users.controller.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { - Controller, - Get, - Post, - Body, - Patch, - Param, - Delete, - Query, - UseGuards, - Request, -} from '@nestjs/common'; -import { UsersService } from './users.service'; -import { CreateUserDto } from './dto/create-user.dto'; -import { UpdateUserDto } from './dto/update-user.dto'; -import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; -import { TenantId } from '../tenants/decorators/tenant.decorator'; - -@Controller('users') -@UseGuards(JwtAuthGuard) -export class UsersController { - constructor(private readonly usersService: UsersService) {} - - @Post() - create(@Body() createUserDto: CreateUserDto, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - if (!tenantId) { - throw new Error('无法确定租户信息'); - } - return this.usersService.create(createUserDto, tenantId); - } - - /** - * 用户统计(仅超管) - * 注意:此路由必须在 :id 路由之前,否则 'stats' 会被当作 id 解析 - */ - @Get('stats') - async getStats(@Request() req) { - return this.usersService.getStats(); - } - - @Get() - findAll( - @Query('page') page?: string, - @Query('pageSize') pageSize?: string, - @Query('keyword') keyword?: string, - @Query('userType') userType?: string, - @Query('filterTenantId') filterTenantId?: string, - @Query('userSource') userSource?: string, - @Query('status') status?: string, - @Request() req?: any, - ) { - const tenantId = req?.tenantId || req?.user?.tenantId; - - // 判断是否超级租户 - const isSuperTenant = req?.user?.isSuperTenant === true; - - return this.usersService.findAll({ - page: page ? parseInt(page) : 1, - pageSize: pageSize ? parseInt(pageSize) : 10, - tenantId, - keyword, - isSuperTenant, - userType, - filterTenantId: filterTenantId ? parseInt(filterTenantId) : undefined, - userSource, - status, - }); - } - - @Get(':id') - findOne(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - const isSuperTenant = req?.user?.isSuperTenant === true; - return this.usersService.findOne(+id, tenantId, isSuperTenant); - } - - @Patch(':id/status') - updateStatus( - @Param('id') id: string, - @Body('status') status: 'enabled' | 'disabled', - @Request() req, - ) { - const operatorId = req.user?.userId || req.user?.id; - return this.usersService.updateStatus(+id, status, operatorId); - } - - @Patch(':id') - async update( - @Param('id') id: string, - @Body() updateUserDto: UpdateUserDto, - @Request() req, - ) { - const tenantId = req.tenantId || req.user?.tenantId; - // 超管端可以更新任意租户的用户 - const tenant = await this.usersService.getTenant(tenantId); - if (tenant?.isSuper === 1) { - return this.usersService.update(+id, updateUserDto, undefined); - } - return this.usersService.update(+id, updateUserDto, tenantId); - } - - @Delete(':id') - remove(@Param('id') id: string, @Request() req) { - const tenantId = req.tenantId || req.user?.tenantId; - return this.usersService.remove(+id, tenantId); - } -} diff --git a/backend/src/users/users.module.ts b/backend/src/users/users.module.ts deleted file mode 100644 index ace21bc..0000000 --- a/backend/src/users/users.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { UsersService } from './users.service'; -import { UsersController } from './users.controller'; - -@Module({ - controllers: [UsersController], - providers: [UsersService], - exports: [UsersService], -}) -export class UsersModule {} diff --git a/backend/src/users/users.service.ts b/backend/src/users/users.service.ts deleted file mode 100644 index 443a3f4..0000000 --- a/backend/src/users/users.service.ts +++ /dev/null @@ -1,400 +0,0 @@ -import { - Injectable, - NotFoundException, - BadRequestException, -} from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { CreateUserDto } from './dto/create-user.dto'; -import { UpdateUserDto } from './dto/update-user.dto'; -import * as bcrypt from 'bcrypt'; - -@Injectable() -export class UsersService { - constructor(private prisma: PrismaService) {} - - async getTenant(tenantId: number) { - return this.prisma.tenant.findUnique({ where: { id: tenantId }, select: { id: true, isSuper: true } }); - } - - async create(createUserDto: CreateUserDto, tenantId: number) { - const hashedPassword = await bcrypt.hash(createUserDto.password, 10); - const { roleIds, ...userData } = createUserDto; - - // 验证角色是否属于该租户 - if (roleIds && roleIds.length > 0) { - const roles = await this.prisma.role.findMany({ - where: { - id: { in: roleIds }, - tenantId, - }, - }); - if (roles.length !== roleIds.length) { - throw new NotFoundException('部分角色不存在或不属于该租户'); - } - } - - return this.prisma.user.create({ - data: { - ...userData, - tenantId, - password: hashedPassword, - roles: - roleIds && roleIds.length > 0 - ? { - create: roleIds.map((roleId) => ({ - roleId, - })), - } - : undefined, - }, - include: { - roles: { - include: { - role: true, - }, - }, - }, - }); - } - - /** - * 查询用户列表 - * isSuperTenant=true 时跨租户查询全部用户,支持 userType/filterTenantId/userSource/status 筛选 - */ - async findAll(params: { - page?: number; - pageSize?: number; - tenantId?: number; - keyword?: string; - isSuperTenant?: boolean; - userType?: string; - filterTenantId?: number; - userSource?: string; - status?: string; - }) { - const { - page = 1, - pageSize = 10, - tenantId, - keyword, - isSuperTenant = false, - userType, - filterTenantId, - userSource, - status, - } = params; - const skip = (page - 1) * pageSize; - const where: any = { validState: 1 }; - - // 超管跨租户查询:不按 tenantId 过滤,用 userType/filterTenantId 代替 - if (isSuperTenant) { - if (userType) { - const tenantCondition = this.buildTenantConditionByUserType(userType); - if (tenantCondition) { - where.tenant = tenantCondition; - } - } - if (filterTenantId) { - where.tenantId = filterTenantId; - } - if (userSource) { - where.userSource = userSource; - } - if (status) { - where.status = status; - } - } else { - // 普通租户:按 tenantId 过滤 - if (tenantId) { - where.tenantId = tenantId; - } - } - - // 关键字搜索 - if (keyword) { - where.OR = [ - { username: { contains: keyword } }, - { nickname: { contains: keyword } }, - { email: { contains: keyword } }, - { phone: { contains: keyword } }, - ]; - } - - // 超管查询时额外 include 租户信息和统计数据 - const include: any = { - roles: { include: { role: true } }, - }; - if (isSuperTenant) { - include.tenant = { - select: { id: true, name: true, code: true, tenantType: true, isSuper: true }, - }; - include._count = { - select: { parentRelations: true, contestRegistrations: true }, - }; - } - - const [list, total] = await Promise.all([ - this.prisma.user.findMany({ - where, - skip, - take: pageSize, - include, - orderBy: { createTime: 'desc' }, - }), - this.prisma.user.count({ where }), - ]); - - return { list, total, page, pageSize }; - } - - /** - * 用户类型统计(仅超管) - */ - async getStats() { - // 获取特殊租户 ID - const specialTenants = await this.prisma.tenant.findMany({ - where: { validState: 1 }, - select: { id: true, code: true, isSuper: true, tenantType: true }, - }); - - const superTenantIds = specialTenants.filter((t) => t.isSuper === 1).map((t) => t.id); - const publicTenantIds = specialTenants.filter((t) => t.code === 'public').map((t) => t.id); - const judgeTenantIds = specialTenants.filter((t) => t.code === 'judge').map((t) => t.id); - const orgTenantIds = specialTenants - .filter((t) => t.isSuper === 0 && t.code !== 'public' && t.code !== 'judge') - .map((t) => t.id); - - const baseWhere = { validState: 1 }; - - const [total, platform, org, judge, publicCount] = await Promise.all([ - this.prisma.user.count({ where: baseWhere }), - this.prisma.user.count({ where: { ...baseWhere, tenantId: { in: superTenantIds } } }), - this.prisma.user.count({ where: { ...baseWhere, tenantId: { in: orgTenantIds } } }), - this.prisma.user.count({ where: { ...baseWhere, tenantId: { in: judgeTenantIds } } }), - this.prisma.user.count({ where: { ...baseWhere, tenantId: { in: publicTenantIds } } }), - ]); - - return { total, platform, org, judge, public: publicCount }; - } - - async findOne(id: number, tenantId?: number, isSuperTenant = false) { - const where: any = { id }; - if (tenantId && !isSuperTenant) { - where.tenantId = tenantId; - } - - const user = await this.prisma.user.findFirst({ - where, - include: { - roles: { - include: { - role: { - include: { - permissions: { include: { permission: true } }, - }, - }, - }, - }, - tenant: { - select: { id: true, name: true, code: true, tenantType: true, isSuper: true }, - }, - parentRelations: isSuperTenant - ? { - include: { - child: { - select: { - id: true, username: true, nickname: true, avatar: true, - gender: true, birthday: true, city: true, status: true, createTime: true, - }, - }, - }, - orderBy: { createTime: 'desc' }, - } - : false, - contestRegistrations: isSuperTenant - ? { - take: 20, - orderBy: { createTime: 'desc' }, - include: { - contest: { select: { id: true, contestName: true, contestState: true } }, - child: { select: { id: true, name: true } }, - }, - } - : false, - contestJudges: isSuperTenant - ? { - include: { - contest: { select: { id: true, contestName: true, status: true } }, - }, - } - : false, - }, - }); - - if (!user) { - throw new NotFoundException('用户不存在'); - } - - return user; - } - - async findByUsername(username: string, tenantId?: number) { - const where: any = { username }; - if (tenantId) { - where.tenantId = tenantId; - } - - return this.prisma.user.findFirst({ - where, - include: { - roles: { - include: { - role: { - include: { - permissions: { - include: { - permission: true, - }, - }, - }, - }, - }, - }, - }, - }); - } - - async update(id: number, updateUserDto: UpdateUserDto, tenantId?: number) { - const { roleIds, ...userData } = updateUserDto; - const data: any = { ...userData }; - - // 验证用户是否存在且属于该租户 - const existingUser = await this.findOne(id, tenantId); - - if (updateUserDto.password) { - data.password = await bcrypt.hash(updateUserDto.password, 10); - } - - // 如果提供了 roleIds,更新角色关联 - if (roleIds !== undefined && tenantId) { - // 验证角色是否属于该租户 - const roles = await this.prisma.role.findMany({ - where: { - id: { in: roleIds }, - tenantId, - }, - }); - if (roles.length !== roleIds.length) { - throw new NotFoundException('部分角色不存在或不属于该租户'); - } - - // 先删除所有现有角色关联 - await this.prisma.userRole.deleteMany({ - where: { userId: id }, - }); - - // 创建新的角色关联 - if (roleIds.length > 0) { - data.roles = { - create: roleIds.map((roleId) => ({ - roleId, - })), - }; - } - } - - return this.prisma.user.update({ - where: { id }, - data, - include: { - roles: { - include: { - role: true, - }, - }, - }, - }); - } - - /** - * 切换用户状态(禁用/启用) - */ - async updateStatus( - id: number, - status: 'enabled' | 'disabled', - operatorId: number, - ) { - if (id === operatorId) { - throw new BadRequestException('不能操作自己的账号'); - } - - const user = await this.prisma.user.findUnique({ - where: { id }, - include: { roles: { include: { role: true } } }, - }); - if (!user) { - throw new NotFoundException('用户不存在'); - } - - // 禁用时检查是否是租户唯一管理员 - if (status === 'disabled') { - const isAdmin = user.roles.some( - (ur) => ur.role.code === 'tenant_admin' || ur.role.code === 'super_admin', - ); - if (isAdmin) { - const adminCount = await this.prisma.user.count({ - where: { - tenantId: user.tenantId, - status: 'enabled', - validState: 1, - roles: { - some: { - role: { - code: { in: ['tenant_admin', 'super_admin'] }, - }, - }, - }, - }, - }); - if (adminCount <= 1) { - throw new BadRequestException('不能禁用租户唯一的管理员账号'); - } - } - } - - return this.prisma.user.update({ - where: { id }, - data: { status }, - }); - } - - async remove(id: number, tenantId?: number) { - // 验证用户是否存在且属于该租户 - await this.findOne(id, tenantId); - - return this.prisma.user.delete({ - where: { id }, - }); - } - - /** - * 根据 userType 构建租户查询条件 - */ - private buildTenantConditionByUserType(userType: string) { - switch (userType) { - case 'platform': - return { isSuper: 1 }; - case 'public': - return { code: 'public' }; - case 'judge': - return { code: 'judge' }; - case 'org': - return { - isSuper: 0, - code: { notIn: ['public', 'judge'] }, - }; - default: - return null; - } - } -} diff --git a/backend/tsconfig.json b/backend/tsconfig.json deleted file mode 100644 index a0a205f..0000000 --- a/backend/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "moduleResolution": "node", - "declaration": true, - "removeComments": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "target": "ES2021", - "lib": ["ES2021"], - "sourceMap": true, - "outDir": "./dist", - "baseUrl": "./", - "incremental": true, - "skipLibCheck": true, - "strictNullChecks": false, - "noImplicitAny": false, - "strictBindCallApply": false, - "forceConsistentCasingInFileNames": false, - "noFallthroughCasesInSwitch": false, - "paths": { - "@/*": ["src/*"] - } - } -}