From 2ea5b73de284d27a9ed8e55984b1a99d3546e9e5 Mon Sep 17 00:00:00 2001 From: Wang Defa <1+wangdefa@noreply.gitea.bcde.io> Date: Mon, 13 Jul 2026 10:08:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=91=8A=E8=AD=A6=E8=A7=84?= =?UTF-8?q?=E5=88=99=E7=95=8C=E9=9D=A2=E3=80=81=E6=81=A2=E5=A4=8D=20Chat?= =?UTF-8?q?=20=E7=AB=AF=E7=82=B9=E5=B9=B6=E4=BC=98=E5=8C=96=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .trellis/.version | 2 +- .trellis/spec/frontend/directory-structure.md | 2 +- .trellis/spec/frontend/index.md | 2 +- .trellis/spec/frontend/typescript-vue.md | 2 +- .trellis/workflow.md | 26 +- CHANGELOG.md | 21 ++ src/api/logevents.ts | 23 -- src/components/logs/AlertRuleModal.vue | 313 ------------------ src/components/logs/LogEventPanel.vue | 10 +- src/components/logs/SystemLogPanel.vue | 1 - src/components/tenant/AuditLogTab.vue | 1 - src/components/tenant/QuotaTab.vue | 1 - src/types/api.ts | 26 -- src/views/AiGatewayView.vue | 1 + src/views/OverviewView.vue | 17 +- src/views/TenantDetailView.vue | 2 +- src/views/TenantListView.vue | 25 +- 17 files changed, 73 insertions(+), 402 deletions(-) delete mode 100644 src/components/logs/AlertRuleModal.vue diff --git a/.trellis/.version b/.trellis/.version index e0ea44c..bf21f52 100644 --- a/.trellis/.version +++ b/.trellis/.version @@ -1 +1 @@ -0.6.5 \ No newline at end of file +0.6.6 \ No newline at end of file diff --git a/.trellis/spec/frontend/directory-structure.md b/.trellis/spec/frontend/directory-structure.md index 4d90360..40761cc 100644 --- a/.trellis/spec/frontend/directory-structure.md +++ b/.trellis/spec/frontend/directory-structure.md @@ -15,7 +15,7 @@ oci-portal-dash/ ├── App.vue NConfigProvider 注入 Naive 主题 ├── assets/ main.css:Tailwind @theme 设计 token(浅色)+ html.dark 暗色变量覆盖与全局基础样式 ├── theme/ tokens.ts(JS 侧 token 唯一来源,含 darkTokens 暗色板)、naive.ts(亮暗两套 themeOverrides 同一工厂生成) - ├── types/ api.ts:与 docs/API接口文档.md 一一对应的 DTO 类型 + ├── types/ api.ts:与后端 swagger(oci-portal/docs/)一一对应的 DTO 类型 ├── api/ request 封装(JWT 注入、401 跳登录、错误 hint 拼接)+ 按资源分模块;VITE_MOCK=1 时返回 mock.ts 数据 ├── stores/ Pinia:auth(令牌持久化)、app(侧栏收缩、暗色主题:默认跟随系统 + localStorage 记忆,驱动 html.dark 与 Naive darkTheme)、scope(全局作用域:租户/区域/区间,localStorage 按租户记忆) ├── router/ 路由与登录守卫 diff --git a/.trellis/spec/frontend/index.md b/.trellis/spec/frontend/index.md index 93ed69c..8b09e61 100644 --- a/.trellis/spec/frontend/index.md +++ b/.trellis/spec/frontend/index.md @@ -27,7 +27,7 @@ Vue 3 + Vite + TypeScript + Naive UI + Tailwind CSS v4 + ECharts + Pinia。Naive - [ ] 读过 [Directory Structure](./directory-structure.md),文件放对层(views / components / composables / api / stores / types) - [ ] 涉及颜色、圆角、间距时先看 [Styling & Design Tokens](./styling-design-tokens.md),禁止硬编码 hex -- [ ] 新增请求走 `api/` 统一封装,DTO 类型进 `types/`(与 `docs/API接口文档.md` 一一对应) +- [ ] 新增请求走 `api/` 统一封装,DTO 类型进 `types/`(与后端 swagger `oci-portal/docs/` 一一对应) - [ ] 出 UI 设计稿前读 `../guides/design-workflow.md` ## Quality Check diff --git a/.trellis/spec/frontend/typescript-vue.md b/.trellis/spec/frontend/typescript-vue.md index 29677b0..52f3303 100644 --- a/.trellis/spec/frontend/typescript-vue.md +++ b/.trellis/spec/frontend/typescript-vue.md @@ -4,7 +4,7 @@ - 开启 `strict`;禁止 `any`,未知类型用 `unknown` 后收窄。 - 对象形状优先 `interface`,联合/工具类型用 `type`;类型导入写 `import type`。 -- 与后端交互的 DTO 类型集中在 `types/`,字段与 `docs/API接口文档.md` 一一对应,不在组件里手写内联响应类型。 +- 与后端交互的 DTO 类型集中在 `types/`,字段与后端 swagger(`oci-portal/docs/`)一一对应,不在组件里手写内联响应类型。 - 用 `const` 对象 + `as const` 代替 `enum`。 ## Vue 组件 diff --git a/.trellis/workflow.md b/.trellis/workflow.md index 5f70366..7775a93 100644 --- a/.trellis/workflow.md +++ b/.trellis/workflow.md @@ -183,7 +183,7 @@ Complex task: ask the user if you can create a Trellis task and enter the planni - 1.0 Create task `[required · once]` (only after task-creation consent) - 1.1 Requirement exploration `[required · repeatable]` (`prd.md`; complex tasks also need `design.md` + `implement.md`) - 1.2 Research `[optional · repeatable]` -- 1.3 Configure context `[required · once]` — Claude Code, Cursor, OpenCode, Codex, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix (sub-agent-dispatch platforms only; inline platforms skip) +- 1.3 Configure context `[required · once]` — Claude Code, Cursor, OpenCode, Codex, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix (sub-agent-dispatch platforms only; inline platforms skip) - 1.4 Activate task `[required · once]` (review gate, then `task.py start`; status → in_progress) - 1.5 Completion criteria @@ -272,13 +272,13 @@ Code committed. Run `/trellis:finish-work`; if dirty, return to Phase 3.4 first. When a user request matches one of these intents inside an active task, route first, then load the detailed phase step if needed. -[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] - Planning or unclear requirements -> `trellis-brainstorm`. - `in_progress` implementation/check -> dispatch `trellis-implement` / `trellis-check`. - Repeated debugging -> `trellis-break-loop`; spec updates -> `trellis-update-spec`. -[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] [codex-inline, Kilo, Antigravity, Devin] @@ -353,7 +353,7 @@ Return to this step whenever requirements change and revise the relevant artifac Research can happen at any time during requirement exploration. It isn't limited to local code — you can use any available tool (MCP servers, skills, web search, etc.) to look up external information, including third-party library docs, industry practices, API references, etc. -[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] Spawn the research sub-agent: @@ -361,7 +361,7 @@ Spawn the research sub-agent: - **Task description**: Research - **Key requirement**: Research output MUST be persisted to `{TASK_DIR}/research/` -[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] [codex-inline, Kilo, Antigravity, Devin] @@ -380,7 +380,7 @@ Brainstorm and research can interleave freely — pause to research a technical #### 1.3 Configure context `[required · once]` -[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] Curate `implement.jsonl` and `check.jsonl` so the Phase 2 sub-agents get the right spec/research context. These files were seeded on `task create` with a single self-describing `_example` line; your job here is to fill in real entries. @@ -425,7 +425,7 @@ Ready gate: both `implement.jsonl` and `check.jsonl` must contain at least one r Skip this step only when both files already have real curated entries. -[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] [codex-inline, Kilo, Antigravity, Devin] @@ -458,11 +458,11 @@ If `task.py start` errors with a session-identity message (no context key from h | `design.md` exists (complex tasks) | ✅ | | `implement.md` exists (complex tasks) | ✅ | -[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] | `implement.jsonl` and `check.jsonl` each contain at least one real curated entry (seed row does not count) | ✅ | -[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] --- @@ -472,7 +472,7 @@ Goal: turn reviewed planning artifacts into code that passes quality checks. #### 2.1 Implement `[required · repeatable]` -[Claude Code, Cursor, OpenCode, CodeBuddy, Droid, Pi] +[Claude Code, Cursor, OpenCode, CodeBuddy, Droid, Pi, Oh My Pi] Spawn the implement sub-agent: @@ -484,7 +484,7 @@ The platform hook/plugin auto-handles: - Reads `implement.jsonl` and injects referenced spec/research files into the agent prompt - Injects `prd.md`, `design.md` if present, and `implement.md` if present -[/Claude Code, Cursor, OpenCode, CodeBuddy, Droid, Pi] +[/Claude Code, Cursor, OpenCode, CodeBuddy, Droid, Pi, Oh My Pi] [codex-sub-agent, Gemini, Qoder, Copilot, ZCode, Reasonix, Trae] @@ -526,7 +526,7 @@ The platform prelude auto-handles the context load requirement: #### 2.2 Quality check `[required · repeatable]` -[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] Spawn the check sub-agent: @@ -540,7 +540,7 @@ The check agent's job: - Auto-fix issues it finds - Run lint and typecheck to verify -[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, ZCode, Reasonix, Trae] +[/Claude Code, Cursor, OpenCode, codex-sub-agent, Kiro, Gemini, Qoder, CodeBuddy, Copilot, Droid, Pi, Oh My Pi, ZCode, Reasonix, Trae] [codex-inline, Kilo, Antigravity, Devin] diff --git a/CHANGELOG.md b/CHANGELOG.md index 34cda95..5a30b29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ 格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循语义化版本。 +## [0.3.0] - 2026-07-13 + +### Added + +- AI 网关端点列表恢复展示 OpenAI Chat Completions 接口(`POST /ai/v1/chat/completions`),标明支持流式与非流式调用 +- 租户列表分页支持 10 / 20 / 50 / 100 条每页切换 + +### Changed + +- 回传日志告警统一改由「通知管理 → 云端事件」分类推送,租户删除提示同步移除已废弃的告警规则清理项 +- 总览页租户测活列表改为限高滚动,「查看全部租户」入口固定展示 +- 系统日志、OCI 审计日志与配额表格取消固定高度,分页内容随页面完整展开 + +### Removed + +- 移除日志页自定义审计告警规则的管理入口、条件表单及相关前端 API + +### Fixed + +- 修复租户列表分页状态在页面重绘时丢失,以及筛选后停留在越界页码的问题 + ## [0.2.0] - 2026-07-12 ### Added diff --git a/src/api/logevents.ts b/src/api/logevents.ts index 67e8b33..41a0e69 100644 --- a/src/api/logevents.ts +++ b/src/api/logevents.ts @@ -1,8 +1,6 @@ import { mockLogEvents, mockLogRelays, mockLogWebhooks } from './mock' import { mockOn, mocked, request } from './request' import type { - AlertRule, - AlertRuleBody, LogEventPage, LogRelayView, LogWebhookInfo, @@ -30,27 +28,6 @@ export function listLogEvents(params: LogEventParams): Promise { return request('/log-events', { query: { ...params } }) } -// ---- 告警规则 ---- -export function listAlertRules(): Promise { - if (mockOn) return mocked([]) - return request<{ items: AlertRule[] }>('/log-events/alert-rules').then((r) => r.items) -} - -export function createAlertRule(body: AlertRuleBody): Promise { - if (mockOn) return mocked({ ...body, id: 1, createdAt: '', updatedAt: '' }, 300) - return request('/log-events/alert-rules', { method: 'POST', body }) -} - -export function updateAlertRule(id: number, body: AlertRuleBody): Promise { - if (mockOn) return mocked({ ...body, id, createdAt: '', updatedAt: '' }, 300) - return request(`/log-events/alert-rules/${id}`, { method: 'PUT', body }) -} - -export function deleteAlertRule(id: number): Promise { - if (mockOn) return mocked(undefined, 300) - return request(`/log-events/alert-rules/${id}`, { method: 'DELETE' }) -} - export function getLogWebhook(cfgId: number): Promise { if (mockOn) { const info = mockLogWebhooks.get(cfgId) diff --git a/src/components/logs/AlertRuleModal.vue b/src/components/logs/AlertRuleModal.vue deleted file mode 100644 index 3336391..0000000 --- a/src/components/logs/AlertRuleModal.vue +++ /dev/null @@ -1,313 +0,0 @@ - - - diff --git a/src/components/logs/LogEventPanel.vue b/src/components/logs/LogEventPanel.vue index 8e050bb..0a10d44 100644 --- a/src/components/logs/LogEventPanel.vue +++ b/src/components/logs/LogEventPanel.vue @@ -1,11 +1,10 @@