From ef2cadfae5b2011771381868c8bc0ad4c03ace6e Mon Sep 17 00:00:00 2001 From: wangfenghe Date: Thu, 19 Mar 2026 17:56:29 +0800 Subject: [PATCH 1/3] feat: LiteLLM --- src/env.d.ts | 1 - src/views/CronJobsView.vue | 2 +- src/views/HomeView.vue | 4 +--- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/env.d.ts b/src/env.d.ts index 0bc3352..8c5875e 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -2,7 +2,6 @@ interface ImportMetaEnv { readonly VITE_SSO_LOGIN_URL?: string - readonly VITE_MODEL_REGISTRY_URL?: string readonly VITE_DEV_API_PROXY_TARGET?: string } diff --git a/src/views/CronJobsView.vue b/src/views/CronJobsView.vue index 259ea94..6ada095 100644 --- a/src/views/CronJobsView.vue +++ b/src/views/CronJobsView.vue @@ -50,7 +50,7 @@ const fallbackModels: ModelOption[] = [ { id: 'kimi-k2-5-thinking', label: 'kimi-k2-5-thinking', brand: 'kimi' }, ] -const modelRegistryApi = import.meta.env.VITE_MODEL_REGISTRY_URL || '/api/v1/models' +const modelRegistryApi = '/api/v1/models' const inferModelBrand = (modelId: string): string => { const normalized = modelId.toLowerCase() diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 1ac5982..60624aa 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -67,9 +67,7 @@ const fallbackModels: ModelOption[] = [ { id: 'kimi-k2-5-thinking', name: 'kimi-k2-5-thinking', brand: 'kimi', enabled: true } ] -const modelRegistryApi = - import.meta.env.VITE_MODEL_REGISTRY_URL || - '/api/v1/models' +const modelRegistryApi = '/api/v1/models' const splitCsv = (raw: unknown): string[] => String(raw ?? '') From 39376bed30b25c4b6a42ee283bbbf65f76b23c1c Mon Sep 17 00:00:00 2001 From: wangfenghe Date: Wed, 25 Mar 2026 11:20:49 +0800 Subject: [PATCH 2/3] feat(watermark): show visible instance watermark in web shell --- src/env.d.ts | 2 ++ src/layouts/AppLayout.vue | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/env.d.ts b/src/env.d.ts index 8c5875e..5ee2054 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -3,6 +3,8 @@ interface ImportMetaEnv { readonly VITE_SSO_LOGIN_URL?: string readonly VITE_DEV_API_PROXY_TARGET?: string + readonly VITE_WATERMARK_PRODUCT?: string + readonly VITE_WATERMARK_OWNER?: string } interface ImportMeta { diff --git a/src/layouts/AppLayout.vue b/src/layouts/AppLayout.vue index 56d3051..3766b68 100644 --- a/src/layouts/AppLayout.vue +++ b/src/layouts/AppLayout.vue @@ -119,6 +119,15 @@ const pageTitle = computed(() => { if (!isDeveloperMode.value && route.path.startsWith('/fleet')) return '历史任务' return String(route.meta.title || '仪表盘') }) +const watermarkProduct = (import.meta.env.VITE_WATERMARK_PRODUCT || 'LinkWork').trim() || 'LinkWork' +const watermarkOwner = (import.meta.env.VITE_WATERMARK_OWNER || 'momotech').trim() || 'momotech' +const watermarkLabel = computed(() => `${watermarkProduct} OSS · ${watermarkOwner}`) +const watermarkInstance = computed(() => { + if (typeof window === 'undefined') { + return 'instance: unknown' + } + return `instance: ${window.location.host || 'local'}` +}) const setWorkMode = (mode: WorkMode) => { if (workMode.value === mode) return @@ -541,7 +550,12 @@ watch( -
+
+
+ + {{ watermarkLabel }} + {{ watermarkInstance }} +
如有问题,请前往 Issues From dadd22af51b2f2b49d65ee8d9ecaf2b0ea2838d1 Mon Sep 17 00:00:00 2001 From: wangfenghe Date: Fri, 27 Mar 2026 14:33:49 +0800 Subject: [PATCH 3/3] docs: add bilingual README with sanitized placeholders --- README.md | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ README_zh-CN.md | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+) create mode 100644 README.md create mode 100644 README_zh-CN.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..dc19152 --- /dev/null +++ b/README.md @@ -0,0 +1,85 @@ +# linkwork-web + +English | [中文](./README_zh-CN.md) + +`linkwork-web` is the LinkWork management frontend, built with Vue 3 + Vite + TypeScript. It covers task operations, role configuration, approvals, and MCP/Skills related pages. + +## Local Development + +### 1) Requirements + +- Node.js 22+ +- npm 10+ + +### 2) Install dependencies + +```bash +cd linkwork-web +npm install +``` + +### 3) Run dev server + +```bash +npm run dev +``` + +By default, Vite proxies `/api` to `http://localhost:8081`. You can override it with `VITE_DEV_API_PROXY_TARGET`. + +### 4) Production build and preview + +```bash +npm run build +npm run preview +``` + +## Key Environment Variables + +| Variable | Description | +|---|---| +| `VITE_DEV_API_PROXY_TARGET` | API proxy target in local development | +| `VITE_SSO_LOGIN_URL` | Redirect URL when unauthenticated (default: `/login`) | +| `VITE_BYPASS_AUTH_GUARD` | Bypass frontend auth guard (`false` to disable bypass) | +| `VITE_WATERMARK_PRODUCT` | UI watermark product name | +| `VITE_WATERMARK_OWNER` | UI watermark owner | +| `VITE_MODEL_ALL_ACCESS_WHITELIST` | CSV whitelist for full model access | +| `VITE_MODEL_DEFAULT_ALLOW_LIST` | CSV default model allow-list | + +## Deploy Flow + +### Option A: Remote deploy via workspace script (recommended) + +Run from workspace root (`link-work`): + +```bash +GG_HOST= \ +REMOTE_USER= \ +BRANCH= \ +PORT=3000 \ +``` + +The script performs: + +1. SSH to remote and validate/clone `linkwork-web` +2. Checkout target branch and run `npm install && npm run build` +3. Generate Nginx config with `/api/` proxy to backend +4. Run `nginx:1.27-alpine` container +5. Check `/` and `/home` (SPA fallback) + +### Option B: Manual container deployment + +```bash +cd linkwork-web +npm install +npm run build + +docker run -d --name linkwork-web -p 3000:80 \ + -v $(pwd)/dist:/usr/share/nginx/html:ro \ + -v $(pwd)/nginx.default.conf:/etc/nginx/conf.d/default.conf:ro \ + nginx:1.27-alpine +``` + +## Dependencies + +- Backend APIs are usually provided by `LinkWork/back` +- Runtime auth path depends on browser cookie/JWT flow diff --git a/README_zh-CN.md b/README_zh-CN.md new file mode 100644 index 0000000..aa75bdf --- /dev/null +++ b/README_zh-CN.md @@ -0,0 +1,86 @@ +# linkwork-web + +`linkwork-web` 是 LinkWork 的前端管理台,基于 Vue 3 + Vite + TypeScript,负责任务管理、岗位配置、审批、MCP/Skills 管理等页面。 + +## 本地开发 + +### 1) 环境要求 + +- Node.js 22+ +- npm 10+ + +### 2) 安装依赖 + +```bash +cd linkwork-web +npm install +``` + +### 3) 启动开发服务 + +```bash +npm run dev +``` + +默认通过 Vite 代理 `/api` 到 `http://localhost:8081`(可通过 `VITE_DEV_API_PROXY_TARGET` 覆盖)。 + +### 4) 生产构建与预览 + +```bash +npm run build +npm run preview +``` + +## 关键环境变量 + +| 变量 | 说明 | +|---|---| +| `VITE_DEV_API_PROXY_TARGET` | 本地开发 API 代理地址 | +| `VITE_SSO_LOGIN_URL` | 未登录时跳转地址(默认 `/login`) | +| `VITE_BYPASS_AUTH_GUARD` | 是否绕过前端路由鉴权(默认开启,设置为 `false` 可关闭) | +| `VITE_WATERMARK_PRODUCT` | 页面水印产品名 | +| `VITE_WATERMARK_OWNER` | 页面水印归属 | +| `VITE_MODEL_ALL_ACCESS_WHITELIST` | 模型全量可见用户白名单(CSV) | +| `VITE_MODEL_DEFAULT_ALLOW_LIST` | 默认可见模型列表(CSV) | + +## Deploy 流程 + +### 方案 A:使用仓库根目录脚本部署到远端主机(推荐) + +在 `link-work` 根目录执行: + +```bash +GG_HOST= \ +REMOTE_USER= \ +BRANCH= \ +PORT=3000 \ +BACKEND_UPSTREAM=http://:8081 \ +./deploy-linkwork-web-gg.local.sh +``` + +脚本行为: + +1. SSH 到远端并校验/克隆 `linkwork-web` 仓库 +2. 切换到指定分支并 `npm install && npm run build` +3. 生成 Nginx 配置(`/api/` 反向代理到后端) +4. 使用 `nginx:1.27-alpine` 启动容器 +5. 执行 `/` 与 `/home` 健康检查(含 SPA fallback) + +### 方案 B:手动容器发布 + +```bash +# 在 linkwork-web 内 +npm install +npm run build + +# 用 dist + nginx 配置启动容器 +docker run -d --name linkwork-web -p 3000:80 \ + -v $(pwd)/dist:/usr/share/nginx/html:ro \ + -v $(pwd)/nginx.default.conf:/etc/nginx/conf.d/default.conf:ro \ + nginx:1.27-alpine +``` + +## 联动依赖 + +- 后端默认对接 `linkwork-server` API(通常由 `LinkWork/back` 提供) +- 运行时依赖浏览器与后端 Cookie/JWT 认证链路