Files
team-api/internal/packed/landing.html
T

151 lines
12 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>Team-API · 企业级大模型 API 网关</title>
<link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20500%20500%22%20role%3D%22img%22%20aria-label%3D%22Three-color%20orbit%20logo%22%20shape-rendering%3D%22geometricPrecision%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22purple-arm%22%20x1%3D%22315%22%20y1%3D%2277%22%20x2%3D%22201%22%20y2%3D%22279%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%23f000da%22%2F%3E%3Cstop%20offset%3D%220.48%22%20stop-color%3D%22%23b800d1%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%236d00a9%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22green-arm%22%20x1%3D%22315%22%20y1%3D%2277%22%20x2%3D%22201%22%20y2%3D%22279%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2300dc72%22%2F%3E%3Cstop%20offset%3D%220.48%22%20stop-color%3D%22%2300bd69%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23008e4c%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22orange-arm%22%20x1%3D%22315%22%20y1%3D%2277%22%20x2%3D%22201%22%20y2%3D%22279%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%23d90016%22%2F%3E%3Cstop%20offset%3D%220.48%22%20stop-color%3D%22%23ff7900%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23f79a00%22%2F%3E%3C%2FlinearGradient%3E%3CradialGradient%20id%3D%22purple-ball%22%20cx%3D%2234%25%22%20cy%3D%2227%25%22%20r%3D%2272%25%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%23ff25e8%22%2F%3E%3Cstop%20offset%3D%220.52%22%20stop-color%3D%22%23d500d2%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%238700ad%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22green-ball%22%20cx%3D%2235%25%22%20cy%3D%2227%25%22%20r%3D%2273%25%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2322ed91%22%2F%3E%3Cstop%20offset%3D%220.52%22%20stop-color%3D%22%2300bd6b%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2300834c%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22orange-ball%22%20cx%3D%2234%25%22%20cy%3D%2227%25%22%20r%3D%2273%25%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%23ffdc00%22%2F%3E%3Cstop%20offset%3D%220.52%22%20stop-color%3D%22%23ff8b00%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23d71712%22%2F%3E%3C%2FradialGradient%3E%3CradialGradient%20id%3D%22cyan-ball%22%20cx%3D%2235%25%22%20cy%3D%2228%25%22%20r%3D%2273%25%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%2317efff%22%2F%3E%3Cstop%20offset%3D%220.58%22%20stop-color%3D%22%2308d8ef%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2319bdd5%22%2F%3E%3C%2FradialGradient%3E%3Cpath%20id%3D%22arm-shape%22%20d%3D%22M219%20286c-38-22-61-59-60-103%201-61%2046-109%20105-112%2020-1%2039%201%2055%206l-5%2021c-16-4-32-6-48-5-47%202-84%2041-85%2090-1%2042%2013%2076%2038%20103z%22%2F%3E%3Ccircle%20id%3D%22endpoint-shape%22%20cx%3D%22331%22%20cy%3D%2282%22%20r%3D%2226.56218506%22%2F%3E%3C%2Fdefs%3E%3Cg%20transform%3D%22translate(250%20244)%20rotate(10.20552699)%20scale(0.94118763)%20translate(-250%20-244)%22%3E%3Cuse%20href%3D%22%23arm-shape%22%20fill%3D%22url(%23purple-arm)%22%2F%3E%3Cuse%20href%3D%22%23endpoint-shape%22%20fill%3D%22url(%23purple-ball)%22%2F%3E%3C%2Fg%3E%3Cg%20transform%3D%22rotate(-120%20250%20244)%20translate(250%20244)%20rotate(10.20552699)%20scale(0.94118763)%20translate(-250%20-244)%22%3E%3Cuse%20href%3D%22%23arm-shape%22%20fill%3D%22url(%23green-arm)%22%2F%3E%3Cuse%20href%3D%22%23endpoint-shape%22%20fill%3D%22url(%23green-ball)%22%2F%3E%3C%2Fg%3E%3Cg%20transform%3D%22rotate(120%20250%20244)%20translate(250%20244)%20rotate(10.20552699)%20scale(0.94118763)%20translate(-250%20-244)%22%3E%3Cuse%20href%3D%22%23arm-shape%22%20fill%3D%22url(%23orange-arm)%22%2F%3E%3Cuse%20href%3D%22%23endpoint-shape%22%20fill%3D%22url(%23orange-ball)%22%2F%3E%3C%2Fg%3E%3Ccircle%20cx%3D%22250%22%20cy%3D%22244%22%20r%3D%2237%22%20fill%3D%22url(%23cyan-ball)%22%2F%3E%3C%2Fsvg%3E">
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,100..1000;1,9..40,100..1000&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<script>
tailwind.config = {
theme: {
extend: {
fontFamily: {
sans: ['DM Sans', 'system-ui', 'sans-serif'],
mono: ['JetBrains Mono', 'monospace'],
}
}
}
}
</script>
<style>
body { font-family: 'DM Sans', system-ui, sans-serif; }
.card {
box-shadow:
0 0 0 1px rgba(0, 0, 0, 0.03),
0 2px 4px rgba(0, 0, 0, 0.03),
0 12px 24px rgba(0, 0, 0, 0.06);
}
.entry-btn {
transition: background-color 0.15s ease, transform 0.1s ease, box-shadow 0.15s ease;
}
.entry-btn:hover { box-shadow: 0 2px 8px rgba(37, 99, 235, 0.3); }
.entry-btn:active { transform: translateY(0.5px); }
</style>
</head>
<body class="min-h-screen flex items-center justify-center p-4" style="background: linear-gradient(160deg, #f0f4f8 0%, #e8edf5 50%, #f5f3ff 100%);">
<div class="w-full max-w-md">
<div class="card bg-white rounded-2xl p-8 sm:p-10">
<!-- Brand -->
<div class="text-center mb-8">
<div class="inline-flex items-center justify-center w-14 h-14 rounded-2xl mb-4 border border-gray-100 bg-white" style="box-shadow: 0 4px 12px rgba(0,0,0,0.06);">
<svg class="w-9 h-9" viewBox="0 0 500 500" role="img" aria-label="Team-API">
<defs>
<linearGradient id="purple-arm" x1="315" y1="77" x2="201" y2="279" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#f000da"/>
<stop offset="0.48" stop-color="#b800d1"/>
<stop offset="1" stop-color="#6d00a9"/>
</linearGradient>
<linearGradient id="green-arm" x1="315" y1="77" x2="201" y2="279" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#00dc72"/>
<stop offset="0.48" stop-color="#00bd69"/>
<stop offset="1" stop-color="#008e4c"/>
</linearGradient>
<linearGradient id="orange-arm" x1="315" y1="77" x2="201" y2="279" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#d90016"/>
<stop offset="0.48" stop-color="#ff7900"/>
<stop offset="1" stop-color="#f79a00"/>
</linearGradient>
<radialGradient id="purple-ball" cx="34%" cy="27%" r="72%">
<stop offset="0" stop-color="#ff25e8"/>
<stop offset="0.52" stop-color="#d500d2"/>
<stop offset="1" stop-color="#8700ad"/>
</radialGradient>
<radialGradient id="green-ball" cx="35%" cy="27%" r="73%">
<stop offset="0" stop-color="#22ed91"/>
<stop offset="0.52" stop-color="#00bd6b"/>
<stop offset="1" stop-color="#00834c"/>
</radialGradient>
<radialGradient id="orange-ball" cx="34%" cy="27%" r="73%">
<stop offset="0" stop-color="#ffdc00"/>
<stop offset="0.52" stop-color="#ff8b00"/>
<stop offset="1" stop-color="#d71712"/>
</radialGradient>
<radialGradient id="cyan-ball" cx="35%" cy="28%" r="73%">
<stop offset="0" stop-color="#17efff"/>
<stop offset="0.58" stop-color="#08d8ef"/>
<stop offset="1" stop-color="#19bdd5"/>
</radialGradient>
<path id="arm-shape" d="M219 286c-38-22-61-59-60-103 1-61 46-109 105-112 20-1 39 1 55 6l-5 21c-16-4-32-6-48-5-47 2-84 41-85 90-1 42 13 76 38 103z"/>
<circle id="endpoint-shape" cx="331" cy="82" r="26.56218506"/>
</defs>
<g transform="translate(250 244) rotate(10.20552699) scale(0.94118763) translate(-250 -244)">
<use href="#arm-shape" fill="url(#purple-arm)"/>
<use href="#endpoint-shape" fill="url(#purple-ball)"/>
</g>
<g transform="rotate(-120 250 244) translate(250 244) rotate(10.20552699) scale(0.94118763) translate(-250 -244)">
<use href="#arm-shape" fill="url(#green-arm)"/>
<use href="#endpoint-shape" fill="url(#green-ball)"/>
</g>
<g transform="rotate(120 250 244) translate(250 244) rotate(10.20552699) scale(0.94118763) translate(-250 -244)">
<use href="#arm-shape" fill="url(#orange-arm)"/>
<use href="#endpoint-shape" fill="url(#orange-ball)"/>
</g>
<circle cx="250" cy="244" r="37" fill="url(#cyan-ball)"/>
</svg>
</div>
<h1 class="text-2xl font-semibold text-gray-900 tracking-tight">Team-API</h1>
<p class="text-sm text-gray-500 mt-1.5">企业级大模型 API 网关</p>
</div>
<!-- Intro -->
<p class="text-sm text-gray-500 text-center mb-8">
统一接入 OpenAI / Claude / Gemini 等主流大模型,为多租户提供 API Key 管理与计费能力
</p>
<!-- Frontend entry -->
<div class="space-y-3">
<a href="/admin" class="entry-btn flex items-center justify-between w-full bg-gray-50 border border-gray-200 rounded-xl px-4 py-3 text-sm text-gray-700 hover:bg-gray-100">
<span>管理后台</span>
<span class="text-xs text-gray-400">平台运营</span>
</a>
<a href="/" class="entry-btn flex items-center justify-between w-full bg-gray-50 border border-gray-200 rounded-xl px-4 py-3 text-sm text-gray-700 hover:bg-gray-100">
<span>租户控制台</span>
<span class="text-xs text-gray-400">组织使用</span>
</a>
</div>
<!-- Dev hint -->
<p class="text-center text-xs text-gray-400 mt-6">
开发环境请通过 Vite 访问
<a id="dev-admin" href="#" class="text-blue-600 hover:underline">管理后台 :4001</a>
<span class="mx-1">·</span>
<a id="dev-tenant" href="#" class="text-blue-600 hover:underline">租户控制台 :4002</a>
</p>
<p class="text-center text-xs text-gray-400 mt-4">
Team-API v<span id="version">__VERSION__</span>
</p>
</div>
</div>
<script>
(function () {
// 开发环境前端 Vite 开发服务器地址(管理后台 :4001 / 租户控制台 :4002),按当前 hostname 动态拼接
var host = window.location.hostname || 'localhost';
var admin = document.getElementById('dev-admin');
var tenant = document.getElementById('dev-tenant');
if (admin) admin.href = 'http://' + host + ':4001';
if (tenant) tenant.href = 'http://' + host + ':4002';
})();
</script>
</body>
</html>