diff --git a/docs/sql/mysql/20251212_add_judge_invite_fields.sql b/docs/sql/mysql/20251212_add_judge_invite_fields.sql new file mode 100644 index 0000000..4f3ec5d --- /dev/null +++ b/docs/sql/mysql/20251212_add_judge_invite_fields.sql @@ -0,0 +1,59 @@ +-- ===================================================== +-- 武术比赛管理系统 - 补充裁判邀请表字段 +-- 添加实体类中存在但数据库表缺失的字段 +-- Date: 2025-12-12 +-- ===================================================== + +USE martial_db; + +-- ===================================================== +-- martial_judge_invite (裁判邀请码表) - 添加缺失字段 +-- ===================================================== + +-- 添加 invite_status 字段 +ALTER TABLE martial_judge_invite +ADD COLUMN invite_status int DEFAULT 0 COMMENT '邀请状态(0-待回复,1-已接受,2-已拒绝,3-已取消)' AFTER token_expire_time; + +-- 添加 invite_time 字段 +ALTER TABLE martial_judge_invite +ADD COLUMN invite_time datetime DEFAULT NULL COMMENT '邀请时间' AFTER invite_status; + +-- 添加 reply_time 字段 +ALTER TABLE martial_judge_invite +ADD COLUMN reply_time datetime DEFAULT NULL COMMENT '回复时间' AFTER invite_time; + +-- 添加 reply_note 字段 +ALTER TABLE martial_judge_invite +ADD COLUMN reply_note varchar(500) DEFAULT NULL COMMENT '回复备注' AFTER reply_time; + +-- 添加 contact_phone 字段 +ALTER TABLE martial_judge_invite +ADD COLUMN contact_phone varchar(20) DEFAULT NULL COMMENT '联系电话' AFTER reply_note; + +-- 添加 contact_email 字段 +ALTER TABLE martial_judge_invite +ADD COLUMN contact_email varchar(100) DEFAULT NULL COMMENT '联系邮箱' AFTER contact_phone; + +-- 添加 invite_message 字段 +ALTER TABLE martial_judge_invite +ADD COLUMN invite_message varchar(1000) DEFAULT NULL COMMENT '邀请消息' AFTER contact_email; + +-- 添加 cancel_reason 字段 +ALTER TABLE martial_judge_invite +ADD COLUMN cancel_reason varchar(500) DEFAULT NULL COMMENT '取消原因' AFTER invite_message; + +-- ===================================================== +-- 验证修改 +-- ===================================================== +SELECT '=== 裁判邀请表字段补充完成 ===' AS status; + +-- 查看表结构 +SHOW COLUMNS FROM martial_judge_invite; + +-- 统计字段数量 +SELECT + 'martial_judge_invite 字段数:' AS info, + COUNT(*) AS count +FROM information_schema.COLUMNS +WHERE TABLE_SCHEMA='martial_db' +AND TABLE_NAME='martial_judge_invite'; diff --git a/docs/sql/mysql/20251212_add_menu_data.sql b/docs/sql/mysql/20251212_add_menu_data.sql new file mode 100644 index 0000000..e2b6c4e --- /dev/null +++ b/docs/sql/mysql/20251212_add_menu_data.sql @@ -0,0 +1,147 @@ +-- ===================================================== +-- 武术比赛管理系统 - 菜单数据 +-- 添加武术比赛管理相关菜单 +-- Date: 2025-12-12 +-- ===================================================== + +-- 注意:请根据实际情况调整菜单ID,避免与现有菜单冲突 +-- 建议先查询当前最大菜单ID: SELECT MAX(id) FROM blade_menu; + +USE bladex; + +-- ===================================================== +-- 1. 武术比赛管理 - 一级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2000000, 0, 'martial', '武术比赛', 'menu', '/martial', 'iconfont icon-quanxian', 1, 1, 0, 1, '武术比赛管理系统', 0); + +-- ===================================================== +-- 2. 赛事管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2001000, 2000000, 'martial:competition', '赛事管理', 'menu', '/martial/competition/list', 'iconfont icon-rizhi', 1, 1, 0, 1, '赛事信息管理', 0); + +-- ===================================================== +-- 3. 报名管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2002000, 2000000, 'martial:registration', '报名详情', 'menu', '/martial/registration/detail', 'iconfont icon-wenben', 2, 1, 0, 1, '报名信息管理', 0); + +-- ===================================================== +-- 4. 订单管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2003000, 2000000, 'martial:order', '订单管理', 'menu', '/martial/order/list', 'iconfont icon-caidan', 3, 1, 0, 1, '订单信息管理', 0); + +-- ===================================================== +-- 5. 参赛选手管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2004000, 2000000, 'martial:participant', '参赛选手管理', 'menu', '/martial/participant/list', 'iconfont icon-icon-', 4, 1, 0, 1, '参赛选手信息管理', 0); + +-- ===================================================== +-- 6. 项目管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2005000, 2000000, 'martial:project', '项目管理', 'menu', '/martial/project/list', 'iconfont icon-liebiao', 5, 1, 0, 1, '比赛项目管理', 0); + +-- ===================================================== +-- 7. 评委管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2006000, 2000000, 'martial:referee', '评委管理', 'menu', '/martial/referee/list', 'iconfont icon-quanxian', 6, 1, 0, 1, '评委信息管理', 0); + +-- ===================================================== +-- 8. 裁判邀请 - 二级菜单 ⭐ 重点 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2007000, 2000000, 'martial:judgeInvite', '裁判邀请', 'menu', '/martial/judgeInvite/list', 'iconfont icon-email', 7, 1, 0, 1, '裁判邀请码管理', 0); + +-- ===================================================== +-- 9. 裁判分配 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2008000, 2000000, 'martial:judgeProject', '裁判分配', 'menu', '/martial/judgeProject/list', 'iconfont icon-quanxian', 8, 1, 0, 1, '裁判项目分配', 0); + +-- ===================================================== +-- 10. 评分管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2009000, 2000000, 'martial:score', '评分管理', 'menu', '/martial/score/index', 'iconfont icon-icon-', 9, 1, 0, 1, '评分记录管理', 0); + +-- ===================================================== +-- 11. 扣分项管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2010000, 2000000, 'martial:deduction', '扣分项管理', 'menu', '/martial/deduction/list', 'iconfont icon-icon-', 10, 1, 0, 1, '扣分项配置管理', 0); + +-- ===================================================== +-- 12. 成绩管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2011000, 2000000, 'martial:result', '成绩管理', 'menu', '/martial/result/list', 'iconfont icon-icon-', 11, 1, 0, 1, '成绩统计管理', 0); + +-- ===================================================== +-- 13. 赛程计划 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2012000, 2000000, 'martial:schedulePlan', '赛程计划', 'menu', '/martial/schedulePlan/list', 'iconfont icon-riqi', 12, 1, 0, 1, '赛程安排管理', 0); + +-- ===================================================== +-- 14. 选手关联 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2013000, 2000000, 'martial:scheduleAthlete', '选手关联', 'menu', '/martial/scheduleAthlete/list', 'iconfont icon-icon-', 13, 1, 0, 1, '赛程选手关联', 0); + +-- ===================================================== +-- 15. 轮播图管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2014000, 2000000, 'martial:banner', '轮播图管理', 'menu', '/martial/banner/index', 'iconfont icon-tupian', 14, 1, 0, 1, '轮播图配置', 0); + +-- ===================================================== +-- 16. 直播管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2015000, 2000000, 'martial:live', '直播管理', 'menu', '/martial/live/list', 'iconfont icon-icon-', 15, 1, 0, 1, '直播信息管理', 0); + +-- ===================================================== +-- 17. 信息发布 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2016000, 2000000, 'martial:info', '信息发布', 'menu', '/martial/info/list', 'iconfont icon-wenben', 16, 1, 0, 1, '信息发布管理', 0); + +-- ===================================================== +-- 18. 异常事件 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2017000, 2000000, 'martial:exception', '异常事件', 'menu', '/martial/exception/list', 'iconfont icon-icon-', 17, 1, 0, 1, '异常事件管理', 0); + +-- ===================================================== +-- 19. 活动日程 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2018000, 2000000, 'martial:activity', '活动日程', 'menu', '/martial/activity/list', 'iconfont icon-riqi', 18, 1, 0, 1, '活动日程管理', 0); + +-- ===================================================== +-- 20. 赛事规程管理 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2019000, 2000000, 'martial:rules', '赛事规程管理', 'menu', '/martial/rules/index', 'iconfont icon-wenben', 19, 1, 0, 1, '赛事规程文件管理', 0); + +-- ===================================================== +-- 21. 导出中心 - 二级菜单 +-- ===================================================== +INSERT INTO `blade_menu` (`id`, `parent_id`, `code`, `name`, `alias`, `path`, `source`, `sort`, `category`, `action`, `is_open`, `remark`, `is_deleted`) +VALUES (2020000, 2000000, 'martial:export', '导出中心', 'menu', '/martial/export/index', 'iconfont icon-icon-', 20, 1, 0, 1, '数据导出中心', 0); + +-- ===================================================== +-- 验证插入 +-- ===================================================== +SELECT '=== 菜单数据插入完成 ===' AS status; + +-- 查看插入的菜单 +SELECT id, parent_id, name, path, sort +FROM blade_menu +WHERE id >= 2000000 AND id <= 2020000 +ORDER BY id; diff --git a/src/main/java/org/springblade/common/config/BladeConfiguration.java b/src/main/java/org/springblade/common/config/BladeConfiguration.java index e8364f7..3e2e887 100644 --- a/src/main/java/org/springblade/common/config/BladeConfiguration.java +++ b/src/main/java/org/springblade/common/config/BladeConfiguration.java @@ -48,7 +48,7 @@ public class BladeConfiguration implements WebMvcConfigurer { */ @Override public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/cors/**") + registry.addMapping("/**") .allowedOriginPatterns("*") .allowedHeaders("*") .allowedMethods("*") diff --git a/src/main/java/org/springblade/modules/martial/controller/MartialDeductionItemController.java b/src/main/java/org/springblade/modules/martial/controller/MartialDeductionItemController.java index df057a9..8199e9a 100644 --- a/src/main/java/org/springblade/modules/martial/controller/MartialDeductionItemController.java +++ b/src/main/java/org/springblade/modules/martial/controller/MartialDeductionItemController.java @@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.*; */ @RestController @AllArgsConstructor -@RequestMapping("/martial/deductionItem") +@RequestMapping("/blade-martial/deductionItem") @Tag(name = "扣分项配置管理", description = "扣分项配置接口") public class MartialDeductionItemController extends BladeController { diff --git a/src/main/java/org/springblade/modules/martial/controller/MartialJudgeInviteController.java b/src/main/java/org/springblade/modules/martial/controller/MartialJudgeInviteController.java index 08aa623..58cae52 100644 --- a/src/main/java/org/springblade/modules/martial/controller/MartialJudgeInviteController.java +++ b/src/main/java/org/springblade/modules/martial/controller/MartialJudgeInviteController.java @@ -129,4 +129,99 @@ public class MartialJudgeInviteController extends BladeController { return R.data(invite); } + /** + * 发送邀请 + */ + @PostMapping("/send") + @Operation(summary = "发送邀请", description = "向评委发送邀请") + public R sendInvite(@RequestBody MartialJudgeInvite judgeInvite) { + // TODO: 实现邮件/短信发送逻辑 + judgeInvite.setInviteStatus(0); // 待回复 + judgeInvite.setInviteTime(java.time.LocalDateTime.now()); + return R.status(judgeInviteService.saveOrUpdate(judgeInvite)); + } + + /** + * 重发邀请 + */ + @PostMapping("/resend/{inviteId}") + @Operation(summary = "重发邀请", description = "重新发送邀请") + public R resendInvite(@PathVariable Long inviteId) { + MartialJudgeInvite invite = judgeInviteService.getById(inviteId); + if (invite == null) { + return R.fail("邀请记录不存在"); + } + // TODO: 实现邮件/短信重发逻辑 + invite.setInviteTime(java.time.LocalDateTime.now()); + return R.status(judgeInviteService.updateById(invite)); + } + + /** + * 取消邀请 + */ + @PostMapping("/cancel/{inviteId}") + @Operation(summary = "取消邀请", description = "取消邀请") + public R cancelInvite(@PathVariable Long inviteId, @RequestParam(required = false) String reason) { + MartialJudgeInvite invite = judgeInviteService.getById(inviteId); + if (invite == null) { + return R.fail("邀请记录不存在"); + } + invite.setInviteStatus(3); // 已取消 + invite.setCancelReason(reason); + return R.status(judgeInviteService.updateById(invite)); + } + + /** + * 确认邀请 + */ + @PostMapping("/confirm/{inviteId}") + @Operation(summary = "确认邀请", description = "确认接受邀请") + public R confirmInvite(@PathVariable Long inviteId) { + MartialJudgeInvite invite = judgeInviteService.getById(inviteId); + if (invite == null) { + return R.fail("邀请记录不存在"); + } + if (invite.getInviteStatus() != 1) { + return R.fail("只能确认已接受的邀请"); + } + // TODO: 实现确认逻辑(如分配场地、项目等) + return R.success("确认成功"); + } + + /** + * 发送提醒 + */ + @PostMapping("/reminder/{inviteId}") + @Operation(summary = "发送提醒", description = "提醒评委回复邀请") + public R sendReminder(@PathVariable Long inviteId, @RequestParam(required = false) String message) { + MartialJudgeInvite invite = judgeInviteService.getById(inviteId); + if (invite == null) { + return R.fail("邀请记录不存在"); + } + // TODO: 实现提醒发送逻辑(邮件/短信) + return R.success("提醒发送成功"); + } + + /** + * 从评委库导入 + */ + @PostMapping("/import/pool") + @Operation(summary = "从评委库导入", description = "从评委库批量导入评委") + public R importFromPool(@RequestParam Long competitionId, @RequestParam String judgeIds) { + // TODO: 实现从评委库导入逻辑 + List ids = Func.toLongList(judgeIds); + // 为每个评委生成邀请码 + return R.success("导入成功"); + } + + /** + * 导出邀请数据 + */ + @GetMapping("/export") + @Operation(summary = "导出邀请数据", description = "导出邀请数据为Excel") + public void exportInvites(MartialJudgeInvite judgeInvite) { + // TODO: 实现Excel导出逻辑 + // 使用EasyExcel或POI导出 + } + } diff --git a/src/main/java/org/springblade/modules/martial/controller/MartialMiniController.java b/src/main/java/org/springblade/modules/martial/controller/MartialMiniController.java index 365ad66..c9c15a8 100644 --- a/src/main/java/org/springblade/modules/martial/controller/MartialMiniController.java +++ b/src/main/java/org/springblade/modules/martial/controller/MartialMiniController.java @@ -34,7 +34,7 @@ import java.util.stream.Collectors; */ @RestController @AllArgsConstructor -@RequestMapping("/api/mini") +@RequestMapping("/mini") @Tag(name = "小程序接口", description = "小程序评分系统专用接口") public class MartialMiniController extends BladeController { diff --git a/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java index bb13c56..2d20764 100644 --- a/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java +++ b/src/main/java/org/springblade/modules/martial/service/impl/MartialScheduleArrangeServiceImpl.java @@ -749,6 +749,7 @@ public class MartialScheduleArrangeServiceImpl implements IMartialScheduleArrang participant.setProjectName(groupData.getGroupName()); participant.setCategory(athlete.getCategory()); participant.setPerformanceOrder(order++); + participant.setScheduleStatus("draft"); // 初始状态为草稿 participant.setCreateTime(new Date()); scheduleParticipantMapper.insert(participant); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0f5a66d..08d30a7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -240,14 +240,13 @@ blade: - /blade-desk/notice/submit - /blade-flow/model/submit - /blade-develop/datasource/submit - - /blade-system/user/register #安全框架配置 secure: #严格模式 #缺失令牌字段则取消授权 - strict-token: true + strict-token: false #缺失请求头则取消授权 - strict-header: true + strict-header: false #接口放行 skip-url: - /blade-test/** @@ -255,6 +254,8 @@ blade: - /blade-device/** - /blade-system/user/register - /blade-auth/captcha/send + - /blade-auth/oauth/token + - /mini/login #授权认证配置 auth: - method: ALL