fix:用户端活动报名修复报名按钮

This commit is contained in:
zhonghua 2026-04-03 15:59:54 +08:00
parent bee5152a2d
commit ff25e41243
4 changed files with 95 additions and 21 deletions

View File

@ -44,7 +44,7 @@ public class PublicActivityController {
@GetMapping("/{id}/my-registration") @GetMapping("/{id}/my-registration")
@Operation(summary = "查询我的报名信息") @Operation(summary = "查询我的报名信息")
public Result<BizContestRegistration> getMyRegistration(@PathVariable Long id) { public Result<Map<String, Object>> getMyRegistration(@PathVariable Long id) {
Long userId = SecurityUtil.getCurrentUserId(); Long userId = SecurityUtil.getCurrentUserId();
return Result.success(publicActivityService.getMyRegistration(id, userId)); return Result.success(publicActivityService.getMyRegistration(id, userId));
} }

View File

@ -64,6 +64,7 @@ public class PublicActivityService {
result.put("contestType", contest.getContestType()); result.put("contestType", contest.getContestType());
result.put("contestState", contest.getContestState()); result.put("contestState", contest.getContestState());
result.put("status", contest.getStatus()); result.put("status", contest.getStatus());
result.put("visibility", contest.getVisibility());
result.put("startTime", contest.getStartTime()); result.put("startTime", contest.getStartTime());
result.put("endTime", contest.getEndTime()); result.put("endTime", contest.getEndTime());
result.put("coverUrl", contest.getCoverUrl()); result.put("coverUrl", contest.getCoverUrl());
@ -81,6 +82,8 @@ public class PublicActivityService {
result.put("registerState", contest.getRegisterState()); result.put("registerState", contest.getRegisterState());
result.put("submitStartTime", contest.getSubmitStartTime()); result.put("submitStartTime", contest.getSubmitStartTime());
result.put("submitEndTime", contest.getSubmitEndTime()); result.put("submitEndTime", contest.getSubmitEndTime());
result.put("reviewStartTime", contest.getReviewStartTime());
result.put("reviewEndTime", contest.getReviewEndTime());
result.put("workType", contest.getWorkType()); result.put("workType", contest.getWorkType());
result.put("workRequirement", contest.getWorkRequirement()); result.put("workRequirement", contest.getWorkRequirement());
result.put("resultState", contest.getResultState()); result.put("resultState", contest.getResultState());
@ -89,14 +92,35 @@ public class PublicActivityService {
} }
/** /**
* 查询当前用户的报名信息 * 查询当前用户的报名信息包含作品提交状态
*/ */
public BizContestRegistration getMyRegistration(Long contestId, Long userId) { public Map<String, Object> getMyRegistration(Long contestId, Long userId) {
return contestRegistrationMapper.selectOne( BizContestRegistration reg = contestRegistrationMapper.selectOne(
new LambdaQueryWrapper<BizContestRegistration>() new LambdaQueryWrapper<BizContestRegistration>()
.eq(BizContestRegistration::getContestId, contestId) .eq(BizContestRegistration::getContestId, contestId)
.eq(BizContestRegistration::getUserId, userId) .eq(BizContestRegistration::getUserId, userId)
.last("LIMIT 1")); .last("LIMIT 1"));
if (reg == null) {
return null;
}
Map<String, Object> result = new LinkedHashMap<>();
result.put("id", reg.getId());
result.put("contestId", reg.getContestId());
result.put("userId", reg.getUserId());
result.put("registrationType", reg.getRegistrationType());
result.put("registrationState", reg.getRegistrationState());
result.put("registrationTime", reg.getRegistrationTime());
// 查询是否已提交作品
Long workCount = contestWorkMapper.selectCount(
new LambdaQueryWrapper<BizContestWork>()
.eq(BizContestWork::getRegistrationId, reg.getId()));
result.put("hasSubmittedWork", workCount > 0);
result.put("workCount", workCount);
return result;
} }
/** /**

View File

@ -17,7 +17,14 @@ publicApi.interceptors.request.use((config) => {
// 响应拦截器 // 响应拦截器
publicApi.interceptors.response.use( publicApi.interceptors.response.use(
(response) => response.data?.data ?? response.data, (response) => {
// 后端返回格式:{ code: 200, message: "success", data: xxx }
// 当 data 为 null 时,直接返回 null
if (response.data) {
return response.data.data !== undefined ? response.data.data : response.data
}
return response.data
},
(error) => { (error) => {
if (error.response?.status === 401) { if (error.response?.status === 401) {
localStorage.removeItem("public_token") localStorage.removeItem("public_token")
@ -207,8 +214,22 @@ export interface PublicActivity {
registerEndTime: string registerEndTime: string
submitStartTime: string submitStartTime: string
submitEndTime: string submitEndTime: string
reviewStartTime: string
reviewEndTime: string
organizers: any organizers: any
visibility: string visibility: string
resultState: string
resultPublishTime: string | null
content: string
address: string | null
contactName: string | null
contactPhone: string | null
contactQrcode: string | null
coOrganizers: any
sponsors: any
registerState: string
workType: string
workRequirement: string
} }
export const publicActivitiesApi = { export const publicActivitiesApi = {
@ -228,7 +249,16 @@ export const publicActivitiesApi = {
) => publicApi.post(`/public/activities/${id}/register`, data), ) => publicApi.post(`/public/activities/${id}/register`, data),
getMyRegistration: (id: number) => getMyRegistration: (id: number) =>
publicApi.get(`/public/activities/${id}/my-registration`), publicApi.get<{
id: number
contestId: number
userId: number
registrationType: string
registrationState: string
registrationTime: string
hasSubmittedWork: boolean
workCount: number
} | null>(`/public/activities/${id}/my-registration`),
submitWork: ( submitWork: (
id: number, id: number,

View File

@ -51,27 +51,33 @@
立即报名 立即报名
</a-button> </a-button>
<a-button v-else size="large" block class="action-btn-done"> <a-button v-else size="large" block class="action-btn-done">
<check-circle-outlined /> 已报名等待提交阶段 <check-circle-outlined /> 已报名
</a-button> </a-button>
</template> </template>
<!-- 提交阶段 --> <!-- 提交阶段 -->
<template v-else-if="currentStage === 'submit'"> <template v-else-if="currentStage === 'submit'">
<a-button v-if="hasRegistered && !hasSubmittedWork" type="primary" size="large" block class="action-btn" @click="openSubmitWork"> <a-button v-if="!isLoggedIn" type="primary" size="large" block class="action-btn" @click="goLogin">
登录后查看作品
</a-button>
<a-button v-else-if="!hasRegistered" size="large" block disabled class="action-btn-disabled">
需先报名才能提交作品
</a-button>
<a-button v-else-if="!hasSubmittedWork" type="primary" size="large" block class="action-btn" @click="openSubmitWork">
<upload-outlined /> 提交作品 <upload-outlined /> 提交作品
</a-button> </a-button>
<a-button v-else-if="hasSubmittedWork" size="large" block class="action-btn-done"> <a-button v-else size="large" block class="action-btn-done">
<check-circle-outlined /> 作品已提交 <check-circle-outlined /> 作品已提交
</a-button> </a-button>
<a-button v-else size="large" block disabled>
需先报名才能提交作品
</a-button>
</template> </template>
<!-- 评审阶段 --> <!-- 评审阶段 -->
<template v-else-if="currentStage === 'review'"> <template v-else-if="currentStage === 'review'">
<a-button size="large" block class="action-btn-info"> <a-button v-if="hasRegistered" size="large" block class="action-btn-info">
<hourglass-outlined /> 评审中请耐心等待 <hourglass-outlined /> 您已报名评审中请耐心等待
</a-button>
<a-button v-else size="large" block disabled class="action-btn-disabled">
报名已结束
</a-button> </a-button>
</template> </template>
@ -84,7 +90,7 @@
<!-- 未开始 --> <!-- 未开始 -->
<template v-else> <template v-else>
<a-button size="large" block disabled> <a-button size="large" block disabled class="action-btn-disabled">
活动即将开始 活动即将开始
</a-button> </a-button>
</template> </template>
@ -285,13 +291,17 @@ const checkRegistrationStatus = async () => {
if (!isLoggedIn.value || !activity.value) return if (!isLoggedIn.value || !activity.value) return
try { try {
const reg = await publicActivitiesApi.getMyRegistration(activity.value.id) const reg = await publicActivitiesApi.getMyRegistration(activity.value.id)
if (reg) { // reg id
if (reg && reg.id) {
hasRegistered.value = true hasRegistered.value = true
myRegistration.value = reg myRegistration.value = reg
// works //
hasSubmittedWork.value = reg.works && reg.works.length > 0 hasSubmittedWork.value = reg.hasSubmittedWork || false
} }
} catch { /* not registered */ } } catch (e) {
// hasRegistered = false
console.log('查询报名状态失败或未报名')
}
} }
// //
@ -363,8 +373,8 @@ const handleRegister = async () => {
onMounted(async () => { onMounted(async () => {
await fetchDetail() await fetchDetail()
fetchChildren() await fetchChildren()
checkRegistrationStatus() await checkRegistrationStatus()
}) })
</script> </script>
@ -493,6 +503,16 @@ $primary: #6366f1;
color: $primary !important; color: $primary !important;
border: 1px solid #c7d2fe !important; border: 1px solid #c7d2fe !important;
} }
.action-btn-disabled {
height: 48px !important;
border-radius: 14px !important;
font-size: 15px !important;
font-weight: 600 !important;
background: #f3f4f6 !important;
color: #9ca3af !important;
border: 1px solid #e5e7eb !important;
}
} }
.results-hint { .results-hint {