guanwei 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +202 -0
- package/README.md +247 -0
- package/dist/assets/index-CsOD5rSo.js +102 -0
- package/dist/assets/index-CsOD5rSo.js.map +1 -0
- package/dist/assets/index-DQx62TUr.css +1 -0
- package/dist/favicon.svg +12 -0
- package/dist/index.html +15 -0
- package/eslint.config.js +28 -0
- package/index.html +25 -0
- package/package.json +96 -0
- package/postcss.config.js +10 -0
- package/public/favicon.svg +12 -0
- package/scripts/guanwei +245 -0
- package/scripts/install.sh +79 -0
- package/scripts/release.sh +42 -0
- package/scripts/setup.bat +36 -0
- package/scripts/setup.sh +123 -0
- package/server/src/data/db.json +12059 -0
- package/server/src/data/guanwei.db +0 -0
- package/server/src/data/lifeContext.ts +423 -0
- package/server/src/data/spreads.ts +255 -0
- package/server/src/data/tarotCards.ts +2353 -0
- package/server/src/index.ts +71 -0
- package/server/src/routes/ai.ts +376 -0
- package/server/src/routes/divine.ts +140 -0
- package/server/src/routes/hour.ts +40 -0
- package/server/src/routes/tarot.ts +129 -0
- package/server/src/routes/users.ts +140 -0
- package/server/src/services/chartBrief.ts +131 -0
- package/server/src/services/divineStore.ts +188 -0
- package/server/src/services/hourInference.ts +150 -0
- package/server/src/services/llmProvider.ts +181 -0
- package/server/src/services/promptBuilder.ts +327 -0
- package/server/src/services/relativesCheck.ts +139 -0
- package/server/src/services/sixRelatives.ts +70 -0
- package/server/src/services/skills.ts +116 -0
- package/server/src/types/index.ts +104 -0
- package/server/src/utils/semanticAnalyzer.ts +555 -0
- package/server/src/utils/tarotEngine.ts +849 -0
- package/server/tsconfig.json +18 -0
- package/shared/core/data/classics.ts +276 -0
- package/shared/core/data/courses.ts +211 -0
- package/shared/core/data/duanyu.ts +148 -0
- package/shared/core/data/ganzhi.ts +53 -0
- package/shared/core/data/gua64.ts +93 -0
- package/shared/core/data/liuren.ts +18 -0
- package/shared/core/data/liuyao.ts +73 -0
- package/shared/core/data/qimen.ts +27 -0
- package/shared/core/data/region-full.ts +3 -0
- package/shared/core/data/region.ts +310 -0
- package/shared/core/data/tarotSpreads.ts +78 -0
- package/shared/core/data/xiaoliuren.ts +18 -0
- package/shared/core/data/ziwei.ts +97 -0
- package/shared/core/data/zodiac.ts +20 -0
- package/shared/core/engine/astrology.ts +169 -0
- package/shared/core/engine/bazi.ts +306 -0
- package/shared/core/engine/calendar.ts +127 -0
- package/shared/core/engine/daily.ts +133 -0
- package/shared/core/engine/liuren.ts +86 -0
- package/shared/core/engine/liuyao.ts +93 -0
- package/shared/core/engine/meihua.ts +87 -0
- package/shared/core/engine/qimen.ts +78 -0
- package/shared/core/engine/questionFit.ts +94 -0
- package/shared/core/engine/tarot.ts +69 -0
- package/shared/core/engine/trueSolarTime.ts +86 -0
- package/shared/core/engine/xiaoliuren.ts +19 -0
- package/shared/core/engine/ziwei.ts +217 -0
- package/shared/core/engine/ziweiInterpret.ts +161 -0
- package/shared/core/types.ts +206 -0
- package/src/App.tsx +69 -0
- package/src/arts/registry.ts +31 -0
- package/src/assets/react.svg +1 -0
- package/src/components/Backdrop.tsx +27 -0
- package/src/components/BambooArt.tsx +41 -0
- package/src/components/CalendarInput.tsx +131 -0
- package/src/components/DateInput.tsx +103 -0
- package/src/components/Disclaimer.tsx +12 -0
- package/src/components/Empty.tsx +8 -0
- package/src/components/ErrorBoundary.tsx +38 -0
- package/src/components/HomeSideAnchor.tsx +62 -0
- package/src/components/InkVein.tsx +10 -0
- package/src/components/LifeEventsInput.tsx +47 -0
- package/src/components/LocationPicker.tsx +117 -0
- package/src/components/Motes.tsx +65 -0
- package/src/components/Navigation.tsx +80 -0
- package/src/components/ProfileForm.tsx +40 -0
- package/src/components/ProfilePicker.tsx +40 -0
- package/src/components/QuestionFields.tsx +47 -0
- package/src/components/ReportView.tsx +211 -0
- package/src/components/ResultCard.tsx +40 -0
- package/src/components/SealButton.tsx +18 -0
- package/src/components/SiteFooter.tsx +17 -0
- package/src/components/SiteNav.tsx +103 -0
- package/src/components/SongDialog.tsx +64 -0
- package/src/components/SongSearchSelect.tsx +81 -0
- package/src/components/SongSelect.tsx +61 -0
- package/src/components/StarField.tsx +119 -0
- package/src/components/TarotCard.tsx +129 -0
- package/src/components/TimeShichenInput.tsx +29 -0
- package/src/components/arts/AstrologyArt.tsx +141 -0
- package/src/components/arts/BaziArt.tsx +269 -0
- package/src/components/arts/LiurenArt.tsx +87 -0
- package/src/components/arts/LiuyaoArt.tsx +111 -0
- package/src/components/arts/MeihuaArt.tsx +105 -0
- package/src/components/arts/QimenArt.tsx +86 -0
- package/src/components/arts/TarotArt.tsx +110 -0
- package/src/components/arts/XiaoliurenArt.tsx +93 -0
- package/src/components/arts/ZiweiArt.tsx +296 -0
- package/src/data/arts.ts +84 -0
- package/src/data/lifeContext.ts +423 -0
- package/src/data/sample-report.json +146 -0
- package/src/data/shichen.ts +21 -0
- package/src/data/spreads.ts +255 -0
- package/src/data/tarotCards.ts +2353 -0
- package/src/hooks/useAIInterpret.ts +76 -0
- package/src/hooks/useDivine.ts +39 -0
- package/src/hooks/useTheme.ts +29 -0
- package/src/index.css +190 -0
- package/src/lib/utils.ts +6 -0
- package/src/main.tsx +12 -0
- package/src/pages/AboutPage.tsx +25 -0
- package/src/pages/AcademyPage.tsx +128 -0
- package/src/pages/AstrologyPage.tsx +33 -0
- package/src/pages/AuthPage.tsx +263 -0
- package/src/pages/BaZiPage.tsx +33 -0
- package/src/pages/ClassicsPage.tsx +120 -0
- package/src/pages/DemoPage.tsx +161 -0
- package/src/pages/HistoryPage.tsx +133 -0
- package/src/pages/Home.tsx +179 -0
- package/src/pages/HomePage.tsx +174 -0
- package/src/pages/ModulePage.tsx +320 -0
- package/src/pages/SpreadEditor.tsx +230 -0
- package/src/pages/SpreadEditorPage.tsx +105 -0
- package/src/pages/SpreadLibrary.tsx +199 -0
- package/src/pages/SpreadLibraryPage.tsx +17 -0
- package/src/pages/TarotPage.tsx +738 -0
- package/src/pages/ZiWeiPage.tsx +33 -0
- package/src/services/api.ts +342 -0
- package/src/stores/useDivinationStore.ts +22 -0
- package/src/styles/song.css +1066 -0
- package/src/styles/tokens.css +60 -0
- package/src/types/index.ts +104 -0
- package/src/utils/astrologyCalc.ts +61 -0
- package/src/utils/comboEngine.ts +134 -0
- package/src/utils/dst.ts +24 -0
- package/src/utils/panTone.ts +206 -0
- package/src/utils/recordStore.ts +60 -0
- package/src/utils/semanticAnalyzer.ts +555 -0
- package/src/utils/spreadStorage.ts +32 -0
- package/src/utils/storage.ts +27 -0
- package/src/utils/tarotEngine.ts +849 -0
- package/src/utils/userStore.ts +234 -0
- package/src/vite-env.d.ts +1 -0
- package/tailwind.config.js +52 -0
- package/tsconfig.json +40 -0
- package/vite.config.ts +34 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ============================================================
|
|
3
|
+
# 观微 Guanwei · 一键安装脚本(备用方式)
|
|
4
|
+
# 用法(复制这一行到终端执行):
|
|
5
|
+
# curl -fsSL https://raw.githubusercontent.com/RubyCcll/guanwei/main/scripts/install.sh | bash
|
|
6
|
+
#
|
|
7
|
+
# 【推荐方式】一行命令(国内走 npmmirror,几秒装完):
|
|
8
|
+
# npm i -g guanwei
|
|
9
|
+
# guanwei setup --key 你的APIKey
|
|
10
|
+
# guanwei start
|
|
11
|
+
#
|
|
12
|
+
# 本脚本做什么:拉取项目 → 安装依赖 → 全局安装 guanwei 命令
|
|
13
|
+
# 装完:guanwei setup 配置 Key → guanwei start 启动
|
|
14
|
+
# 只想快速跑?装好 Docker 后(不装本脚本也行):
|
|
15
|
+
# docker run -d --name guanwei -p 5173:80 -e LLM_DEEPSEEK_KEY=你的Key ghcr.io/rubyccll/guanwei:latest
|
|
16
|
+
# ============================================================
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
echo "=============================================="
|
|
20
|
+
echo " 观微 Guanwei · 一键安装(源码方式)"
|
|
21
|
+
echo "=============================================="
|
|
22
|
+
|
|
23
|
+
# 0. 优先推荐 npm 方式(国内最快)
|
|
24
|
+
if command -v npm >/dev/null 2>&1; then
|
|
25
|
+
echo ""
|
|
26
|
+
echo "检测到 npm——【推荐】直接用一行命令安装(几秒完成):"
|
|
27
|
+
echo ""
|
|
28
|
+
echo " npm i -g guanwei"
|
|
29
|
+
echo " guanwei setup --key 你的APIKey"
|
|
30
|
+
echo " guanwei start"
|
|
31
|
+
echo ""
|
|
32
|
+
read -r -p "是否继续源码安装?[y/N] " answer
|
|
33
|
+
if [[ ! "${answer:-}" =~ ^[Yy]$ ]]; then
|
|
34
|
+
echo "已取消。用上面 npm 三行命令即可安装 ✓"
|
|
35
|
+
exit 0
|
|
36
|
+
fi
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
REPO="https://github.com/RubyCcll/guanwei.git"
|
|
40
|
+
INSTALL_DIR="${GUANWEI_DIR:-$HOME/guanwei}"
|
|
41
|
+
BRANCH="main"
|
|
42
|
+
|
|
43
|
+
# 1. 检查 git / node
|
|
44
|
+
if ! command -v git >/dev/null 2>&1; then
|
|
45
|
+
echo "❌ 未检测到 git——请先安装:https://git-scm.com/downloads"
|
|
46
|
+
echo " 或者用 npm 方式:npm i -g guanwei"
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
|
|
50
|
+
# 2. 拉取/更新项目
|
|
51
|
+
if [[ -d "$INSTALL_DIR/.git" ]]; then
|
|
52
|
+
echo "📦 检测到已有项目,更新到最新..."
|
|
53
|
+
git -C "$INSTALL_DIR" fetch origin >/dev/null 2>&1 || true
|
|
54
|
+
git -C "$INSTALL_DIR" merge --ff-only origin/$BRANCH >/dev/null 2>&1 || git -C "$INSTALL_DIR" pull --rebase origin $BRANCH >/dev/null 2>&1 || true
|
|
55
|
+
else
|
|
56
|
+
echo "📦 拉取项目到 $INSTALL_DIR ..."
|
|
57
|
+
git clone --depth 1 -b $BRANCH "$REPO" "$INSTALL_DIR"
|
|
58
|
+
fi
|
|
59
|
+
cd "$INSTALL_DIR"
|
|
60
|
+
|
|
61
|
+
# 3. 安装依赖
|
|
62
|
+
echo "📦 安装依赖(首次约 1-3 分钟)..."
|
|
63
|
+
npm install --no-fund --no-audit >/dev/null 2>&1 || echo " ⚠️ 前端依赖安装警告"
|
|
64
|
+
(cd server && npm install --no-fund --no-audit >/dev/null 2>&1) || echo " ⚠️ 后端依赖安装警告"
|
|
65
|
+
|
|
66
|
+
# 4. 全局安装 guanwei 命令
|
|
67
|
+
echo "🔗 安装 guanwei 全局命令..."
|
|
68
|
+
npm link >/dev/null 2>&1 || echo " ⚠️ npm link 失败(可手动:cd $INSTALL_DIR && npm link)"
|
|
69
|
+
|
|
70
|
+
echo "=============================================="
|
|
71
|
+
echo "🎉 安装完成!项目位于:$INSTALL_DIR"
|
|
72
|
+
echo ""
|
|
73
|
+
echo "下一步:"
|
|
74
|
+
echo " 1) 配置 API Key: guanwei setup --key 你的APIKey"
|
|
75
|
+
echo " 2) 启动: guanwei start(或 guanwei start --docker)"
|
|
76
|
+
echo " 3) 浏览器打开: http://localhost:5173"
|
|
77
|
+
echo ""
|
|
78
|
+
echo "常用命令:guanwei status / doctor / update / stop"
|
|
79
|
+
echo "=============================================="
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ============================================================
|
|
3
|
+
# 观微发版脚本:升级版本号 → 同步 lockfile → 打 tag → 推送
|
|
4
|
+
# 用法:./scripts/release.sh 1.1.2 (新版本号,不带 v 前缀)
|
|
5
|
+
# 要求:工作区无未提交改动;CHANGELOG.md 已写好本次版本条目
|
|
6
|
+
# ============================================================
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
cd "$(dirname "$0")/.."
|
|
9
|
+
|
|
10
|
+
NEW_VER="${1:-}"
|
|
11
|
+
if [[ -z "$NEW_VER" ]] || ! [[ "$NEW_VER" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
12
|
+
echo "用法: ./scripts/release.sh <版本号> 例如: ./scripts/release.sh 1.1.2"; exit 1
|
|
13
|
+
fi
|
|
14
|
+
|
|
15
|
+
if [[ -n "$(git status --porcelain)" ]]; then
|
|
16
|
+
echo "⚠️ 工作区有未提交改动,先提交或 stash 再发版"; exit 1
|
|
17
|
+
fi
|
|
18
|
+
|
|
19
|
+
echo "1️⃣ 更新 package.json / server/package.json -> ${NEW_VER}"
|
|
20
|
+
node -e "
|
|
21
|
+
const fs = require('fs');
|
|
22
|
+
for (const p of ['package.json', 'server/package.json', 'package-lock.json', 'server/package-lock.json']) {
|
|
23
|
+
const d = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
24
|
+
d.version = '${NEW_VER}';
|
|
25
|
+
fs.writeFileSync(p, JSON.stringify(d, null, 2) + '\n');
|
|
26
|
+
}
|
|
27
|
+
"
|
|
28
|
+
echo " ✅ 版本号与 lockfile 已同步"
|
|
29
|
+
|
|
30
|
+
echo "2️⃣ 检查 CHANGELOG.md 是否已有 [${NEW_VER}] 条目..."
|
|
31
|
+
if ! grep -q "^## \[${NEW_VER}\]" CHANGELOG.md; then
|
|
32
|
+
echo " ⚠️ CHANGELOG.md 缺少 [${NEW_VER}] 条目——请补上后再继续(Ctrl+C 中断)"
|
|
33
|
+
read -rp " 已补好?回车继续: " _
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
echo "3️⃣ 提交 + 打 tag + 推送"
|
|
37
|
+
git add package.json package-lock.json server/package.json server/package-lock.json CHANGELOG.md
|
|
38
|
+
git commit -m "chore: 版本升级 ${NEW_VER}"
|
|
39
|
+
git tag "v${NEW_VER}"
|
|
40
|
+
git push origin main
|
|
41
|
+
git push origin "v${NEW_VER}"
|
|
42
|
+
echo "🎉 v${NEW_VER} 已推送——CI / Release / 镜像 / Pages 将自动执行"
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
@echo off
|
|
2
|
+
REM 观微一键配置与启动(Windows)—— 用法:setup.bat --key sk-xxx [--docker]
|
|
3
|
+
setlocal
|
|
4
|
+
set KEY=
|
|
5
|
+
set MODE=local
|
|
6
|
+
|
|
7
|
+
:parse
|
|
8
|
+
if "%~1"=="" goto done
|
|
9
|
+
if "%~1"=="--key" (set KEY=%~2 & shift & shift & goto parse)
|
|
10
|
+
if "%~1"=="--docker" (set MODE=docker & shift & goto parse)
|
|
11
|
+
echo 未知参数: %~1
|
|
12
|
+
exit /b 1
|
|
13
|
+
:done
|
|
14
|
+
|
|
15
|
+
if "%KEY%"=="" (
|
|
16
|
+
echo 请用: setup.bat --key 你的APIKey [--docker]
|
|
17
|
+
echo 或先手动创建 server\.env(参考 server\.env.example)
|
|
18
|
+
exit /b 1
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
echo 生成 server\.env ...
|
|
22
|
+
> server\.env echo LLM_PROVIDER=deepseek
|
|
23
|
+
>> server\.env echo LLM_DEEPSEEK_KEY=%KEY%
|
|
24
|
+
>> server\.env echo LLM_DEEPSEEK_MODEL=deepseek-chat
|
|
25
|
+
|
|
26
|
+
if "%MODE%"=="docker" (
|
|
27
|
+
docker compose up -d --build
|
|
28
|
+
echo 已启动: http://localhost:5173
|
|
29
|
+
) else (
|
|
30
|
+
call npm install
|
|
31
|
+
pushd server
|
|
32
|
+
call npm install
|
|
33
|
+
popd
|
|
34
|
+
start "guanwei-backend" cmd /c "cd server && npm run dev"
|
|
35
|
+
call npm run dev
|
|
36
|
+
)
|
package/scripts/setup.sh
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ============================================================
|
|
3
|
+
# 观微 Guanwei · 一键配置与启动
|
|
4
|
+
# 用法:
|
|
5
|
+
# ./scripts/setup.sh # 交互式:选择服务商 → 输入 API Key → 自动装依赖并启动
|
|
6
|
+
# ./scripts/setup.sh --key sk-xxx # 非交互(默认 DeepSeek)
|
|
7
|
+
# ./scripts/setup.sh --provider gemini --key xxxx
|
|
8
|
+
# ./scripts/setup.sh --key sk-xxx --docker # 用 Docker 启动(无需本机 Node)
|
|
9
|
+
# ./scripts/setup.sh --link # 额外:全局安装 guanwei 命令(之后任意目录可用)
|
|
10
|
+
# ============================================================
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
cd "$(dirname "$0")/.."
|
|
13
|
+
|
|
14
|
+
PROVIDER=""
|
|
15
|
+
KEY=""
|
|
16
|
+
MODE="local" # local | docker
|
|
17
|
+
|
|
18
|
+
LINK=""
|
|
19
|
+
while [[ $# -gt 0 ]]; do
|
|
20
|
+
case "$1" in
|
|
21
|
+
--provider) PROVIDER="$2"; shift 2 ;;
|
|
22
|
+
--key) KEY="$2"; shift 2 ;;
|
|
23
|
+
--docker) MODE="docker"; shift ;;
|
|
24
|
+
--link) LINK="1"; shift ;;
|
|
25
|
+
-h|--help)
|
|
26
|
+
sed -n '1,12p' "$0" | sed 's/^# \{0,1\}//'; exit 0 ;;
|
|
27
|
+
*) echo "未知参数: $1(--provider / --key / --docker / --help)"; exit 1 ;;
|
|
28
|
+
esac
|
|
29
|
+
done
|
|
30
|
+
|
|
31
|
+
# ---------- 1. 选择服务商与 Key ----------
|
|
32
|
+
if [[ -z "$PROVIDER" ]]; then
|
|
33
|
+
if [[ -n "$KEY" ]]; then
|
|
34
|
+
# 只给了 --key:默认 DeepSeek
|
|
35
|
+
PROVIDER=deepseek
|
|
36
|
+
else
|
|
37
|
+
echo "=============================================="
|
|
38
|
+
echo " 观微 Guanwei · 一键配置"
|
|
39
|
+
echo "=============================================="
|
|
40
|
+
echo "选择 AI 服务商:"
|
|
41
|
+
echo " 1) DeepSeek(推荐,性价比高)"
|
|
42
|
+
echo " 2) Gemini(Google)"
|
|
43
|
+
echo " 3) Groq(免费额度)"
|
|
44
|
+
echo " 4) 通义千问(阿里云)"
|
|
45
|
+
echo " 5) 自定义 OpenAI 兼容端点"
|
|
46
|
+
read -rp "请输入编号 [1]: " CHOICE
|
|
47
|
+
case "${CHOICE:-1}" in
|
|
48
|
+
1) PROVIDER=deepseek ;;
|
|
49
|
+
2) PROVIDER=gemini ;;
|
|
50
|
+
3) PROVIDER=groq ;;
|
|
51
|
+
4) PROVIDER=qwen ;;
|
|
52
|
+
5) PROVIDER=custom ;;
|
|
53
|
+
*) echo "无效编号"; exit 1 ;;
|
|
54
|
+
esac
|
|
55
|
+
fi
|
|
56
|
+
fi
|
|
57
|
+
if [[ -z "$KEY" ]]; then
|
|
58
|
+
read -rsp "请输入你的 ${PROVIDER} API Key(输入不回显): " KEY; echo
|
|
59
|
+
fi
|
|
60
|
+
if [[ -z "$KEY" ]]; then
|
|
61
|
+
echo "错误:API Key 不能为空"; exit 1
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
# ---------- 2. 生成 server/.env ----------
|
|
65
|
+
mkdir -p server
|
|
66
|
+
cat > server/.env <<EOF
|
|
67
|
+
# 由 scripts/setup.sh 生成($(date '+%Y-%m-%d %H:%M'))
|
|
68
|
+
LLM_PROVIDER=${PROVIDER}
|
|
69
|
+
EOF
|
|
70
|
+
case "$PROVIDER" in
|
|
71
|
+
deepseek) echo "LLM_DEEPSEEK_KEY=${KEY}" >> server/.env
|
|
72
|
+
echo "LLM_DEEPSEEK_MODEL=deepseek-chat" >> server/.env ;;
|
|
73
|
+
gemini) echo "LLM_GEMINI_KEY=${KEY}" >> server/.env ;;
|
|
74
|
+
groq) echo "LLM_GROQ_KEY=${KEY}" >> server/.env ;;
|
|
75
|
+
qwen) echo "LLM_QWEN_KEY=${KEY}" >> server/.env ;;
|
|
76
|
+
custom)
|
|
77
|
+
echo "LLM_CUSTOM_KEY=${KEY}" >> server/.env
|
|
78
|
+
read -rp "自定义端点 URL [https://your-endpoint/v1/chat/completions]: " EP
|
|
79
|
+
echo "LLM_CUSTOM_ENDPOINT=${EP:-https://your-endpoint/v1/chat/completions}" >> server/.env ;;
|
|
80
|
+
esac
|
|
81
|
+
echo "✅ server/.env 已生成(API Key 仅存本地,已 gitignore)"
|
|
82
|
+
|
|
83
|
+
# ---------- 3. 前端环境 ----------
|
|
84
|
+
if [[ ! -f .env.development ]] && [[ -f .env.development.example ]]; then
|
|
85
|
+
cp .env.development.example .env.development
|
|
86
|
+
echo "✅ .env.development 已就绪"
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# ---------- 3.5 可选:全局安装 guanwei 命令 ----------
|
|
90
|
+
if [[ -n "$LINK" ]]; then
|
|
91
|
+
echo "🔗 全局安装 guanwei 命令(npm link,之后任意目录可用)..."
|
|
92
|
+
npm link 2>&1 | tail -1
|
|
93
|
+
echo " 现在可以直接运行:guanwei status"
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# ---------- 4. 安装依赖并启动 ----------
|
|
97
|
+
if [[ "$MODE" == "docker" ]]; then
|
|
98
|
+
if ! command -v docker >/dev/null 2>&1; then
|
|
99
|
+
echo "错误:未检测到 Docker,请先安装 https://www.docker.com/"; exit 1
|
|
100
|
+
fi
|
|
101
|
+
# 兼容 docker compose 插件与独立 docker-compose
|
|
102
|
+
if docker compose version >/dev/null 2>&1; then
|
|
103
|
+
COMPOSE="docker compose"
|
|
104
|
+
elif command -v docker-compose >/dev/null 2>&1; then
|
|
105
|
+
COMPOSE="docker-compose"
|
|
106
|
+
else
|
|
107
|
+
echo "错误:未找到 docker compose 插件(docker-compose)"; exit 1
|
|
108
|
+
fi
|
|
109
|
+
echo "🐳 正在构建并启动(首次构建需几分钟)..."
|
|
110
|
+
$COMPOSE up -d --build
|
|
111
|
+
echo "✅ 已启动:前端 http://localhost:5173 · 后端 http://localhost:3018"
|
|
112
|
+
echo " 停止:$COMPOSE down"
|
|
113
|
+
else
|
|
114
|
+
echo "📦 安装依赖(首次较慢)..."
|
|
115
|
+
npm install --no-fund --no-audit
|
|
116
|
+
(cd server && npm install --no-fund --no-audit)
|
|
117
|
+
echo "🚀 启动服务..."
|
|
118
|
+
echo " 后端 :3018(tsx watch)"
|
|
119
|
+
echo " 前端 :5173(vite dev)"
|
|
120
|
+
echo " Ctrl+C 停止"
|
|
121
|
+
(cd server && npm run dev) &
|
|
122
|
+
npm run dev
|
|
123
|
+
fi
|