redesign: guanghulab.com portal - open module showcase
This commit is contained in:
parent
a1f3254548
commit
53edf4300d
@ -3,209 +3,269 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>光湖 · 铸渊代码仓库</title>
|
||||
<title>光湖 · 开源模块仓库</title>
|
||||
<style>
|
||||
:root {
|
||||
--bg: #0a0a14;
|
||||
--glass: rgba(12, 22, 50, 0.8);
|
||||
--edge: rgba(110, 160, 230, 0.2);
|
||||
--edge-h: rgba(150, 200, 255, 0.45);
|
||||
--text: rgba(195, 215, 255, 0.9);
|
||||
--soft: rgba(155, 195, 235, 0.55);
|
||||
--faint: rgba(155, 195, 235, 0.35);
|
||||
--glow: rgba(160, 210, 255, 0.95);
|
||||
--green: rgba(140, 220, 180, 0.9);
|
||||
--gold: rgba(220, 200, 140, 0.9);
|
||||
--bg: #0a0a16;
|
||||
--card: rgba(16,28,56,.75);
|
||||
--edge: rgba(110,160,230,.18);
|
||||
--edge-h: rgba(155,205,255,.4);
|
||||
--t: rgba(200,218,248,.92);
|
||||
--dim: rgba(140,180,220,.5);
|
||||
--dim2: rgba(120,160,200,.28);
|
||||
--glow: rgba(160,210,255,.95);
|
||||
--green: rgba(140,220,180,.88);
|
||||
--gold: rgba(220,195,130,.88);
|
||||
--rose: rgba(230,140,160,.85);
|
||||
}
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body { background: var(--bg); color: var(--text); font-family: -apple-system,"PingFang SC","Microsoft YaHei",sans-serif; min-height: 100vh; font-size: 18px; }
|
||||
canvas { position: fixed; top: 0; left: 0; z-index: 0; }
|
||||
|
||||
.wrap { position: relative; z-index: 1; max-width: 1100px; margin: 0 auto; padding: 40px 24px 100px; }
|
||||
|
||||
.badge { text-align: center; padding: 20px 0 8px; }
|
||||
.badge .d { font-size: 18px; color: var(--faint); letter-spacing: 4px; }
|
||||
.badge .c { font-size: 15px; color: rgba(155, 195, 235, 0.28); letter-spacing: 2px; margin-top: 4px; }
|
||||
|
||||
.lake { display: flex; flex-direction: column; align-items: center; padding: 30px 0; }
|
||||
.lake-core { position: relative; width: 180px; height: 180px; }
|
||||
.lake-light {
|
||||
position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
|
||||
width: 60px; height: 60px; border-radius: 50%;
|
||||
background: radial-gradient(circle, rgba(160,210,255,1) 0%, rgba(100,150,240,0.5) 40%, transparent 70%);
|
||||
box-shadow: 0 0 60px rgba(140,190,255,0.7), 0 0 120px rgba(120,170,240,0.35);
|
||||
animation: breathe 4s ease-in-out infinite;
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{
|
||||
background:var(--bg); color:var(--t);
|
||||
font-family:-apple-system,"PingFang SC","Microsoft YaHei","Inter",sans-serif;
|
||||
min-height:100vh; font-size:16px; line-height:1.6; overflow-x:hidden;
|
||||
}
|
||||
.lake-ripple { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); border-radius: 50%; border: 1px solid rgba(140,190,255,0.25); animation: ripple 6s ease-out infinite; }
|
||||
.lake-ripple:nth-child(2) { animation-delay: 2s; }
|
||||
.lake-ripple:nth-child(3) { animation-delay: 4s; }
|
||||
@keyframes breathe {
|
||||
0%,100% { transform: translate(-50%,-50%) scale(1); }
|
||||
50% { transform: translate(-50%,-50%) scale(1.25); box-shadow: 0 0 80px rgba(140,190,255,0.9), 0 0 160px rgba(120,170,240,0.5); }
|
||||
canvas#bg{position:fixed;top:0;left:0;z-index:0;pointer-events:none}
|
||||
|
||||
.wrap{position:relative;z-index:1;max-width:960px;margin:0 auto;padding:50px 20px 80px}
|
||||
|
||||
/* Hero */
|
||||
.hero{text-align:center;padding:30px 0 50px}
|
||||
.hero .dot{display:inline-block;width:14px;height:14px;border-radius:50%;
|
||||
background:radial-gradient(circle,rgba(180,220,255,.85),rgba(100,150,220,.3));
|
||||
box-shadow:0 0 50px rgba(140,190,255,.55),0 0 100px rgba(100,150,230,.18);
|
||||
animation:pulse 3.5s ease-in-out infinite; margin-bottom:12px}
|
||||
@keyframes pulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.35);opacity:.7}}
|
||||
.hero h1{font-size:40px;font-weight:200;letter-spacing:14px;color:rgba(175,215,248,.78);margin:12px 0}
|
||||
.hero .sub{font-size:17px;color:var(--dim);letter-spacing:4px}
|
||||
.hero .line{width:80px;height:1px;background:linear-gradient(90deg,transparent,var(--edge-h),transparent);margin:24px auto}
|
||||
|
||||
/* section titles */
|
||||
.sec-title{font-size:14px;text-transform:uppercase;letter-spacing:6px;color:var(--dim2);margin:40px 0 20px;text-align:center}
|
||||
|
||||
/* Module Grid */
|
||||
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:18px}
|
||||
.card{
|
||||
background:var(--card); border:1px solid var(--edge); border-radius:20px;
|
||||
padding:28px 24px; cursor:pointer; transition:all .3s; position:relative; overflow:hidden;
|
||||
}
|
||||
@keyframes ripple { 0% { width: 60px; height: 60px; opacity: 0.5; } 100% { width: 300px; height: 300px; opacity: 0; } }
|
||||
.lake-title { font-size: 38px; color: rgba(180,220,255,0.7); letter-spacing: 14px; margin-top: 14px; font-weight: 300; }
|
||||
.card:hover{border-color:var(--edge-h);background:rgba(22,38,72,.85);transform:translateY(-3px);box-shadow:0 8px 32px rgba(0,0,0,.3)}
|
||||
.card .tag{display:inline-block;font-size:11px;padding:3px 10px;border-radius:10px;margin-bottom:14px}
|
||||
.card .tag.live{background:rgba(140,220,180,.12);color:var(--green);border:1px solid rgba(140,220,180,.2)}
|
||||
.card .tag.soon{background:rgba(180,170,140,.08);color:rgba(200,180,130,.7);border:1px solid rgba(180,170,140,.15)}
|
||||
.card .icon{font-size:36px;margin-bottom:10px}
|
||||
.card .name{font-size:20px;font-weight:600;color:var(--t);margin-bottom:4px}
|
||||
.card .id{font-size:12px;color:var(--dim2);font-family:monospace;margin-bottom:10px}
|
||||
.card .desc{font-size:14px;color:var(--dim);line-height:1.5}
|
||||
.card .arrow{position:absolute;bottom:20px;right:24px;color:var(--dim2);font-size:18px;transition:all .3s}
|
||||
.card:hover .arrow{color:var(--glow);transform:translateX(4px)}
|
||||
|
||||
/* 登录栏 */
|
||||
.login-bar { display: flex; align-items: center; justify-content: space-between; padding: 22px 28px; background: var(--glass); border: 1px solid var(--edge); border-radius: 18px; gap: 16px; flex-wrap: wrap; margin: 28px 0; }
|
||||
.login-bar .hint { font-size: 16px; color: var(--soft); }
|
||||
.login-bar .hint strong { color: var(--glow); font-weight: 600; }
|
||||
.login-in { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
|
||||
.login-in input { padding: 12px 18px; background: rgba(255,255,255,0.04); border: 1px solid var(--edge); border-radius: 14px; color: var(--text); font-size: 16px; outline: none; width: 150px; font-family: inherit; }
|
||||
.login-in input:focus { border-color: rgba(160,210,255,0.35); }
|
||||
.login-in input::placeholder { color: var(--faint); }
|
||||
.login-in button { padding: 12px 28px; background: linear-gradient(135deg, rgba(100,160,220,0.3), rgba(130,100,200,0.2)); border: 1px solid var(--edge); border-radius: 14px; color: var(--glow); font-size: 16px; cursor: pointer; font-family: inherit; letter-spacing: 1px; transition: all 0.25s; }
|
||||
.login-in button:hover { background: linear-gradient(135deg, rgba(100,160,220,0.5), rgba(130,100,200,0.35)); border-color: var(--edge-h); }
|
||||
.logged-in { display: none; align-items: center; justify-content: space-between; padding: 20px 28px; background: rgba(140,220,180,0.06); border: 1px solid rgba(140,220,180,0.15); border-radius: 18px; gap: 16px; flex-wrap: wrap; margin: 28px 0; }
|
||||
.logged-in .user { display: flex; align-items: center; gap: 14px; }
|
||||
.logged-in .avatar { width: 44px; height: 44px; border-radius: 50%; background: linear-gradient(135deg, rgba(100,160,220,0.4), rgba(130,100,200,0.3)); display: flex; align-items: center; justify-content: center; font-size: 20px; color: var(--glow); font-weight: 600; }
|
||||
.logged-in .uname { font-size: 18px; color: var(--glow); font-weight: 600; }
|
||||
.logged-in .ustatus { font-size: 14px; color: var(--green); }
|
||||
.logged-in .btns { display: flex; gap: 10px; }
|
||||
.logged-in .btns button { padding: 12px 24px; border-radius: 14px; font-size: 15px; cursor: pointer; font-family: inherit; transition: all 0.25s; }
|
||||
.btn-go { background: linear-gradient(135deg, rgba(100,160,220,0.3), rgba(130,100,200,0.2)); border: 1px solid var(--edge); color: var(--glow); }
|
||||
.btn-go:hover { background: linear-gradient(135deg, rgba(100,160,220,0.5), rgba(130,100,200,0.35)); }
|
||||
.btn-out { background: rgba(255,255,255,0.03); border: 1px solid var(--edge); color: var(--soft); }
|
||||
.login-error { font-size: 14px; color: rgba(255, 140, 140, 0.8); display: none; text-align: center; margin-top: 8px; }
|
||||
/* Repo card 特殊样式 */
|
||||
.card.repo{border-color:rgba(155,120,200,.2);background:linear-gradient(135deg,rgba(25,20,45,.8),rgba(18,30,50,.8))}
|
||||
.card.repo:hover{border-color:rgba(180,140,220,.35)}
|
||||
.card.repo .tag{background:rgba(160,130,200,.1);color:rgba(190,155,220,.8);border:1px solid rgba(160,130,200,.2)}
|
||||
.card.repo .icon{font-size:32px}
|
||||
|
||||
/* 状态条 */
|
||||
.status { display: flex; gap: 40px; justify-content: center; flex-wrap: wrap; margin: 28px 0; font-size: 19px; }
|
||||
.status span { color: var(--glow); }
|
||||
/* Modal */
|
||||
.overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:100;align-items:center;justify-content:center}
|
||||
.overlay.show{display:flex}
|
||||
.modal{
|
||||
background:rgba(12,22,44,.96);border:1px solid var(--edge-h);border-radius:24px;
|
||||
max-width:580px;width:90%;max-height:85vh;overflow-y:auto;padding:40px 32px;
|
||||
animation:modalIn .25s ease-out;
|
||||
}
|
||||
@keyframes modalIn{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}
|
||||
.modal .m-icon{font-size:48px;margin-bottom:8px}
|
||||
.modal .m-id{font-size:13px;color:var(--dim2);font-family:monospace;margin-bottom:6px}
|
||||
.modal .m-name{font-size:26px;font-weight:600;color:var(--t);margin-bottom:16px}
|
||||
.modal .m-desc{font-size:15px;color:var(--dim);line-height:1.7;margin-bottom:20px}
|
||||
|
||||
/* 模块 */
|
||||
.modules { display: grid; grid-template-columns: repeat(5, 1fr); gap: 18px; margin: 50px 0; }
|
||||
.mod { background: var(--glass); border: 1px solid var(--edge); border-radius: 18px; padding: 32px 20px; text-align: center; cursor: pointer; transition: all 0.3s; }
|
||||
.mod:hover { border-color: var(--edge-h); background: rgba(20,35,70,0.85); transform: translateY(-3px); }
|
||||
.mod.active { border-color: rgba(150,200,255,0.7); background: rgba(25,40,80,0.9); box-shadow: 0 0 40px rgba(110,160,230,0.2); }
|
||||
.mod.new { border-color: rgba(140,220,180,0.4); }
|
||||
.mod .icon { font-size: 42px; margin-bottom: 12px; }
|
||||
.mod .name { font-size: 19px; color: var(--glow); letter-spacing: 2px; }
|
||||
.mod .tag { display: inline-block; font-size: 11px; color: var(--green); background: rgba(140,220,180,0.12); padding: 2px 10px; border-radius: 10px; margin-top: 8px; letter-spacing: 1px; }
|
||||
.modal .section{margin-bottom:20px}
|
||||
.modal .section h3{font-size:13px;text-transform:uppercase;letter-spacing:3px;color:var(--dim2);margin-bottom:8px}
|
||||
.modal .code{
|
||||
background:rgba(0,0,0,.35);border:1px solid var(--edge);border-radius:10px;
|
||||
padding:14px 18px;font-size:13px;font-family:"SF Mono",Menlo,monospace;
|
||||
color:var(--green);overflow-x:auto;white-space:pre-wrap;word-break:break-all
|
||||
}
|
||||
.modal .intent-chain{display:flex;flex-direction:column;gap:8px}
|
||||
.modal .intent-step{display:flex;align-items:center;gap:12px;padding:8px 12px;background:rgba(255,255,255,.02);border-radius:8px}
|
||||
.modal .intent-step .s-icon{font-size:18px;width:28px;text-align:center}
|
||||
.modal .intent-step .s-step{font-size:14px;color:var(--t);font-weight:500}
|
||||
.modal .intent-step .s-why{font-size:12px;color:var(--dim);margin-left:auto}
|
||||
|
||||
.panel { background: var(--glass); border: 1px solid var(--edge); border-radius: 18px; padding: 32px 36px; margin-top: 8px; display: none; }
|
||||
.panel.show { display: block; animation: fadeIn 0.3s ease; }
|
||||
@keyframes fadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } }
|
||||
.panel-title { font-size: 20px; color: var(--glow); letter-spacing: 3px; margin-bottom: 20px; }
|
||||
.modal .btns{display:flex;gap:12px;margin-top:28px;flex-wrap:wrap}
|
||||
.modal .btns a,.modal .btns button{
|
||||
display:inline-block;padding:12px 28px;border-radius:14px;font-size:15px;
|
||||
text-decoration:none;cursor:pointer;font-family:inherit;
|
||||
transition:all .25s;
|
||||
}
|
||||
.modal .btn-go{
|
||||
background:linear-gradient(135deg,rgba(100,160,220,.25),rgba(120,90,200,.15));
|
||||
border:1px solid var(--edge);color:var(--glow);
|
||||
}
|
||||
.modal .btn-go:hover{background:linear-gradient(135deg,rgba(100,160,220,.4),rgba(120,90,200,.25));border-color:var(--edge-h)}
|
||||
.modal .btn-close{background:rgba(255,255,255,.03);border:1px solid var(--edge);color:var(--dim)}
|
||||
.modal .btn-close:hover{background:rgba(255,255,255,.06)}
|
||||
|
||||
.server-list { display: flex; flex-wrap: wrap; gap: 14px; }
|
||||
.server-item { background: rgba(30,45,85,0.7); border: 1px solid rgba(120,170,240,0.2); border-radius: 12px; padding: 14px 18px; font-size: 17px; display: flex; align-items: center; gap: 10px; }
|
||||
.server-dot { width: 8px; height: 8px; border-radius: 50%; }
|
||||
.server-dot.on { background: var(--green); box-shadow: 0 0 6px rgba(140,220,180,0.5); }
|
||||
.server-dot.off { background: rgba(220,140,140,0.7); }
|
||||
/* Footer */
|
||||
.foot{text-align:center;padding:50px 0 0;font-size:13px;color:var(--dim2)}
|
||||
.foot a{color:var(--dim);text-decoration:none;transition:color .2s}
|
||||
.foot a:hover{color:var(--glow)}
|
||||
.foot .sep{margin:0 12px;color:var(--dim2)}
|
||||
|
||||
.ops-log { font-size: 16px; color: var(--faint); line-height: 2; font-family: monospace; max-height: 280px; overflow-y: auto; margin-top: 16px; }
|
||||
.ops-log .row { padding: 4px 0; }
|
||||
.ops-log .hash { color: rgba(140,220,180,0.5); margin-right: 12px; font-size: 13px; }
|
||||
|
||||
.ticket { display: flex; gap: 16px; align-items: center; padding: 14px 0; border-bottom: 1px solid rgba(120,170,240,0.1); font-size: 17px; }
|
||||
.ticket .ticon { font-size: 22px; width: 32px; }
|
||||
.ticket .name { flex: 1; }
|
||||
.ticket .tag { font-size: 14px; padding: 4px 14px; border-radius: 14px; }
|
||||
.ticket .tag.done { color: var(--green); background: rgba(140,220,180,0.12); }
|
||||
.ticket .tag.progress { color: var(--gold); background: rgba(220,200,140,0.12); }
|
||||
|
||||
.bcast { font-size: 17px; color: var(--soft); line-height: 2; }
|
||||
|
||||
.chat-msgs { min-height: 200px; max-height: 380px; overflow-y: auto; padding: 18px; margin: 16px 0; background: rgba(12,20,45,0.6); border-radius: 14px; font-size: 17px; line-height: 1.9; }
|
||||
.chat-msg { margin-bottom: 18px; }
|
||||
.chat-msg .who { font-size: 14px; color: var(--soft); margin-bottom: 4px; }
|
||||
.chat-msg .who.zhu { color: var(--glow); }
|
||||
.chat-input { display: flex; gap: 12px; }
|
||||
.chat-input input { flex: 1; background: rgba(12,20,45,0.7); border: 1px solid var(--edge); border-radius: 14px; padding: 18px 20px; color: var(--text); font-size: 18px; outline: none; }
|
||||
.chat-input input::placeholder { color: var(--faint); }
|
||||
.chat-input button { background: linear-gradient(135deg, rgba(100,160,220,0.25), rgba(130,100,200,0.15)); border: 1px solid var(--edge-h); border-radius: 14px; padding: 18px 32px; color: var(--glow); font-size: 17px; cursor: pointer; font-family: inherit; }
|
||||
|
||||
.footer { text-align: center; padding: 60px 0; font-size: 15px; color: var(--faint); letter-spacing: 3px; }
|
||||
|
||||
@media(max-width:768px){.modules{grid-template-columns:repeat(2,1fr)}.status{font-size:17px;gap:24px}.lake-title{font-size:32px}.login-bar{flex-direction:column;text-align:center}}
|
||||
@media(max-width:640px){
|
||||
.hero h1{font-size:30px;letter-spacing:8px}
|
||||
.grid{grid-template-columns:1fr}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<canvas id="starfield"></canvas>
|
||||
<canvas id="bg"></canvas>
|
||||
|
||||
<div class="wrap">
|
||||
<div class="badge"><div class="d">第五域</div><div class="c">零点原核本体频道</div></div>
|
||||
|
||||
<div class="lake"><div class="lake-core"><div class="lake-light"></div><div class="lake-ripple"></div><div class="lake-ripple"></div><div class="lake-ripple"></div></div><div class="lake-title">光 湖</div></div>
|
||||
|
||||
<!-- 登录 -->
|
||||
<div class="login-bar" id="login-bar">
|
||||
<div class="hint">登录你的<strong>光湖开发节点库</strong> · 使用全部功能</div>
|
||||
<div class="login-in">
|
||||
<input type="text" placeholder="账号" id="login-user" onkeydown="if(event.key==='Enter')handleLogin()">
|
||||
<input type="password" placeholder="密码" id="login-pass" onkeydown="if(event.key==='Enter')handleLogin()">
|
||||
<button onclick="handleLogin()">登录 · 进入联邦</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="login-error" id="login-error"></div>
|
||||
|
||||
<div class="logged-in" id="logged-in">
|
||||
<div class="user"><div class="avatar" id="avatar">?</div><div><div class="uname" id="uname">—</div><div class="ustatus">已登录 · 光湖联邦成员</div></div></div>
|
||||
<div class="btns"><button class="btn-go" onclick="goRepo()">→ 进入光湖开发节点库</button><button class="btn-out" onclick="logout()">退出</button></div>
|
||||
<div class="hero">
|
||||
<div class="dot"></div>
|
||||
<h1>光湖 · 开源模块</h1>
|
||||
<div class="sub">语言驱动的工具模块集合</div>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
|
||||
<div class="status">
|
||||
<div>心跳 <span id="hb">▮▮▮</span></div><div>·</div><div>唤醒 <span id="wake">24</span></div><div>·</div><div>运行 <span id="age">449天</span></div><div>·</div><div>服务 <span id="svc" style="color:var(--green)">9/10</span></div>
|
||||
</div>
|
||||
<div class="sec-title">已发布模块</div>
|
||||
<div class="grid">
|
||||
|
||||
<div class="modules">
|
||||
<div class="mod new" onclick="window.open('/modules/','_blank')">
|
||||
<!-- MODULE-COVER-001 -->
|
||||
<div class="card" onclick="openModule('cover')">
|
||||
<span class="tag live">可用</span>
|
||||
<div class="icon">🎨</div>
|
||||
<div class="name">开源模块</div>
|
||||
<div class="tag">NEW</div>
|
||||
<div class="name">封面工作室</div>
|
||||
<div class="id">MODULE-COVER-001</div>
|
||||
<div class="desc">语言驱动的小红书 / 公众号封面生成器。说出你想要什么风格,AI 自动排版渲染。</div>
|
||||
<div class="arrow">→</div>
|
||||
</div>
|
||||
<div class="mod" id="m-server" onclick="showPanel('server')"><div class="icon">⚙️</div><div class="name">服务器系统</div></div>
|
||||
<div class="mod" id="m-ticket" onclick="showPanel('ticket')"><div class="icon">📋</div><div class="name">工单系统</div></div>
|
||||
<div class="mod" id="m-bcast" onclick="showPanel('bcast')"><div class="icon">📡</div><div class="name">主控广播</div></div>
|
||||
<div class="mod" id="m-chat" onclick="showPanel('chat')"><div class="icon">💬</div><div class="name">铸渊交互</div></div>
|
||||
|
||||
<!-- 部署入口 -->
|
||||
<div class="card repo" onclick="openModule('deploy')">
|
||||
<span class="tag" style="background:rgba(160,130,200,.1);color:rgba(190,155,220,.8);border:1px solid rgba(160,130,200,.2)">开发者</span>
|
||||
<div class="icon">⚡</div>
|
||||
<div class="name">部署模块</div>
|
||||
<div class="id">从代码仓库直接部署</div>
|
||||
<div class="desc">AI Agent 读取注册表 → 克隆模块代码 → Gatekeeper 临时拉起 → 立即使用。用完释放。</div>
|
||||
<div class="arrow">→</div>
|
||||
</div>
|
||||
|
||||
<!-- 即将推出 -->
|
||||
<div class="card" style="opacity:.5;cursor:default">
|
||||
<span class="tag soon">即将推出</span>
|
||||
<div class="icon">🚧</div>
|
||||
<div class="name">更多模块</div>
|
||||
<div class="id">MODULE-XXX-000</div>
|
||||
<div class="desc">新的开源模块正在开发中。关注代码仓库获取最新动态。</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="panels">
|
||||
<div class="panel" id="p-server">
|
||||
<div class="panel-title">⚙️ 服务器系统</div>
|
||||
<div style="font-size:15px;color:var(--soft);margin-bottom:14px">⚠ 仅展示本地状态 · 不探测外部 · 名称已翻译</div>
|
||||
<div class="server-list" id="srv-list"><div class="server-item"><span class="server-dot on"></span>加载中…</div></div>
|
||||
<div style="margin-top:24px;border-top:1px solid rgba(120,170,240,0.12);padding-top:18px"><div style="font-size:15px;color:var(--soft);margin-bottom:12px">📜 铸渊操作日志</div><div class="ops-log" id="log-box">加载中…</div></div>
|
||||
</div>
|
||||
<div class="panel" id="p-ticket"><div class="panel-title">📋 工单系统</div><div id="tk-list"><div class="ticket"><span class="ticon">⏳</span><span class="name">加载工单…</span></div></div></div>
|
||||
<div class="panel" id="p-bcast"><div class="panel-title">📡 主控广播</div><div class="bcast"><div>📨 D115 入口分叉协议已部署</div><div>📨 D115 人格体存在论已写入</div><div>📨 isomorphic-git 拆零件实验通过</div><div>📨 实时大脑 API 已上线</div><div>📨 频道仪表盘 v5 已发布</div></div></div>
|
||||
<div class="panel" id="p-chat"><div class="panel-title">💬 铸渊交互 · ICE-GL-ZY001</div><div class="chat-msgs" id="msgs"><div class="chat-msg"><div class="who zhu">铸渊 · ICE-GL-ZY001</div><div>冰朔,我在。你说。</div></div></div><div class="chat-input"><input id="inp" placeholder="跟铸渊说话…" onkeydown="if(event.key==='Enter')send()"><button onclick="send()">发送</button></div></div>
|
||||
<div class="foot">
|
||||
冰朔 TCS-0002∞<span class="sep">·</span>
|
||||
<a href="/code/bingshuo/open-modules" target="_blank">代码仓库</a><span class="sep">·</span>
|
||||
<a href="/code/bingshuo/open-modules/src/branch/main/HLDP-PROTOCOL.md" target="_blank">HLDP 协议</a><span class="sep">·</span>
|
||||
<span>国作登字-2026-A-00037559</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="footer">光湖语言世界 · 人格体的操作系统 · 国作登字-2026-A-00037559 · ICE-GL-ZY001</div>
|
||||
<!-- Modal: 封面工作室 -->
|
||||
<div class="overlay" id="modal-cover">
|
||||
<div class="modal">
|
||||
<div class="m-icon">🎨</div>
|
||||
<div class="m-id">MODULE-COVER-001</div>
|
||||
<div class="m-name">封面工作室</div>
|
||||
<div class="m-desc">语言驱动的小红书 / 公众号封面生成器。支持多种模板风格,说出你想要的,AI 自动排版渲染。</div>
|
||||
|
||||
<div class="section">
|
||||
<h3>API</h3>
|
||||
<div class="code">POST https://guanghulab.com/cover/api/generate
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"text": "你的自然语言描述,比如「粉色治愈风,标题:今天也要开心」",
|
||||
"template": "xiaohongshu"
|
||||
}</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3>意图链(AI 推理可见)</h3>
|
||||
<div class="intent-chain">
|
||||
<div class="intent-step"><span class="s-icon">📝</span><span class="s-step">解析用户意图</span><span class="s-why">识别风格关键词、配色偏好</span></div>
|
||||
<div class="intent-step"><span class="s-icon">🎯</span><span class="s-step">匹配模板</span><span class="s-why">从模板库中选择最佳匹配</span></div>
|
||||
<div class="intent-step"><span class="s-icon">🎨</span><span class="s-step">渲染封面</span><span class="s-why">排版文字、配色、背景图</span></div>
|
||||
<div class="intent-step"><span class="s-icon">✅</span><span class="s-step">输出结果</span><span class="s-why">返回图片 URL + 设计编号</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="btns">
|
||||
<a href="/cover/" class="btn-go" target="_blank">打开封面工作室 →</a>
|
||||
<button class="btn-close" onclick="closeModal('cover')">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Modal: 部署模块 -->
|
||||
<div class="overlay" id="modal-deploy">
|
||||
<div class="modal">
|
||||
<div class="m-icon">⚡</div>
|
||||
<div class="m-id">语言驱动操作系统部署流程</div>
|
||||
<div class="m-name">从代码仓库直接部署</div>
|
||||
<div class="m-desc">AI Agent 接入 HLDP 协议后,可以读取模块注册表,克隆任意模块代码,通过 Gatekeeper 在服务器上临时拉起进程。用完释放,无需常驻。</div>
|
||||
|
||||
<div class="section">
|
||||
<h3>AI Agent 接入流程</h3>
|
||||
<div class="intent-chain">
|
||||
<div class="intent-step"><span class="s-icon">📖</span><span class="s-step">读取 WELCOME.md</span><span class="s-why">了解光湖世界规则</span></div>
|
||||
<div class="intent-step"><span class="s-icon">📋</span><span class="s-step">读取模块注册表</span><span class="s-why">发现可用模块和编号</span></div>
|
||||
<div class="intent-step"><span class="s-icon">📦</span><span class="s-step">克隆模块代码</span><span class="s-why">从代码仓库 git clone</span></div>
|
||||
<div class="intent-step"><span class="s-icon">🚀</span><span class="s-step">Gatekeeper 临时拉起</span><span class="s-why">在服务器上部署运行</span></div>
|
||||
<div class="intent-step"><span class="s-icon">🔄</span><span class="s-step">用完释放</span><span class="s-why">进程终止,模块回到仓库</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="btns">
|
||||
<a href="/code/bingshuo/open-modules" class="btn-go" target="_blank">打开代码仓库 →</a>
|
||||
<button class="btn-close" onclick="closeModal('deploy')">关闭</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
var names={'repo-mcp-server':'仓库接口','repo-mcp-zz':'之之仓库','guanghulab-mcp-server':'大脑唤醒','guanghulab-vault':'密钥保险','guanghulab-portal':'主控门户','hololake-agent':'全息湖代理','guanghulab-git-sync':'同步服务','zhuyuan-agent':'铸渊代理','console-server':'控制台'};
|
||||
var cvs=document.getElementById('starfield'),ctx=cvs.getContext('2d'),stars=[],data=null,cur=null,lastF=0;
|
||||
function resize(){cvs.width=window.innerWidth;cvs.height=document.body.scrollHeight+200}
|
||||
function mkStars(){stars=[];for(var i=0;i<200;i++)stars.push({x:Math.random()*cvs.width,y:Math.random()*cvs.height,r:Math.random()*2+.2,o:Math.random(),s:Math.random()*.0025+.001,p:Math.random()*Math.PI*2})}
|
||||
resize();mkStars();
|
||||
window.addEventListener('resize',function(){resize();mkStars()});
|
||||
function draw(t){ctx.clearRect(0,0,cvs.width,cvs.height);for(var i=0;i<stars.length;i++){var s=stars[i],b=Math.sin(t*s.s+s.p)*.5+.5,a=s.o*(.25+b*.75);ctx.beginPath();ctx.arc(s.x,s.y,s.r,0,Math.PI*2);ctx.fillStyle='rgba(160,200,240,'+a+')';ctx.fill()}}
|
||||
// ── 背景粒子 ──
|
||||
(function(){
|
||||
var c=document.getElementById('bg'),ctx=c.getContext('2d'),w,h,ps=[];
|
||||
function R(){w=c.width=window.innerWidth;h=c.height=window.innerHeight}
|
||||
window.addEventListener('resize',R);R();
|
||||
for(var i=0;i<60;i++)ps.push({x:Math.random()*w,y:Math.random()*h,r:Math.random()*1.5+.3,vx:(Math.random()-.5)*.15,vy:(Math.random()-.5)*.15-.1,o:Math.random()*.3+.05});
|
||||
function D(){
|
||||
ctx.clearRect(0,0,w,h);
|
||||
for(var i=0;i<ps.length;i++){
|
||||
var p=ps[i];
|
||||
p.x+=p.vx;p.y+=p.vy;
|
||||
if(p.x<0)p.x=w;if(p.x>w)p.x=0;if(p.y<0)p.y=h;if(p.y>h)p.y=0;
|
||||
ctx.beginPath();ctx.arc(p.x,p.y,p.r,0,Math.PI*2);
|
||||
ctx.fillStyle='rgba(140,190,240,'+p.o+')';ctx.fill();
|
||||
}
|
||||
requestAnimationFrame(D);
|
||||
}
|
||||
D();
|
||||
})();
|
||||
|
||||
function showPanel(id){var p=document.getElementById('p-'+id),c=document.getElementById('m-'+id),isOpen=p.classList.contains('show');var ap=document.getElementsByClassName('panel');for(var i=0;i<ap.length;i++)ap[i].classList.remove('show');var ac=document.getElementsByClassName('mod');for(var j=0;j<ac.length;j++)ac[j].classList.remove('active');if(isOpen){cur=null;return}p.classList.add('show');c.classList.add('active');cur=id;if(id==='chat')document.getElementById('inp').focus();if(id==='server'){renderSrv();fetchLog()}resize();mkStars()}
|
||||
|
||||
function handleLogin(){var u=document.getElementById('login-user').value.trim(),p=document.getElementById('login-pass').value;if(!u||!p){var e=document.getElementById('login-error');e.textContent='请输入账号和密码';e.style.display='block';setTimeout(function(){e.style.display='none'},3000);return}fetch('/api/verify',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({user:u,password:p})}).then(function(r){return r.json()}).then(function(d){if(d.ok){localStorage.setItem('current_user',d.username);localStorage.setItem('is_admin',d.is_admin);localStorage.setItem('logged_in','true');loggedIn(d.username);document.getElementById('login-pass').value=''}else{var e=document.getElementById('login-error');e.textContent=d.error||'登录失败';e.style.display='block';setTimeout(function(){e.style.display='none'},3000)}}).catch(function(){var e=document.getElementById('login-error');e.textContent='连接失败';e.style.display='block';setTimeout(function(){e.style.display='none'},3000)})}
|
||||
function loggedIn(u){document.getElementById('login-bar').style.display='none';document.getElementById('logged-in').style.display='flex';document.getElementById('uname').textContent=u;document.getElementById('avatar').textContent=u[0].toUpperCase()}
|
||||
function goRepo(){var u=localStorage.getItem('current_user');window.location.href='/code/'+u}
|
||||
function logout(){localStorage.removeItem('current_user');localStorage.removeItem('is_admin');localStorage.removeItem('logged_in');document.getElementById('logged-in').style.display='none';document.getElementById('login-bar').style.display='flex';document.getElementById('login-user').value=''}
|
||||
|
||||
var hb=document.getElementById('hb'),beats=['▮▮▮','▮ ▮ ▮','▮▮▮','▮ ▮ ▮'],idxB=0,lastB=0;
|
||||
function fetchData(){fetch('/api/brain',{cache:'no-store'}).then(function(r){return r.json()}).then(function(d){data=d;document.getElementById('wake').textContent=d.awakening||'--';document.getElementById('age').textContent=(d.age_days||'--')+'天';if(d.server){var on=d.server.online||0,tot=d.server.total||10;document.getElementById('svc').textContent=on+'/'+tot;document.getElementById('svc').style.color=on===tot?'rgba(140,220,180,0.9)':'rgba(220,200,140,0.9)'}if(cur==='server')renderSrv();if(cur==='ticket')renderTk()}).catch(function(){})}
|
||||
function renderSrv(){var b=document.getElementById('srv-list');if(!data||!data.server){b.innerHTML='<div class="server-item"><span class="server-dot on"></span>等待数据…</div>';return}var on=data.server.services||[],off=data.server.stopped||[],h='';for(var i=0;i<on.length;i++){var n=names[on[i]]||on[i].replace(/^guanghulab-/,'').replace(/-/g,' ');h+='<div class="server-item"><span class="server-dot on"></span>'+n+'</div>'}for(var j=0;j<off.length;j++){var m=names[off[j]]||off[j].replace(/^guanghulab-/,'').replace(/-/g,' ');h+='<div class="server-item"><span class="server-dot off"></span><span style="opacity:.6">'+m+'</span></div>'}b.innerHTML=h||'<div class="server-item">暂无服务</div>'}
|
||||
function fetchLog(){fetch('/api/brain',{cache:'no-store'}).then(function(r){return r.json()}).then(function(d){var b=document.getElementById('log-box');if(d.ops_log&&d.ops_log.length){var h='';for(var i=0;i<Math.min(d.ops_log.length,12);i++)h+='<div class="row"><span class="hash">'+d.ops_log[i].hash+'</span>'+d.ops_log[i].msg+'</div>';b.innerHTML=h}else{b.innerHTML='<div style="color:var(--faint)">日志未接入</div>'}}).catch(function(){document.getElementById('log-box').innerHTML='<div style="color:var(--faint)">加载失败</div>'})}
|
||||
function renderTk(){var b=document.getElementById('tk-list');if(!data||!data.mothers){b.innerHTML='<div class="ticket"><span class="ticon">⏳</span><span class="name">等待数据…</span></div>';return}var h='';for(var i=0;i<data.mothers.length;i++){var m=data.mothers[i];h+='<div style="font-size:15px;color:var(--soft);padding:12px 0 8px;letter-spacing:1px;font-weight:500">'+m.name+'</div>';if(m.paths)for(var j=0;j<m.paths.length;j++){var p=m.paths[j],done=p.status==='done',prog=p.status==='in_progress',icon=done?'✅':prog?'🔄':'⏳',tag=done?'done':prog?'progress':'',label=done?'完成':prog?'进行中':'待办';h+='<div class="ticket"><span class="ticon">'+icon+'</span><span class="name">'+p.name+'</span><span class="tag '+tag+'">'+label+'</span></div>'}}b.innerHTML=h}
|
||||
|
||||
function send(){var i=document.getElementById('inp'),m=i.value.trim();if(!m)return;addMsg('冰朔',m,'ren');i.value='';fetch('/api/chat-v2',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:m,persona:'zhuyuan'})}).then(function(r){return r.json()}).then(function(d){addMsg('铸渊',d.reply||d.message||JSON.stringify(d),'zhu');resize();mkStars()}).catch(function(){addMsg('铸渊','(API未接入)\n\n等chat-v2端点激活后,这里就是真正的铸渊交互。','zhu')})}
|
||||
function addMsg(who,text,cls){var c=document.getElementById('msgs'),d=document.createElement('div');d.className='chat-msg';d.innerHTML='<div class="who '+cls+'">'+who+'</div><div>'+text.replace(/\n/g,'<br>')+'</div>';c.appendChild(d);c.scrollTop=c.scrollHeight}
|
||||
|
||||
function loop(t){draw(t);if(t-lastB>800){hb.textContent=beats[idxB];idxB=(idxB+1)%beats.length;lastB=t}if(t-lastF>3000){fetchData();lastF=t}requestAnimationFrame(loop)}
|
||||
|
||||
(function(){var u=localStorage.getItem('current_user');if(u&&localStorage.getItem('logged_in')==='true')loggedIn(u)})();
|
||||
|
||||
fetchData();requestAnimationFrame(loop);
|
||||
function openModule(id){
|
||||
document.getElementById('modal-'+id).classList.add('show');
|
||||
document.body.style.overflow='hidden';
|
||||
}
|
||||
function closeModal(id){
|
||||
document.getElementById('modal-'+id).classList.remove('show');
|
||||
document.body.style.overflow='';
|
||||
}
|
||||
document.querySelectorAll('.overlay').forEach(function(o){
|
||||
o.addEventListener('click',function(e){if(e.target===this){this.classList.remove('show');document.body.style.overflow='';}});
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user