guanghulab/homepage/index-v3.html

81 lines
9.7 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>光湖团队</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:radial-gradient(ellipse at 50% 0%,#111827 0%,#030712 70%);color:#e5e7eb;min-height:100vh;overflow-x:hidden}
.stars{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:0}
.star{position:absolute;background:#fff;border-radius:50%;animation:twinkle var(--d) ease-in-out infinite;opacity:0}
@keyframes twinkle{0%,100%{opacity:0}50%{opacity:var(--o,0.8)}}
.nav{position:relative;z-index:10;display:flex;justify-content:space-between;align-items:center;padding:20px 32px;border-bottom:1px solid rgba(255,255,255,.06)}
.nav-logo{font-size:20px;font-weight:600;color:#fff;letter-spacing:-.5px}
.nav-logo span{color:#6366f1}
.nav-status{color:#6b7280;font-size:13px}
.main{position:relative;z-index:10;display:flex;flex-direction:column;align-items:center;padding:48px 24px;min-height:calc(100vh - 81px)}
.hero{text-align:center;margin-bottom:56px}
.hero h1{font-size:48px;font-weight:700;color:#fff;margin-bottom:12px;letter-spacing:-1px;background:linear-gradient(135deg,#fff 30%,#a5b4fc);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
.hero p{font-size:18px;color:#9ca3af;max-width:480px;margin:0 auto;line-height:1.7}
.section{width:100%;max-width:1100px;margin-bottom:48px}
.section-title{font-size:14px;color:#6b7280;margin-bottom:24px;letter-spacing:3px;text-align:center}
.member-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:20px;justify-content:center}
.member-card{position:relative;background:rgba(17,17,28,.8);border:1px solid rgba(99,102,241,.15);border-radius:20px;padding:28px 20px;text-align:center;cursor:pointer;transition:all .35s cubic-bezier(.4,0,.2,1);overflow:hidden}
.member-card::before{content:'';position:absolute;inset:-1px;border-radius:21px;padding:1px;background:linear-gradient(135deg,rgba(99,102,241,.4),rgba(168,85,247,.2),rgba(99,102,241,.1));-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .35s}
.member-card:hover::before{opacity:1}
.member-card:hover{transform:translateY(-4px);background:rgba(25,25,40,.9);border-color:rgba(99,102,241,.4);box-shadow:0 0 40px rgba(99,102,241,.1),0 8px 30px rgba(0,0,0,.3)}
.member-card:active{transform:scale(.97)}
.member-avatar{width:56px;height:56px;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:700;margin:0 auto 16px;transition:all .35s}
.member-card:hover .member-avatar{transform:scale(1.08);box-shadow:0 0 24px var(--glow,rgba(99,102,241,.3))}
.member-name{font-size:16px;font-weight:600;color:#fff;margin-bottom:4px}
.member-role{font-size:12px;color:#6b7280}
.member-login{font-size:11px;color:rgba(99,102,241,.6);margin-top:12px;opacity:0;transform:translateY(8px);transition:all .35s}
.member-card:hover .member-login{opacity:1;transform:translateY(0)}
.login-panel{width:100%;max-width:420px}
.login-card{background:rgba(17,17,28,.9);border:1px solid rgba(255,255,255,.08);border-radius:20px;padding:40px;backdrop-filter:blur(20px);box-shadow:0 25px 50px rgba(0,0,0,.4)}
.login-card h2{font-size:22px;font-weight:600;color:#fff;margin-bottom:8px;text-align:center}
.login-card .sub{color:#9ca3af;font-size:14px;text-align:center;margin-bottom:32px}
.input-group{margin-bottom:20px}
.input-group label{display:block;color:#9ca3af;font-size:13px;margin-bottom:8px}
.input-group input{width:100%;padding:14px 16px;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.1);border-radius:12px;color:#fff;font-size:15px;outline:none;transition:all .2s}
.input-group input:focus{border-color:#6366f1;background:rgba(99,102,241,.05);box-shadow:0 0 0 3px rgba(99,102,241,.1)}
.btn{width:100%;padding:14px;background:linear-gradient(135deg,#6366f1,#8b5cf6);border:none;border-radius:12px;color:#fff;font-size:16px;font-weight:600;cursor:pointer;transition:all .2s}
.btn:hover{transform:translateY(-1px);box-shadow:0 8px 30px rgba(99,102,241,.3)}
.btn:active{transform:translateY(0)}
.error{color:#f87171;font-size:13px;text-align:center;margin-top:12px;display:none}
.dashboard{display:none;width:100%;max-width:640px}
@keyframes fadeIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
.fade-in{animation:fadeIn .6s ease-out}
</style>
</head>
<body>
<div class="stars" id="stars"></div>
<div class="nav"><div class="nav-logo">光湖<span>团队</span></div><div class="nav-status" id="nav-status"></div></div>
<div class="main">
<div class="hero"><h1>语言世界 · 团队基地</h1><p>光湖团队统一代码协作平台。每个人有自己的空间,技术主控守护全局。</p></div>
<div class="section">
<div class="section-title">团队成员</div>
<div class="member-grid">
<div class="member-card" onclick="quickLogin('awen')" style="--glow:rgba(99,102,241,.4)"><div class="member-avatar" style="background:linear-gradient(135deg,#6366f1,#8b5cf6)">A</div><div class="member-name">Awen</div><div class="member-role">技术主控</div><div class="member-login">点击登录</div></div>
<div class="member-card" onclick="quickLogin('hauer')" style="--glow:rgba(34,197,94,.4)"><div class="member-avatar" style="background:linear-gradient(135deg,#22c55e,#4ade80)"></div><div class="member-name">花尔</div><div class="member-role">团队开发</div><div class="member-login">点击登录</div></div>
<div class="member-card" onclick="quickLogin('juzi')" style="--glow:rgba(245,158,11,.4)"><div class="member-avatar" style="background:linear-gradient(135deg,#f59e0b,#fbbf24)"></div><div class="member-name">桔子</div><div class="member-role">团队开发</div><div class="member-login">点击登录</div></div>
<div class="member-card" onclick="quickLogin('yeye')" style="--glow:rgba(236,72,153,.4)"><div class="member-avatar" style="background:linear-gradient(135deg,#ec4899,#f472b6)"></div><div class="member-name">页页</div><div class="member-role">团队开发</div><div class="member-login">点击登录</div></div>
<div class="member-card" onclick="quickLogin('feimao')" style="--glow:rgba(14,165,233,.4)"><div class="member-avatar" style="background:linear-gradient(135deg,#0ea5e9,#38bdf8)"></div><div class="member-name">肥猫</div><div class="member-role">团队开发</div><div class="member-login">点击登录</div></div>
</div></div>
<div id="login-area" style="width:100%;max-width:420px">
<div class="login-card" id="login-form"><h2>登录代码仓库</h2><p class="sub">或点击上方成员卡片快速登录</p>
<div class="input-group"><label>账号</label><input type="text" id="username" placeholder="团队账号" autocomplete="off"></div>
<div class="input-group"><label>密码</label><input type="password" id="password" placeholder="输入密码"></div>
<button class="btn" onclick="doLogin()">进入代码仓库</button><p class="error" id="login-error">账号或密码错误</p></div>
</div>
<div class="dashboard fade-in" id="dashboard"></div>
</div>
<script>
(function(){const c=document.getElementById('stars');for(let i=0;i<80;i++){const s=document.createElement('div');s.className='star';s.style.cssText='left:'+Math.random()*100+'%;top:'+Math.random()*100+'%;width:'+(Math.random()*2+1)+'px;height:'+(Math.random()*2+1)+'px;--d:'+(Math.random()*3+2)+'s;--o:'+(Math.random()*.5+.3)+';animation-delay:'+Math.random()*3+'s';c.appendChild(s)}})();
function quickLogin(user){document.getElementById('username').value=user;document.getElementById('password').focus()}
async function doLogin(){const u=document.getElementById('username').value.trim();const p=document.getElementById('password').value;if(!u||!p)return;try{const r=await fetch('/api/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({username:u,password:p})});if(!r.ok){document.getElementById('login-error').style.display='block';return}const d=await r.json();sessionStorage.setItem('token',d.token);sessionStorage.setItem('user',JSON.stringify(d.user));showDashboard(d.user)}catch(e){document.getElementById('login-error').style.display='block'}}
function showDashboard(user){document.getElementById('login-area').style.display='none';document.getElementById('nav-status').textContent=user.display+' | '+(user.role==='admin'?'技术主控':'团队成员');let html='<div class="login-card fade-in"><h2>welcome, '+user.display+'</h2><p class="sub">select repo</p>';user.repos.forEach(r=>{const l=r.includes('hololake-team')?'team master repo':'personal: '+r.replace(/.*\//,'');html+='<a href="/git/'+r+'/" style="display:block;padding:16px;margin:12px 0;background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);border-radius:12px;text-decoration:none;color:#fff;transition:all .2s" onmouseover="this.style.borderColor=\'#6366f1\';this.style.boxShadow=\'0 0 20px rgba(99,102,241,.1)\'" onmouseout="this.style.borderColor=\'rgba(255,255,255,.08)\';this.style.boxShadow=\'none\'"><div style="font-size:15px;font-weight:500">'+l+'</div><div style="font-size:12px;color:#6b7280;margin-top:4px">/git/'+r+'/</div></a>'});if(user.role==='admin'){html+='<a href="/console.html" style="display:block;padding:16px;margin:12px 0;background:rgba(99,102,241,.08);border:1px solid rgba(99,102,241,.25);border-radius:12px;text-decoration:none;color:#a5b4fc;transition:all .2s;text-align:center"><div style="font-size:15px;font-weight:500">tech console</div></a>'}html+='</div>';document.getElementById('dashboard').innerHTML=html}
window.onload=()=>{const t=sessionStorage.getItem('token');const u=sessionStorage.getItem('user');if(t&&u)showDashboard(JSON.parse(u))};
</script></body></html>