From 91491239c5d4611b5b1404a7abeb2bb23d0edad5 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期三, 30 九月 2026 14:26:59 +0800
Subject: [PATCH] feat(wxcp): 活动封面改用附件中间表,报名姓名手机号改为选填

---
 yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/controller/admin/activity/WxCpActivityPublicController.java |   70 +++++++++++++++++++++++++++++++----
 1 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/controller/admin/activity/WxCpActivityPublicController.java b/yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/controller/admin/activity/WxCpActivityPublicController.java
index be902a8..6acbdcb 100644
--- a/yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/controller/admin/activity/WxCpActivityPublicController.java
+++ b/yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/controller/admin/activity/WxCpActivityPublicController.java
@@ -1,7 +1,9 @@
 package cn.iocoder.yudao.module.wxcp.controller.admin.activity;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.system.controller.admin.storage.vo.SystemStorageBlobRespVO;
 import cn.iocoder.yudao.module.wxcp.controller.admin.activity.vo.WxCpSignupPublicReqVO;
 import cn.iocoder.yudao.module.wxcp.dal.dataobject.activity.WxCpActivityDO;
 import cn.iocoder.yudao.module.wxcp.enums.activity.WxCpActivityStatusEnum;
@@ -17,8 +19,10 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.net.URI;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
@@ -91,6 +95,7 @@
                 .append("body{margin:0;padding:16px;font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;")
                 .append("background:#f5f6f8;color:#1f2329;font-size:15px;line-height:1.6}")
                 .append(".card{background:#fff;border-radius:12px;padding:18px;margin-bottom:12px;box-shadow:0 1px 4px rgba(0,0,0,.06)}")
+                .append(".cover{display:block;width:100%;max-height:260px;object-fit:cover;border-radius:8px;margin-bottom:14px;background:#f2f3f5}")
                 .append("h1{font-size:19px;margin:0 0 14px;font-weight:600;word-break:break-all}")
                 .append(".meta{color:#646a73;font-size:14px}")
                 .append(".meta div{margin-bottom:6px;display:flex}")
@@ -113,7 +118,13 @@
                 .append("</style></head><body>");
 
         // 娲诲姩淇℃伅
-        sb.append("<div class=\"card\"><h1>").append(esc(activity.getTitle())).append("</h1>")
+        sb.append("<div class=\"card\">");
+        // 灏侀潰鍥撅細鏉ヨ嚜闄勪欢涓棿琛紙record_type = wxcp_activity锛夛紝涓氬姟琛ㄤ笉瀛樻枃浠跺湴鍧�
+        String coverUrl = resolveCoverUrl(activity.getId());
+        if (StrUtil.isNotBlank(coverUrl)) {
+            sb.append("<img class=\"cover\" src=\"").append(esc(coverUrl)).append("\" alt=\"娲诲姩灏侀潰\">");
+        }
+        sb.append("<h1>").append(esc(activity.getTitle())).append("</h1>")
                 .append("<div class=\"meta\">");
         String timeText = formatTimeRange(activity.getStartTime(), activity.getEndTime());
         if (StrUtil.isNotBlank(timeText)) {
@@ -139,12 +150,12 @@
         }
         sb.append("</div>");
 
-        // 鎶ュ悕琛ㄥ崟
+        // 鎶ュ悕琛ㄥ崟锛氬鍚嶃�佹墜鏈哄彿鍧囦负閫夊~锛屽彧濉簡鎵嬫満鍙锋墠鏍¢獙鏍煎紡
         sb.append("<div class=\"card\">")
-                .append("<label>濮撳悕 <span style=\"color:#f53f3f\">*</span></label>")
-                .append("<input id=\"name\" type=\"text\" placeholder=\"璇疯緭鍏ュ鍚峔" maxlength=\"64\" autocomplete=\"name\">")
-                .append("<label>鎵嬫満鍙� <span style=\"color:#f53f3f\">*</span></label>")
-                .append("<input id=\"mobile\" type=\"tel\" inputmode=\"numeric\" placeholder=\"璇疯緭鍏� 11 浣嶆墜鏈哄彿\" maxlength=\"11\" autocomplete=\"tel\">")
+                .append("<label>濮撳悕</label>")
+                .append("<input id=\"name\" type=\"text\" placeholder=\"璇疯緭鍏ュ鍚嶏紙閫夊~锛塡" maxlength=\"64\" autocomplete=\"name\">")
+                .append("<label>鎵嬫満鍙�</label>")
+                .append("<input id=\"mobile\" type=\"tel\" inputmode=\"numeric\" placeholder=\"璇疯緭鍏� 11 浣嶆墜鏈哄彿锛堥�夊~锛塡" maxlength=\"11\" autocomplete=\"tel\">")
                 .append("<label>鍙備笌璇存槑</label>")
                 .append("<textarea id=\"content\" placeholder=\"鍙~鍐欏娉ㄣ�侀渶姹傛垨鍏朵粬璇存槑锛堥�夊~锛塡" maxlength=\"1000\"></textarea>")
                 .append("<label>鍥剧墖 / 闄勪欢</label>")
@@ -172,8 +183,7 @@
                 .append("var n=document.getElementById('name').value.trim();")
                 .append("var m=document.getElementById('mobile').value.trim();")
                 .append("var c=document.getElementById('content').value.trim();")
-                .append("if(!n){tip('璇峰~鍐欏鍚�');return}")
-                .append("if(!/^1[3-9]\\d{9}$/.test(m)){tip('鎵嬫満鍙锋牸寮忎笉姝g‘');return}")
+                .append("if(m&&!/^1[3-9]\\d{9}$/.test(m)){tip('鎵嬫満鍙锋牸寮忎笉姝g‘锛岃濉� 11 浣嶆墜鏈哄彿鎴栫暀绌�');return}")
                 .append("btn.disabled=true;")
                 .append("var fs=fileInput.files;")
                 .append("var upload=Promise.resolve([]);")
@@ -202,6 +212,50 @@
         return sb.toString();
     }
 
+    /**
+     * 鍙栨椿鍔ㄥ皝闈㈠湴鍧�锛堝彇闄勪欢鍒楄〃閲岀殑绗竴寮狅級
+     */
+    private String resolveCoverUrl(Long activityId) {
+        List<SystemStorageBlobRespVO> attachments = activityService.getActivityAttachments(activityId);
+        if (CollUtil.isEmpty(attachments)) {
+            return null;
+        }
+        SystemStorageBlobRespVO cover = attachments.get(0);
+        String raw = StrUtil.blankToDefault(cover.getPreviewURL(), cover.getUrl());
+        if (StrUtil.isBlank(raw)) {
+            return null;
+        }
+        return toSameOriginUrl(raw);
+    }
+
+    /**
+     * 鎶婇檮浠跺湴鍧�杞垚鍚屾簮鐩稿鍦板潃
+     *
+     * 闄勪欢閲屽瓨鐨勬槸甯︾鍚嶇殑缁濆鍦板潃锛屽煙鍚嶅彇鑷� yudao.storage.domain锛堥�氬父鏄唴缃戝湴鍧�锛夈��
+     * 鑰屾墜鏈烘壂鐮佹槸閫氳繃鍏綉鍩熷悕鎵撳紑鏈〉闈㈢殑锛岀洿杩炲唴缃戝湴鍧�浼氬姞杞戒笉鍑哄浘鐗囥��
+     * 杩欓噷鍓ユ帀鍗忚涓庡煙鍚嶅彧鐣� /admin-api/... 璺緞锛屼氦缁欏悓婧愪唬鐞嗚浆鍙戯紝
+     * 鍐呯綉銆佸叕缃戣闂兘鑳芥甯告樉绀猴紱鍥犱负鍙彇璺緞涓嶅彇鍩熷悕锛屼篃涓嶅瓨鍦ㄨ烦杞埌澶栭儴绔欑偣鐨勯闄┿��
+     */
+    private String toSameOriginUrl(String url) {
+        String trimmed = url.trim();
+        if (!StrUtil.startWithAnyIgnoreCase(trimmed, "http://", "https://")) {
+            return trimmed;
+        }
+        try {
+            URI uri = URI.create(trimmed);
+            String path = uri.getRawPath();
+            if (StrUtil.isBlank(path)) {
+                return trimmed;
+            }
+            String query = uri.getRawQuery();
+            return StrUtil.isBlank(query) ? path : path + "?" + query;
+        } catch (IllegalArgumentException e) {
+            // 鍦板潃涓嶅悎瑙勫氨鍘熸牱閫忓嚭锛屼笉鑳藉洜涓轰竴寮犲皝闈㈠浘璁╂暣椤垫墦涓嶅紑
+            log.warn("娲诲姩灏侀潰鍦板潃瑙f瀽澶辫触锛屾寜鍘熸牱杈撳嚭锛歿}", trimmed);
+            return trimmed;
+        }
+    }
+
     private String renderMessagePage(String title, String desc) {
         return "<!DOCTYPE html><html lang=\"zh-CN\"><head><meta charset=\"UTF-8\">"
                 + "<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">"

--
Gitblit v1.9.3