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 docs/user-stories.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

> **本文档以中文撰写**(用户故事主体、验收标准、流程说明均为中文;关键术语保留中英对照)。
>
> **v1.12(2026-08-17)· 移除「组织设置 Organization settings」表单.** 组织管理页只保留部门列表(部门 CRUD + 每月点数分配),删除底部「组织设置」表单(组织名称 / 默认成员配额 / 开关)。「关闭外部注册」属**部署配置项,不在 UI 中设置**(US-16 标注);「成员自助申请加额需管理员审批」开关移除后,申请加额流程**默认需审批**(US-20 说明)。
> **v1.11(2026-08-17)· 管理视图移除独立「Key 池」管理,统一走「上架 key」.** 管理员与普通用户一样通过**共享管理页「上架新 key」**(选厂商 → Plan → 模型、填 key、声明额度、可用时间段)配置上游 key——企业场景下管理员上架、员工消费,本质上就是 key 池;不再有独立的管理员 Key 池界面。移除 Admin「Key 池」tab(成员管理 / 用量报表 / 组织管理 / 平台运营保留)。「Key 池」保留为**数据层概念**(平台持有的上游 key 集合,见 docs/architecture.md 4.2)。更新 US-12 / 企业流程 / 对齐表。
> **v1.10(2026-08-17)· 上架表单"可用时间段"结构化.** 上架 key 的可用时间段改为**正式字段**(星期多选 + 起止时间,可多选;留空 = 全天不限),后端可解析生效;**备注只作纯文本**,不承载任何逻辑。共享列表展示可用时间段(如「周一~周五 09:00-18:00」),未设置显示「全天」。更新 US-8 / US-9 AC。
> **v1.9(2026-08-17)· 上架流程改为「厂商 → Plan → 模型」.** 分享者上架时选择的是**厂商的 Plan**(而不是厂商/模型):大多数分享的是自己的 Plan 订阅(如阿里 Token Plan、Kimi Code),同一厂商不同 Plan 的 Base URL 可能不同。上架表单改为三级联动「选厂商 → 选 Plan → 选该 Plan 支持的模型」,Plan 下拉中「API(按量)」代表按量计价的 key,其余为订阅 Plan;内置国内已知 Plan 清单(阿里云百炼 / 智谱 / 火山方舟 / Kimi 月之暗面 / MiniMax / DeepSeek,每家至少一个「API(按量)」项)。共享列表展示「厂商 · Plan / 模型」。更新 US-8 / US-9 / 核心机制表「上架 Listing」行。
Expand Down Expand Up @@ -243,7 +244,7 @@ flowchart LR
- **US-15** 作为企业管理员,我希望按模型与成员查看用量报表,以便控制成本、发现重度用户。
- AC:用量 Tab 显示按模型、按成员的点数消费;数字与账本一致。
- **US-16** 作为企业管理员,我希望可选地关闭外部注册,以便企业部署保持仅内网。
- AC:组织设置含「关闭外部注册(企业内网部署)」开关;开启后仅受邀 / 已有账号可登录。
- AC:**部署配置项,不在 UI 中设置**(企业内网部署时在部署配置中关闭外部注册);开启后仅受邀 / 已有账号可登录。

#### 关键流程(Key Flow)— J-3: key 池 → 员工使用模型

Expand Down Expand Up @@ -284,7 +285,7 @@ flowchart LR
- **US-19** 作为企业成员,我希望查看我的交易记录,以便知道何时花了多少。
- AC:交易记录页列出消费记录(及管理员充值调整)带时间戳。
- **US-20** 作为企业成员,我希望余额低时申请更多点数,以便继续工作。
- AC:低余额通知(设置开关);申请流程(按原型:组织设置中「成员自助申请加额需管理员审批」开关);申请到达管理员。
- AC:申请流程(默认需管理员审批——原「需审批」开关随组织设置表单移除);申请到达管理员。

#### 关键流程(Key Flow)— J-4: 登录 → 消费 → 申请更多点数

Expand Down Expand Up @@ -331,7 +332,7 @@ flowchart LR
| E-03 | **部门被删除**(Department deleted) | 【企业】 | 被删部门的成员变为**未分配**;不计入任何部门汇总;管理员可重新分配;其点数余额不受影响。 |
| E-04 | **点数不足**(Insufficient points) | 【通用】 | 任何上游调用前先阻断请求;清晰提示当前余额与所需点数;不允许负余额;引导用户充值 / 申请更多。 |
| E-05 | **API Key 泄露 / 失陷**(API key leak / compromise) | 【通用】 | 设置:立即删除 key(带确认,「删除后该 key 立即失效」);平台签发的 key 可撤销且即时生效;鼓励用户轮换;上游 key 在 UI 任何位置都不明文展示。 |
| E-06 | **新成员未分配**(New member, no department) | 【企业】 | 新注册默认**未分配**;仍获得默认成员配额(按组织设置);管理员之后分配。 |
| E-06 | **新成员未分配**(New member, no department) | 【企业】 | 新注册默认**未分配**;仍获得默认成员配额;管理员之后分配。 |
| E-07 | **模型无定价数据**(Model with no pricing data) | 【公共】 | 上架仍成功,使用「默认价」兜底;市场显示该价格;后续迭代可补充定价。 |
| E-08 | **非法充值金额**(Top-up with invalid amount) | 【企业】 | 管理员任意金额充值校验**正整数**;零 / 负 / 非数字输入被拒绝并提示。 |
| E-09 | **剪贴板受限(file://)**(Clipboard restricted) | 【通用】 | 一键复制降级为选中 key + Ctrl/Cmd+C 指引,用户仍能拿到完整 key。 |
Expand Down
6 changes: 3 additions & 3 deletions ui/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
- **企业版**:部署在企业内网,管理员(IT)把采购的 key 放进池子、给成员分配点数;
- 两者的**功能集合完全相同**(市场 / 共享 / 钱包 / 交易 / 设置),不存在"企业版专属功能";
- 差异只在**谁会主动分享**(公共版人人可分享;企业版只有管理员有动力采购/分享 key);
- **角色是权限差异,不是产品差异**:管理员额外拥有"管理视图"(key 池 / 成员点数 / 用量报表 / 组织设置),普通用户没有;员工就是普通用户,用同一套界面。
- **角色是权限差异,不是产品差异**:管理员额外拥有"管理视图"(成员点数 / 用量报表 / 组织管理 / 平台运营),普通用户没有;员工就是普通用户,用同一套界面。

本原型据此实现:单一登录入口(角色由账号决定),一套导航(仪表盘 / 模型市场 / 共享管理 / 钱包 / 交易记录 / 设置 + 管理员角色视图)。

Expand Down Expand Up @@ -40,10 +40,10 @@ python3 -m http.server 8000 --directory ui
1. 仪表盘 Dashboard — 点数余额、本月用量、共享收益、**本月点数变化(近 1 月按类型汇总收支:赠送/过期/收益/消费/充值/提现 + 净变化,取代静态"点数来源"分组)**
2. 模型市场 Marketplace — 模型浏览、搜索、厂商筛选、排序(按价格/上下文);可用性标注「多 key · 自动故障转移」(该模型配置多个上游 key,架构 v0.2 路由策略);每行「使用 / 消费」入口 → 聊天 Mock 模拟调用(按模型输出参考价扣小数点数,如 -0.38 点,产生消费交易;余额不足时阻断并提示)
3. 共享管理 Sharing — 默认只显示统计 + 我的共享列表(key 脱敏展示,可暂停/恢复/重新上架/彻底删除;列表展示「厂商 · Plan / 模型 · 可用时间段」,如「智谱 · GLM Coding Plan / glm-5.2 · 周一~周五 09:00-18:00」,未设置显示「全天」);点击"+ 添加 / 上架新 key"展开上架表单(**三级联动:厂商 → Plan → 模型**——内置国内已知 Plan 清单(阿里云百炼 / 智谱 / 火山方舟 / Kimi / MiniMax / DeepSeek,每家含「API(按量)」= 按量计价的 key),选 Plan 后显示 key 前缀 / 专属端点提示;**可用时间段为结构化字段**:星期多选 chips + 起止时间(留空 = 全天不限),备注仅纯文本;须填 API Key,平台加密托管;分享者只填声明额度,单价由平台按模型定价自动计算并展示参考价),提交成功或取消后自动收起
4. 钱包 Wallet — 点数余额、**本月点数变化(近 1 月按类型汇总收支 + 净变化,与仪表盘一致)**、**充值入口(US-4:模拟流程——输入点数 → 余额增加 → topup 交易记录;文案注明"演示,真实支付后续接入";提现仍 disabled)**、**申请加额(US-20:企业成员余额低时申请更多点数 → 提交后等待管理员审批,与组织设置开关联动)**;收支明细已去重,统一到【交易记录】(页内提供跳转提示)
4. 钱包 Wallet — 点数余额、**本月点数变化(近 1 月按类型汇总收支 + 净变化,与仪表盘一致)**、**充值入口(US-4:模拟流程——输入点数 → 余额增加 → topup 交易记录;文案注明"演示,真实支付后续接入";提现仍 disabled)**、**申请加额(US-20:企业成员余额低时申请更多点数 → 提交后等待管理员审批,默认需审批)**;收支明细已去重,统一到【交易记录】(页内提供跳转提示)
5. 交易记录 Transactions — 消费/收益/充值/提现/赠送(gift)唯一明细入口,Tab 筛选 + MRT 风格表格(列排序/列筛选/分页,与 Tab 叠加生效)
6. 设置 Settings — 账户、API Key 管理(完整增删改查:生成带名字、改名、删除需确认「删除后该 key 立即失效」、按名字搜索、一键复制完整 key——列表脱敏展示 atk_live_****xxxx,复制为完整值;file:// 下 clipboard API 受限时降级为选中+Ctrl/Cmd+C)、通知、偏好
7. 管理视图 Admin(管理员 / 运营者角色专属)— 成员管理(改部门:下拉可选部门或"未分配";任意金额充值,正整数校验;新注册成员默认未分配部门;**加额申请审批(US-20:待审批列表 → 批准=成员余额+申请点数 / 驳回)**)、用量报表(按模型/成员)、组织管理(部门列表 + 部门增删改查 + 每月点数分配,含部门汇总统计,未分配成员不计入任何部门;保留组织设置卡片,含"关闭外部注册"企业部署开关与"成员自助申请加额需管理员审批"开关——关掉后成员申请直接生效)、平台运营(运营者 = 宿主本人,职责最小化:① 运行概览——运行状态 / 用户数 / 共享 key 数 / 交易量 / 点数流入流出;② 用户充值——按用户名 / 邮箱搜索定位,输入点数金额(可为小数)确认后余额增加永久有效点数并产生一条交易记录)。**无独立 Key 池管理**——管理员与普通用户一样通过共享管理页「上架 key」配置上游 key(共享列表即 key 池视图,可暂停/删除)
7. 管理视图 Admin(管理员 / 运营者角色专属)— 成员管理(改部门:下拉可选部门或"未分配";任意金额充值,正整数校验;新注册成员默认未分配部门;**加额申请审批(US-20:待审批列表 → 批准=成员余额+申请点数 / 驳回;申请默认需审批)**)、用量报表(按模型/成员)、组织管理(部门列表 + 部门增删改查 + 每月点数分配,含部门汇总统计,未分配成员不计入任何部门;**无「组织设置」表单**——组织名称 / 默认成员配额 / 开关均移除,"关闭外部注册"为部署配置项不在 UI 中)、平台运营(运营者 = 宿主本人,职责最小化:① 运行概览——运行状态 / 用户数 / 共享 key 数 / 交易量 / 点数流入流出;② 用户充值——按用户名 / 邮箱搜索定位,输入点数金额(可为小数)确认后余额增加永久有效点数并产生一条交易记录)。**无独立 Key 池管理**——管理员与普通用户一样通过共享管理页「上架 key」配置上游 key(共享列表即 key 池视图,可暂停/删除)

## 文件结构

Expand Down
10 changes: 0 additions & 10 deletions ui/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -342,16 +342,6 @@ <h3>部门列表 <span class="en">Departments</span></h3>
</table>
</div>
</div>
<div class="card">
<h3>组织设置 <span class="en">Organization settings</span></h3>
<div class="form">
<label>组织名称 <input class="input" value="示例科技 Example Tech"></label>
<label>默认成员配额(点数/月)<input class="input" type="number" value="20000"></label>
<label class="check"><input type="checkbox" id="org-approval-toggle" checked> 成员自助申请加额需管理员审批</label>
<label class="check"><input type="checkbox"> 关闭外部注册(企业内网部署)</label>
<button class="btn btn-primary">保存设置 <span class="en">(Save)</span></button>
</div>
</div>
</div>

<div class="admin-pane hidden" data-admin-pane="ops">
Expand Down
25 changes: 6 additions & 19 deletions ui/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -413,25 +413,12 @@
const amt = Number(rawAmt);
if (!rawAmt || !Number.isInteger(amt) || amt <= 0) { toast("请输入正整数申请点数(未生效)"); return; }
if (!reason) { toast("请填写申请原因(未生效)"); return; }
// 与组织设置「成员自助申请加额需管理员审批」开关联动
const needApproval = $("#org-approval-toggle") && $("#org-approval-toggle").checked;
if (needApproval) {
D.RAISE_REQUESTS.unshift({
id: Date.now(), user: D.USER.name, email: D.USER.email, amount: amt, reason, status: "pending", time: nowTime(),
});
closeRaise();
toast("已提交申请 +" + D.fmt(amt) + " 点,等待管理员审批");
} else {
D.USER.balance = Math.round((D.USER.balance + amt) * 100) / 100;
D.TRANSACTIONS.unshift({
id: Date.now(), time: nowTime(), type: "topup", partner: "管理员",
detail: "加额 · 申请直接生效(审批开关已关闭)", tokens: "—", pts: +amt, status: "成功",
});
$("#side-balance").textContent = D.fmt(D.USER.balance);
renderWallet();
closeRaise();
toast("审批开关已关闭,申请直接生效 +" + D.fmt(amt) + " 点");
}
// 加额申请默认需管理员审批(原「需审批」开关随组织设置表单移除,见 rant 10:59:23)
D.RAISE_REQUESTS.unshift({
id: Date.now(), user: D.USER.name, email: D.USER.email, amount: amt, reason, status: "pending", time: nowTime(),
});
closeRaise();
toast("已提交申请 +" + D.fmt(amt) + " 点,等待管理员审批");
}

/* --- 管理员:加额申请审批(US-20) --- */
Expand Down
Loading