From 297d2d1c5649e91a690248a9b6e5dce2e12c7924 Mon Sep 17 00:00:00 2001 From: ivan Date: Wed, 11 Feb 2026 19:24:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=8B=86=E5=88=86?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=92=8C=E5=90=88=E5=B9=B6=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/skills/deploy/SKILL.md | 47 ++++++++++++++++++ .env | 5 ++ .env.example | 12 ++++- .env.production | 2 + AGENTS.md | 6 +++ package.json | 1 + scripts/deploy.mjs | 75 ++++++++++++++++++++++++++++ src/App.vue | 8 ++- src/api/event.ts | 49 ++++++++++++++++--- src/api/market.ts | 32 ++++++++++-- src/api/request.ts | 2 +- src/api/user.ts | 34 +++++++++++++ src/components/MarketCard.vue | 14 +++++- src/components/TradeComponent.vue | 81 ++++++++++++++++++++++++++----- src/stores/user.ts | 29 ++++++++++- src/views/EventMarkets.vue | 27 +++++++---- src/views/Home.vue | 20 +++++++- src/views/Login.vue | 29 +++++------ src/views/TradeDetail.vue | 76 ++++++++++++++++++++++++++--- src/views/Wallet.vue | 2 +- vite.config.ts | 26 ++++------ 21 files changed, 492 insertions(+), 85 deletions(-) create mode 100644 .cursor/skills/deploy/SKILL.md create mode 100644 .env.production create mode 100644 scripts/deploy.mjs create mode 100644 src/api/user.ts diff --git a/.cursor/skills/deploy/SKILL.md b/.cursor/skills/deploy/SKILL.md new file mode 100644 index 0000000..834e450 --- /dev/null +++ b/.cursor/skills/deploy/SKILL.md @@ -0,0 +1,47 @@ +--- +name: deploy +description: 将 PolyClientVuetify 项目打包并通过 SSH 部署到远程服务器。用户说「部署」「发布」时使用此 skill。 +--- + +# 项目打包并部署 + +将 PolyClientVuetify 项目构建后通过 SSH rsync 部署到 `root@38.246.250.238:/opt/1panel/www/sites/pm.xtrader.vip/index`。 + +## 使用方式 + +在项目根目录执行: + +```bash +npm run deploy +``` + +## 执行流程 + +1. **打包**:执行 `npm run build`,生成 `dist/` 目录 + - 生产构建自动使用 `.env.production`,API 地址为 `https://api.xtrader.vip` +2. **SSH 部署**:使用 rsync 将 `dist/` 同步到远程目录 + +## 前置条件 + +- 本机已配置 SSH 免密登录 `root@38.246.250.238`,或可交互输入密码 +- 远程目录 `/opt/1panel/www/sites/pm.xtrader.vip/index` 需存在且有写权限 + +## 环境变量(可选) + +在 `.env` 或 `.env.local` 中配置,不配置时使用默认值: + +| 变量 | 默认值 | 说明 | +|------|--------|------| +| `DEPLOY_HOST` | 38.246.250.238 | 部署目标主机 | +| `DEPLOY_USER` | root | SSH 用户 | +| `DEPLOY_PATH` | /opt/1panel/www/sites/pm.xtrader.vip/index | 远程目录 | + +## 涉及文件 + +- **部署脚本**:`scripts/deploy.mjs` +- **构建输出**:`dist/`(由 Vite 生成) + +## 故障排查 + +- **Permission denied**:确认 SSH 密钥已添加到远程服务器(`ssh-copy-id root@38.246.250.238`) +- **目录不存在**:在远程服务器执行 `mkdir -p /opt/1panel/www/sites/pm.xtrader.vip/index` diff --git a/.env b/.env index 4e9b7fb..b224459 100644 --- a/.env +++ b/.env @@ -1,3 +1,8 @@ # API 基础地址,不设置时默认 https://api.xtrader.vip # 连接测试服务器 192.168.3.21:8888 时复制本文件为 .env 或 .env.local 并取消下一行注释: VITE_API_BASE_URL=http://192.168.3.21:8888 + +# SSH 部署(npm run deploy),可选覆盖 +# DEPLOY_HOST=38.246.250.238 +# DEPLOY_USER=root +# DEPLOY_PATH=/opt/1panel/www/sites/pm.xtrader.vip/index diff --git a/.env.example b/.env.example index 2141460..cf34f1e 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,11 @@ -# API 基础地址,不设置时默认 https://api.xtrader.vip -# 连接测试服务器 192.168.3.21:8888 时复制本文件为 .env 或 .env.local 并取消下一行注释: +# API 基础地址(开发环境 npm run dev) +# 不设置时默认 https://api.xtrader.vip +# 连接测试服务器时复制本文件为 .env 并取消下一行注释: # VITE_API_BASE_URL=http://192.168.3.21:8888 +# +# 生产打包/部署时自动使用 .env.production 中的 https://api.xtrader.vip + +# SSH 部署(npm run deploy),不配置时使用默认值 +# DEPLOY_HOST=38.246.250.238 +# DEPLOY_USER=root +# DEPLOY_PATH=/opt/1panel/www/sites/pm.xtrader.vip/index diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..cb04907 --- /dev/null +++ b/.env.production @@ -0,0 +1,2 @@ +# 生产环境 API 地址(npm run build / npm run deploy 时自动使用) +VITE_API_BASE_URL=https://api.xtrader.vip diff --git a/AGENTS.md b/AGENTS.md index 1d27d9f..79b8672 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -136,6 +136,12 @@ Usage notes: project + +deploy +将 PolyClientVuetify 项目打包并通过 SSH 部署到远程服务器。用户说「部署」「发布」时使用此 skill。 +project + + diff --git a/package.json b/package.json index d9affc0..4722a00 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "dev": "vite", "build": "run-p type-check \"build-only {@}\" --", + "deploy": "node --env-file=.env --env-file=.env.production scripts/deploy.mjs", "preview": "vite preview", "test:unit": "vitest", "test:e2e": "playwright test", diff --git a/scripts/deploy.mjs b/scripts/deploy.mjs new file mode 100644 index 0000000..19ad06d --- /dev/null +++ b/scripts/deploy.mjs @@ -0,0 +1,75 @@ +#!/usr/bin/env node +/** + * 将项目打包并部署到远程服务器 + * 使用方式:npm run deploy + * 通过 SSH rsync 部署到 root@38.246.250.238:/opt/1panel/www/sites/pm.xtrader.vip/index + * + * 环境变量(可选):DEPLOY_HOST、DEPLOY_USER、DEPLOY_PATH + * 依赖:rsync(系统自带)、ssh 免密或密钥 + */ +import { execSync, spawnSync } from 'child_process' +import { dirname, join } from 'path' +import { fileURLToPath } from 'url' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const projectRoot = join(__dirname, '..') +const distDir = join(projectRoot, 'dist') + +const config = { + host: process.env.DEPLOY_HOST || '38.246.250.238', + user: process.env.DEPLOY_USER || 'root', + path: process.env.DEPLOY_PATH || '/opt/1panel/www/sites/pm.xtrader.vip/index', +} + +const target = `${config.user}@${config.host}:${config.path}` + +function build() { + const apiUrl = process.env.VITE_API_BASE_URL || 'https://api.xtrader.vip' + console.log(`📦 正在打包项目(.env.production API: ${apiUrl})...`) + execSync('npm run build', { + cwd: projectRoot, + stdio: 'inherit', + // 继承 process.env(已由 --env-file=.env.production 加载生产配置) + env: process.env, + }) + console.log('✅ 打包完成\n') +} + +function deploy() { + const rsyncCheck = spawnSync('which', ['rsync'], { encoding: 'utf8' }) + if (rsyncCheck.status !== 0) { + console.error('❌ 未找到 rsync') + process.exit(1) + } + + console.log(`🔌 正在通过 SSH 部署到 ${target} ...`) + const result = spawnSync( + 'rsync', + [ + '-avz', + '--delete', + '--exclude=.DS_Store', + `${distDir}/`, + `${target}/`, + ], + { + cwd: projectRoot, + stdio: 'inherit', + encoding: 'utf8', + } + ) + + if (result.status !== 0) { + console.error('❌ 部署失败') + process.exit(1) + } + + console.log('\n🎉 部署成功!') +} + +function main() { + build() + deploy() +} + +main() diff --git a/src/App.vue b/src/App.vue index 204e94c..e096ddd 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@