From cebc3dc5c22113f0d80311d813c2b0eb46f3492b Mon Sep 17 00:00:00 2001 From: HouYunFei <1844025705@qq.com> Date: Sun, 5 Jul 2026 11:38:42 +0800 Subject: [PATCH] feat: update project structure for Vite and React Router, remove deprecated sources, and enhance Docker deployment --- CHANGELOG.md | 10 ++++++-- Dockerfile | 10 +++----- VERSION | 2 +- docs/content/docs/progress/pending-test.mdx | 4 ++++ docs/vercel.json | 5 ++++ nginx.conf | 10 ++++++++ .../components/canvas/asset-picker-modal.tsx | 1 + .../canvas/canvas-assistant-panel.tsx | 4 ++-- .../canvas-image-toolbar-settings-modal.tsx | 10 ++++---- .../canvas/canvas-node-hover-toolbar.tsx | 5 ++-- .../canvas/canvas-node-mask-edit-dialog.tsx | 2 +- web/src/services/api/image.ts | 10 ++++---- web/src/services/api/prompts.ts | 24 ------------------- web/src/stores/use-config-store.ts | 4 ++-- web/tsconfig.json | 2 +- web/vercel.json | 7 ++++++ 16 files changed, 60 insertions(+), 50 deletions(-) create mode 100644 docs/vercel.json create mode 100644 nginx.conf create mode 100644 web/vercel.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 5341381..20ce55a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,15 @@ ## Unreleased -+ [新增] 渠道兼容Gemini格式。 + [新增] 新增Codex App插件支持。 -+ [调整] Next.js -> Vite,前端构建工具迁移。 ++ [修复] 修复前端 TypeScript 构建报错。 ++ [调整] Docker 运行镜像改为 nginx 静态托管。 + +## v0.5.0 - 2026-07-05 + ++ [新增] 渠道兼容Gemini格式。 ++ [调整] 前端从 Next.js 迁移到 Vite,项目改为静态前端构建。 ++ [调整] 移除已 404 的 EvoLinkAI 提示词来源。 ## v0.4.0 - 2026-06-16 diff --git a/Dockerfile b/Dockerfile index 289be81..96dbe40 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,13 +10,9 @@ COPY web ./ RUN bun run build # 运行镜像:只启动静态前端,AI 请求由浏览器前台直连用户自己的接口。 -FROM node:22-bookworm-slim +FROM nginx:1.27-alpine -WORKDIR /app -COPY --from=web-build /app/web/dist /app/web/dist -ENV NODE_ENV=production -ENV PORT=3000 -RUN npm install -g serve@14.2.5 +COPY --from=web-build /app/web/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 3000 -CMD ["serve", "-s", "/app/web/dist", "-l", "3000"] diff --git a/VERSION b/VERSION index 01e994d..48080b4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v0.4.0 \ No newline at end of file +v0.5.0 \ No newline at end of file diff --git a/docs/content/docs/progress/pending-test.mdx b/docs/content/docs/progress/pending-test.mdx index 69b9206..b3c353a 100644 --- a/docs/content/docs/progress/pending-test.mdx +++ b/docs/content/docs/progress/pending-test.mdx @@ -11,4 +11,8 @@ description: 当前版本已实现但仍需人工验证的变更项 - 音频和视频生成:选择 Gemini 调用格式时先给出不支持提示,仍需使用 OpenAI 兼容渠道。 - WebDAV 同步:移除 Next.js 转发代理和连接方式选择,改为浏览器前端直接连接 WebDAV 服务。 - 提示词库:移除 Next.js route 抓取和服务端内存缓存,改为浏览器前端直连 GitHub 原始文件并缓存到 IndexedDB。 +- 提示词库:移除已 404 的 `EvoLinkAI/awesome-gpt-image-2-API-and-Prompts` 来源。 - 前端构建:移除 Next.js,改为 Vite + React Router,并将前端目录调整为 `pages` / `components` / `stores` / `lib` / `layouts` / `styles`,需验证首页、图片/视频工作台、素材、提示词库和画布路由跳转。 +- 前端构建:修复 TypeScript 严格检查下的构建报错。 +- Vercel 部署:新增 `web` 和 `docs` 两个子项目的 Vercel 配置,需分别验证静态前端和文档站部署。 +- Docker 部署:运行镜像从 Node serve 改为 nginx 静态托管,需验证前端路由刷新回退。 diff --git a/docs/vercel.json b/docs/vercel.json new file mode 100644 index 0000000..7ef21ac --- /dev/null +++ b/docs/vercel.json @@ -0,0 +1,5 @@ +{ + "framework": "nextjs", + "installCommand": "bun install", + "buildCommand": "bun run build" +} diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..b9cf424 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,10 @@ +server { + listen 3000; + server_name _; + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } +} diff --git a/web/src/components/canvas/asset-picker-modal.tsx b/web/src/components/canvas/asset-picker-modal.tsx index e12462b..9032f6c 100644 --- a/web/src/components/canvas/asset-picker-modal.tsx +++ b/web/src/components/canvas/asset-picker-modal.tsx @@ -9,6 +9,7 @@ export type InsertAssetPayload = { kind: "text"; content: string; title: string type Props = { open: boolean; + defaultTab?: string; onInsert: (payload: InsertAssetPayload) => void; onClose: () => void; }; diff --git a/web/src/components/canvas/canvas-assistant-panel.tsx b/web/src/components/canvas/canvas-assistant-panel.tsx index 41b1652..c050a8e 100644 --- a/web/src/components/canvas/canvas-assistant-panel.tsx +++ b/web/src/components/canvas/canvas-assistant-panel.tsx @@ -805,7 +805,7 @@ function OnlineAgentLogView({ logs, theme, context, onClear }: { logs: OnlineAge const content = mode === "text" ? formatOnlineLogText(logs, context) : formatOnlineLogJson(logs, context); const lastError = [...logs].reverse().find((item) => /错误|失败|error/i.test(`${item.title}\n${stringifyLog(item.data)}`)); const copy = async (value = content) => { - if (copyToClipboard(value)) return; + if (await copyToClipboard(value)) return; textareaRef.current?.focus(); textareaRef.current?.select(); }; @@ -1266,7 +1266,7 @@ async function buildToolAgentMessages(snapshot: CanvasAgentSnapshot, history: Ca ...history .filter((message) => message.role === "user" || message.role === "assistant" || message.role === "system") .slice(-8) - .map((message): ResponseInputMessage => ({ role: message.role, content: message.text })), + .map((message): ResponseInputMessage => ({ role: message.role as "system" | "user" | "assistant", content: message.text })), { role: "user", content: [ diff --git a/web/src/components/canvas/canvas-image-toolbar-settings-modal.tsx b/web/src/components/canvas/canvas-image-toolbar-settings-modal.tsx index ded4517..27a4753 100644 --- a/web/src/components/canvas/canvas-image-toolbar-settings-modal.tsx +++ b/web/src/components/canvas/canvas-image-toolbar-settings-modal.tsx @@ -100,10 +100,12 @@ export function ImageToolSettingsModal({ frames.push(firstFrame); const timer = window.setTimeout(sync, 120); const resizeObserver = typeof ResizeObserver !== "undefined" && toolbar ? new ResizeObserver(sync) : null; - resizeObserver?.observe(toolbar); - toolbar?.childNodes.forEach((child) => { - if (child instanceof Element) resizeObserver?.observe(child); - }); + if (resizeObserver && toolbar) { + resizeObserver.observe(toolbar); + toolbar.childNodes.forEach((child) => { + if (child instanceof Element) resizeObserver.observe(child); + }); + } sync(); window.addEventListener("resize", syncPreviewScroll); return () => { diff --git a/web/src/components/canvas/canvas-node-hover-toolbar.tsx b/web/src/components/canvas/canvas-node-hover-toolbar.tsx index 6a79801..30fe8c0 100644 --- a/web/src/components/canvas/canvas-node-hover-toolbar.tsx +++ b/web/src/components/canvas/canvas-node-hover-toolbar.tsx @@ -100,6 +100,7 @@ export function CanvasNodeHoverToolbar({ if (!node) return null; + const activeNode = node; const left = viewport.x + (node.position.x + node.width / 2) * viewport.k; const top = viewport.y + node.position.y * viewport.k - 14; const isImage = node.type === CanvasNodeType.Image; @@ -124,7 +125,7 @@ export function CanvasNodeHoverToolbar({ const imageTools = buildImageToolbarTools(node, { onUpload, onToggleFreeResize, onMaskEdit, onCrop, onSplit, onUpscale, onSuperResolve, onAngle, onViewImage, onCopyPrompt: copyImagePrompt, onReversePrompt }); function openImageToolSettings() { - onKeep(node.id); + onKeep(activeNode.id); setDraftImageToolIds(quickImageToolIds); setDraftShowImageToolLabels(showImageToolLabels); setImageToolSettingsOpen(true); @@ -280,7 +281,7 @@ export function CanvasNodeInfoModal({ node, open, onClose }: { node: CanvasNodeD function ToolbarAction({ title, label, icon, onClick, showLabel, active = false, danger = false }: ToolbarTool & { showLabel: boolean }) { const hasText = showLabel && Boolean(label); return ( - +