diff --git a/backend-java/src/main/java/com/competition/common/config/ContestWorkSchemaRepair.java b/backend-java/src/main/java/com/competition/common/config/ContestWorkSchemaRepair.java new file mode 100644 index 0000000..d706d6a --- /dev/null +++ b/backend-java/src/main/java/com/competition/common/config/ContestWorkSchemaRepair.java @@ -0,0 +1,49 @@ +package com.competition.common.config; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +/** + * 数据库启动时轻量修复: + * 由于本项目部分环境可能没有跑过最新的 init.sql, + * 导致 `t_biz_contest_work` 缺少 `deleted` 字段,从而 MyBatis-Plus 逻辑删除查询报 500。 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ContestWorkSchemaRepair implements ApplicationRunner { + + private final JdbcTemplate jdbcTemplate; + + @Override + public void run(ApplicationArguments args) { + try { + Integer columnCnt = jdbcTemplate.queryForObject( + "SELECT COUNT(*) " + + "FROM information_schema.columns " + + "WHERE table_schema = DATABASE() " + + "AND table_name = 't_biz_contest_work' " + + "AND column_name = 'deleted'", + Integer.class + ); + + if (columnCnt == null || columnCnt == 0) { + log.warn("检测到表 `t_biz_contest_work` 缺少字段 `deleted`,尝试补齐..."); + jdbcTemplate.execute( + "ALTER TABLE t_biz_contest_work " + + "ADD COLUMN deleted tinyint NOT NULL DEFAULT '0' " + + "COMMENT '逻辑删除:0-未删除,1-已删除'" + ); + log.info("补齐字段 `t_biz_contest_work.deleted` 完成"); + } + } catch (Exception e) { + // 不阻断启动,给调用方避免 500 需要依赖数据库权限/执行成功 + log.warn("补齐 `t_biz_contest_work.deleted` 失败:{}", e.getMessage()); + } + } +} + diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestWorkController.java b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestWorkController.java index 9166846..f94ddab 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestWorkController.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/controller/ContestWorkController.java @@ -37,7 +37,9 @@ public class ContestWorkController { @RequirePermission("work:read") @Operation(summary = "获取作品统计") public Result> getStats(@RequestParam(required = false) Long contestId) { - return Result.success(workService.getStats(contestId, SecurityUtil.getCurrentTenantId())); + return Result.success( + workService.getStats(contestId, SecurityUtil.getCurrentTenantId(), SecurityUtil.isSuperAdmin()) + ); } @GetMapping diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/service/IContestWorkService.java b/backend-java/src/main/java/com/competition/modules/biz/contest/service/IContestWorkService.java index 1a8e73f..3d4f9cf 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/service/IContestWorkService.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/service/IContestWorkService.java @@ -15,7 +15,7 @@ public interface IContestWorkService extends IService { PageResult> findAll(QueryWorkDto dto, Long tenantId, boolean isSuperTenant); - Map getStats(Long contestId, Long tenantId); + Map getStats(Long contestId, Long tenantId, boolean isSuperTenant); Map findDetail(Long id); diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestWorkServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestWorkServiceImpl.java index 50d9c9f..6452f8f 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestWorkServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestWorkServiceImpl.java @@ -160,9 +160,44 @@ public class ContestWorkServiceImpl extends ServiceImpl keywordRegistrationIds = Collections.emptySet(); if (StringUtils.hasText(dto.getKeyword())) { - wrapper.and(w -> w.like(BizContestWork::getTitle, dto.getKeyword()) - .or().like(BizContestWork::getWorkNo, dto.getKeyword())); + String keyword = dto.getKeyword(); + + // keyword 命中口径:作品编号(work_no)/作者姓名(account_name)/报名账号(account_no)/队伍名称(team_name) + LambdaQueryWrapper regWrapper = new LambdaQueryWrapper<>(); + if (dto.getContestId() != null) { + regWrapper.eq(BizContestRegistration::getContestId, dto.getContestId()); + } + regWrapper.eq(BizContestRegistration::getValidState, 1); + + if (dto.getTenantId() != null) { + regWrapper.eq(BizContestRegistration::getTenantId, dto.getTenantId()); + } else if (!isSuperTenant && tenantId != null) { + regWrapper.eq(BizContestRegistration::getTenantId, tenantId); + } + + regWrapper.and(w -> w.like(BizContestRegistration::getAccountNo, keyword) + .or().like(BizContestRegistration::getAccountName, keyword) + .or().like(BizContestRegistration::getTeamName, keyword)); + + List regs = contestRegistrationMapper.selectList(regWrapper); + keywordRegistrationIds = regs.stream() + .map(BizContestRegistration::getId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + if (!keywordRegistrationIds.isEmpty()) { + // 使用 apply 拼接 IN 条件,避免当前 MyBatis-Plus LambdaQueryWrapper 的 + // or().in() 链式泛型推断导致的编译失败。 + String registrationIdIn = keywordRegistrationIds.stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + wrapper.and(w -> w.like(BizContestWork::getWorkNo, keyword) + .or().apply("registration_id IN (" + registrationIdIn + ")")); + } else { + wrapper.and(w -> w.like(BizContestWork::getWorkNo, keyword)); + } } if (StringUtils.hasText(dto.getSubmitStartTime())) { wrapper.ge(BizContestWork::getSubmitTime, @@ -175,17 +210,23 @@ public class ContestWorkServiceImpl extends ServiceImpl page = new Page<>(dto.getPage(), dto.getPageSize()); Page result = contestWorkMapper.selectPage(page, wrapper); - // 批量查询报名信息 + // 批量查询报名/赛事信息 Set registrationIds = result.getRecords().stream() .map(BizContestWork::getRegistrationId) .filter(Objects::nonNull) .collect(Collectors.toSet()); + Set contestIds = result.getRecords().stream() + .map(BizContestWork::getContestId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Map registrationMap = new HashMap<>(); if (!registrationIds.isEmpty()) { List registrations = contestRegistrationMapper.selectBatchIds(registrationIds); @@ -193,12 +234,47 @@ public class ContestWorkServiceImpl extends ServiceImpl r)); } + Map contestMap = new HashMap<>(); + if (!contestIds.isEmpty()) { + List contests = contestMapper.selectBatchIds(contestIds); + contestMap = contests.stream() + .collect(Collectors.toMap(BizContest::getId, c -> c)); + } + Map finalRegistrationMap = registrationMap; + Map finalContestMap = contestMap; List> voList = result.getRecords().stream() .map(work -> { Map map = workToMap(work); + + BizContest contest = finalContestMap.get(work.getContestId()); + if (contest != null) { + Map contestVo = new LinkedHashMap<>(); + contestVo.put("id", contest.getId()); + contestVo.put("contestName", contest.getContestName()); + map.put("contest", contestVo); + } + BizContestRegistration reg = finalRegistrationMap.get(work.getRegistrationId()); if (reg != null) { + Map userVo = new LinkedHashMap<>(); + userVo.put("id", reg.getUserId()); + userVo.put("username", reg.getAccountNo()); + userVo.put("nickname", reg.getAccountName()); + + Map regVo = new LinkedHashMap<>(); + regVo.put("id", reg.getId()); + regVo.put("user", userVo); + + if (StringUtils.hasText(reg.getTeamName()) || reg.getTeamId() != null) { + Map teamVo = new LinkedHashMap<>(); + teamVo.put("teamName", reg.getTeamName()); + regVo.put("team", teamVo); + } + + map.put("registration", regVo); + + // 兼容旧字段:保留扁平账号信息 map.put("accountNo", reg.getAccountNo()); map.put("accountName", reg.getAccountName()); map.put("userId", reg.getUserId()); @@ -211,7 +287,7 @@ public class ContestWorkServiceImpl extends ServiceImpl getStats(Long contestId, Long tenantId) { + public Map getStats(Long contestId, Long tenantId, boolean isSuperTenant) { log.info("获取作品统计,赛事ID:{}", contestId); LambdaQueryWrapper baseWrapper = new LambdaQueryWrapper<>(); @@ -219,6 +295,10 @@ public class ContestWorkServiceImpl extends ServiceImpl submittedWrapper = new LambdaQueryWrapper<>(); @@ -226,6 +306,10 @@ public class ContestWorkServiceImpl extends ServiceImpl acceptedWrapper = new LambdaQueryWrapper<>(); + LambdaQueryWrapper reviewedWrapper = new LambdaQueryWrapper<>(); if (contestId != null) { - acceptedWrapper.eq(BizContestWork::getContestId, contestId); + reviewedWrapper.eq(BizContestWork::getContestId, contestId); } - acceptedWrapper.eq(BizContestWork::getIsLatest, true); - acceptedWrapper.eq(BizContestWork::getStatus, "accepted"); - long accepted = count(acceptedWrapper); - - LambdaQueryWrapper rejectedWrapper = new LambdaQueryWrapper<>(); - if (contestId != null) { - rejectedWrapper.eq(BizContestWork::getContestId, contestId); + reviewedWrapper.eq(BizContestWork::getIsLatest, true); + reviewedWrapper.eq(BizContestWork::getValidState, 1); + if (!isSuperTenant && tenantId != null) { + reviewedWrapper.eq(BizContestWork::getTenantId, tenantId); } - rejectedWrapper.eq(BizContestWork::getIsLatest, true); - rejectedWrapper.eq(BizContestWork::getStatus, "rejected"); - long rejected = count(rejectedWrapper); + // 已评完口径:兼容 accepted/awarded 两种结果状态 + reviewedWrapper.in(BizContestWork::getStatus, Arrays.asList("accepted", "awarded")); + long reviewed = count(reviewedWrapper); Map stats = new LinkedHashMap<>(); stats.put("total", total); stats.put("submitted", submitted); stats.put("reviewing", reviewing); - stats.put("accepted", accepted); - stats.put("rejected", rejected); + stats.put("reviewed", reviewed); return stats; } diff --git a/backend-java/src/main/java/com/competition/modules/sys/controller/SysTenantController.java b/backend-java/src/main/java/com/competition/modules/sys/controller/SysTenantController.java index fd122b6..4b57d27 100644 --- a/backend-java/src/main/java/com/competition/modules/sys/controller/SysTenantController.java +++ b/backend-java/src/main/java/com/competition/modules/sys/controller/SysTenantController.java @@ -2,10 +2,14 @@ package com.competition.modules.sys.controller; import com.competition.common.result.PageResult; import com.competition.common.result.Result; +import com.competition.common.exception.BusinessException; +import com.competition.common.enums.ErrorCode; import com.competition.common.util.SecurityUtil; import com.competition.modules.sys.dto.CreateTenantDto; import com.competition.modules.sys.dto.UpdateTenantDto; +import com.competition.modules.sys.entity.SysMenu; import com.competition.modules.sys.entity.SysTenant; +import com.competition.modules.sys.service.ISysMenuService; import com.competition.modules.sys.service.ISysTenantService; import com.competition.security.annotation.RequirePermission; import io.swagger.v3.oas.annotations.Operation; @@ -15,6 +19,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.Map; +import java.util.List; +import java.util.Objects; @Tag(name = "租户管理") @RestController @@ -23,6 +29,7 @@ import java.util.Map; public class SysTenantController { private final ISysTenantService tenantService; + private final ISysMenuService menuService; @PostMapping @RequirePermission("tenant:create") @@ -90,4 +97,24 @@ public class SysTenantController { tenantService.removeTenant(id, currentTenantId); return Result.success(); } + + @GetMapping("/{id}/menus") + @RequirePermission("tenant:read") + @Operation(summary = "获取租户菜单树") + public Result> getTenantMenus(@PathVariable Long id) { + Long currentTenantId = SecurityUtil.getCurrentTenantId(); + boolean isSuperAdmin = SecurityUtil.isSuperAdmin(); + + // 非超管只能查询自身租户 + if (!isSuperAdmin && !Objects.equals(id, currentTenantId)) { + throw BusinessException.of(ErrorCode.FORBIDDEN, "只能查询当前租户菜单"); + } + + // 校验租户是否存在 + if (tenantService.getById(id) == null) { + throw BusinessException.of(ErrorCode.NOT_FOUND, "租户不存在"); + } + + return Result.success(menuService.getTenantMenus(id)); + } } diff --git a/backend-java/src/main/java/com/competition/modules/sys/service/ISysMenuService.java b/backend-java/src/main/java/com/competition/modules/sys/service/ISysMenuService.java index a3c0d64..0ee258e 100644 --- a/backend-java/src/main/java/com/competition/modules/sys/service/ISysMenuService.java +++ b/backend-java/src/main/java/com/competition/modules/sys/service/ISysMenuService.java @@ -12,6 +12,11 @@ public interface ISysMenuService extends IService { List findAllTree(); + /** + * 获取指定租户可用的菜单树(基于 t_sys_tenant_menu 分配) + */ + List getTenantMenus(Long tenantId); + List getUserMenus(Long userId, Long tenantId, boolean isSuperAdmin); SysMenu findDetail(Long id); diff --git a/backend-java/src/main/java/com/competition/modules/sys/service/impl/SysMenuServiceImpl.java b/backend-java/src/main/java/com/competition/modules/sys/service/impl/SysMenuServiceImpl.java index a8e51fa..e9e1182 100644 --- a/backend-java/src/main/java/com/competition/modules/sys/service/impl/SysMenuServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/sys/service/impl/SysMenuServiceImpl.java @@ -95,6 +95,34 @@ public class SysMenuServiceImpl extends ServiceImpl impl return buildTree(filteredMenus, null); } + @Override + public List getTenantMenus(Long tenantId) { + if (tenantId == null) return Collections.emptyList(); + + // 获取所有有效菜单 + List allMenus = list(new LambdaQueryWrapper() + .eq(SysMenu::getValidState, 1) + .orderByAsc(SysMenu::getSort)); + + // 获取租户已分配的菜单 ID + List tenantMenus = tenantMenuMapper.selectList( + new LambdaQueryWrapper().eq(SysTenantMenu::getTenantId, tenantId)); + Set tenantMenuIds = tenantMenus.stream().map(SysTenantMenu::getMenuId).collect(Collectors.toSet()); + + // 过滤出租户可用的菜单 + List filteredMenus = allMenus.stream() + .filter(menu -> tenantMenuIds.contains(menu.getId())) + .collect(Collectors.toList()); + + // 补全父菜单(确保树结构完整) + Set filteredIds = filteredMenus.stream().map(SysMenu::getId).collect(Collectors.toSet()); + for (SysMenu menu : new ArrayList<>(filteredMenus)) { + addParentsIfMissing(menu, allMenus, filteredMenus, filteredIds); + } + + return buildTree(filteredMenus, null); + } + @Override public SysMenu findDetail(Long id) { SysMenu menu = getById(id); diff --git a/backend-java/src/main/resources/db/init.sql b/backend-java/src/main/resources/db/init.sql index 3a73e45..8a29b41 100644 --- a/backend-java/src/main/resources/db/init.sql +++ b/backend-java/src/main/resources/db/init.sql @@ -568,6 +568,7 @@ CREATE TABLE `t_biz_contest_work` ( `user_work_id` int DEFAULT NULL, `create_by` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人账号', `update_by` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人账号', + `deleted` tinyint NOT NULL DEFAULT '0' COMMENT '逻辑删除:0-未删除,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`), @@ -579,7 +580,7 @@ CREATE TABLE `t_biz_contest_work` ( KEY `t_contest_work_user_work_id_fkey` (`user_work_id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; -INSERT INTO `t_biz_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,NULL,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,NULL,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,NULL,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,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,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,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,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,NULL,NULL); +INSERT INTO `t_biz_contest_work` (id,tenant_id,contest_id,registration_id,work_no,title,description,files,version,is_latest,status,submit_time,submitter_user_id,submitter_account_no,submit_source,preview_url,ai_model_meta,creator,modifier,create_time,modify_time,valid_state,award_level,award_name,certificate_url,final_score,preview_urls,rank,user_work_id,create_by,update_by) 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,NULL,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,NULL,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,NULL,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,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,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,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,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,NULL,NULL); /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `t_biz_contest_work_attachment` ( diff --git a/backend-java/src/main/resources/db/migration/V1__add_deleted_to_t_biz_contest_work.sql b/backend-java/src/main/resources/db/migration/V1__add_deleted_to_t_biz_contest_work.sql new file mode 100644 index 0000000..e775554 --- /dev/null +++ b/backend-java/src/main/resources/db/migration/V1__add_deleted_to_t_biz_contest_work.sql @@ -0,0 +1,21 @@ +-- Flyway migration: +-- 兼容部分环境没有跑过最新的 init.sql, +-- 导致 t_biz_contest_work 缺少 deleted 字段,从而逻辑删除查询报错。 +SET @column_cnt := ( + SELECT COUNT(*) + FROM information_schema.columns + WHERE table_schema = DATABASE() + AND table_name = 't_biz_contest_work' + AND column_name = 'deleted' +); + +SET @sql := IF( + @column_cnt = 0, + 'ALTER TABLE t_biz_contest_work ADD COLUMN deleted tinyint NOT NULL DEFAULT ''0'' COMMENT ''逻辑删除:0-未删除,1-已删除''', + 'SELECT 1' +); + +PREPARE stmt FROM @sql; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + 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 9fa0db3..0000000 Binary files a/backend/competition-management-service-test-1.0.0.tgz and /dev/null differ 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/*"] - } - } -} diff --git a/docs/legacy/TENANT_IMPLEMENTATION.md b/docs/legacy/TENANT_IMPLEMENTATION.md index 973fab2..ca00689 100644 --- a/docs/legacy/TENANT_IMPLEMENTATION.md +++ b/docs/legacy/TENANT_IMPLEMENTATION.md @@ -145,7 +145,7 @@ const users = await prisma.user.findMany({ where }); - `GET /api/tenants/:id` - 获取租户详情 - `PATCH /api/tenants/:id` - 更新租户(包括菜单分配) - `DELETE /api/tenants/:id` - 删除租户 -- `GET /api/tenants/:id/menus` - 获取租户菜单树 +- `GET /api/tenants/:id/menus` - 获取租户菜单树(返回与 `/api/menus/user-menus` 相同的菜单树结构;数据来源 `t_sys_tenant_menu`;非超管只能查询自身租户) ### 其他接口 diff --git a/frontend/src/views/system/roles/Index.vue b/frontend/src/views/system/roles/Index.vue index 9d40dce..b3d4aaa 100644 --- a/frontend/src/views/system/roles/Index.vue +++ b/frontend/src/views/system/roles/Index.vue @@ -275,8 +275,9 @@ const handleEdit = async (record: Role) => { form.code = detail.code form.description = detail.description || '' // 回显权限 - form.permissionIds = detail.permissions?.map((rp) => rp.permission.id) || [] + form.permissionIds = detail.permissions?.map((rp) => rp.id) || [] } catch (error) { + console.error(error) message.error('获取角色详情失败') modalVisible.value = false } finally { diff --git a/frontend/src/views/system/users/Index.vue b/frontend/src/views/system/users/Index.vue index 53bc893..2e68d3e 100644 --- a/frontend/src/views/system/users/Index.vue +++ b/frontend/src/views/system/users/Index.vue @@ -7,12 +7,8 @@
-
+
@@ -27,43 +23,21 @@
- + - + - + 管理创建 自主注册 - + 正常 禁用 @@ -71,11 +45,15 @@ - + 搜索 - + 重置 @@ -84,15 +62,8 @@
- +