Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions ui/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ python3 -m http.server 8000 --directory ui

同一套界面(角色视图):

1. 仪表盘 Dashboard — 点数余额、本月用量、共享收益、最近交易
2. 模型市场 Marketplace — 模型浏览、搜索、厂商筛选、排序(按价格/上下文)
1. 仪表盘 Dashboard — 点数余额、本月用量、共享收益、最近交易、点数来源(分组展示有效期:赠送当日有效 / 收益与充值永久)
2. 模型市场 Marketplace — 模型浏览、搜索、厂商筛选、排序(按价格/上下文);可用性标注「多 key · 自动故障转移」(该模型配置多个上游 key,架构 v0.2 路由策略);每行「使用 / 消费」入口 → 聊天 Mock 模拟调用(按模型输出参考价扣小数点数,如 -0.38 点,产生消费交易;余额不足时阻断并提示)
3. 共享管理 Sharing — 默认只显示统计 + 我的共享列表(key 脱敏展示,可暂停/恢复/重新上架/彻底删除);点击"+ 添加 / 上架新 key"展开上架表单(须填 API Key,平台加密托管;分享者只填声明额度,单价由平台按模型定价自动计算并展示参考价),提交成功或取消后自动收起
4. 钱包 Wallet — 点数余额、点数来源(每日赠送 1 点 · 有效期至今日 · 连续第 N 天 / 共 10 天;收益永久;充值永久,充值暂未开放)、充值/提现占位入口;收支明细已去重,统一到【交易记录】(页内提供跳转提示)
5. 交易记录 Transactions — 消费/收益/充值/提现/赠送(gift)唯一明细入口,Tab 筛选 + MRT 风格表格(列排序/列筛选/分页,与 Tab 叠加生效)
6. 设置 Settings — 账户、API Key 管理(完整增删改查:生成带名字、改名、删除需确认「删除后该 key 立即失效」、按名字搜索、一键复制完整 key——列表脱敏展示 atk_live_****xxxx,复制为完整值;file:// 下 clipboard API 受限时降级为选中+Ctrl/Cmd+C)、通知、偏好
7. 管理视图 Admin(管理员角色专属)— Key 池管理(添加/撤销)、成员管理(改部门:下拉可选部门或"未分配";任意金额充值,正整数校验;新注册成员默认未分配部门)、用量报表(按模型/成员)、组织管理(部门列表 + 部门增删改查 + 每月点数分配,含部门汇总统计,未分配成员不计入任何部门;保留组织设置卡片,含"关闭外部注册"企业部署开关)
7. 管理视图 Admin(管理员 / 运营者角色专属)— Key 池管理(添加/撤销)、成员管理(改部门:下拉可选部门或"未分配";任意金额充值,正整数校验;新注册成员默认未分配部门)、用量报表(按模型/成员)、组织管理(部门列表 + 部门增删改查 + 每月点数分配,含部门汇总统计,未分配成员不计入任何部门;保留组织设置卡片,含"关闭外部注册"企业部署开关)、平台运营(运营者 = 宿主本人,职责最小化:① 运行概览——运行状态 / 用户数 / 共享 key 数 / 交易量 / 点数流入流出;② 用户充值——按用户名 / 邮箱搜索定位,输入点数金额(可为小数)确认后余额增加永久有效点数并产生一条交易记录)

## 文件结构

Expand All @@ -56,6 +56,7 @@ ui/
- 点数规则:**1 点 ≈ 1 元人民币(CNY)**;CNY 模型直接 1 元 = 1 点,USD 模型按 ~7.2 汇率折算为人民币点数;消费点数可为小数(金额保留 2 位小数)
- 点数机制(v1.7):每日赠送 1 点(当日有效,需当天登录领取,未登录日不发不积累;注册起连续 10 个自然日),钱包显示"今日赠送 +1 · 有效期至今日 · 连续第 N 天 / 共 10 天",先扣有有效期的赠送点数;分享收益与未来充值点数永久有效;**分享收益扣 10% 平台分成(收益 = 消费点数 × 90%)**;公共版当前无充值渠道(充值/提现按钮置灰"暂不支持")
- 上架单价不由分享者手填:单价是模型×厂商的客观属性,平台按模型价格表自动计算(参考单价 = 该模型输出价 点数/1M);模型无定价数据时给出"按默认价"兜底,不报错
- 市场模型带 `multi` 标记:表示该模型配置多个上游 key → 标注「多 key · 自动故障转移」(见 `docs/architecture.md` v0.2 路由策略);消费模拟(聊天 Mock)按 输出参考价 × 0.19M tokens 计费,扣减小数点数并产生 consume 交易(US-6)
- 上架需提交 API Key(password 输入):平台加密托管、仅用于代理调用;共享列表只展示脱敏值(如 sk-****1234,前 3 后 4),不展示明文
- 删除 = 彻底下架(key 从平台移除,不可恢复);暂停 = 临时不接单,可恢复
- 全部数据为前端常量(mock),无后端、无真实调用
41 changes: 41 additions & 0 deletions ui/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,47 @@ select.input option { background: var(--bg-card); }
.wallet-note { font-size: 12px; }
.wallet-hint { color: var(--text-mute); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* ---------- 消费模拟(聊天 Mock · US-6) ---------- */

.modal-overlay {
position: fixed; inset: 0;
background: rgba(14, 17, 22, .72);
display: flex; align-items: center; justify-content: center;
z-index: 1000; padding: 24px;
}
.modal {
width: 100%; max-width: 560px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: 16px;
padding: 20px;
box-shadow: var(--shadow);
display: flex; flex-direction: column; gap: 12px;
max-height: 80vh;
}
.modal-head { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.modal-head h3 { font-size: 16px; margin: 0; }
.chat-log {
flex: 1; overflow-y: auto;
background: var(--bg-soft); border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 12px; display: flex; flex-direction: column; gap: 8px;
min-height: 180px; max-height: 40vh;
}
.chat-tip { font-size: 12px; }
.chat-msg { display: flex; }
.chat-msg.user { justify-content: flex-end; }
.chat-msg.bot { justify-content: flex-start; }
.chat-msg .bubble {
max-width: 82%;
padding: 8px 12px; border-radius: 12px; font-size: 13px;
border: 1px solid var(--border); background: var(--bg-card);
color: var(--text); white-space: pre-wrap; word-break: break-word;
}
.chat-msg.user .bubble { background: var(--accent-soft); border-color: rgba(78,205,196,.4); color: var(--accent-text); }
.chat-input-row { display: flex; gap: 10px; align-items: center; }
.chat-input-row .input { flex: 1; }

.toast {
position: fixed; bottom: 28px; left: 50%; transform: translateX(-50%);
background: var(--bg-card); border: 1px solid var(--accent);
Expand Down
40 changes: 39 additions & 1 deletion ui/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ <h3>最近交易 <span class="en">Recent transactions</span></h3>
<h3>我的共享 <span class="en">My sharings</span></h3>
<div class="mini-list" id="dash-sharings"></div>
</div>
<div class="card">
<h3>点数来源 <span class="en">Point sources</span></h3>
<div class="mini-list" id="dash-point-sources"></div>
</div>
</div>
</section>

Expand All @@ -101,7 +105,7 @@ <h2>模型市场 <span class="en">Marketplace</span></h2>
<div class="table-wrap">
<table class="table">
<thead>
<tr><th>厂商 Provider</th><th>模型 Model</th><th>输入价 /1M</th><th>输出价 /1M</th><th>上下文</th><th>可用性</th><th></th></tr>
<tr><th>厂商 Provider</th><th>模型 Model</th><th>输入价 /1M</th><th>输出价 /1M</th><th>上下文</th><th>可用性</th><th>操作 <span class="en">Use</span></th></tr>
</thead>
<tbody id="mk-body"></tbody>
</table>
Expand Down Expand Up @@ -270,6 +274,7 @@ <h2>管理视图 <span class="en">Admin</span></h2>
<button class="tab" data-admin-tab="employees">成员管理</button>
<button class="tab" data-admin-tab="usage">用量报表</button>
<button class="tab" data-admin-tab="org">组织管理</button>
<button class="tab" data-admin-tab="ops">平台运营 <span class="en">Operator</span></button>
</div>

<div class="admin-pane" data-admin-pane="keys">
Expand Down Expand Up @@ -338,11 +343,44 @@ <h3>组织设置 <span class="en">Organization settings</span></h3>
</div>
</div>
</div>

<div class="admin-pane hidden" data-admin-pane="ops">
<div class="stat-grid" id="ops-stats"></div>
<div class="card">
<h3>用户充值 <span class="en">Top up a user</span></h3>
<p class="muted">运营者 = 宿主本人(职责最小化:仅运行概览 + 充值)。按用户名 / 邮箱定位用户 → 输入点数金额 → 确认后余额增加<strong>永久有效点数</strong>并产生一条交易记录。</p>
<div class="toolbar">
<input id="ops-search" class="input" placeholder="搜索用户名 / 邮箱…">
</div>
<div class="table-wrap compact">
<table class="table">
<thead><tr><th>用户</th><th>邮箱</th><th>余额(点数)</th><th></th></tr></thead>
<tbody id="ops-body"></tbody>
</table>
</div>
</div>
</div>
</section>

</main>
</div>

<!-- 消费模拟(聊天 Mock · US-6:市场页「使用 / 消费」→ 模拟调用扣小数点数) -->
<div id="chat-modal" class="modal-overlay hidden">
<div class="modal">
<div class="modal-head">
<h3 id="chat-title">使用模型</h3>
<button type="button" class="btn btn-ghost" id="chat-close">✕</button>
</div>
<p class="muted" id="chat-meta"></p>
<div class="chat-log" id="chat-log"></div>
<div class="chat-input-row">
<input id="chat-input" class="input" placeholder="输入内容,回车发送(模拟调用)…" autocomplete="off">
<button type="button" class="btn btn-primary" id="chat-send">发送 <span class="en">(Send)</span></button>
</div>
</div>
</div>

<div id="toast" class="toast hidden"></div>

<script src="js/data.js"></script>
Expand Down
Loading
Loading