IanShaw027
|
e847cfc8a0
|
fix(frontend): 优化新手引导交互体验
1. 移除重复的"不再提示"按钮
- 只保留右上角的关闭按钮(X)
- 简化用户操作,避免混淆
2. 移除退出确认框
- 点击关闭按钮直接退出并标记为已看过
- ESC 键也直接退出,不再弹出确认框
- 提升用户体验,减少打扰
3. 修复 Select 下拉菜单被遮挡问题
- 增加被高亮元素的下拉菜单 z-index
- 确保下拉菜单在引导 popover 之上显示
- 解决步骤 5/21 (平台选择) 无法操作的问题
|
2025-12-29 16:04:17 +08:00 |
|
IanShaw027
|
337d9ad755
|
fix(frontend): 简易模式下禁用新手引导并优化显示逻辑
修复 Gemini 审查发现的潜在问题,并增强新手引导功能:
1. 简易模式下完全禁用新手引导
- useOnboardingTour: 添加 isSimpleMode 判断,简易模式下不自动启动
- 只在标准模式的管理员第一次加载时自动弹出
2. 动态过滤简易模式相关步骤
- steps.ts: getAdminSteps 添加 isSimpleMode 参数
- 简易模式下自动过滤分组管理和账号分组选择步骤
- 避免引导找不到被隐藏的元素
3. 优化引导按钮显示条件
- AppHeader: 添加 showOnboardingButton computed
- 只在标准模式的管理员下显示"重新开始引导"按钮
- 非管理员或简易模式下不显示按钮
4. 确保引导只在首次自动弹出
- 关闭后不再自动出现
- 只能从右上角手动重新打开
|
2025-12-29 15:43:37 +08:00 |
|
IanShaw027
|
dd247e55e9
|
feat(frontend): 实现新手引导功能
- 添加 Guide 组件和引导步骤配置
- 实现 useOnboardingTour 和 useTourStepDescription composables
- 添加 onboarding store 管理引导状态
- 更新多个视图和组件以支持引导功能
- 添加国际化支持(中英文)
- 删除旧的实现指南文档
|
2025-12-29 15:43:24 +08:00 |
|
shaw
|
c01db6b180
|
fix: 修复快捷添加代理IP弹窗关闭的bug
|
2025-12-29 09:30:32 +08:00 |
|
shaw
|
32b4b139a4
|
fix: 修复因移除 SimpleMode 导致的测试编译错误
- 移除 api_contract_test.go 中的 SettingKeySimpleMode 引用
- 移除期望响应中的 simple_mode 字段
- 修复 NewSettingHandler 调用参数数量
|
2025-12-29 09:24:21 +08:00 |
|
shaw
|
31fef105c7
|
refactor: 移除旧版数据库配置的简易模式实现
移除与 PR #66 冲突的旧版简易模式实现(commit 7d4b7de)。
新版简易模式通过 run_mode 配置文件/环境变量控制,无需数据库设置。
后端变更:
- 移除 SettingKeySimpleMode 常量
- 移除 SystemSettings/PublicSettings 中的 SimpleMode 字段
- 移除 setting_handler 中的简易模式切换逻辑
- 移除 userService 依赖(不再需要自动设置管理员并发数)
前端变更:
- 移除 appStore.simpleMode 状态
- 移除设置页面的"使用模式"设置区块
- 移除 GroupsView 中的简易模式相关逻辑
- 移除相关国际化文案
|
2025-12-29 09:17:00 +08:00 |
|
shaw
|
1f5ced7069
|
fix(frontend): resolve TypeScript errors in simple mode implementation
- Remove unused simpleMode variable in AppSidebar.vue
- Add run_mode to AuthResponse.user type definition
|
2025-12-29 08:51:57 +08:00 |
|
IanShaw027
|
2a70870469
|
fix(简易模式): 统一前端状态管理,修复路由守卫失效问题
**问题**:
1. login/register 未处理 run_mode,导致 authStore.runMode 不更新
2. 侧边栏使用 simpleMode.value,与路由守卫的 authStore.isSimpleMode 不一致
**修复**:
1. 在 login() 和 register() 中提取并设置 run_mode
2. 统一侧边栏使用 authStore.isSimpleMode
**影响**:
- 路由守卫现在可以正确工作
- 前端UI状态与后端配置保持一致
- 登录/注册后立即生效,无需刷新
|
2025-12-29 03:46:47 +08:00 |
|
IanShaw027
|
9e9811cbb3
|
test: 修复分组测试以适配默认分组
由于简易模式会自动创建3个默认分组(anthropic-default, openai-default, gemini-default),
需要更新测试用例的预期数量:
- TestList: 期望5个分组(3个默认 + 2个测试)
- TestListActive: 期望4个活跃分组(3个默认 + 1个测试)
- TestListActiveByPlatform: 期望2个Anthropic分组(1个默认 + 1个测试)
- TestListWithFilters_Platform: 期望2个OpenAI分组(1个默认 + 1个测试)
|
2025-12-29 03:31:03 +08:00 |
|
IanShaw027
|
a5d6035c28
|
fix(frontend): 修复所有页面的UTC时区日期问题并优化初始化
**问题**:
- 使用 toISOString() 格式化日期导致UTC时区问题
- 在UTC+8时区凌晨时,日期会显示为前一天
- 日期范围初始化在 onMounted 中导致重复渲染和请求
**修复**:
- 统一使用本地时区格式化日期
- 在变量声明时就初始化日期范围,避免延迟初始化
- 移除 initializeDateRange() 函数,直接在声明时设置正确值
- 添加 formatLocalDate() 辅助函数统一日期格式化逻辑
**影响范围**:
- 用户仪表盘 (DashboardView)
- 管理员仪表盘 (admin/DashboardView)
- 用户使用记录 (UsageView)
- 管理员使用记录 (admin/UsageView)
**效果**:
- 日期范围正确包含当天数据
- 避免页面加载时的重复请求
- 改善用户体验,减少不必要的重新渲染
|
2025-12-29 03:24:15 +08:00 |
|
IanShaw027
|
ecfad788d9
|
feat(全栈): 实现简易模式核心功能
**功能概述**:
实现简易模式(Simple Mode),为个人用户和小团队提供简化的使用体验,隐藏复杂的分组、订阅、配额等概念。
**后端改动**:
1. 配置系统
- 新增 run_mode 配置项(standard/simple)
- 支持环境变量 RUN_MODE
- 默认值为 standard
2. 数据库初始化
- 自动创建3个默认分组:anthropic-default、openai-default、gemini-default
- 默认分组配置:无并发限制、active状态、非独占
- 幂等性保证:重复启动不会重复创建
3. 账号管理
- 创建账号时自动绑定对应平台的默认分组
- 如果未指定分组,自动查找并绑定默认分组
**前端改动**:
1. 状态管理
- authStore 新增 isSimpleMode 计算属性
- 从后端API获取并同步运行模式
2. UI隐藏
- 侧边栏:隐藏分组管理、订阅管理、兑换码菜单
- 账号管理页面:隐藏分组列
- 创建/编辑账号对话框:隐藏分组选择器
3. 路由守卫
- 限制访问分组、订阅、兑换码相关页面
- 访问受限页面时自动重定向到仪表板
**配置示例**:
```yaml
run_mode: simple
run_mode: standard
```
**影响范围**:
- 后端:配置、数据库迁移、账号服务
- 前端:认证状态、路由、UI组件
- 部署:配置文件示例
**兼容性**:
- 简易模式和标准模式可无缝切换
- 不需要数据迁移
- 现有数据不受影响
|
2025-12-29 03:24:15 +08:00 |
|
shaw
|
e247be6ead
|
fix(frontend): 修复账号管理页面 API Key 类型的提示文案错误
- 添加 OpenAI/Gemini 平台的 baseUrlHint 和 apiKeyHint 国际化文案
- 修改 CreateAccountModal 和 EditAccountModal 根据平台显示正确提示
- 将重复的平台判断逻辑抽取为 computed 属性,优化代码结构
|
2025-12-28 23:24:46 +08:00 |
|
shaw
|
30b95cf5ce
|
fix(usage): 分离 API 响应和窗口统计缓存,修复 5h 窗口未激活时的显示 bug
问题:
1. WindowStats 与 API 响应一起缓存 10 分钟,导致费用数据更新延迟
2. 当 5h 窗口未激活(ResetsAt 为空)时,FiveHour 为 nil,导致所有窗口的 WindowStats 都无法显示
修复:
- 分离缓存:API 响应缓存 10 分钟,窗口统计独立缓存 1 分钟
- RemainingSeconds 每次请求时实时计算
- FiveHour 对象始终创建(即使 ResetsAt 为空)
- addWindowStats 增强防护,支持 FiveHour 为 nil 时仍处理其他窗口
|
2025-12-28 23:12:44 +08:00 |
|
shaw
|
25b8a22648
|
fix(test): 测试用例添加 simple_mode 字段
API 响应新增 simple_mode 字段,同步更新测试期望值
|
2025-12-28 22:51:22 +08:00 |
|
shaw
|
0084da9ca5
|
fix: 修复 NewSettingHandler 参数不足导致的编译错误
- 测试文件添加第三个参数 userService(nil)
- Handler 添加 userService 空指针检查,防止测试环境 panic
|
2025-12-28 22:45:13 +08:00 |
|
shaw
|
31d4c1d2fe
|
fix(frontend): 修复 Select 下拉菜单选项文本被截断的问题
- 修改下拉框宽度策略为 min-w-full w-max max-w-[300px],允许自动扩展
- 添加 left-0 确保下拉框左对齐
- 为选项标签添加 flex-1 min-w-0 text-left 确保正确布局
|
2025-12-28 22:34:42 +08:00 |
|
shaw
|
7d4b7deea9
|
feat: 添加简单模式功能
新增简单模式设置,适合个人使用场景:
- 隐藏多用户管理相关菜单(用户管理、兑换码等)
- 自动关闭用户注册功能
- 管理员并发数自动设为无限制(99999)
- 侧边栏根据模式动态调整菜单项
同时优化分组页面的"专属分组"功能,添加帮助提示说明使用场景
|
2025-12-28 22:19:18 +08:00 |
|
shaw
|
fb9d087838
|
Merge PR #62: refactor(frontend): 前端界面优化与订阅状态管理增强
|
2025-12-28 16:26:13 +08:00 |
|
Wesley Liddick
|
18c6686fed
|
Merge branch 'main' into feature/ui-improvements-clean
|
2025-12-28 03:22:11 -05:00 |
|
IanShaw027
|
386f6da14d
|
fix(frontend): 移除DataTable中未使用的函数和变量
- 移除未使用的 hasExpandableActions 计算属性
- 移除未使用的 toggleActionsExpanded 函数
- 修复 TypeScript 类型检查错误
|
2025-12-28 14:53:36 +08:00 |
|
IanShaw027
|
d895a2c469
|
refactor(frontend): 移除DataTable表头中废弃的展开/折叠按钮
- 移除操作列表头的展开/折叠按钮和图标
- 该功能已被操作列内的'更多'按钮替代
- 保留底层的展开/收起逻辑供'更多'按钮使用
|
2025-12-28 14:53:36 +08:00 |
|
IanShaw027
|
5f2d81d154
|
fix(frontend): 修复UI改进分支中的关键问题
- 修复RedeemView订阅刷新失败导致流程中断的问题
将订阅刷新隔离到独立try/catch,失败时仅显示警告
- 修复DataTable resize事件监听器泄漏问题
确保添加和移除使用同一个回调引用
- 修复订阅状态缓存导致强制刷新失效的问题
force=true时绕过activePromise缓存,clear()清空缓存
- 修复图表主题切换后颜色不更新的问题
添加图表ref并在主题切换时调用update()方法
|
2025-12-28 14:53:36 +08:00 |
|
IanShaw027
|
4e3499c0d7
|
fix(frontend): 改进订阅状态实时刷新机制
- 在 Dashboard 页面加载时强制刷新订阅状态
- 在兑换订阅卡密后立即刷新订阅状态
- 清理订阅轮询相关注释
|
2025-12-28 14:53:36 +08:00 |
|
IanShaw027
|
26cdb1805d
|
fix(frontend): 补充缺失的BaseDialog组件
|
2025-12-28 14:53:36 +08:00 |
|
IanShaw027
|
506cb21cb1
|
refactor(frontend): UI/UX改进和组件优化
- DataTable组件操作列自适应
- 优化各种Modal弹窗
- 统一API调用方式(AbortSignal)
- 添加全局订阅状态管理
- 优化各管理视图的交互和布局
- 修复国际化翻译问题
|
2025-12-28 14:53:36 +08:00 |
|
yangjianbo
|
fd51ff6970
|
fix: 代码的核心问题是判错条件用错了层级:
- apiKeyService.GetByKey(...) 返回的“找不到 API key”在这个项目里通常会被翻译成业务错误(比如
service.ErrApiKeyNotFound 这类 ApplicationError),而不是直接把 gorm.ErrRecordNotFound 透传到中
间件层。
- 因此你在中间件里用 errors.Is(err, gorm.ErrRecordNotFound) 去判断“无效 key”,很容易匹配不到(尤其
是:后面加 Redis 缓存、换存储实现、或测试里用 stub repo 时,根本不会出现 gorm 的错误)。
- 匹配不到时就会走到 500 Failed to validate API key,导致无效 API key 被错误地当成服务端故障返回
500(应该是 401)。
修复思路:中间件不要依赖 gorm 的错误,改成判断业务层错误,例如:
if errors.Is(err, service.ErrApiKeyNotFound) {
abortWithGoogleError(c, 401, "Invalid API key")
return
}
如果你把 GetByKey 的“not found”统一封装成业务错误,这样才不会被底层实现(gorm/redis/mock)影响。
|
2025-12-28 14:34:05 +08:00 |
|
程序猿MT
|
295d71be0a
|
Merge branch 'Wei-Shaw:main' into main
|
2025-12-28 13:16:57 +08:00 |
|
shaw
|
9bbe468c91
|
fix: 修复安装脚本通过 pipe 执行时 root 权限检查失效的问题
使用 `id -u` 替代 `$EUID` 进行 root 权限检查。
`$EUID` 是 bash 内置变量,在通过 pipe 执行脚本时可能不可靠。
|
2025-12-28 12:25:55 +08:00 |
|
shaw
|
fbdff4f34f
|
fix: 防止订阅过期时间超出 JSON 序列化范围
问题:当分配订阅天数过大时,expires_at 年份可能超过 9999,
导致 time.Time JSON 序列化失败(RFC 3339 要求年份 <= 9999),
使后台无法显示和删除异常数据。
修复:
- handler 层添加 validity_days 最大值验证(max=36500,即100年)
- service 层添加 MaxValidityDays 和 MaxExpiresAt 双重保护
- 启动时自动修复已存在的异常数据(expires_at > 2099年)
|
2025-12-28 11:45:41 +08:00 |
|
shaw
|
0aa480283f
|
Merge branch 'feat/deferred-batch-update'
|
2025-12-28 11:28:06 +08:00 |
|
shaw
|
cd9d31f5f2
|
fix: 修复NeedsRefresh bug导致刷新失败的问题
|
2025-12-28 11:23:52 +08:00 |
|
noreply
|
cbfce49aa1
|
feat: Schedule batch update for account last_used_at
Implement deferred batch update mechanism to reduce database load:
- Add DeferredService for batching account last_used_at updates
- Add TimingWheelService for efficient recurring task scheduling
- Integrate with GatewayService and OpenAIGatewayService
- Implement BatchUpdateLastUsed repository method using CASE...WHEN SQL
- Fix golangci-lint error: Replace interface{} with any
Benefits:
- Reduces database writes by batching updates (10-second intervals)
- Improves request throughput by deferring non-critical updates
- Maintains accurate account usage tracking for scheduling
|
2025-12-28 09:49:54 +08:00 |
|
程序猿MT
|
1d1da7362b
|
Merge branch 'Wei-Shaw:main' into main
|
2025-12-27 23:09:48 +08:00 |
|
yangjianbo
|
a8c173f043
|
Merge branch 'main' of https://github.com/mt21625457/aicodex2api
|
2025-12-27 23:09:11 +08:00 |
|
yangjianbo
|
97ab649d16
|
fix(仪表盘): 修复最近用量查询日期参数格式
问题:仪表盘“最近用量”调用 /usage 时传入完整 ISO 时间戳(含时分秒/时区),后端 start_date/end_date 仅接受 YYYY-MM-DD,导致请求参数校验失败,页面无法正常展示最近用量。
解决:
- loadRecentUsage 改为传入 YYYY-MM-DD(从 toISOString() 取日期部分),与后端参数格式约定保持一致
- 补充注释说明:后端会将 end_date 扩展到当日结束时间,以及 toISOString() 为 UTC 可能带来的统计口径差异
- 同步修正 usageAPI.getByDateRange 的参数注释,避免后续误用
验证:npm -C frontend run build
|
2025-12-27 23:08:38 +08:00 |
|
程序猿MT
|
d3e73f1260
|
feat: 增加caddy 安全配置示例 (#57)
feat 增加 caddy 示例安全反向代理
|
2025-12-27 21:36:26 +08:00 |
|
程序猿MT
|
f3da4b202e
|
Merge branch 'Wei-Shaw:main' into main
|
2025-12-27 21:32:08 +08:00 |
|
yangjianbo
|
530f6ad81c
|
feat: 增加caddy 安全配置示例
|
2025-12-27 21:31:06 +08:00 |
|
yangjianbo
|
3252c378aa
|
feat 增加 caddy 示例安全反向代理
|
2025-12-27 21:30:14 +08:00 |
|
shaw
|
b5ca6a654c
|
Merge branch 'main' of github.com:Wei-Shaw/sub2api
# Conflicts:
|
2025-12-27 21:16:29 +08:00 |
|
shaw
|
94749b12ac
|
chore: 调整deploy说明以及取消postgres端口暴露
|
2025-12-27 21:14:08 +08:00 |
|
IanShaw
|
523fa9f71e
|
fix(frontend): 修复用户仪表板日期格式错误导致请求失败 (#55)
修复 loadRecentUsage 函数中日期格式问题,将 ISO 完整格式改为 YYYY-MM-DD 格式,与后端 API 期望一致。
|
2025-12-27 21:09:43 +08:00 |
|
shaw
|
54636781ea
|
Merge branch 'feature/datatable-enhancements'
|
2025-12-27 21:00:37 +08:00 |
|
shaw
|
5187db5ee5
|
fix(frontend): 修复DataTable无限循环和i18n邮箱解析错误
- 修复DataTable组件watch监听actionsExpanded导致的无限循环卡死问题
- 为AccountsView和UsersView添加actionsCount属性启用操作列展开功能
- 修复i18n翻译中邮箱地址的@符号未转义导致的编译错误
|
2025-12-27 21:00:26 +08:00 |
|
shaw
|
0b9c4ae69e
|
fix: 修复claude setup token授权效期短的问题
|
2025-12-27 20:42:00 +08:00 |
|
shaw
|
0d5a8a95c8
|
fix: 修复claude token刷新失效的问题
|
2025-12-27 20:13:39 +08:00 |
|
IanShaw027
|
9cd97c9e1d
|
fix(frontend): 统一账号编辑弹窗宽度与新增弹窗保持一致
问题:
- 编辑账号弹窗使用size='lg'
- 新增账号弹窗使用size='xl'
- 两者宽度不一致,体验不统一
修复:
- 将EditAccountModal的size从lg改为xl
- 与CreateAccountModal保持一致
|
2025-12-27 20:13:29 +08:00 |
|
IanShaw027
|
d521191e87
|
fix(frontend): 修复i18n翻译中的Invalid linked format错误
问题:
- admin/settings页面无法访问,报错'Invalid linked format'
- vue-i18n解析器将{'@'}误认为链接格式语法
修复:
- 将zh.ts和en.ts中的{'@'}替换为直接的@字符
- 影响范围:代理配置相关的翻译字符串
|
2025-12-27 20:11:13 +08:00 |
|
IanShaw027
|
fd78993b91
|
feat(frontend): DataTable组件增强 - 操作列宽度自适应和列数自适应padding
新增功能:
1. 操作列宽度自适应
- checkActionsColumnWidth 方法:智能检测操作按钮是否超出列宽
- 临时展开所有按钮测量实际宽度
- 计算包含gap的总宽度
- 与可用宽度对比,自动显示/隐藏"展开"按钮
- 新增 actionsCount prop:
- 用于快速判断是否需要展开功能
- 避免DOM查询带来的性能开销
2. 列数自适应padding
- getAdaptivePaddingClass 方法:根据列数动态调整内边距
- ≥10列 → px-2 (8px)
- ≥7列 → px-3 (12px)
- ≥5列 → px-4 (16px)
- <5列 → px-6 (24px,原始值)
- 让表格在列数较多时更紧凑,提升空间利用率
|
2025-12-27 20:02:10 +08:00 |
|
程序猿MT
|
937b1fb05d
|
Merge branch 'Wei-Shaw:main' into main
|
2025-12-27 20:01:56 +08:00 |
|