feat(frontend): 新增我的个人页面并优化站点导航

- 新增完整的我的页面,包含用户资料展示、使用统计和个人信息编辑功能
- 添加收藏和卡册的快捷入口网格
- 简化导航栏,将原分散的个人中心、我的收藏、我的卡册入口合并为单个「我的」标签
- 编写新页面对应的CSS样式并更新静态资源版本号
- 在数学人生页面添加葫芦侠行的快捷跳转入口
This commit is contained in:
2026-08-08 16:21:48 +08:00
parent dabb54a608
commit d85e2ead34
4 changed files with 55 additions and 11 deletions
+15
View File
@@ -553,3 +553,18 @@ button:focus-visible,input:focus-visible,[tabindex]:focus-visible{outline:2px so
.cc-card-name{font-size:13px;font-weight:600;color:#3A3632;margin-bottom:2px}
.cc-card-type{font-size:10px;color:#ABA6A1;letter-spacing:1px;margin-bottom:4px}
.cc-card-clan{font-size:10px;padding:2px 8px;border-radius:8px;display:inline-block}
/* ========== 我的页面入口卡片 ========== */
.mine-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}
@media(max-width:640px){.mine-grid{grid-template-columns:1fr}}
.mine-entry{display:flex;align-items:center;gap:14px;padding:20px;border:1px solid #D6D1CA;border-radius:8px;background:#FDFCFA;cursor:pointer;transition:all .15s;font:inherit;text-align:left}
.mine-entry:hover{border-color:#808C95;background:#F0EEEA;box-shadow:0 3px 12px rgba(0,0,0,.06)}
.mine-entry-icon{width:46px;height:46px;border-radius:8px;background:#EAE7E2;display:flex;align-items:center;justify-content:center;font-size:22px;flex-shrink:0}
.mine-entry-body{flex:1;min-width:0}
.mine-entry-name{font-size:15px;font-weight:700;color:#3A3632;margin-bottom:3px}
.mine-entry-desc{font-size:12px;color:#8A8580}
.mine-entry-arrow{font-size:18px;color:#ABA6A1;font-weight:700}
/* 数学人生页 · 葫芦侠行入口 */
.ml-story-entry{border-color:#A8907E}
.ml-story-entry:hover{background:#FBF8F3;border-color:#A8907E}
.ml-story-entry .ml-alumni-entry-icon{background:#F5EDE4}
+31 -3
View File
@@ -7,7 +7,7 @@ let cardState={owned:[],draws:0,lastDaily:'',knowledgeRead:0,drawHistory:[]};
let _lang=localStorage.getItem('mb_lang')||'zh';
// ===== i18n =====
const I18N={zh:{home:'首页',discover:'发现',toolbox:'工具箱',knowledge:'知识卡片',story:'葫芦侠行',simulator:'数学人生',favorites:'我的收藏',profile:'个人中心',search:'搜索内容...',guest:'游客用户',
const I18N={zh:{home:'首页',discover:'发现',toolbox:'工具箱',knowledge:'知识卡片',story:'葫芦侠行',simulator:'数学人生',favorites:'我的收藏',profile:'个人中心',mine:'我的',search:'搜索内容...',guest:'游客用户',
heroTitle:'葫芦数学 · 用玩的方式打开数学',heroSub:'数学不是公式,是你理解世界的方式',heroCTA:'开始探索 →',
exploreTitle:'探索数学的万千可能',tryTitle:'试试这些',
mbtiName:'MathBTI 数学人格',mbtiDesc:'12题发现你的数学人格,领养专属数学小人 →',
@@ -66,7 +66,7 @@ const I18N={zh:{home:'首页',discover:'发现',toolbox:'工具箱',knowledge:'
staticAIToggleTitle:'AI数学助教',staticAIHeader:'💬 AI 数学助教',
staticAIWelcome:'你好!我是葫芦数学的AI助教 👋<br><br>试试问我:学数学对学医有什么用?',
staticAIPlaceholder:'输入问题...',staticMbtiTooltip:'测测你的数学人格'},
en:{home:'Home',discover:'Discover',toolbox:'Toolbox',knowledge:'Cards',story:'HuLu Quest',simulator:'Math Life',favorites:'Favorites',profile:'Profile',search:'Search...',guest:'Guest',
en:{home:'Home',discover:'Discover',toolbox:'Toolbox',knowledge:'Cards',story:'HuLu Quest',simulator:'Math Life',favorites:'Favorites',profile:'Profile',mine:'Mine',search:'Search...',guest:'Guest',
heroTitle:'Hulu Math · Play your way into math',heroSub:'Math isn\'t formulas. It\'s how you make sense of things.',heroCTA:'Start Exploring →',
exploreTitle:'Explore Math',tryTitle:'Try These',
mbtiName:'MathBTI Personality Test',mbtiDesc:'12 questions. One math soul. Meet your sprite. →',
@@ -202,7 +202,7 @@ function navigateTo(p){
const t=document.getElementById('page-'+p);if(t)t.classList.add('active');
document.getElementById('mainContent').scrollTop=0;
if(p==='home')loadHome();else if(p==='discover')loadDiscover();else if(p==='toolbox')loadToolbox();
else if(p==='knowledge')loadKnowledgePage();else if(p==='story')loadStory();else if(p==='simulator')loadSimulator();else if(p==='favorites')loadFavorites();else if(p==='profile')loadProfile();else if(p==='cards')loadCardsPage();
else if(p==='knowledge')loadKnowledgePage();else if(p==='story')loadStory();else if(p==='simulator')loadSimulator();else if(p==='favorites')loadFavorites();else if(p==='profile')loadProfile();else if(p==='cards')loadCardsPage();else if(p==='mine')loadMine();
}
// ===== Home (Desmos-style) =====
@@ -557,6 +557,29 @@ async function loadCardsPage(){
grid.innerHTML=h;
}
// ===== Mine Page (我的 — 个人中心 + 收藏 + 卡册入口) =====
async function loadMine(){
chatCtx={};
const c=document.getElementById('mineContent');
if(!c)return;
let p={nickname:'游客用户',avatar_emoji:'葫',avatar_color:'#5B6AF0'};
let s={watch_count:0,favorite_count:0};
try{
const[pr,sr]=await Promise.all([api('/api/user/profile?user_id='+USER_ID),api('/api/user/stats?user_id='+USER_ID)]);
if(pr.code===0&&pr.data)p=pr.data;
if(sr.code===0&&sr.data)s=sr.data;
}catch(e){}
c.innerHTML=
'<div class="page-header"><h1 class="page-title">👤 我的</h1></div>'+
'<div class="profile-card"><div class="profile-avatar-lg" style="background:rgba(255,255,255,.2)">'+esc(p.avatar_emoji||'葫')+'</div><div><div class="profile-name-lg">'+esc(p.nickname||'游客用户')+'</div><div class="profile-id-lg">ID: '+USER_ID+'</div></div></div>'+
'<div class="profile-stats-grid"><div class="profile-stat-card"><div class="num">'+s.watch_count+'</div><div class="label">观看次数</div></div><div class="profile-stat-card"><div class="num">'+s.favorite_count+'</div><div class="label">收藏数量</div></div></div>'+
'<div style="background:#fff;border-radius:16px;padding:16px 20px;box-shadow:0 1px 3px rgba(0,0,0,.04);margin-bottom:20px"><div style="font-weight:600;margin-bottom:12px">编辑资料</div><div style="display:flex;gap:12px;align-items:center;margin-bottom:12px"><span style="font-size:13px;color:#64748B">头像:</span><input id="editAvatar" style="padding:8px 12px;border:1.5px solid #E2E8F0;border-radius:10px;font-size:14px;width:80px" value="'+esc(p.avatar_emoji||'葫')+'"></div><div style="display:flex;gap:12px;align-items:center;margin-bottom:16px"><span style="font-size:13px;color:#64748B">昵称:</span><input id="editNickname" style="flex:1;padding:8px 12px;border:1.5px solid #E2E8F0;border-radius:10px;font-size:14px" value="'+esc(p.nickname||'')+'"></div><button onclick="sP()" style="padding:10px 28px;border-radius:12px;border:none;background:#5B6AF0;color:#fff;font-size:14px;font-weight:600;cursor:pointer">保存</button></div>'+
'<div class="mine-grid">'+
'<div class="mine-entry" onclick="navigateTo(\'favorites\')"><div class="mine-entry-icon">❤️</div><div class="mine-entry-body"><div class="mine-entry-name">我的收藏</div><div class="mine-entry-desc">已收藏的视频和知识卡片</div></div><span class="mine-entry-arrow">→</span></div>'+
'<div class="mine-entry" onclick="navigateTo(\'cards\')"><div class="mine-entry-icon">🎴</div><div class="mine-entry-body"><div class="mine-entry-name">我的卡册</div><div class="mine-entry-desc">收集全部16位数学人物 · '+cardState.owned.length+'/16</div></div><span class="mine-entry-arrow">→</span></div>'+
'</div>';
}
// ===== Pet Experience =====
function getPet(){
let pet=null;
@@ -923,6 +946,11 @@ function loadMathLife(){
(t.ready?'':'<div class="ml-coming-badge">敬请期待</div>')+
'</div>').join('')+
'</div>'+
'<button class="ml-alumni-entry ml-story-entry" onclick="navigateTo(\'story\')">'+
'<span class="ml-alumni-entry-icon">⚔️</span>'+
'<span class="ml-alumni-entry-body"><b>葫芦侠行</b><small>北宋数学武侠互动文字冒险 · 8章93节点 · 8+种结局</small></span>'+
'<span class="ml-alumni-entry-arrow">→</span>'+
'</button>'+
'<button class="ml-alumni-entry" onclick="openMathAlumni()">'+
'<span class="ml-alumni-entry-icon">🎓</span>'+
'<span class="ml-alumni-entry-body"><b>数学校友访谈</b><small>真实校友的大学四年 · Skill 剧本包</small></span>'+