Commit Graph

462 Commits

Author SHA1 Message Date
shaw
a3dacbccd0 refactor: 编辑账户时隐藏过期时间表单,使用独立编辑弹窗
## 问题分析
编辑账户时显示过期时间表单存在以下问题:

1. **相对时间 vs 绝对时间冲突**:
   - 下拉框提供相对时间选项(30天、90天等)
   - 实际存储的是绝对时间(如 2025-02-15)
   - 过了1天后,无法准确对应原来的"30天"选项

2. **用户体验混乱**:
   - 设置了30天过期,编辑时下拉框显示"永不过期"
   - 无法准确回显用户当初的选择
   - 容易误导用户

3. **功能重复**:
   - 已有独立的AccountExpiryEditModal弹窗专门编辑过期时间
   - 该弹窗使用绝对时间显示,更清晰准确

## 解决方案
仅在编辑模式下隐藏过期时间表单:
- 创建账户时:保留过期时间表单(相对时间设置合理)
- 编辑账户时:隐藏过期时间表单,引导用户使用独立的编辑弹窗

## 实现细节
在两处过期时间表单添加 v-if="!isEdit" 条件:
- 第645行:OAuth添加方式的表单
- 第2116行:手动添加方式的表单

## 用户流程改进
- 创建账户:可以快速选择相对过期时间(30天、90天等)
- 编辑账户:在列表中点击"编辑到期时间"按钮 → 使用独立弹窗编辑
- 弹窗优势:显示当前绝对过期时间、支持快捷延期、实时预览新时间

文件: web/admin-spa/src/components/accounts/AccountForm.vue:645,2116
2025-10-12 14:04:16 +08:00
shaw
62e457932e fix: 修复账户编辑时过期时间不回显的问题
## 问题描述
在账户编辑页面,虽然过期时间已保存并在列表中正确显示,但点击编辑时:
- expireDuration 和 customExpireDate 字段为空
- 导致过期时间选择器显示为空白状态

## 根本原因
AccountForm.vue 的 form 初始化时:
- expiresAt 正确读取了 props.account?.expiresAt
- 但 expireDuration 和 customExpireDate 都初始化为空字符串
- 缺少从 expiresAt 反向初始化这两个字段的逻辑

## 修复方案
修改 form 初始化逻辑(第 3443-3457 行):
- expireDuration: 如果存在 expiresAt,设置为 'custom'
- customExpireDate: 如果存在 expiresAt,转换为 datetime-local 格式 (YYYY-MM-DDTHH:mm)
- expiresAt: 保持原有逻辑不变

## 技术细节
使用 IIFE (立即执行函数) 在 reactive 对象初始化时计算初始值:
```javascript
expireDuration: (() => {
  if (props.account?.expiresAt) return 'custom'
  return ''
})()
```

## 测试验证
-  编辑已设置过期时间的账户,过期时间正确回显
-  编辑未设置过期时间的账户,显示为永不过期
-  AccountExpiryEditModal 组件已有正确的初始化逻辑,无需修改

文件: web/admin-spa/src/components/accounts/AccountForm.vue:3443-3457
2025-10-12 13:56:26 +08:00
shaw
a84f344df6 Merge PR #541: 添加账户订阅到期时间管理功能 + 修复核心过期检查逻辑
## 原PR功能
-  后端添加subscriptionExpiresAt字段支持
-  前端提供到期时间设置界面(快捷选项 + 自定义日期)
-  账户列表显示到期状态(已过期🔴/即将过期🟠/永不过期)
-  新增AccountExpiryEditModal.vue编辑弹窗组件
-  支持创建和更新账户时设置到期时间
-  完整支持暗黑模式

## 🔧 关键修复(本次提交)
原PR缺少核心过期检查逻辑,过期账户仍会被调度使用。本次合并时添加了:

1. **新增isAccountNotExpired()方法**:
   - 检查账户subscriptionExpiresAt字段
   - 未设置过期时间视为永不过期
   - 添加debug日志记录过期账户

2. **在selectAvailableAccount()中添加过期检查**:
   - 过滤逻辑中集成this.isAccountNotExpired(account)
   - 确保过期账户不被选择

3. **在selectAccountForApiKey()中添加过期检查**:
   - 绑定账户检查中添加过期验证
   - 共享池过滤中添加过期验证

## 🗑️ 清理工作
- 移除了不应提交的account_expire_feature.md评审文档(756行)

## 技术细节
- API层使用expiresAt,存储层使用subscriptionExpiresAt
- 存储格式:ISO 8601 (UTC)
- 空值表示:null表示永不过期
- 时区处理:后端UTC,前端自动转换本地时区

作者: mrlitong (原PR) + Claude Code (修复)
PR: https://github.com/Wei-Shaw/claude-relay-service/pull/541
2025-10-12 13:42:57 +08:00
shaw
8e415f8ff8 Merge PR #545: 常用模型增加deepseek-chat;修复修改时默认选择白名单
- Claude Console类型账户默认白名单模型增加deepseek-chat模型
- 修复白名单模式下的初始化逻辑:
  * 白名单模式:正确设置allowedModels用于显示勾选的模型
  * 同时保留modelMappings以便用户切换到映射模式时有初始数据
  * 映射模式:只设置modelMappings,不填充allowedModels
- 增加代码注释,清晰说明不同模式的数据设置逻辑

作者: looksgood
PR: https://github.com/Wei-Shaw/claude-relay-service/pull/545
2025-10-12 13:34:10 +08:00
jft0m
44c6be129b Merge branch 'Wei-Shaw:main' into main 2025-10-12 09:28:12 +08:00
litongtongxue
c8c337099e Merge upstream/main into feature/account-expiry-management
解决与 upstream/main 的代码冲突:
- 保留账户到期时间 (expiresAt) 功能
- 采用 buildProxyPayload() 函数重构代理配置
- 同步最新的 Droid 平台功能和修复

主要改动:
- AccountForm.vue: 整合到期时间字段和新的 proxy 处理方式
- 合并 upstream 的 Droid 多 API Key 支持等新特性

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-12 00:55:25 +08:00
shaw
26894f485b feat: droid账号增加apikey数量显示 2025-10-11 23:05:48 +08:00
shaw
0b2610842a feat: droid apikey异常自动移除 2025-10-11 22:39:41 +08:00
shaw
53dee11a10 feat: droid的apikey模式适配多种更新方式 2025-10-11 22:15:38 +08:00
liangjie.wanglj
c81ec34ad8 常用模型增加deepseek-chat;修复修改时默认选择白名单 2025-10-11 18:53:41 +08:00
shaw
4a925e2f8b docs: 更新droid部分内容 2025-10-11 12:37:37 +08:00
shaw
a6f5876eca fix: 修复droid类型账号类型显示 2025-10-11 11:48:20 +08:00
shaw
6c2ef2eef3 fix: 修复droid账号更新丢失apikey的问题 2025-10-11 11:23:24 +08:00
shaw
19fa518e65 fix: 修复droid追加和代理代理IP提交异常的问题 2025-10-11 10:50:26 +08:00
litongtongxue
a82dcebd7b feat: 添加账户订阅到期时间管理功能
## 新增功能
- 支持为 Claude 账户设置订阅到期时间
- 前端提供到期时间选择器(快捷选项 + 自定义日期)
- 账户列表显示到期状态(已过期/即将过期/永不过期)
- 新增独立的到期时间编辑弹窗组件

## 技术变更
- 后端新增 subscriptionExpiresAt 字段存储
- 前端使用 expiresAt 字段进行交互
- 支持创建、编辑、显示完整流程

## 包含文件
- src/routes/admin.js: POST/PUT 端点支持 expiresAt 字段
- src/services/claudeAccountService.js: 存储和返回到期时间
- web/admin-spa/src/components/accounts/AccountForm.vue: 表单添加到期时间选择
- web/admin-spa/src/views/AccountsView.vue: 列表显示和编辑功能
- web/admin-spa/src/components/accounts/AccountExpiryEditModal.vue: 新增编辑弹窗
- account_expire_feature.md: 代码评审报告和优化建议

## 注意事项
⚠️ 本次提交包含初步实现,详细的优化建议请查看 account_expire_feature.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-11 01:05:21 +08:00
jft0m
1c80970aef Merge branch 'Wei-Shaw:main' into main 2025-10-10 21:37:18 +08:00
shaw
c9ad287587 docs: 更新droid教程部分 2025-10-10 21:06:02 +08:00
shaw
14e54c0473 docs: 更新Droid 使用教程 2025-10-10 17:34:53 +08:00
shaw
5165d6c536 Merge branch 'fix/tutorial-dark-theme' into merge-pr523 2025-10-10 16:38:45 +08:00
shaw
e209a23ae7 Merge branch 'pr-532' into merge-pr523 2025-10-10 16:37:35 +08:00
shaw
b28631e737 Merge branch 'pr-523' into merge-pr523 2025-10-10 16:34:29 +08:00
shaw
fad9e52c98 feat: Droid平台支持多apikey添加 2025-10-10 16:09:15 +08:00
shaw
1811290c0b feat: 优化droid类型账号oauth流程 2025-10-10 15:36:50 +08:00
shaw
42db271848 feat: droid平台账户数据统计及调度能力 2025-10-10 15:13:45 +08:00
litong.41
6b1062caa6 feat: 优化API Key复制功能,支持一键复制环境变量配置
- 修改"复制 API Key"按钮为"复制配置信息"
- 复制内容包含 ANTHROPIC_BASE_URL 和 ANTHROPIC_AUTH_TOKEN
- 用户无需手动拼接,可直接粘贴使用
- 支持自定义 BASE_URL 配置(通过 VITE_API_BASE_PREFIX 环境变量)
- 自动从浏览器地址获取 BASE_URL(无自定义配置时)
2025-10-10 14:27:16 +08:00
litongtongxue
75804f4c2e fix(web): 修复使用教程页面暗色主题样式问题
- 优化按钮激活态在暗色模式下的视觉效果
- 修复所有提示框(info/success/warning)的暗色样式
- 增强文本对比度,提升可读性(标题/正文/辅助文本)
- 改进代码块在暗色模式下的边框和背景
- 修复 FAQ 折叠面板的暗色主题适配
- 保持玻璃态效果和响应式设计

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-10 02:20:22 +08:00
shaw
2fc84a6aca feat: 新增Droid cli支持 2025-10-09 23:05:09 +08:00
shaw
4de2ea3d17 feat: api-keys页面增加窗口限制进度显示 2025-10-09 08:57:05 +08:00
於林涛
705bd7611c Merge remote-tracking branch 'upstream/main'
# Conflicts:
#	src/routes/api.js
2025-10-08 19:34:17 +08:00
sususu98
786a62e2e3 feat(账户表单): 添加模型限制模式切换功能
支持在白名单模式和映射模式之间切换,白名单模式允许通过复选框选择支持的模型,映射模式保留原有的模型映射功能

暂时没有限制专属绑定场景
2025-10-08 17:41:28 +08:00
shaw
9209f10fc3 Merge branch 'dev' of https://github.com/Wei-Shaw/claude-relay-service into dev 2025-10-07 15:25:26 +08:00
Wesley Liddick
642ea1a33a Merge pull request #511 from sususu98/dev
fix: 用户登录接口在开发环境 404 错误
2025-10-07 15:20:42 +08:00
litongtongxue
cac1b90d23 chore: 格式化代码符合 Prettier 规范 2025-10-07 14:44:25 +08:00
litongtongxue
454f366c50 fix: 修复日均费用计算逻辑
问题描述:
- 之前的日均费用计算是基于固定的30天窗口,而不是账户实际使用的天数
- 这导致新创建的账户显示的日均费用不准确

修复方案:
- 获取账户的创建时间(createdAt字段)
- 计算从账户创建到当前时间的实际天数
- 使用实际天数来计算日均费用(30天总费用 / 实际天数)
- 在前端显示实际使用天数,让用户了解计算基准

修改内容:
- 后端:在 /accounts/:accountId/usage-history 端点中添加实际天数计算逻辑
- 前端:在详情弹窗中显示基于实际使用天数的提示信息

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-07 11:27:29 +08:00
jft0m
5d7225b2eb feat: 添加 Opus 限流状态显示
- 在账户列表中显示 Opus 限流状态徽章
- 显示限流剩余时间(天/小时)
- 后端 API 添加 opusRateLimitedAt 和 opusRateLimitEndAt 字段
- 优化徽章样式,防止文字溢出
2025-10-06 15:49:28 +00:00
shaw
d44582dc31 feat: 适配claude新opus周限规则 2025-10-04 10:49:40 +08:00
sususu98
57e75cd526 fix: 用户登录接口在开发环境 404 错误
修复 user.js 中未使用 API_PREFIX 导致的路径问题。
  现在开发环境正确使用 /webapi 前缀进行代理转发。
2025-10-03 22:34:31 +08:00
wfunc
a3666e3a3e feat: add rate limit recovery webhook notifications
添加限流恢复的 webhook 通知功能,当账户从限流状态自动恢复时发送通知。

主要改进:

1. **新增通知类型** (webhookConfigService.js)
   - 添加 `rateLimitRecovery` 通知类型
   - 在配置获取和保存时自动合并默认通知类型
   - 确保新增的通知类型有默认值

2. **增强限流清理服务** (rateLimitCleanupService.js)
   - 改进自动停止账户的检测逻辑
   - 在 `finally` 块中确保 `clearedAccounts` 列表被重置,避免重复通知
   - 对自动停止的账户显式调用 `removeAccountRateLimit`
   - 为 Claude 和 Claude Console 账户添加 `autoStopped` 和 `needsAutoStopRecovery` 检测

3. **改进 Claude Console 限流移除** (claudeConsoleAccountService.js)
   - 检测并恢复因自动停止而禁用调度的账户
   - 清理过期的 `rateLimitAutoStopped` 标志
   - 增加详细的日志记录

4. **前端 UI 支持** (SettingsView.vue)
   - 在 Webhook 设置中添加"限流恢复"通知类型选项
   - 更新默认通知类型配置

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-02 23:54:30 +08:00
shaw
fe894cc07a docs: issue-501 2025-10-02 19:25:59 +08:00
shaw
5024628fa6 Merge branch 'pr-503' into dev 2025-10-02 18:04:11 +08:00
duyaoguang
7fd5224e0a fix: 🐛 fee calc fix 2025-10-02 13:09:19 +08:00
iaineng
e88f07ca92 feat(ui): add OAuth usage display alongside Setup Token
Add OAuth usage visualization for Claude OAuth accounts while maintaining
existing Setup Token session window display. Accounts show different UI
based on authorization type detected via scopes.

Changes:
- Add loadClaudeUsage() for async OAuth usage data loading
- Add isClaudeOAuth() to detect auth type (checks user:profile + user:inference scopes)
- Add OAuth helpers: formatClaudeUsagePercent, getClaudeUsageWidth,
  getClaudeUsageBarClass, formatClaudeRemaining
- Display three OAuth windows (5h, 7d, 7d-Opus) for OAuth accounts
- Maintain original session window display for Setup Token accounts
- Color-coded progress bars (blue < 60%, yellow 60-90%, red >= 90%)
- Update tooltip with OAuth documentation
- Remove duplicate Claude fallback branch
- Apply to desktop and mobile views
2025-09-30 22:52:08 +08:00
shaw
fcf54565ec chore: 其他文件修改
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-30 11:25:43 +08:00
shaw
c62b397fde docs: 更新vscode使用参数配置 [skip ci] 2025-09-30 09:31:02 +08:00
shaw
aca2b1cccb feat: 账号列表支持批量删除 2025-09-28 21:43:57 +08:00
shaw
323f3ab6c4 style: api-stats布局优化 2025-09-28 15:43:37 +08:00
shaw
5e015e87e0 style: 优化api-stats布局 2025-09-28 14:54:24 +08:00
shaw
b123cc35c1 feat: api-stats页面查询专属账号会话窗口 2025-09-28 14:36:38 +08:00
shaw
a12e076413 fix: 修复账号筛选平台是oai显示异常 2025-09-28 11:47:05 +08:00
shaw
3077c3d789 docs: codex配置说明优化 2025-09-28 10:53:57 +08:00