feat: mobile forgot-password redesign, navbar/search updates, vite proxy and request tweaks

This commit is contained in:
chunyu
2026-09-04 12:53:05 +08:00
parent a14badf8f7
commit 5bb503ff2c
12 changed files with 1224 additions and 866 deletions
+26 -1
View File
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

+204 -110
View File
@@ -38,20 +38,36 @@
.current-section h2 { font-size: 16px; color: #ff4444; margin-bottom: 12px; }
.current-section .current-icon { width: 64px; height: 64px; }
.section-label {
max-width: 1100px;
margin: 40px auto 16px;
padding-left: 4px;
}
.section-label h2 {
font-size: 18px;
color: #aaa;
border-left: 3px solid;
padding-left: 10px;
}
.section-label.sub { margin-top: 50px; }
.section-label.sub h2 { border-color: #D4423A; color: #D4423A; }
.section-label.old h2 { border-color: #6C63FF; color: #8B83FF; }
.section-label p { font-size: 13px; color: #666; margin-top: 4px; padding-left: 13px; }
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 24px;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
max-width: 1100px;
margin: 0 auto;
}
.card {
background: #1a1a2e;
border-radius: 16px;
padding: 30px 20px 24px;
padding: 28px 20px 22px;
text-align: center;
border: 1px solid #2a2a3e;
transition: transform 0.2s, border-color 0.2s;
transition: transform 0.2s, border-color 0.2s, box-shadow 0.2s;
cursor: pointer;
position: relative;
}
@@ -64,7 +80,7 @@
box-shadow: 0 0 20px rgba(76, 175, 80, 0.2);
}
.card.selected::after {
content: '✓ 已选择';
content: '\2713 \5DF2\u9009\u62E9';
position: absolute;
top: 12px;
right: 12px;
@@ -75,20 +91,20 @@
font-size: 12px;
}
.card-icon {
width: 96px;
height: 96px;
margin: 0 auto 16px;
width: 88px;
height: 88px;
margin: 0 auto 14px;
}
.card h3 {
font-size: 18px;
margin-bottom: 8px;
font-size: 16px;
margin-bottom: 6px;
color: #fff;
}
.card .desc {
font-size: 13px;
color: #999;
font-size: 12px;
color: #888;
line-height: 1.6;
margin-bottom: 16px;
margin-bottom: 12px;
}
.tags {
display: flex;
@@ -97,12 +113,16 @@
flex-wrap: wrap;
}
.tag {
background: rgba(108, 99, 255, 0.15);
background: rgba(108, 99, 255, 0.12);
color: #8B83FF;
padding: 3px 10px;
border-radius: 20px;
font-size: 11px;
}
.tag.cola {
background: rgba(212, 66, 58, 0.12);
color: #E74C3C;
}
.sizes-section {
max-width: 1100px;
@@ -180,168 +200,242 @@
</head>
<body>
<h1>可乐项目 - 图标模板预览</h1>
<p class="subtitle">点击选择你喜欢的图标设计,然后应用为项目 Favicon</p>
<h1>&#21487;&#20048;&#39033;&#30446; - &#22270;&#26631;&#27169;&#26495;&#39044;&#35272;</h1>
<p class="subtitle">&#28857;&#20987;&#36873;&#25321;&#20320;&#21916;&#27489;&#30340;&#22270;&#26631;&#35774;&#35745;&#65292;&#28982;&#21518;&#24212;&#29992;&#20026;&#39033;&#30446; Favicon</p>
<!-- 当前图标 -->
<div class="current-section">
<h2>当前图标</h2>
<img class="current-icon" src="/favicon.svg" alt="当前图标">
<h2>&#24403;&#21069;&#22270;&#26631;</h2>
<img class="current-icon" src="/favicon.svg" alt="&#24403;&#21069;&#22270;&#26631;">
</div>
<!-- 新图标选项 -->
<div class="section-label sub">
<h2>&#26032;&#35774;&#35745; - &#24494;&#22930;&#21487;&#20048;&#20803;&#32032;</h2>
<p>&#24086;&#22930;&#34013;&#20837;&#21487;&#20048;&#33394;&#35843;&#12289;&#27668;&#27874;&#12289;&#27700;&#20307;&#31561;&#20803;&#32032;&#65292;&#20294;&#20445;&#25345;&#20805;&#20998;&#20811;&#21046;&#65292;&#19981;&#30452;&#21462;&#21487;&#20048;</p>
</div>
<div class="grid" id="new-grid">
<div class="card" data-file="icon-c-letter-v2.svg" onclick="selectCard(this)">
<img class="card-icon" src="icon-c-letter-v2.svg" alt="V2 C">
<h3>&#26434;&#24535; C &#26631;&#35782;</h3>
<p class="desc">&#28145;&#33394;&#32972;&#26223;&#19978;&#32431;&#32321;&#30340; C &#23383;&#27597;&#65292;&#21491;&#19978;&#35282;&#19968;&#20010;&#24494;&#23567;&#32418;&#28857;&#26263;&#31034;&#27668;&#27874;&#12290;&#20805;&#20998;&#20445;&#25345;&#20805;&#20998;&#24037;&#20855;&#24863;&#65292;&#21487;&#20048;&#20803;&#32032;&#21482;&#20316;&#28857;&#32512;&#12290;</p>
<div class="tags">
<span class="tag">&#26497;&#31616;</span>
<span class="tag">C&#23383;&#27597;</span>
<span class="tag cola">&#24494;&#22930;&#21487;&#20048;&#33394;</span>
</div>
</div>
<div class="card" data-file="icon-colared-wrench.svg" onclick="selectCard(this)">
<img class="card-icon" src="icon-colared-wrench.svg" alt="&#21487;&#20048;&#32418;&#25171;&#25166;">
<h3>&#32418;&#33394;&#25171;&#25166;</h3>
<p class="desc">&#28145;&#33394;&#32972;&#26223;&#19978;&#31616;&#32431;&#30340;&#25171;&#25166;&#24037;&#20855;&#65292;&#21491;&#19979;&#35282;&#26377;&#19968;&#25226;&#24494;&#22930;&#30340;&#28145;&#32418;&#33394;&#27700;&#25226;&#65292;&#20687;&#21487;&#20048;&#30340;&#19968;&#28857;&#21360;&#35760;&#12290;</p>
<div class="tags">
<span class="tag">&#24037;&#20855;</span>
<span class="tag">&#31616;&#32431;</span>
<span class="tag cola">&#21487;&#20048;&#32418;&#28857;&#32512;</span>
</div>
</div>
<div class="card" data-file="icon-wave-square.svg" onclick="selectCard(this)">
<img class="card-icon" src="icon-wave-square.svg" alt="&#27874;&#27874;&#26041;&#22359;">
<h3>&#27874;&#27874;&#24037;&#20855;&#30418;</h3>
<p class="desc">&#26041;&#22359;&#20869;&#19978;&#21333;&#37096;&#30041;&#30333;&#65292;&#24213;&#37096;&#26377;&#21487;&#20048;&#33394;&#30340;&#27700;&#38754;&#27874;&#27874;&#21644;&#27668;&#27874;&#12290;&#20013;&#22830;&#30333;&#33394;&#21315;&#23383;&#31526;&#21495;&#34920;&#31034;&#24037;&#20855;&#23646;&#24615;&#12290;</p>
<div class="tags">
<span class="tag">&#24037;&#20855;&#24179;&#21488;</span>
<span class="tag">&#25277;&#35937;&#35774;&#35745;</span>
<span class="tag cola">&#21487;&#20048;&#27874;&#27874;</span>
</div>
</div>
<div class="card" data-file="icon-ring-colared.svg" onclick="selectCard(this)">
<img class="card-icon" src="icon-ring-colared.svg" alt="&#21487;&#20048;&#29615;">
<h3>&#32418;&#29615;&#26143;&#36784;</h3>
<p class="desc">&#21487;&#20048;&#32418;&#33394;&#22806;&#29615;&#21253;&#34987;&#28145;&#33394;&#20869;&#22260;&#65292;&#20013;&#22830;&#37329;&#33394;&#26143;&#36784;&#31526;&#21495;&#12290;&#21487;&#20048;&#33394;&#21482;&#20316;&#20026;&#22806;&#26694;&#23384;&#22312;&#65292;&#20869;&#37096;&#20445;&#25345;&#24037;&#20855;&#24863;&#12290;</p>
<div class="tags">
<span class="tag">&#20960;&#20309;</span>
<span class="tag">&#22806;&#29615;&#35774;&#35745;</span>
<span class="tag cola">&#21487;&#20048;&#32418;&#26694;</span>
</div>
</div>
</div>
<div class="section-label old" style="margin-top:56px;">
<h2>&#21407;&#26377;&#35774;&#35745;</h2>
<p>&#36739;&#20026;&#30452;&#25549;&#30340;&#39118;&#26684;&#35774;&#35745;&#65292;&#21487;&#20048;&#20803;&#32032;&#34920;&#36798;&#26356;&#30452;&#25549;</p>
</div>
<div class="grid">
<div class="card" data-file="icon-c-letter.svg" onclick="selectCard(this)">
<img class="card-icon" src="icon-c-letter.svg" alt="C字母图标">
<h3>字母 C 标识</h3>
<p class="desc">圆润加粗的"C"字母,搭配气泡装饰,呼应可乐品牌。橙红到深红的渐变色调,温暖而有辨识度。</p>
<img class="card-icon" src="icon-c-letter.svg" alt="C&#23383;&#27597;">
<h3>&#23383;&#27597; C &#26631;&#35782;</h3>
<p class="desc">&#22278;&#28072;&#21152;&#31895;&#30340;C&#23383;&#27597;&#65292;&#25645;&#37197;&#27668;&#27874;&#35013;&#39280;&#65292;&#27225;&#32418;&#21040;&#28145;&#32418;&#30340;&#28183;&#21464;&#33394;&#35843;&#65292;&#28201;&#31896;&#32780;&#26377;&#36776;&#35748;&#24230;&#12290;</p>
<div class="tags">
<span class="tag">品牌辨识</span>
<span class="tag">极简</span>
<span class="tag">可乐色调</span>
<span class="tag">&#21697;&#29260;&#36776;&#35748;</span>
<span class="tag cola">&#21487;&#20048;&#33394;&#35843;</span>
</div>
</div>
<div class="card" data-file="icon-toolbox.svg" onclick="selectCard(this)">
<img class="card-icon" src="icon-toolbox.svg" alt="工具箱图标">
<h3>等距工具箱</h3>
<p class="desc">3D等距视角的彩色工具箱,珊瑚色/青色/紫色多面体设计,展现平台多工具属性,现代科技感。</p>
<img class="card-icon" src="icon-toolbox.svg" alt="&#24037;&#20855;&#31665;">
<h3>&#31561;&#36317;&#24037;&#20855;&#31665;</h3>
<p class="desc">3D&#31561;&#36317;&#35270;&#35282;&#30340;&#24425;&#33394;&#24037;&#20855;&#31665;&#65292;&#29644;&#29790;&#33394;/&#38738;&#33394;/&#32043;&#33394;&#22810;&#38754;&#20307;&#35774;&#35745;&#65292;&#23637;&#29616;&#24179;&#21488;&#22810;&#24037;&#20855;&#23646;&#24615;&#12290;</p>
<div class="tags">
<span class="tag">3D等距</span>
<span class="tag">多色</span>
<span class="tag">工具平台</span>
<span class="tag">3D&#31561;&#36317;</span>
<span class="tag">&#22810;&#33394;</span>
<span class="tag">&#24037;&#20855;&#24179;&#21488;</span>
</div>
</div>
<div class="card" data-file="icon-colabubbles.svg" onclick="selectCard(this)">
<img class="card-icon" src="icon-colabubbles.svg" alt="气泡可乐图标">
<h3>抽象气泡杯</h3>
<p class="desc">深色背景上的极简可乐杯,液体中冒出的气泡传递活力感。暗色系设计,科技感十足。</p>
<img class="card-icon" src="icon-colabubbles.svg" alt="&#27668;&#27874;&#21487;&#20048;">
<h3>&#25277;&#35937;&#27668;&#27874;&#26694;</h3>
<p class="desc">&#28145;&#33394;&#32972;&#26223;&#19978;&#30340;&#26497;&#31616;&#21487;&#20048;&#26694;&#65292;&#27700;&#20307;&#20013;&#20987;&#20986;&#30340;&#27668;&#27874;&#20253;&#36882;&#27963;&#21147;&#24863;&#12290;&#26263;&#33394;&#31995;&#35774;&#35745;&#12290;</p>
<div class="tags">
<span class="tag">暗色系</span>
<span class="tag">抽象</span>
<span class="tag">活力</span>
<span class="tag">&#26263;&#33394;&#31995;</span>
<span class="tag">&#25277;&#35937;</span>
<span class="tag cola">&#21487;&#20048;&#26694;</span>
</div>
</div>
<div class="card" data-file="icon-hextool.svg" onclick="selectCard(this)">
<img class="card-icon" src="icon-hextool.svg" alt="六边形工具图标">
<h3>六边形齿轮</h3>
<p class="desc">六边形底座搭配齿轮符号,紫蓝渐变光效。传达精密工具与技术平台的气质,科技前沿感。</p>
<img class="card-icon" src="icon-hextool.svg" alt="&#20843;&#36793;&#24418;">
<h3>&#20843;&#36793;&#24418;&#39592;&#36753;</h3>
<p class="desc">&#20843;&#36793;&#24418;&#24213;&#24231;&#25645;&#37197;&#39592;&#36753;&#31526;&#21495;&#65292;&#32043;&#34013;&#28183;&#21464;&#20809;&#25928;&#12290;&#20253;&#36882;&#31934;&#23494;&#24037;&#20855;&#19982;&#25216;&#26415;&#24179;&#21488;&#30340;&#27668;&#36136;&#12290;</p>
<div class="tags">
<span class="tag">科技感</span>
<span class="tag">几何</span>
<span class="tag">工具符号</span>
<span class="tag">&#31185;&#25216;&#24863;</span>
<span class="tag">&#20960;&#20309;</span>
<span class="tag">&#24037;&#20855;&#31526;&#21495;</span>
</div>
</div>
</div>
<!-- 多尺寸预览 -->
<div class="sizes-section">
<h2>不同尺寸预览</h2>
<div id="sizes-grid" class="sizes-grid" style="display:none;">
</div>
<h2>&#19981;&#21516;&#23618;&#27425;&#39044;&#35272;</h2>
<div id="sizes-grid" class="sizes-grid" style="display:none;"></div>
</div>
<!-- 特性对比 -->
<div class="compare-table">
<h2>设计特性对比</h2>
<h2>&#35774;&#35745;&#29305;&#24615;&#23545;&#27604;</h2>
<table>
<thead>
<tr>
<th>图标</th>
<th>风格</th>
<th>配色</th>
<th>适用场景</th>
<th>辨识度</th>
<th>&#22270;&#26631;</th>
<th>&#39118;&#26684;</th>
<th>&#37197;&#33394;</th>
<th>&#21487;&#20048;&#20803;&#32032;</th>
<th>&#36866;&#29992;&#22330;&#26223;</th>
</tr>
</thead>
<tbody>
<tr>
<td>字母 C</td>
<td>扁平极简</td>
<td>暖色系(橙红→深红)</td>
<td>品牌一致性最强,适合正式场合</td>
<td>⭐⭐⭐⭐⭐</td>
<td>&#26434;&#24535; C</td>
<td>&#28145;&#33394;&#32972; + &#26497;&#31616;&#32447;&#26465;</td>
<td>&#28145;&#34013;&#32043;&#32972; + &#32418;&#33394;C</td>
<td>&#19968;&#20010;&#23567;&#32418;&#28857;</td>
<td>&#21697;&#29260;&#19968;&#33268;&#24615;&#26368;&#24378;</td>
</tr>
<tr>
<td>等距工具箱</td>
<td>3D 等距</td>
<td>多色(珊瑚+青+紫)</td>
<td>展现工具多样性,视觉冲击力强</td>
<td>⭐⭐⭐⭐</td>
<td>&#32418;&#33394;&#25171;&#25166;</td>
<td>&#26497;&#31616;&#32447;&#26465;&#24037;&#20855;</td>
<td>&#28145;&#32972; + &#32418;&#33394;&#25171;&#25166;</td>
<td>&#19968;&#25226;&#28145;&#32418;&#27700;&#25226;</td>
<td>&#24037;&#20855;&#24863;&#26368;&#24378;</td>
</tr>
<tr>
<td>气泡可乐杯</td>
<td>暗色抽象</td>
<td>暗色系(深棕+焦糖)</td>
<td>暗色主题搭配最佳,独特有记忆点</td>
<td>⭐⭐⭐⭐</td>
<td>&#27874;&#27874;&#24037;&#20855;&#30418;</td>
<td>&#26041;&#22359; + &#27874;&#27874;&#25277;&#35937;</td>
<td>&#28145;&#34013;&#32043;&#32972; + &#32418;&#33394;&#27874;&#27874;</td>
<td>&#24213;&#37096;&#27874;&#27874; + &#27668;&#27874;</td>
<td>&#25277;&#35937;&#35774;&#35745;&#26368;&#20248;&#38597;</td>
</tr>
<tr>
<td>六边形齿轮</td>
<td>科技几何</td>
<td>冷色系(紫→蓝)</td>
<td>技术平台定位,专业现代</td>
<td>⭐⭐⭐⭐</td>
<td>&#32418;&#29615;&#26143;&#36784;</td>
<td>&#20960;&#20309;&#22806;&#29615;&#24418;</td>
<td>&#32418;&#33394;&#22806;&#29615; + &#37329;&#33394;&#26143;&#36784;</td>
<td>&#32418;&#33394;&#22278;&#29615;</td>
<td>&#31934;&#32431;&#20843;&#36793;&#24615;&#26368;&#24378;</td>
</tr>
<tr>
<td>&#23383;&#27597; C</td>
<td>&#25153;&#24179;&#26497;&#31616;</td>
<td>&#27225;&#32418;&#8594;&#28145;&#32418;&#28183;&#21464;</td>
<td>&#27668;&#27874;&#35013;&#39280;</td>
<td>&#21697;&#29260;&#20851;&#32852;&#26368;&#30452;&#25549;</td>
</tr>
<tr>
<td>&#31561;&#36317;&#24037;&#20855;&#31665;</td>
<td>3D&#31561;&#36317;</td>
<td>&#29644;&#29790;+&#38738;+&#32043;&#22810;&#33394;</td>
<td>&#26080;&#30452;&#25549;&#21487;&#20048;&#20803;&#32032;</td>
<td>&#23637;&#29616;&#24037;&#20855;&#22810;&#26679;&#24615;</td>
</tr>
<tr>
<td>&#25277;&#35937;&#27668;&#27874;&#26694;</td>
<td>&#26263;&#33394;&#25277;&#35937;</td>
<td>&#28145;&#26834;+&#29123;&#31232;&#33394;</td>
<td>&#26694;&#24418;+&#27668;&#27874;+&#27700;&#20307;</td>
<td>&#26263;&#33394;&#20027;&#39029;&#26368;&#25645;</td>
</tr>
<tr>
<td>&#20843;&#36793;&#24418;&#39592;&#36753;</td>
<td>&#31185;&#25216;&#20960;&#20309;</td>
<td>&#32043;&#8594;&#34013;&#28183;&#21464;</td>
<td>&#26080;&#30452;&#25549;&#21487;&#20048;&#20803;&#32032;</td>
<td>&#25216;&#26415;&#24179;&#21488;&#27668;&#36136;</td>
</tr>
</tbody>
</table>
</div>
<button class="apply-btn" id="applyBtn" disabled onclick="applyIcon()">
选择一个图标后点击应用
&#36873;&#25321;&#19968;&#20010;&#22270;&#26631;&#21518;&#28857;&#20987;&#24212;&#29992;
</button>
<script>
let selectedFile = null;
var selectedFile = null;
function selectCard(card) {
document.querySelectorAll('.card').forEach(c => c.classList.remove('selected'));
var cards = document.querySelectorAll('.card');
for (var i = 0; i < cards.length; i++) cards[i].classList.remove('selected');
card.classList.add('selected');
selectedFile = card.dataset.file;
const btn = document.getElementById('applyBtn');
selectedFile = card.getAttribute('data-file');
var btn = document.getElementById('applyBtn');
btn.disabled = false;
btn.textContent = `应用 "${card.querySelector('h3').textContent}" 为项目图标`;
// 展示多尺寸预览
btn.textContent = '\u5E94\u7528 "' + card.querySelector('h3').textContent + '" \u4E3A\u9879\u76EE\u56FE\u6807';
showSizes(selectedFile);
}
function showSizes(file) {
const grid = document.getElementById('sizes-grid');
var grid = document.getElementById('sizes-grid');
grid.style.display = 'flex';
const sizes = [
{ w: 16, h: 16, label: '16×16 浏览器标签' },
{ w: 32, h: 32, label: '32×32 标准' },
{ w: 48, h: 48, label: '48×48 推荐' },
{ w: 64, h: 64, label: '64×64 收藏夹' },
{ w: 128, h: 128, label: '128×128 高清' },
var sizes = [
{ w: 16, h: 16, label: '16x16 \u6D4F\u89C8\u5668\u6807\u7B7E' },
{ w: 32, h: 32, label: '32x32 \u6807\u51C6' },
{ w: 48, h: 48, label: '48x48 \u63A8\u8350' },
{ w: 64, h: 64, label: '64x64 \u6536\u85CF\u5939' },
{ w: 128, h: 128, label: '128x128 \u9AD8\u6E05' }
];
grid.innerHTML = sizes.map(s =>
`<div class="size-group">
<img src="${file}" width="${s.w}" height="${s.h}" alt="${s.label}">
<div class="size-label">${s.label}</div>
</div>`
).join('');
var html = '';
for (var i = 0; i < sizes.length; i++) {
var s = sizes[i];
html += '<div class="size-group">' +
'<img src="' + file + '" width="' + s.w + '" height="' + s.h + '">' +
'<div class="size-label">' + s.label + '</div>' +
'</div>';
}
grid.innerHTML = html;
}
function applyIcon() {
if (!selectedFile) return;
if (confirm(`确认将项目图标替换为 "${selectedFile}"?\n\n原 favicon.svg 将被替换。`)) {
// 复制文件
fetch(selectedFile).then(r => r.text()).then(svg => {
const blob = new Blob([svg], { type: 'image/svg+xml' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'favicon.svg';
a.click();
URL.revokeObjectURL(url);
alert('已下载新图标文件 favicon.svg\n请将它替换到 public/ 目录下覆盖原文件。');
});
}
var name = card.querySelector('h3').textContent;
fetch(selectedFile).then(function(r) { return r.text(); }).then(function(svg) {
var blob = new Blob([svg], { type: 'image/svg+xml' });
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = 'favicon.svg';
a.click();
URL.revokeObjectURL(url);
});
}
</script>
</body>