feat(mindspace): add SEO/GEO delivery, page template catalog, and admin hooks
Memind CI / Test, build, and release guards (push) Has been cancelled

Enable optional SEO/GEO injection and discovery routes for confirmed public pages while keeping private pages noindex. Add premium page template skills, portal catalog API, template shop UI, and Baidu push gated by memind_adm config.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-08-10 08:06:12 +08:00
parent 7c65540366
commit fde6503bdf
158 changed files with 9194 additions and 270 deletions
@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="创意机构预览">
<defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#f5f5f5"/><stop offset="100%" stop-color="#e5e5e5"/></linearGradient></defs>
<rect width="640" height="360" fill="url(#g)"/>
<rect x="40" y="200" width="360" height="100" rx="16" fill="rgba(255,255,255,0.12)"/>
<text x="56" y="240" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="12" font-weight="700">Premium Template</text>
<text x="56" y="278" fill="#fff" font-family="system-ui,sans-serif" font-size="26" font-weight="800">创意机构</text>
</svg>

After

Width:  |  Height:  |  Size: 709 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#47556922"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#475569" font-family="system-ui,sans-serif" font-size="14" font-weight="700">BLOG</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">博客长文模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#47556933"/></svg>

After

Width:  |  Height:  |  Size: 673 B

@@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="商品促销模板预览">
<rect width="640" height="360" fill="#fff8f2"/>
<rect x="32" y="32" width="280" height="296" rx="20" fill="#ffffff" stroke="#f3e8dc"/>
<text x="52" y="68" fill="#ef4444" font-family="system-ui,sans-serif" font-size="12" font-weight="800" letter-spacing="2">SPRING SALE</text>
<text x="52" y="112" fill="#1f2933" font-family="system-ui,sans-serif" font-size="30" font-weight="800">全场 8 折起</text>
<text x="52" y="142" fill="#52606d" font-family="system-ui,sans-serif" font-size="14">首屏 CTA · 卖点 · 优惠区</text>
<rect x="52" y="168" width="132" height="40" rx="20" fill="#ef4444"/>
<text x="82" y="194" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">立即抢购</text>
<rect x="340" y="48" width="268" height="200" rx="20" fill="#ffe8d9"/>
<rect x="368" y="76" width="212" height="144" rx="16" fill="#ffffff" opacity="0.85"/>
<rect x="340" y="268" width="268" height="60" rx="16" fill="#ffffff" stroke="#f3e8dc"/>
<text x="360" y="304" fill="#52606d" font-family="system-ui,sans-serif" font-size="13">满 199 减 30 · 限时本周</text>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="公益募捐预览">
<defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#fef3c7"/><stop offset="100%" stop-color="#fde68a"/></linearGradient></defs>
<rect width="640" height="360" fill="url(#g)"/>
<rect x="40" y="200" width="360" height="100" rx="16" fill="rgba(255,255,255,0.12)"/>
<text x="56" y="240" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="12" font-weight="700">Premium Template</text>
<text x="56" y="278" fill="#fff" font-family="system-ui,sans-serif" font-size="26" font-weight="800">公益募捐</text>
</svg>

After

Width:  |  Height:  |  Size: 709 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#2563eb22"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#2563eb" font-family="system-ui,sans-serif" font-size="14" font-weight="700">COURSE</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">课程落地页模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#2563eb33"/></svg>

After

Width:  |  Height:  |  Size: 678 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#ec489922"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#ec4899" font-family="system-ui,sans-serif" font-size="14" font-weight="700">EVENT</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">活动邀请模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#ec489933"/></svg>

After

Width:  |  Height:  |  Size: 674 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#16a34a22"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#16a34a" font-family="system-ui,sans-serif" font-size="14" font-weight="700">FITNESS</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">健身课程模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#16a34a33"/></svg>

After

Width:  |  Height:  |  Size: 676 B

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="酒店民宿预览">
<defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#78350f"/><stop offset="100%" stop-color="#1c1917"/></linearGradient></defs>
<rect width="640" height="360" fill="url(#g)"/>
<rect x="40" y="200" width="360" height="100" rx="16" fill="rgba(255,255,255,0.12)"/>
<text x="56" y="240" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="12" font-weight="700">Premium Template</text>
<text x="56" y="278" fill="#fff" font-family="system-ui,sans-serif" font-size="26" font-weight="800">酒店民宿</text>
</svg>

After

Width:  |  Height:  |  Size: 709 B

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="摄影画廊预览">
<defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#171717"/><stop offset="100%" stop-color="#0a0a0a"/></linearGradient></defs>
<rect width="640" height="360" fill="url(#g)"/>
<rect x="40" y="200" width="360" height="100" rx="16" fill="rgba(255,255,255,0.12)"/>
<text x="56" y="240" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="12" font-weight="700">Premium Template</text>
<text x="56" y="278" fill="#fff" font-family="system-ui,sans-serif" font-size="26" font-weight="800">摄影画廊</text>
</svg>

After

Width:  |  Height:  |  Size: 709 B

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="播客节目预览">
<defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#4c1d95"/><stop offset="100%" stop-color="#0f0f14"/></linearGradient></defs>
<rect width="640" height="360" fill="url(#g)"/>
<rect x="40" y="200" width="360" height="100" rx="16" fill="rgba(255,255,255,0.12)"/>
<text x="56" y="240" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="12" font-weight="700">Premium Template</text>
<text x="56" y="278" fill="#fff" font-family="system-ui,sans-serif" font-size="26" font-weight="800">播客节目</text>
</svg>

After

Width:  |  Height:  |  Size: 709 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#6366f122"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#6366f1" font-family="system-ui,sans-serif" font-size="14" font-weight="700">PORTFOLIO</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">作品集模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#6366f133"/></svg>

After

Width:  |  Height:  |  Size: 675 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#ea580c22"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#ea580c" font-family="system-ui,sans-serif" font-size="14" font-weight="700">PRODUCT-GRID</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">产品网格模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#ea580c33"/></svg>

After

Width:  |  Height:  |  Size: 681 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#0d948822"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#0d9488" font-family="system-ui,sans-serif" font-size="14" font-weight="700">REALESTATE</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">房产展示模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#0d948833"/></svg>

After

Width:  |  Height:  |  Size: 679 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#d9770622"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#d97706" font-family="system-ui,sans-serif" font-size="14" font-weight="700">RESTAURANT</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">餐饮菜单模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#d9770633"/></svg>

After

Width:  |  Height:  |  Size: 679 B

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#1d4ed822"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#1d4ed8" font-family="system-ui,sans-serif" font-size="14" font-weight="700">RESUME</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">个人简历模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#1d4ed833"/></svg>

After

Width:  |  Height:  |  Size: 675 B

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="SaaS 产品页预览">
<defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#312e81"/><stop offset="100%" stop-color="#0f172a"/></linearGradient></defs>
<rect width="640" height="360" fill="url(#g)"/>
<rect x="40" y="200" width="360" height="100" rx="16" fill="rgba(255,255,255,0.12)"/>
<text x="56" y="240" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="12" font-weight="700">Premium Template</text>
<text x="56" y="278" fill="#fff" font-family="system-ui,sans-serif" font-size="26" font-weight="800">SaaS 产品页</text>
</svg>

After

Width:  |  Height:  |  Size: 713 B

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="创业融资预览">
<defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#0c4a6e"/><stop offset="100%" stop-color="#030712"/></linearGradient></defs>
<rect width="640" height="360" fill="url(#g)"/>
<rect x="40" y="200" width="360" height="100" rx="16" fill="rgba(255,255,255,0.12)"/>
<text x="56" y="240" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="12" font-weight="700">Premium Template</text>
<text x="56" y="278" fill="#fff" font-family="system-ui,sans-serif" font-size="26" font-weight="800">创业融资</text>
</svg>

After

Width:  |  Height:  |  Size: 709 B

@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="问卷 Page Data 模板预览">
<rect width="640" height="360" fill="#f5f0e5"/>
<rect x="120" y="28" width="400" height="304" rx="24" fill="#ffffff" filter="drop-shadow(0 16px 40px rgba(45,53,47,0.12))"/>
<text x="152" y="76" fill="#18211d" font-family="system-ui,sans-serif" font-size="26" font-weight="800">活动报名</text>
<text x="152" y="104" fill="#5c655f" font-family="system-ui,sans-serif" font-size="13">Page Data 问卷壳 · 前台提交</text>
<rect x="152" y="124" width="336" height="36" rx="12" fill="#faf8f3" stroke="#d7d0c1"/>
<rect x="152" y="176" width="336" height="36" rx="12" fill="#faf8f3" stroke="#d7d0c1"/>
<rect x="152" y="228" width="336" height="36" rx="12" fill="#faf8f3" stroke="#d7d0c1"/>
<text x="164" y="147" fill="#8a938d" font-family="system-ui,sans-serif" font-size="12">姓名</text>
<text x="164" y="199" fill="#8a938d" font-family="system-ui,sans-serif" font-size="12">手机号</text>
<text x="164" y="251" fill="#8a938d" font-family="system-ui,sans-serif" font-size="12">参与人数</text>
<rect x="152" y="284" width="336" height="36" rx="18" fill="#2f6f57"/>
<text x="292" y="308" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700" text-anchor="middle">提交报名</text>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,20 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360" role="img" aria-label="旅游 Hero 模板预览">
<defs>
<linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#0f2744"/>
<stop offset="100%" stop-color="#0a1628"/>
</linearGradient>
<linearGradient id="sun" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#fcd34d"/>
<stop offset="100%" stop-color="#f59e0b"/>
</linearGradient>
</defs>
<rect width="640" height="360" fill="url(#sky)"/>
<circle cx="520" cy="72" r="36" fill="url(#sun)" opacity="0.95"/>
<path d="M0 250 L120 190 L220 230 L340 150 L480 220 L640 180 L640 360 L0 360 Z" fill="#14304f"/>
<path d="M0 280 L90 240 L200 270 L320 210 L460 260 L640 230 L640 360 L0 360 Z" fill="#0d2138"/>
<rect x="40" y="220" width="320" height="96" rx="16" fill="rgba(255,255,255,0.08)"/>
<text x="56" y="252" fill="#fcd34d" font-family="system-ui,sans-serif" font-size="12" font-weight="700" letter-spacing="2">WEEKEND GUIDE</text>
<text x="56" y="286" fill="#f5f7fa" font-family="system-ui,sans-serif" font-size="28" font-weight="800">周末去哪玩?</text>
<text x="56" y="308" fill="#c8d3e0" font-family="system-ui,sans-serif" font-size="13">深色沉浸 Hero · 攻略卡片</text>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="640" height="360" viewBox="0 0 640 360"><rect width="640" height="360" fill="#be185d22"/><rect x="24" y="24" width="592" height="312" rx="20" fill="#fff" opacity="0.92"/><text x="48" y="88" fill="#be185d" font-family="system-ui,sans-serif" font-size="14" font-weight="700">WEDDING</text><text x="48" y="140" fill="#111827" font-family="system-ui,sans-serif" font-size="28" font-weight="800">婚礼邀请模板</text><rect x="48" y="168" width="544" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="196" width="420" height="12" rx="6" fill="#e5e7eb"/><rect x="48" y="240" width="160" height="72" rx="12" fill="#be185d33"/></svg>

After

Width:  |  Height:  |  Size: 676 B