feat: batch update - gift card breakdown spec, backend APIs, miniprogram pages, ETL finance recharge, docs & migrations

This commit is contained in:
Neo
2026-03-20 01:43:48 +08:00
parent 075caf067f
commit 79f9a0e1da
437 changed files with 118603 additions and 976 deletions

View File

@@ -0,0 +1,78 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 750 580" preserveAspectRatio="xMidYMid slice">
<defs>
<!-- theme-dark-gold: 深色黑金,右下角金色光晕 -->
<linearGradient id="main" x1="0" y1="1" x2="0.8" y2="0">
<stop offset="0%" stop-color="#1a1a1a"/>
<stop offset="40%" stop-color="#2a2520"/>
<stop offset="100%" stop-color="#1f1c18"/>
</linearGradient>
<linearGradient id="silk" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="white" stop-opacity="0"/>
<stop offset="20%" stop-color="white" stop-opacity="0.03"/>
<stop offset="45%" stop-color="white" stop-opacity="0.08"/>
<stop offset="55%" stop-color="white" stop-opacity="0.08"/>
<stop offset="80%" stop-color="white" stop-opacity="0.03"/>
<stop offset="100%" stop-color="white" stop-opacity="0"/>
</linearGradient>
<radialGradient id="darkTL" cx="-0.1" cy="-0.05" r="0.75" gradientUnits="objectBoundingBox">
<stop offset="0%" stop-color="black" stop-opacity="0.3"/>
<stop offset="45%" stop-color="black" stop-opacity="0"/>
</radialGradient>
<linearGradient id="darkTop" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="black" stop-opacity="0.2"/>
<stop offset="40%" stop-color="black" stop-opacity="0"/>
</linearGradient>
<radialGradient id="glowL" cx="0.05" cy="0.4" r="0.65" gradientUnits="objectBoundingBox">
<stop offset="0%" stop-color="white" stop-opacity="0.06"/>
<stop offset="50%" stop-color="white" stop-opacity="0"/>
</radialGradient>
<!-- 金色右下光晕 (::after dark-gold 特殊处理) -->
<radialGradient id="glowGold" cx="0.6" cy="0.7" r="0.6" gradientUnits="objectBoundingBox">
<stop offset="0%" stop-color="#ffc400" stop-opacity="0.25"/>
<stop offset="50%" stop-color="#ffbb00" stop-opacity="0"/>
</radialGradient>
<linearGradient id="goldDiag" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#ffbb00" stop-opacity="0"/>
<stop offset="30%" stop-color="#ffbb00" stop-opacity="0.15"/>
<stop offset="60%" stop-color="#ffb700" stop-opacity="0.2"/>
<stop offset="100%" stop-color="#ffb700" stop-opacity="0"/>
</linearGradient>
<linearGradient id="edgeHL" x1="0" y1="1" x2="0" y2="0">
<stop offset="0%" stop-color="#ffc400" stop-opacity="0.1"/>
<stop offset="25%" stop-color="#ffc400" stop-opacity="0"/>
</linearGradient>
<linearGradient id="r1" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="white" stop-opacity="0.3"/>
<stop offset="50%" stop-color="white" stop-opacity="0.1"/>
<stop offset="100%" stop-color="white" stop-opacity="0.2"/>
</linearGradient>
<linearGradient id="r2" x1="0%" y1="100%" x2="100%" y2="0%">
<stop offset="0%" stop-color="black" stop-opacity="0.2"/>
<stop offset="50%" stop-color="white" stop-opacity="0.15"/>
<stop offset="100%" stop-color="black" stop-opacity="0.1"/>
</linearGradient>
<linearGradient id="r3" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="white" stop-opacity="0"/>
<stop offset="30%" stop-color="white" stop-opacity="0.25"/>
<stop offset="70%" stop-color="white" stop-opacity="0.25"/>
<stop offset="100%" stop-color="white" stop-opacity="0"/>
</linearGradient>
<filter id="aBlur"><feGaussianBlur stdDeviation="2"/></filter>
</defs>
<rect width="750" height="580" fill="url(#main)"/>
<rect width="750" height="580" fill="url(#silk)"/>
<rect width="750" height="580" fill="url(#darkTL)"/>
<rect width="750" height="580" fill="url(#darkTop)"/>
<rect width="750" height="580" fill="url(#glowL)"/>
<!-- 金色光晕 -->
<rect width="750" height="580" fill="url(#glowGold)"/>
<rect width="750" height="580" fill="url(#goldDiag)"/>
<rect width="750" height="580" fill="url(#edgeHL)"/>
<!-- Aurora 丝带opacity 降低,配合深色主题) -->
<g opacity="0.35" transform="translate(-62,73) scale(2.184,1.456)">
<path d="M-50 180 Q80 100 180 140 T350 100 T500 140" fill="none" stroke="url(#r2)" stroke-width="60" stroke-linecap="round" filter="url(#aBlur)"/>
<path d="M-30 50 Q100 120 200 70 T380 110 T520 60" fill="none" stroke="url(#r1)" stroke-width="45" stroke-linecap="round"/>
<path d="M0 120 Q120 60 220 100 T420 70" fill="none" stroke="url(#r3)" stroke-width="25" stroke-linecap="round"/>
<path d="M50 90 Q150 150 280 90 T450 120" fill="none" stroke="white" stroke-opacity="0.15" stroke-width="8" stroke-linecap="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.5 KiB