From 053edabb58c323de8f5752af460325b0e4b51ba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=A3=E4=BA=9B=E8=8A=B1=E5=84=BF?= <1156921458@qq.com> Date: Thu, 15 May 2025 14:44:27 +0800 Subject: [PATCH] .. --- .../controller/ClientGroupController.java | 3 +- .../impl/ClientActivityServiceImpl.java | 5 + .../controller/ActGroupController.java | 3 +- .../controller/ActUserController.java | 10 +- .../ActivitySignInQueryController.java | 13 +- .../app/module/activity/models/ActUser.java | 16 + .../module/activity/models/ActivityItem.java | 9 +- .../service/impl/ActUserServiceImpl.java | 18 +- .../platform/activity/manage/itemForm.js | 370 ++++++++++++++---- .../activity/signInUserQuery/index.html | 23 +- .../views/platform/activity/user/index.html | 18 +- frontend/src/pages/activity/detail/index.vue | 166 ++++---- .../activity/registration-form/index.vue | 58 ++- .../src/pages/activity/team-form/index.vue | 19 +- frontend/src/pages/activity/team/index.vue | 8 +- frontend/src/pages/login/index.vue | 1 + frontend/src/pages/login/register.vue | 24 +- frontend/src/static/img/empty.png | Bin 6443 -> 56350 bytes 18 files changed, 548 insertions(+), 216 deletions(-) diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientGroupController.java b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientGroupController.java index 128a7f8..34c773d 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientGroupController.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/controller/ClientGroupController.java @@ -81,7 +81,8 @@ public class ClientGroupController { ActGroupUser groupUser = dao.fetch(ActGroupUser.class, Cnd.where(ActGroupUser::getUserId, "=", StpClientUtil.STP.getLoginIdAsLong()) .and(ActGroupUser::getActivityId, "=", activityId)); if (Lang.isEmpty(groupUser)) { - return Result.error("您还没加入任何团队"); +// return Result.error("您还没加入任何团队"); + return Result.success(); } Sql sql = Sqls.create("select * from act_group where id=@id").setParam("id", groupUser.getGroupId()); sql.setCallback(Sqls.callback.map()); diff --git a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java index 4705455..2443605 100644 --- a/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/client/module/activity/service/impl/ClientActivityServiceImpl.java @@ -84,6 +84,11 @@ public class ClientActivityServiceImpl extends BaseServiceImpl impleme user.setSignUpMobile(signVO.getContactPhone()); user.setSignUpUserId(StpClientUtil.STP.getLoginIdAsLong()); user.setSignUpTime(now); + + if(!user.getTraffic().equals("自驾")){ + user.setCarNo(null); + } + } // delete then insert so easy diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActGroupController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActGroupController.java index 28defcc..74773f5 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActGroupController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActGroupController.java @@ -32,6 +32,7 @@ import org.nutz.mvc.annotation.Param; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.IntStream; /** @@ -265,7 +266,7 @@ public class ActGroupController { for (ActGroup group : actGroups) { List scores = dao.query(ActItemGroupScore.class, Cnd.where(ActItemGroupScore::getGroupId, "=", group.getId()) .and(ActivityItem::getActivityId, "=", activityId)); - BigDecimal total = scores.stream().map(ActItemGroupScore::getScore).reduce(BigDecimal::add).orElse(new BigDecimal(0)); + BigDecimal total = scores.stream().map(ActItemGroupScore::getScore).filter(Objects::nonNull).reduce(BigDecimal::add).orElse(new BigDecimal(0)); group.setTotalScore(total); } dao.update(actGroups, "totalScore"); diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java index e4961e5..3d119bd 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActUserController.java @@ -242,9 +242,13 @@ public class ActUserController { add(new ExcelExportEntity("所属单位", "unitName", 20)); add(new ExcelExportEntity("报名时间", "signUpTime2", 20)); add(new ExcelExportEntity("是否签到", "isSignInDesc", 20)); - add(new ExcelExportEntity("是否展示才艺", "isShowSkillDesc", 20)); - add(new ExcelExportEntity("才艺名称", "skillName", 20)); - add(new ExcelExportEntity("所需器材", "equip", 20)); +// add(new ExcelExportEntity("是否展示才艺", "isShowSkillDesc", 20)); +// add(new ExcelExportEntity("才艺名称", "skillName", 20)); +// add(new ExcelExportEntity("所需器材", "equip", 20)); + add(new ExcelExportEntity("交通方式", "traffic", 20)); + add(new ExcelExportEntity("自驾车牌号", "carNo", 20)); + add(new ExcelExportEntity("是否接站", "isStationDesc", 20)); + add(new ExcelExportEntity("是否参加嘉年华", "isPartyDesc", 20)); }}; response.setContentType("application/octet-stream"); diff --git a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivitySignInQueryController.java b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivitySignInQueryController.java index af4c66b..25957ef 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/controller/ActivitySignInQueryController.java +++ b/backend/src/main/java/com/budwk/app/module/activity/controller/ActivitySignInQueryController.java @@ -121,10 +121,10 @@ public class ActivitySignInQueryController { WHEN 1 THEN '已发放' WHEN 0 THEN '未发放' END AS isGrantDesc, - CASE au.isShowSkill + CASE au.isStation WHEN 1 THEN '是' WHEN 0 THEN '' - END AS isShowSkillDesc, + END AS isStationDesc, CASE au.isParty WHEN 1 THEN '是' WHEN 0 THEN '' @@ -157,9 +157,12 @@ public class ActivitySignInQueryController { add(new ExcelExportEntity("签到时间", "signInTime", 20)); add(new ExcelExportEntity("是否住宿", "isStayDesc", 20)); // add(new ExcelExportEntity("物资发放", "isGrantDesc", 20)); - add(new ExcelExportEntity("是否展示才艺", "isShowSkillDesc", 20)); - add(new ExcelExportEntity("才艺名称", "skillName", 20)); - add(new ExcelExportEntity("所需器材", "equip", 20)); +// add(new ExcelExportEntity("是否展示才艺", "isShowSkillDesc", 20)); +// add(new ExcelExportEntity("才艺名称", "skillName", 20)); +// add(new ExcelExportEntity("所需器材", "equip", 20)); + add(new ExcelExportEntity("交通方式", "traffic", 20)); + add(new ExcelExportEntity("自驾车牌号", "carNo", 20)); + add(new ExcelExportEntity("是否接站", "isStationDesc", 20)); add(new ExcelExportEntity("是否参加嘉年华", "isPartyDesc", 20)); }}; diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java index c2326f6..2747e6a 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActUser.java @@ -139,6 +139,22 @@ public class ActUser extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 100) private String equip; + @Column + @Comment("交通方式") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String traffic; + + @Column + @Comment("是否接站") + @ColDefine(type = ColType.BOOLEAN) + @Default("0") + private Boolean isStation; + + @Column + @Comment("自驾车牌号") + @ColDefine(type = ColType.VARCHAR, width = 100) + private String carNo; + @Column @Comment("是否参加嘉年华") @ColDefine(type = ColType.BOOLEAN) diff --git a/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java b/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java index 8659baf..79fa38c 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java +++ b/backend/src/main/java/com/budwk/app/module/activity/models/ActivityItem.java @@ -26,12 +26,17 @@ public class ActivityItem extends BaseModel { @ColDefine(type = ColType.VARCHAR, width = 30) private String name; - @Comment("活动形式") + @Comment("比赛方法") @Column @ColDefine(type = ColType.VARCHAR, width = 300) private String form; - @Comment("评分规则") + @Comment("比赛规则") + @Column + @ColDefine(type = ColType.VARCHAR, width = 500) + private String ruleForm; + + @Comment("评分标准") @Column @ColDefine(type = ColType.VARCHAR, width = 300) private String rule; diff --git a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActUserServiceImpl.java b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActUserServiceImpl.java index 9ce6ee0..9f011fa 100644 --- a/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActUserServiceImpl.java +++ b/backend/src/main/java/com/budwk/app/module/activity/service/impl/ActUserServiceImpl.java @@ -47,18 +47,18 @@ public class ActUserServiceImpl extends BaseServiceImpl implements ActU WHEN 1 THEN '住宿' WHEN 0 THEN '不住宿' END AS isStayDesc, - CASE u.isGrant + CASE u.isGrant WHEN 1 THEN '已发放' WHEN 0 THEN '未发放' END AS isGrantDesc, - CASE u.isShowSkill - WHEN 1 THEN '是' - WHEN 0 THEN '' - END AS isShowSkillDesc, - CASE u.isParty - WHEN 1 THEN '是' - WHEN 0 THEN '' - END AS isPartyDesc, + CASE u.isStation + WHEN 1 THEN '是' + WHEN 0 THEN '' + END AS isStationDesc, + CASE u.isParty + WHEN 1 THEN '是' + WHEN 0 THEN '' + END AS isPartyDesc, act.`title` AS activityName FROM act_user u diff --git a/backend/src/main/resources/views/platform/activity/manage/itemForm.js b/backend/src/main/resources/views/platform/activity/manage/itemForm.js index 85e37da..5ea3ba9 100644 --- a/backend/src/main/resources/views/platform/activity/manage/itemForm.js +++ b/backend/src/main/resources/views/platform/activity/manage/itemForm.js @@ -1,97 +1,331 @@ const itemForm = { template: /*language=HTML*/ ` - + - - - - - - - - - - - - - - - - - - - - - - - - - - 添加项目 - - +
+
+
项目 {{index + 1}}
+ +
+ + + + + + + + 是 + 否 + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 推荐上传 4:3 比例的图片,大小不超过2MB +
+
+
+
+
+ +
+ +

暂无项目,请点击下方按钮添加

+
+ + + 添加项目 +
- + +
`, data() { return { visible: false, + submitting: false, form: { tableData: [] }, + originalData: [], // 用于存储原始数据,以便检测变更 rules: {} } }, methods: { onOpen(id) { this.visible = true + this.resetForm() + this.fetchItems(id) + }, + fetchItems(id) { $.post("/platform/activity/manage/getItems", { id }).then((res) => { if (res.code === 0) { this.$set(this.form, "id", id) - this.$set(this.form, "tableData", res.data) + const data = res.data || [] + // 确保每个项目都有必要的初始属性 + const formattedData = data.map(item => ({ + ...item, + isTeamApply: item.isTeamApply === undefined ? false : item.isTeamApply, + num: item.num || 0, + form: item.form || "", + ruleForm: item.ruleForm || "", + rule: item.rule || "", + img: item.img || "" + })) + this.$set(this.form, "tableData", formattedData) + this.originalData = JSON.parse(JSON.stringify(formattedData)) // 保存原始数据的副本 + } else { + this.$message.error(res.msg || "加载项目数据失败") } + }).catch(err => { + this.$message.error("网络错误,请稍后重试") + console.error(err) }) }, addRow() { - this.form.tableData.push({isTeamApply:false,applyNum:0}) - }, - removeRow(index) { - this.form.tableData.splice(index, 1) - }, - onSubmit() { - $.post("/platform/activity/manage/updateItem", { - id: this.form.id, - items: JSON.stringify(this.form.tableData) - }).then((res) => { - if (res.code === 0) { - this.$message.success("修改成功") - this.visible = false - } else { - this.$message.error(res.msg) + if (this.form.tableData.length >= 20) { + this.$message.warning("最多添加20个项目") + return + } + this.form.tableData.push({ + name: "", + isTeamApply: false, + num: 1, + form: "", + ruleForm: "", + rule: "", + img: "" + }) + // 添加新行后滚动到底部 + this.$nextTick(() => { + const container = document.querySelector(".el-dialog__body") + if (container) { + container.scrollTop = container.scrollHeight } }) + }, + removeRow(index) { + this.$confirm("确定要删除此项目吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(() => { + this.form.tableData.splice(index, 1) + this.$message.success("删除成功") + }).catch(() => { + }) + }, + onSubmit() { + this.$refs.form.validate(valid => { + if (valid) { + if (this.form.tableData.length === 0) { + this.$message.warning("请至少添加一个项目") + return + } + + this.submitting = true + + // 检查数据是否有变更 + const hasChanges = JSON.stringify(this.form.tableData) !== JSON.stringify(this.originalData) + if (!hasChanges) { + this.$message.info("数据未变更") + this.submitting = false + this.visible = false + return + } + + $.post("/platform/activity/manage/updateItem", { + id: this.form.id, + items: JSON.stringify(this.form.tableData) + }).then((res) => { + this.submitting = false + if (res.code === 0) { + this.$message.success("保存成功") + this.visible = false + this.$emit("refresh") // 通知父组件刷新数据 + } else { + this.$message.error(res.msg || "保存失败") + } + }).catch(err => { + this.submitting = false + this.$message.error("网络错误,请稍后重试") + console.error(err) + }) + } else { + this.$message.warning("请完善表单信息") + return false + } + }) + }, + resetForm() { + this.form = { + id: null, + tableData: [] + } + this.originalData = [] + this.submitting = false + if (this.$refs.form) { + this.$refs.form.resetFields() + } + }, + handleClose() { + // 检查数据是否有变更 + const hasChanges = JSON.stringify(this.form.tableData) !== JSON.stringify(this.originalData) + if (hasChanges) { + this.$confirm("有未保存的更改,确定要关闭吗?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(() => { + this.visible = false + this.resetForm() + }).catch(() => { + }) + } else { + this.visible = false + this.resetForm() + } } - } + }, + style: /*language=CSS*/ ` + .project-card { + margin-bottom: 20px; + border: 1px solid #EBEEF5; + border-radius: 4px; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + background-color: #fff; + transition: all 0.3s; + } + + .project-card:hover { + box-shadow: 0 4px 15px 0 rgba(0, 0, 0, 0.15); + } + + .project-card-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 15px 20px; + border-bottom: 1px solid #EBEEF5; + background-color: #f5f7fa; + border-radius: 4px 4px 0 0; + } + + .project-card-title { + font-size: 16px; + font-weight: bold; + color: #303133; + } + + .el-tabs__content { + padding: 15px; + } + + .image-tip { + color: #909399; + font-size: 12px; + margin-top: 8px; + } + + .empty-state { + text-align: center; + padding: 40px 0; + color: #909399; + } + + .empty-state i { + font-size: 48px; + margin-bottom: 10px; + } + + .empty-state p { + font-size: 14px; + } + + .el-input-number.is-controls-right .el-input__inner { + padding-left: 15px; + padding-right: 50px; + } + + .el-dialog__body { + max-height: calc(100vh - 215px); + overflow-y: auto; + padding: 20px 20px 10px; + } + + .project-card .el-tabs--border-card{ + border: none; + } + ` } diff --git a/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html b/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html index 3a356fb..ea266a7 100644 --- a/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html +++ b/backend/src/main/resources/views/platform/activity/signInUserQuery/index.html @@ -97,16 +97,19 @@ layout("/layouts/platform_1.html"){ {{row.isStay?'住宿':'不住宿'}} - - - - - - + + + + + + + + + + + + + - - - - - - + + + + + + + +