feat(portal): add logical group admin page

This commit is contained in:
phamnazage-jpg
2026-05-29 13:06:19 +08:00
parent 535f00712d
commit 2e9b4ab988
8 changed files with 1417 additions and 3 deletions

View File

@@ -10,7 +10,10 @@
- `https://sub.tksea.top/portal/` 的静态页面源码
- `tksea-portal/admin/index.html`
- `https://sub.tksea.top/portal/admin/` 的管理首页
- 统一收纳“新增模型 / 供应商目录”和“导入供应商帐号”入口
- 统一收纳“逻辑分组 / 路由”“新增模型 / 供应商目录”和“导入供应商帐号”入口
- `tksea-portal/admin/logical-groups.html`
- `https://sub.tksea.top/portal/admin/logical-groups.html`
- 维护 `logical_group / public_model / route / shadow_group` 的最小运营页
- `tksea-portal/admin/providers.html`
- `https://sub.tksea.top/portal/admin/providers.html`
- 用现有 CRM API 做 pack/provider 浏览、preview-import、import以及 provider manifest 草稿生成

View File

@@ -372,6 +372,7 @@
<main class="shell">
<nav class="topnav" aria-label="Admin Navigation">
<a href="/portal/admin/">管理首页</a>
<a href="/portal/admin/logical-groups.html">逻辑分组 / 路由</a>
<a href="/portal/admin/providers.html">新增模型 / 供应商目录</a>
<a href="/portal/admin/batch-import.html" class="is-current">导入供应商帐号</a>
<a href="/portal/" target="_blank" rel="noreferrer">用户 Portal</a>

View File

@@ -250,6 +250,7 @@
<main class="shell">
<nav class="topnav" aria-label="Admin Navigation">
<a href="/portal/admin/" class="is-current">管理首页</a>
<a href="/portal/admin/logical-groups.html">逻辑分组 / 路由</a>
<a href="/portal/admin/providers.html">新增模型 / 供应商目录</a>
<a href="/portal/admin/batch-import.html">导入供应商帐号</a>
<a href="/portal/" target="_blank" rel="noreferrer">用户 Portal</a>
@@ -276,6 +277,10 @@
<div class="metric-label">统一入口</div>
<div class="metric-value">/portal/admin/</div>
</div>
<div class="metric">
<div class="metric-label">Logical Group</div>
<div class="metric-value">/logical-groups</div>
</div>
<div class="metric">
<div class="metric-label">Provider 目录</div>
<div class="metric-value">/providers</div>
@@ -288,6 +293,28 @@
</section>
<section class="grid">
<article class="card panel">
<h2>逻辑分组 / 路由</h2>
<p>
这页给插件前置路由使用,负责维护 <code>logical_group</code><code>public_model</code>
<code>route</code><code>shadow_host_id / shadow_group_id</code> 的关系。当前首版已经能直接调
<code>/api/logical-groups</code> 系列接口,适合先把 canonical shadow route 收进统一管理面。
</p>
<div class="cta-row">
<a class="cta primary" href="/portal/admin/logical-groups.html">打开逻辑分组页</a>
</div>
<ul class="list">
<li>
<strong>适用动作</strong>
创建 logical group、绑定 public model、维护 route 与 shadow group 映射。
</li>
<li>
<strong>默认 API Base</strong>
<code>https://sub.tksea.top/portal-admin-api</code>
</li>
</ul>
</article>
<article class="card panel">
<h2>新增模型 / 供应商目录</h2>
<p>
@@ -337,8 +364,8 @@
<section class="status-grid">
<article class="status-card status-available">
<div class="metric-label">可立即使用</div>
<strong>Provider 浏览 + 导入</strong>
<p>依赖现有 <code>/api/packs</code><code>/api/providers/*</code><code>/api/batch-import/*</code> 即可完成。</p>
<strong>逻辑分组 + Provider 导入</strong>
<p>依赖现有 <code>/api/logical-groups</code><code>/api/packs</code><code>/api/providers/*</code><code>/api/batch-import/*</code> 即可完成。</p>
</article>
<article class="status-card status-note">
<div class="metric-label">当前边界</div>

File diff suppressed because it is too large Load Diff

View File

@@ -359,6 +359,7 @@
<main class="shell">
<nav class="topnav" aria-label="Admin Navigation">
<a href="/portal/admin/">管理首页</a>
<a href="/portal/admin/logical-groups.html">逻辑分组 / 路由</a>
<a href="/portal/admin/providers.html" class="is-current">新增模型 / 供应商目录</a>
<a href="/portal/admin/batch-import.html">导入供应商帐号</a>
<a href="/portal/" target="_blank" rel="noreferrer">用户 Portal</a>

View File

@@ -169,6 +169,7 @@ tksea portal deployed
remote: ${REMOTE}
portal url: https://sub.tksea.top/portal/
portal admin home url: https://sub.tksea.top/portal/admin/
logical groups admin url: https://sub.tksea.top/portal/admin/logical-groups.html
provider admin url: https://sub.tksea.top/portal/admin/providers.html
batch import admin url: https://sub.tksea.top/portal/admin/batch-import.html
batch import admin url: https://sub.tksea.top/portal/admin-batch-import.html

View File

@@ -325,6 +325,12 @@ write_body() {
}
case "$url" in
*/api/admin/session/login)
write_body '{"authenticated":true,"username":"portal-admin"}'
;;
*/api/admin/session)
write_body '{"authenticated":true,"login_enabled":true,"username":"portal-admin"}'
;;
*/api/hosts)
write_body '{"host_id":"remote43-current-host"}'
;;
@@ -490,6 +496,8 @@ EOF
KEY="/does/not/matter" \
REMOTE="fake@host" \
CRM_BASE="http://127.0.0.1:18088" \
CRM_ADMIN_USERNAME="portal-admin" \
CRM_ADMIN_PASSWORD="portal-pass" \
HOST_BASE="http://127.0.0.1:18087" \
CRM_HOST_BASE="http://127.0.0.1:18093" \
REMOTE_HOST_BASE="http://127.0.0.1:18093" \

View File

@@ -5,6 +5,7 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
HTML_FILE="$ROOT_DIR/deploy/tksea-portal/index.html"
ADMIN_HTML_FILE="$ROOT_DIR/deploy/tksea-portal/admin-batch-import.html"
ADMIN_HOME_FILE="$ROOT_DIR/deploy/tksea-portal/admin/index.html"
ADMIN_LOGICAL_GROUPS_FILE="$ROOT_DIR/deploy/tksea-portal/admin/logical-groups.html"
ADMIN_PROVIDERS_FILE="$ROOT_DIR/deploy/tksea-portal/admin/providers.html"
ADMIN_BATCH_FILE="$ROOT_DIR/deploy/tksea-portal/admin/batch-import.html"
NGINX_FILE="$ROOT_DIR/deploy/tksea-portal/nginx.sub.tksea.top.conf.example"
@@ -26,6 +27,7 @@ assert_contains_file() {
[[ -f "$HTML_FILE" ]] || fail "missing $HTML_FILE"
[[ -f "$ADMIN_HTML_FILE" ]] || fail "missing $ADMIN_HTML_FILE"
[[ -f "$ADMIN_HOME_FILE" ]] || fail "missing $ADMIN_HOME_FILE"
[[ -f "$ADMIN_LOGICAL_GROUPS_FILE" ]] || fail "missing $ADMIN_LOGICAL_GROUPS_FILE"
[[ -f "$ADMIN_PROVIDERS_FILE" ]] || fail "missing $ADMIN_PROVIDERS_FILE"
[[ -f "$ADMIN_BATCH_FILE" ]] || fail "missing $ADMIN_BATCH_FILE"
[[ -f "$NGINX_FILE" ]] || fail "missing $NGINX_FILE"
@@ -51,6 +53,7 @@ assert_contains_file "$HTML_FILE" "deepseek-chat"
assert_contains_file "$ADMIN_HTML_FILE" "Batch Import Admin"
assert_contains_file "$ADMIN_HTML_FILE" "/portal/admin/"
assert_contains_file "$ADMIN_HTML_FILE" "/portal/admin/logical-groups.html"
assert_contains_file "$ADMIN_HTML_FILE" "/portal/admin/providers.html"
assert_contains_file "$ADMIN_HTML_FILE" "/portal/admin/batch-import.html"
assert_contains_file "$ADMIN_HTML_FILE" "/portal-admin-api"
@@ -65,13 +68,32 @@ assert_contains_file "$ADMIN_HTML_FILE" "reused"
assert_contains_file "$ADMIN_HTML_FILE" "reactivated"
assert_contains_file "$ADMIN_HOME_FILE" "Admin Portal"
assert_contains_file "$ADMIN_HOME_FILE" "/portal/admin/logical-groups.html"
assert_contains_file "$ADMIN_HOME_FILE" "/portal/admin/providers.html"
assert_contains_file "$ADMIN_HOME_FILE" "/portal/admin/batch-import.html"
assert_contains_file "$ADMIN_HOME_FILE" "/portal-admin-api"
assert_contains_file "$ADMIN_HOME_FILE" "浏览器提交到 CRM"
assert_contains_file "$ADMIN_HOME_FILE" "逻辑分组 / 路由"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "Logical Group Admin"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/portal/admin/"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/portal/admin/logical-groups.html"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/portal/admin/providers.html"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/portal/admin/batch-import.html"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/api/admin/session/login"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/api/admin/session/logout"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/api/admin/session"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/api/logical-groups"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "logical_group"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "shadow_group_id"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "shadow_host_id"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "首版页面只覆盖新增与查看"
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" 'credentials: "include"'
assert_contains_file "$ADMIN_LOGICAL_GROUPS_FILE" "/portal-admin-api"
assert_contains_file "$ADMIN_PROVIDERS_FILE" "Provider Admin"
assert_contains_file "$ADMIN_PROVIDERS_FILE" "管理员登录"
assert_contains_file "$ADMIN_PROVIDERS_FILE" "/portal/admin/logical-groups.html"
assert_contains_file "$ADMIN_PROVIDERS_FILE" "/api/admin/session/login"
assert_contains_file "$ADMIN_PROVIDERS_FILE" "/api/admin/session/logout"
assert_contains_file "$ADMIN_PROVIDERS_FILE" "/api/admin/session"
@@ -114,6 +136,7 @@ assert_contains_file "$NGINX_FILE" "location /kimi-portal-proxy/"
assert_contains_file "$DEPLOY_SCRIPT" "portal url: https://sub.tksea.top/portal/"
assert_contains_file "$DEPLOY_SCRIPT" "portal admin home url: https://sub.tksea.top/portal/admin/"
assert_contains_file "$DEPLOY_SCRIPT" "logical groups admin url: https://sub.tksea.top/portal/admin/logical-groups.html"
assert_contains_file "$DEPLOY_SCRIPT" "provider admin url: https://sub.tksea.top/portal/admin/providers.html"
assert_contains_file "$DEPLOY_SCRIPT" "batch import admin url: https://sub.tksea.top/portal/admin/batch-import.html"
assert_contains_file "$DEPLOY_SCRIPT" "batch import admin url: https://sub.tksea.top/portal/admin-batch-import.html"