-
活动日程
-
-
@@ -184,9 +487,51 @@ export default {
{ date: '2025-05-21', time: '09:00-18:00', event: '初赛', venue: '比赛馆' },
]
}
- ]
+ ],
+ dialogVisible: false,
+ dialogMode: 'create', // create, edit, view
+ submitLoading: false,
+ currentCompetitionId: null,
+ formData: {
+ competitionName: '',
+ organizer: '',
+ location: '',
+ venue: '',
+ registrationTime: '',
+ competitionTime: '',
+ status: 1,
+ introduction: '',
+ contactPerson: '',
+ contactPhone: '',
+ contactEmail: '',
+ rules: '',
+ requirements: '',
+ awards: '',
+ schedule: []
+ },
+ formRules: {
+ competitionName: [
+ { required: true, message: '请输入赛事名称', trigger: 'blur' }
+ ],
+ organizer: [
+ { required: true, message: '请输入主办单位', trigger: 'blur' }
+ ],
+ location: [
+ { required: true, message: '请输入举办地点', trigger: 'blur' }
+ ]
+ }
};
},
+ computed: {
+ dialogTitle() {
+ const titleMap = {
+ create: '新建赛事',
+ edit: '编辑赛事',
+ view: '查看赛事'
+ };
+ return titleMap[this.dialogMode] || '赛事信息';
+ }
+ },
mounted() {
this.loadCompetitionList();
},
@@ -231,24 +576,28 @@ export default {
},
handleCreate() {
- this.$router.push({
- path: '/martial/competition/create',
- query: { mode: 'create' }
- });
+ this.dialogMode = 'create';
+ this.currentCompetitionId = null;
+ this.resetFormData();
+ this.dialogVisible = true;
},
handleView(row) {
- this.$router.push({
- path: '/martial/competition/create',
- query: { mode: 'view', id: row.id }
- });
+ this.dialogMode = 'view';
+ this.currentCompetitionId = row.id;
+ this.formData = { ...row };
+ this.dialogVisible = true;
},
handleEdit(row) {
- this.$router.push({
- path: '/martial/competition/create',
- query: { mode: 'edit', id: row.id }
- });
+ this.dialogMode = 'edit';
+ this.currentCompetitionId = row.id;
+ this.formData = { ...row };
+ this.dialogVisible = true;
+ },
+
+ switchToEdit() {
+ this.dialogMode = 'edit';
},
handleDelete(row) {
@@ -264,6 +613,85 @@ export default {
this.$message.success('删除成功');
}
}).catch(() => {});
+ },
+
+ handleAddSchedule() {
+ this.formData.schedule.push({
+ date: '',
+ time: '',
+ event: '',
+ venue: ''
+ });
+ },
+
+ handleDeleteSchedule(index) {
+ this.formData.schedule.splice(index, 1);
+ },
+
+ handleSubmit() {
+ this.$refs.formRef.validate((valid) => {
+ if (valid) {
+ this.submitLoading = true;
+
+ setTimeout(() => {
+ if (this.dialogMode === 'create') {
+ // 新建
+ const newId = this.competitionList.length > 0
+ ? Math.max(...this.competitionList.map(item => item.id)) + 1
+ : 1;
+ const newCompetition = {
+ ...this.formData,
+ id: newId,
+ posterImages: [],
+ regulationFiles: []
+ };
+ this.competitionList.push(newCompetition);
+ this.$message.success('创建成功');
+ } else if (this.dialogMode === 'edit') {
+ // 编辑
+ const index = this.competitionList.findIndex(item => item.id === this.currentCompetitionId);
+ if (index !== -1) {
+ this.competitionList[index] = {
+ ...this.competitionList[index],
+ ...this.formData
+ };
+ this.$message.success('保存成功');
+ }
+ }
+
+ this.saveCompetitionList();
+ this.dialogVisible = false;
+ this.submitLoading = false;
+ }, 500);
+ } else {
+ this.$message.error('请完善必填信息');
+ }
+ });
+ },
+
+ handleDialogClose() {
+ this.$refs.formRef.resetFields();
+ this.resetFormData();
+ },
+
+ resetFormData() {
+ this.formData = {
+ competitionName: '',
+ organizer: '',
+ location: '',
+ venue: '',
+ registrationTime: '',
+ competitionTime: '',
+ status: 1,
+ introduction: '',
+ contactPerson: '',
+ contactPhone: '',
+ contactEmail: '',
+ rules: '',
+ requirements: '',
+ awards: '',
+ schedule: []
+ };
}
}
};
@@ -306,4 +734,49 @@ export default {
padding: 0 8px;
}
}
+
+.competition-form {
+ max-height: 60vh;
+ overflow-y: auto;
+}
+
+.form-section {
+ margin-bottom: 30px;
+ padding: 20px;
+ background: #fafafa;
+ border-radius: 8px;
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+}
+
+.section-title {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 600;
+ color: #333;
+
+ i {
+ color: #dc2626;
+ font-size: 18px;
+ }
+}
+
+:deep(.el-form-item) {
+ margin-bottom: 18px;
+}
+
+:deep(.el-table) {
+ .el-input {
+ width: 100%;
+ }
+}
+
+.dialog-footer {
+ text-align: right;
+}
diff --git a/src/views/martial/deduction/index.vue b/src/views/martial/deduction/index.vue
new file mode 100644
index 0000000..f754b35
--- /dev/null
+++ b/src/views/martial/deduction/index.vue
@@ -0,0 +1,698 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 查询
+
+ 重置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.sortOrder }}
+
+
+
+
+
+
+
+ -{{ row.deductionPoints }}
+
+
+
+
+
+
+ {{ formatDate(row.createTime) }}
+
+
+
+
+
+ 编辑
+
+
+ 克隆
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 扣分范围:0.1 - 10.0 分
+
+
+
+ 数字越小越靠前
+
+
+
+
+
+
+ 取消
+
+ 确定
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 将复制 {{ cloneForm.itemCount }} 个扣分项到目标项目
+
+
+
+
+ 取消
+
+ 确定克隆
+
+
+
+
+
+
+
+
+
diff --git a/src/views/martial/dispatch/index.vue b/src/views/martial/dispatch/index.vue
index 2e870e4..e6d6f8e 100644
--- a/src/views/martial/dispatch/index.vue
+++ b/src/views/martial/dispatch/index.vue
@@ -154,7 +154,7 @@ export default {
},
methods: {
goBack() {
- this.$router.push('/martial/order/list')
+ this.$router.go(-1)
},
setViewMode(index, mode) {
this.dispatchGroups[index].viewMode = mode
diff --git a/src/views/martial/exception/index.vue b/src/views/martial/exception/index.vue
new file mode 100644
index 0000000..4fb8c88
Binary files /dev/null and b/src/views/martial/exception/index.vue differ
diff --git a/src/views/martial/export/index.vue b/src/views/martial/export/index.vue
new file mode 100644
index 0000000..e3566a7
--- /dev/null
+++ b/src/views/martial/export/index.vue
@@ -0,0 +1,698 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 排名
+ 选手姓名
+ 团队名称
+ 项目
+ 总分
+ 最终成绩
+ 奖牌
+ 裁判评分明细
+
+
+
+
+ Excel (xlsx)
+ PDF
+ CSV
+
+
+
+
+ 导出成绩单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 运动员名单
+ 裁判名单
+ 工作人员名单
+
+
+
+
+ Excel (xlsx)
+ PDF
+
+
+
+
+ 导出名单
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 获奖证书(金银铜牌)
+ 参赛证书
+ 优秀运动员证书
+
+
+
+
+
+ {{ item.templateName }}
+
+ {{ item.description }}
+
+
+
+
+
+
+ PDF
+ JPG图片
+
+
+
+
+
+ 开启后将根据筛选条件批量生成
+
+
+
+
+ 生成证书
+
+
+ 预览模板
+
+
+
+
+
+
+
已生成证书
+
+
+
+
+
+
+ 🏅 金牌
+ 🥈 银牌
+ 🥉 铜牌
+ -
+
+
+
+
+ {{ formatDate(row.generateTime) }}
+
+
+
+
+
+ 预览
+
+
+ 下载
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Excel (xlsx)
+ PDF
+
+
+
+
+
+ 导出PDF时包含统计图表
+
+
+
+
+ 导出报表
+
+
+
+
+
+
+
+
+ 报表说明
+
+
+
赛事统计报表:包含赛事基本信息、时间、地点、参赛人数、项目数量、裁判数量等综合统计信息
+
项目统计报表:各项目报名人数、实际参赛人数、获奖分布、平均分、最高分、最低分等详细数据
+
裁判工作量报表:每位裁判的评分数量、负责项目、工作时长、评分准确性等统计
+
报名统计报表:报名趋势分析、地域分布、团队排名、报名费收入统计等
+
奖牌榜报表:按团队或地区统计金银铜牌数量,包含总积分排名
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+
diff --git a/src/views/martial/info/index.vue b/src/views/martial/info/index.vue
new file mode 100644
index 0000000..5f7934f
--- /dev/null
+++ b/src/views/martial/info/index.vue
@@ -0,0 +1,1194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ statistics.totalInfo || 0 }}
+
;op
+
+
+
+
+
+
+
+
+
+
+
+
{{ statistics.published || 0 }}
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ statistics.totalViews || 0 }}
+
;
+
+
+
+
+
+
+
+
+
+
+
+
{{ statistics.importantCount || 0 }}
+
́o
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "
+
+ n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ nv
+ ́
+
+ {{ getTypeText(item.infoType) }}
+
+
+
+
+
+
+
{{ item.title }}
+
{{ item.summary || 'X' }}
+
+
+
+
+
+
+
+
+ {{ item.isTop ? 'ֈnv' : 'nv' }}
+
+
+ {{ item.isImportant ? 'ֈ́' : ':́' }}
+
+
+
+
+
+
+
+
+
+
+
+
+ d
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ lJ
+
+
+
+
+
+
+
+
+
+
+
+
+ /jpgpng<:16:9
+
+
+
+
+
+
+
+
+
+ D
+
+ /8c< 5*DU*
50MB
+
+
+
+
+
+
+
s
+
+
+
+
+ nv
+ ́
+
+
+
+
+
+ ֈ
+
+ {{ dialogTitle === 'o' ? 's' : 'X9' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ X{{ detailData.summary }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/martial/judgeInvite/index.vue b/src/views/martial/judgeInvite/index.vue
new file mode 100644
index 0000000..ccbf488
Binary files /dev/null and b/src/views/martial/judgeInvite/index.vue differ
diff --git a/src/views/martial/judgeProject/index.vue b/src/views/martial/judgeProject/index.vue
new file mode 100644
index 0000000..7e5a4cb
--- /dev/null
+++ b/src/views/martial/judgeProject/index.vue
@@ -0,0 +1,1722 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ statistics.totalJudges || 0 }}
+
;$p
+
+
+
+
+
+
+
+
+
+
+
+
{{ statistics.assignedProjects || 0 }}
+
My
+
+
+
+
+
+
+
+
+
+
+
+
{{ statistics.unassignedProjects || 0 }}
+
*My
+
+
+
+
+
+
+
+
+
+
+
+
{{ statistics.avgWorkload || 0 }}
+
sG\
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ | y
|
+ ;$ |
+ o$ |
+ g1 |
+ g2 |
+ g3 |
+ \ |
+
+
+
+
+ |
+
+ {{ project.projectName }}
+ {{ project.categoryName }}
+
+ |
+
+ handleJudgeChange(project, role.value, val)"
+ >
+
+ {{ judge.judgeName }}
+
+ {{ judge.judgeLevel }} | {{ getJudgeWorkloadCount(judge.id) }}y
+
+
+
+ |
+
+
+
+
+
+
6
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.judgeLevel }}
+
+
+
+
+
+
+ {{ getRoleText(row.role) }}
+
+
+
+
+
+
+
+
+ c8
+
+
+
+
+ {{ formatDateTime(row.assignTime) }}
+
+
+
+
+
+
+
+
+ d
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.judgeLevel }}
+
+
+
+
+
+
+
+
+ {{ row.totalProjects || 0 }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ :*yM$
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ batchForm.projectIds.length }} *y
+
+
+
+ ֈ
+
+ nM ({{ batchForm.projectIds.length }})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }Ga
+ IM
+
+
+
+
+ Ve
+
+
+
}Ga=ϩM$\sa
+
IMI$HM0́y
+
M M
+
+
+
+
+ ֈ
+
+ M
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ֈ
+
+ n
+
+
+
+
+
+
+
+
{{ detailData.projectName }}
+
+ {{ detailData.categoryName }}
+