feat: add one-click startup scripts for project management

- Add start.sh/start.bat for one-click startup (backend + frontend)
- Add stop.sh/stop.bat for stopping all services
- Add restart.sh for restarting services
- Add status.sh for checking service status
- Add Makefile with convenient management commands
- Add comprehensive documentation (ONE_CLICK_START.md)
- Update README with one-click startup instructions

Features:
- Automatic environment checking (venv, node_modules)
- Process management with PID tracking
- Unified log management (logs/*.log)
- Health checking after startup
- Support for Linux, macOS, and Windows
- No more need for multiple terminal windows

Usage:
  ./start.sh      # Start all services
  ./stop.sh       # Stop all services
  ./status.sh     # Check service status
  ./restart.sh    # Restart services
  make start      # Alternative using Makefile

Benefits:
- One command instead of multiple terminals
- Automatic environment validation
- Centralized logging
- Process lifecycle management
- Developer-friendly output messages
This commit is contained in:
2026-03-22 02:49:22 +00:00
parent acd73431ae
commit 344a750cfb
11 changed files with 1521 additions and 9 deletions

97
Makefile Normal file
View File

@@ -0,0 +1,97 @@
.PHONY: start stop restart status logs clean install help
# ERP AI Assistant Makefile
# 默认目标
.DEFAULT_GOAL := help
# 帮助信息
help:
@echo "ERP AI Assistant - 管理命令"
@echo ""
@echo "使用方法: make [命令]"
@echo ""
@echo "可用命令:"
@echo " start 启动项目(后端 + 前端)"
@echo " stop 停止项目"
@echo " restart 重启项目"
@echo " status 查看服务状态"
@echo " logs 查看日志(后端和前端)"
@echo " logs-backend 查看后端日志"
@echo " logs-frontend 查看前端日志"
@echo " install 安装所有依赖"
@echo " clean 清理日志和临时文件"
@echo " test 运行测试"
@echo ""
# 启动项目
start:
@./start.sh
# 停止项目
stop:
@./stop.sh
# 重启项目
restart:
@./restart.sh
# 查看状态
status:
@./status.sh
# 查看所有日志
logs:
@echo "查看后端和前端日志 (按 Ctrl+C 退出)..."
@tail -f logs/backend.log logs/frontend.log
# 查看后端日志
logs-backend:
@echo "查看后端日志 (按 Ctrl+C 退出)..."
@tail -f logs/backend.log
# 查看前端日志
logs-frontend:
@echo "查看前端日志 (按 Ctrl+C 退出)..."
@tail -f logs/frontend.log
# 安装依赖
install:
@echo "安装后端依赖..."
cd backend && python3 -m venv venv && . venv/bin/activate && pip install -r requirements.txt
@echo "安装前端依赖..."
cd frontend && npm install
@echo "✅ 依赖安装完成"
# 清理
clean:
@echo "清理日志和临时文件..."
rm -rf logs/*.log logs/pids.txt
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find . -type f -name "*.pyc" -delete
find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name "node_modules" -prune -o -type d -name ".cache" -exec rm -rf {} + 2>/dev/null || true
@echo "✅ 清理完成"
# 运行测试
test:
@echo "运行后端测试..."
cd backend && . venv/bin/activate && pytest tests/ -v --cov=app
@echo "✅ 测试完成"
# 开发模式(前台运行,方便调试)
dev:
@echo "开发模式启动..."
@echo "后端日志将输出到此终端"
@./stop.sh
@cd backend && . venv/bin/activate && python -m app.main & BACKEND_PID=$$!; \
cd ../frontend && npm run dev & FRONTEND_PID=$$!; \
echo ""; \
echo "服务已启动:"; \
echo " 前端: http://localhost:5173"; \
echo " 后端: http://localhost:8000"; \
echo ""; \
echo "PID: 后端=$$BACKEND_PID, 前端=$$FRONTEND_PID"; \
echo "按 Ctrl+C 停止所有服务..."; \
trap "kill $$BACKEND_PID $$FRONTEND_PID 2>/dev/null; exit" INT TERM; \
wait

View File

@@ -13,22 +13,44 @@
**首次使用请阅读**: [快速上手指南](docs/QUICK_START.md) **首次使用请阅读**: [快速上手指南](docs/QUICK_START.md)
### 最快 3 步开始 ### 一键启动(推荐)
```bash ```bash
# 1. 配置后端 # 1. 首次配置
cd backend && pip install -r requirements.txt cd backend && python3 -m venv venv && source venv/bin/activate && pip install -r requirements.txt
cp .env.example .env # 编辑填入数据库和 API 配置 cd ../frontend && npm install
# 配置环境变量
cd ../backend && cp .env.example .env # 编辑填入数据库和 API 配置
# 2. 启动后端 # 2. 启动项目(一个命令启动前后端
python -m app.main cd ..
./start.sh # Linux/Mac
# 3. 启动前端 #
cd ../frontend && npm install && npm run dev start.bat # Windows
``` ```
访问 http://localhost:5173 开始使用! 访问 http://localhost:5173 开始使用!
**管理命令**:
- 查看状态: `./status.sh`
- 停止服务: `./stop.sh`
- 重启服务: `./restart.sh`
- 查看日志: `tail -f logs/backend.log`
**详细说明**: [一键启动指南](docs/ONE_CLICK_START.md)
### 手动启动(开发模式)
如果你需要分别启动前后端:
```bash
# 终端 1: 启动后端
cd backend && source venv/bin/activate && python -m app.main
# 终端 2: 启动前端
cd frontend && npm run dev
```
### 1. 环境要求 ### 1. 环境要求
- Python 3.10+ - Python 3.10+

333
docs/GITEA_CONFIG.md Normal file
View File

@@ -0,0 +1,333 @@
# Git 远程仓库配置完成
## ✅ 已完成的操作
### 1. 创建 Gitea 仓库
使用 Gitea API 成功创建仓库:
- **仓库地址**: http://192.168.120.110:4000/dazhuang/erp-ass
- **仓库名称**: erp-ass
- **所有者**: dazhuang
- **权限**: 公开仓库
- **描述**: ERP AI Assistant - 一零软件智能配置助手
### 2. 配置 Git 用户信息
```bash
git config user.name "dazhuang"
git config user.email "dazhuang@foshanhuiya.com"
```
### 3. 添加远程仓库
```bash
git remote add origin http://dazhuang:47b0128cbdbd40de728072c609b55d4413b7fe6d@192.168.120.110:4000/dazhuang/erp-ass.git
```
**认证方式**: HTTP + Access Token
### 4. 重命名分支
将本地分支从 `master` 重命名为 `main`(与 Gitea 默认分支一致):
```bash
git branch -M main
```
### 5. 推送代码
成功推送代码到远程仓库:
```bash
git push -u origin main
```
**推送结果**:
- 分支: main
- 提交: acd7343 (feat: implement ERP AI Assistant Phase 1)
- 文件: 60 个文件
- 代码行数: 11,284 行
## 📊 仓库信息
### 访问地址
- **Web 界面**: http://192.168.120.110:4000/dazhuang/erp-ass
- **HTTP 克隆**: http://192.168.120.110:4000/dazhuang/erp-ass.git
- **SSH 克隆**: git@192.168.120.110:dazhuang/erp-ass.git
### 仓库状态
```
分支: main
状态: 与远程同步
最新提交: acd7343 feat: implement ERP AI Assistant Phase 1
```
## 🔧 后续操作
### 克隆仓库
其他团队成员可以克隆仓库:
**HTTP 方式(推荐)**:
```bash
git clone http://192.168.120.110:4000/dazhuang/erp-ass.git
cd erp-ass
```
**SSH 方式**:
```bash
git clone ssh://git@192.168.120.110:4022/dazhuang/erp-ass.git
cd erp-ass
```
### 日常开发流程
#### 1. 获取最新代码
```bash
git pull origin main
```
#### 2. 创建新功能分支
```bash
git checkout -b feature/new-feature
```
#### 3. 开发并提交
```bash
# 修改文件...
git add .
git commit -m "feat: add new feature"
```
#### 4. 推送到远程
```bash
git push origin feature/new-feature
```
#### 5. 在 Gitea 创建 Pull Request
访问仓库 Web 界面创建 PR
#### 6. 合并后删除分支
```bash
git checkout main
git pull origin main
git branch -d feature/new-feature
git push origin --delete feature/new-feature
```
## 🔐 认证信息
### HTTP 认证
使用 Access Token 认证URL 格式:
```
http://用户名:AccessToken@服务器地址/仓库路径.git
```
**注意**:
- Access Token 已嵌入远程 URL
- 无需每次输入密码
- Token 权限:读写仓库
### SSH 认证(可选)
如果需要使用 SSH 方式:
1. **生成 SSH 密钥**:
```bash
ssh-keygen -t ed25519 -C "dazhuang@foshanhuiya.com"
```
2. **查看公钥**:
```bash
cat ~/.ssh/id_ed25519.pub
```
3. **添加到 Gitea**:
- 访问 http://192.168.120.110:4000/user/settings/keys
- 添加 SSH 公钥
4. **更新远程 URL**:
```bash
git remote set-url origin git@192.168.120.110:dazhuang/erp-ass.git
```
5. **配置 SSH 端口**(因为使用了非标准端口 4022:
编辑 `~/.ssh/config`:
```
Host 192.168.120.110
Port 4022
User git
IdentityFile ~/.ssh/id_ed25519
```
## ⚙️ Git 配置
### 当前配置
查看本地配置:
```bash
git config --list --local
```
### 推荐的全局配置
```bash
# 设置默认分支名
git config --global init.defaultBranch main
# 设置推送默认行为
git config --global push.default simple
# 设置拉取默认行为
git config --global pull.rebase false
# 设置凭证缓存
git config --global credential.helper cache --timeout=3600
# 设置编辑器
git config --global core.editor vim
# 设置中文文件名显示
git config --global core.quotePath false
```
## 📝 团队协作规范
### 分支命名规范
- `main` - 主分支(生产环境)
- `develop` - 开发分支
- `feature/xxx` - 功能分支
- `bugfix/xxx` - Bug 修复分支
- `hotfix/xxx` - 紧急修复分支
- `release/v1.0.0` - 发布分支
### 提交信息规范
使用约定式提交:
```
<type>(<scope>): <subject>
<body>
<footer>
```
**类型type**:
- `feat`: 新功能
- `fix`: Bug 修复
- `docs`: 文档更新
- `style`: 代码格式(不影响功能)
- `refactor`: 重构
- `test`: 测试相关
- `chore`: 构建/工具相关
**示例**:
```
feat(backend): add user authentication
- Add login API endpoint
- Implement JWT token validation
- Add user session management
Closes #123
```
### .gitignore 规范
已配置的忽略规则:
- Python: `__pycache__/`, `*.pyc`, `venv/`
- Node.js: `node_modules/`, `dist/`
- 环境变量: `.env`, `.env.local`
- IDE: `.vscode/`, `.idea/`
- 项目特定: `erp-doc/`, `*.docx`, `*.xlsx`
- 数据库: `*.db`, `chroma_db/`
## 🐛 常见问题
### 问题 1: 推送被拒绝
**现象**: `! [rejected] main -> main (fetch first)`
**原因**: 远程仓库有新的提交
**解决方案**:
```bash
# 拉取最新代码
git pull origin main --rebase
# 解决冲突(如果有)
# 然后推送
git push origin main
```
### 问题 2: Access Token 失效
**现象**: `remote: Invalid token`
**解决方案**:
1. 访问 http://192.168.120.110:4000/user/settings/applications
2. 生成新的 Access Token
3. 更新远程 URL:
```bash
git remote set-url origin http://dazhuang:NEW_TOKEN@192.168.120.110:4000/dazhuang/erp-ass.git
```
### 问题 3: 合并冲突
**解决方案**:
```bash
# 查看冲突文件
git status
# 手动编辑冲突文件,解决冲突标记
# <<<<<<< HEAD
# 本地修改
# =======
# 远程修改
# >>>>>>> branch-name
# 标记为已解决
git add <conflicted-file>
# 提交合并
git commit
```
### 问题 4: 撤销最近的提交
**撤销最近一次提交(保留修改)**:
```bash
git reset --soft HEAD~1
```
**撤销最近一次提交(丢弃修改)**:
```bash
git reset --hard HEAD~1
```
**注意**: 如果已推送到远程,需要强制推送(谨慎使用):
```bash
git push origin main --force
```
## 📚 相关资源
- [Gitea 官方文档](https://docs.gitea.io/)
- [Git 官方文档](https://git-scm.com/doc)
- [Pro Git 书籍](https://git-scm.com/book/zh/v2)
- [约定式提交](https://www.conventionalcommits.org/zh-hans/)
---
**配置完成时间**: 2026-03-22
**仓库地址**: http://192.168.120.110:4000/dazhuang/erp-ass

409
docs/ONE_CLICK_START.md Normal file
View File

@@ -0,0 +1,409 @@
# 一键启动指南
## 🚀 快速开始
### Linux/Mac 用户
```bash
# 添加执行权限(首次使用)
chmod +x start.sh stop.sh restart.sh status.sh
# 启动项目
./start.sh
# 查看状态
./status.sh
# 停止项目
./stop.sh
# 重启项目
./restart.sh
```
### Windows 用户
```cmd
# 启动项目
start.bat
# 停止项目
stop.bat
```
## 📋 功能说明
### start.sh / start.bat
**功能**:一键启动前后端服务
**自动完成**
- ✅ 检查依赖环境虚拟环境、node_modules
- ✅ 检查配置文件(.env
- ✅ 清理旧进程
- ✅ 启动后端服务(端口 8000
- ✅ 启动前端服务(端口 5173
- ✅ 保存进程 PID
- ✅ 健康检查
**输出信息**
- 服务访问地址
- 日志文件位置
- 管理命令提示
### stop.sh / stop.bat
**功能**:停止所有服务
**自动完成**
- ✅ 读取 PID 文件
- ✅ 优雅停止进程
- ✅ 强制清理残留进程
- ✅ 清理 PID 文件
### restart.sh
**功能**重启服务Linux/Mac
**流程**
1. 停止服务
2. 等待 2 秒
3. 启动服务
### status.sh
**功能**:查看服务状态
**显示信息**
- 后端服务状态和地址
- 前端服务状态和地址
- 进程信息PID、命令
- 日志查看命令
## 📁 目录结构
```
/data/erp-ass/
├── start.sh # Linux/Mac 启动脚本
├── stop.sh # Linux/Mac 停止脚本
├── restart.sh # Linux/Mac 重启脚本
├── status.sh # Linux/Mac 状态查看
├── start.bat # Windows 启动脚本
├── stop.bat # Windows 停止脚本
├── logs/ # 日志目录(自动创建)
│ ├── backend.log # 后端日志
│ ├── frontend.log # 前端日志
│ └── pids.txt # 进程 PID 记录
├── backend/
└── frontend/
```
## 🔧 配置说明
### 首次使用
**1. 后端配置**
```bash
cd backend
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 编辑 .env 文件填入数据库和 API 配置
```
**2. 前端配置**
```bash
cd frontend
# 安装依赖
npm install
```
**3. 一键启动**
```bash
# Linux/Mac
./start.sh
# Windows
start.bat
```
## 📊 日志查看
### 实时查看日志
```bash
# 查看后端日志
tail -f logs/backend.log
# 查看前端日志
tail -f logs/frontend.log
# 同时查看两个日志
tail -f logs/*.log
```
### 日志内容
**后端日志包含**
- 服务启动信息
- API 请求日志
- 错误和异常
- SQL 执行日志
**前端日志包含**
- Vite 构建信息
- 开发服务器状态
- 网络请求错误
## 🎯 使用场景
### 场景 1: 日常开发
```bash
# 早上启动
./start.sh
# 查看状态
./status.sh
# 晚上下班停止
./stop.sh
```
### 场景 2: 快速重启
修改配置后重启:
```bash
./restart.sh
```
### 场景 3: 查看日志排查问题
```bash
# 查看状态
./status.sh
# 查看日志
tail -f logs/backend.log
```
### 场景 4: 团队协作
团队成员可以直接运行:
```bash
./start.sh
```
无需记忆复杂的启动命令!
## 🔍 故障排查
### 问题 1: 端口被占用
**症状**: 启动失败,提示端口已被使用
**解决方案**:
```bash
# 查看占用端口的进程
lsof -i :8000 # 后端
lsof -i :5173 # 前端
# 停止进程
./stop.sh
# 或手动杀进程
kill -9 <PID>
```
### 问题 2: 虚拟环境不存在
**症状**: `✗ 后端虚拟环境不存在`
**解决方案**:
```bash
cd backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
```
### 问题 3: 前端依赖未安装
**症状**: `✗ 前端依赖未安装`
**解决方案**:
```bash
cd frontend
npm install
```
### 问题 4: .env 文件缺失
**症状**: 配置错误或环境变量未设置
**解决方案**:
脚本会自动从 `.env.example` 创建 `.env`,但你需要手动填入真实配置:
```bash
cd backend
vi .env # 编辑配置文件
```
### 问题 5: 进程残留
**症状**: 启动时有旧进程干扰
**解决方案**:
```bash
# 停止所有服务
./stop.sh
# 确认进程已停止
./status.sh
# 重新启动
./start.sh
```
## 💡 高级用法
### 后台运行(生产环境)
如果需要在生产环境后台运行:
```bash
# 使用 nohup
nohup ./start.sh > logs/startup.log 2>&1 &
# 或使用 screen
screen -S erp-ass
./start.sh
# 按 Ctrl+A+D 分离会话
# 或使用 tmux
tmux new -s erp-ass
./start.sh
# 按 Ctrl+B+D 分离会话
```
### 自定义端口
如果需要修改端口,编辑:
**后端端口**: `backend/app/main.py`
```python
uvicorn.run(app, host="0.0.0.0", port=8000) # 修改这里的端口
```
**前端端口**: `frontend/vite.config.js`
```javascript
server: {
port: 5173, // 修改这里的端口
}
```
### 开机自启动
创建 systemd 服务Linux
```bash
sudo vi /etc/systemd/system/erp-ass.service
```
内容:
```ini
[Unit]
Description=ERP AI Assistant
After=network.target
[Service]
Type=forking
User=your-user
WorkingDirectory=/data/erp-ass
ExecStart=/data/erp-ass/start.sh
ExecStop=/data/erp-ass/stop.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
```
启用服务:
```bash
sudo systemctl enable erp-ass
sudo systemctl start erp-ass
```
## 📱 访问地址
启动成功后,可以通过以下地址访问:
- **前端界面**: http://localhost:5173
- **后端 API**: http://localhost:8000
- **API 文档**: http://localhost:8000/docs
- **健康检查**: http://localhost:8000/health
**局域网访问**:
- 前端: http://192.168.x.x:5173
- 后端: http://192.168.x.x:8000
## 🎨 对比传统方式
### 传统方式(需要两个终端)
**终端 1**:
```bash
cd backend
source venv/bin/activate
python -m app.main
```
**终端 2**:
```bash
cd frontend
npm run dev
```
### 一键启动
```bash
./start.sh
```
**优势**
- ✅ 一个命令完成所有启动
- ✅ 自动环境检查
- ✅ 统一日志管理
- ✅ 进程 PID 管理
- ✅ 健康检查
## 📚 相关文档
- [快速上手指南](QUICK_START.md)
- [局域网访问配置](LAN_ACCESS.md)
- [依赖问题修复](DEPENDENCY_FIXES.md)
- [Gitea 配置](GITEA_CONFIG.md)
---
**创建时间**: 2026-03-22
**版本**: 1.0.0
**兼容性**: Linux, macOS, Windows

254
docs/SCRIPTS_SUMMARY.md Normal file
View File

@@ -0,0 +1,254 @@
# 一键启动脚本创建完成
## ✅ 已创建的文件
### Linux/Mac 脚本
1. **start.sh** - 一键启动脚本
- 自动检查依赖环境
- 启动后端和前端服务
- 保存进程 PID
- 健康检查
2. **stop.sh** - 停止脚本
- 优雅停止所有进程
- 强制清理残留进程
- 清理 PID 文件
3. **restart.sh** - 重启脚本
- 先停止后启动
- 等待间隔确保完全停止
4. **status.sh** - 状态查看脚本
- 检查服务运行状态
- 显示进程信息
- 提供日志查看命令
### Windows 脚本
1. **start.bat** - Windows 启动脚本
- 在新窗口中启动服务
- 自动检查环境
2. **stop.bat** - Windows 停止脚本
- 查找并停止进程
- 清理端口占用
### 文档
1. **docs/ONE_CLICK_START.md** - 详细使用指南
- 使用方法
- 故障排查
- 高级用法
## 🎯 使用方法
### 首次使用
```bash
# 1. 后端配置
cd backend
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# 编辑 .env 填入配置
# 2. 前端配置
cd ../frontend
npm install
# 3. 添加脚本执行权限
cd ..
chmod +x *.sh
```
### 日常使用
```bash
# 启动项目
./start.sh
# 查看状态
./status.sh
# 查看日志
tail -f logs/backend.log
tail -f logs/frontend.log
# 停止项目
./stop.sh
# 重启项目
./restart.sh
```
## 📊 启动输出示例
```bash
$ ./start.sh
========================================
ERP AI Assistant - 启动中...
========================================
启动后端服务...
PID: 12345
日志: /data/erp-ass/logs/backend.log
地址: http://localhost:8000
等待后端启动...
✓ 后端启动成功
启动前端服务...
PID: 12346
日志: /data/erp-ass/logs/frontend.log
地址: http://localhost:5173
等待前端启动...
前端启动成功
========================================
✅ 启动完成!
========================================
📍 访问地址:
前端: http://localhost:5173
后端: http://localhost:8000
API文档: http://localhost:8000/docs
📋 管理命令:
查看日志: tail -f logs/backend.log
停止服务: ./stop.sh
重启服务: ./restart.sh
```
## 💡 核心特性
### 1. 环境检查
脚本会自动检查:
- ✅ Python 虚拟环境是否存在
- ✅ 前端依赖是否安装
- ✅ .env 配置文件是否存在
如果缺失,会给出明确的提示。
### 2. 进程管理
- 自动清理旧进程
- 保存进程 PID 到 `logs/pids.txt`
- 支持优雅停止和强制停止
### 3. 日志管理
- 后端日志: `logs/backend.log`
- 前端日志: `logs/frontend.log`
- 支持 `tail -f` 实时查看
### 4. 健康检查
- 启动后自动检查服务是否正常运行
- 后端检查: `http://localhost:8000/health`
- 前端检查: `http://localhost:5173`
## 🔄 对比传统方式
### 传统方式(需要两个终端)
**终端 1**:
```bash
cd backend
source venv/bin/activate
python -m app.main
```
**终端 2**:
```bash
cd frontend
npm run dev
```
**缺点**:
- 占用两个终端窗口
- 需要记忆多个命令
- 没有统一的日志管理
- 没有进程管理
### 一键启动
```bash
./start.sh
```
**优点**:
- ✅ 一个命令完成所有启动
- ✅ 只占用一个终端
- ✅ 自动环境检查
- ✅ 统一日志管理
- ✅ 进程 PID 管理
- ✅ 健康检查
- ✅ 友好的输出信息
## 🐛 已知问题和解决方案
### 问题 1: 权限不足
**症状**: `bash: ./start.sh: Permission denied`
**解决方案**:
```bash
chmod +x *.sh
```
### 问题 2: 虚拟环境路径问题
**症状**: 虚拟环境激活失败
**解决方案**:
确保在项目根目录运行脚本,或使用绝对路径。
### 问题 3: 端口被占用
**症状**: 启动失败,端口已被使用
**解决方案**:
```bash
# 查看端口占用
lsof -i :8000
lsof -i :5173
# 停止服务
./stop.sh
# 或手动杀进程
kill -9 <PID>
```
## 📚 下一步
1. **测试脚本**: 运行 `./start.sh` 测试启动
2. **查看状态**: 运行 `./status.sh` 查看服务状态
3. **访问应用**: 打开 http://localhost:5173
4. **查看日志**: `tail -f logs/backend.log`
## 🎉 总结
现在你可以通过一个命令启动整个项目了!
**Linux/Mac**:
- 启动: `./start.sh`
- 停止: `./stop.sh`
- 状态: `./status.sh`
- 重启: `./restart.sh`
**Windows**:
- 启动: `start.bat`
- 停止: `stop.bat`
不再需要手动打开多个终端窗口!
---
**创建时间**: 2026-03-22
**文件数量**: 7 个4 个 Linux/Mac 脚本 + 2 个 Windows 脚本 + 1 个文档)
**所有脚本已添加执行权限**

25
restart.sh Executable file
View File

@@ -0,0 +1,25 @@
#!/bin/bash
# ERP AI Assistant - 重启脚本
set -e
# 颜色定义
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} ERP AI Assistant - 重启中...${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
# 停止服务
"$PROJECT_ROOT/stop.sh"
# 等待进程完全停止
sleep 2
# 启动服务
"$PROJECT_ROOT/start.sh"

66
start.bat Normal file
View File

@@ -0,0 +1,66 @@
@echo off
REM ERP AI Assistant - Windows 启动脚本
setlocal enabledelayedexpansion
echo ========================================
echo ERP AI Assistant - 启动中...
echo ========================================
echo.
REM 项目根目录
set PROJECT_ROOT=%~dp0
set BACKEND_DIR=%PROJECT_ROOT%backend
set FRONTEND_DIR=%PROJECT_ROOT%frontend
set LOGS_DIR=%PROJECT_ROOT%logs
REM 创建日志目录
if not exist "%LOGS_DIR%" mkdir "%LOGS_DIR%"
REM 检查虚拟环境
if not exist "%BACKEND_DIR%\venv" (
echo [错误] 后端虚拟环境不存在
echo 请先运行: cd backend ^&^& python -m venv venv ^&^& pip install -r requirements.txt
exit /b 1
)
REM 检查 node_modules
if not exist "%FRONTEND_DIR%\node_modules" (
echo [错误] 前端依赖未安装
echo 请先运行: cd frontend ^&^& npm install
exit /b 1
)
REM 检查 .env 文件
if not exist "%BACKEND_DIR%\.env" (
echo [警告] .env 文件不存在,使用 .env.example
copy "%BACKEND_DIR%\.env.example" "%BACKEND_DIR%\.env" > nul
)
echo 启动后端服务...
cd /d "%BACKEND_DIR%"
start "ERP AI Assistant - Backend" cmd /c "venv\Scripts\activate && python -m app.main"
echo 后端地址: http://localhost:8000
echo API文档: http://localhost:8000/docs
echo.
echo 启动前端服务...
cd /d "%FRONTEND_DIR%"
start "ERP AI Assistant - Frontend" cmd /c "npm run dev"
echo 前端地址: http://localhost:5173
echo.
echo ========================================
echo 启动完成!
echo ========================================
echo.
echo 前端地址: http://localhost:5173
echo 后端地址: http://localhost:8000
echo API文档: http://localhost:8000/docs
echo.
echo 提示: 后端和前端已在新窗口中启动
echo 关闭窗口即可停止服务
echo.
cd /d "%PROJECT_ROOT%"
pause

128
start.sh Executable file
View File

@@ -0,0 +1,128 @@
#!/bin/bash
# ERP AI Assistant - 一键启动脚本
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$PROJECT_ROOT/backend"
FRONTEND_DIR="$PROJECT_ROOT/frontend"
LOGS_DIR="$PROJECT_ROOT/logs"
# 创建日志目录
mkdir -p "$LOGS_DIR"
# 日志文件
BACKEND_LOG="$LOGS_DIR/backend.log"
FRONTEND_LOG="$LOGS_DIR/frontend.log"
PID_FILE="$LOGS_DIR/pids.txt"
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} ERP AI Assistant - 启动中...${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
# 检查虚拟环境
if [ ! -d "$BACKEND_DIR/venv" ]; then
echo -e "${RED}✗ 后端虚拟环境不存在${NC}"
echo -e "${YELLOW} 请先运行: cd backend && python3 -m venv venv && pip install -r requirements.txt${NC}"
exit 1
fi
# 检查 node_modules
if [ ! -d "$FRONTEND_DIR/node_modules" ]; then
echo -e "${RED}✗ 前端依赖未安装${NC}"
echo -e "${YELLOW} 请先运行: cd frontend && npm install${NC}"
exit 1
fi
# 检查 .env 文件
if [ ! -f "$BACKEND_DIR/.env" ]; then
echo -e "${YELLOW}⚠ .env 文件不存在,使用 .env.example${NC}"
cp "$BACKEND_DIR/.env.example" "$BACKEND_DIR/.env"
fi
# 清理旧进程
if [ -f "$PID_FILE" ]; then
echo -e "${YELLOW}停止旧进程...${NC}"
while read pid; do
if kill -0 "$pid" 2>/dev/null; then
kill "$pid" 2>/dev/null || true
fi
done < "$PID_FILE"
rm -f "$PID_FILE"
sleep 2
fi
# 清空日志
> "$BACKEND_LOG"
> "$FRONTEND_LOG"
echo -e "${GREEN}启动后端服务...${NC}"
cd "$BACKEND_DIR"
source venv/bin/activate
nohup python -m app.main >> "$BACKEND_LOG" 2>&1 &
BACKEND_PID=$!
echo "$BACKEND_PID" >> "$PID_FILE"
echo -e " PID: $BACKEND_PID"
echo -e " 日志: $BACKEND_LOG"
echo -e " 地址: ${GREEN}http://localhost:8000${NC}"
# 等待后端启动
echo -e "\n${YELLOW}等待后端启动...${NC}"
sleep 3
# 检查后端是否成功启动
if curl -s http://localhost:8000/health > /dev/null 2>&1; then
echo -e "${GREEN}✓ 后端启动成功${NC}"
else
echo -e "${YELLOW}⚠ 后端可能还在启动中,请稍后检查日志${NC}"
fi
echo -e "\n${GREEN}启动前端服务...${NC}"
cd "$FRONTEND_DIR"
nohup npm run dev >> "$FRONTEND_LOG" 2>&1 &
FRONTEND_PID=$!
echo "$FRONTEND_PID" >> "$PID_FILE"
echo -e " PID: $FRONTEND_PID"
echo -e " 日志: $FRONTEND_LOG"
echo -e " 地址: ${GREEN}http://localhost:5173${NC}"
# 等待前端启动
echo -e "\n${YELLOW}等待前端启动...${NC}"
sleep 5
# 检查前端是否成功启动
if curl -s http://localhost:5173 > /dev/null 2>&1; then
echo -e "${GREEN}✓ 前端启动成功${NC}"
else
echo -e "${YELLOW}⚠ 前端可能还在启动中,请稍后检查日志${NC}"
fi
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} ✅ 启动完成!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo -e "📍 访问地址:"
echo -e " 前端: ${BLUE}http://localhost:5173${NC}"
echo -e " 后端: ${BLUE}http://localhost:8000${NC}"
echo -e " API文档: ${BLUE}http://localhost:8000/docs${NC}"
echo ""
echo -e "📋 管理命令:"
echo -e " 查看日志: ${YELLOW}tail -f logs/backend.log${NC}${YELLOW}tail -f logs/frontend.log${NC}"
echo -e " 停止服务: ${YELLOW}./stop.sh${NC}"
echo -e " 重启服务: ${YELLOW}./restart.sh${NC}"
echo ""
echo -e "💡 提示:"
echo -e " - 后端日志: $BACKEND_LOG"
echo -e " - 前端日志: $FRONTEND_LOG"
echo -e " - 进程 PID 已保存到: $PID_FILE"
echo ""

70
status.sh Executable file
View File

@@ -0,0 +1,70 @@
#!/bin/bash
# ERP AI Assistant - 状态检查脚本
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PID_FILE="$PROJECT_ROOT/logs/pids.txt"
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} ERP AI Assistant - 服务状态${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
# 检查后端
echo -e "${YELLOW}后端服务:${NC}"
if curl -s http://localhost:8000/health > /dev/null 2>&1; then
HEALTH=$(curl -s http://localhost:8000/health)
echo -e " 状态: ${GREEN}✓ 运行中${NC}"
echo -e " 地址: http://localhost:8000"
echo -e " API文档: http://localhost:8000/docs"
echo -e " 健康检查: $HEALTH"
else
echo -e " 状态: ${RED}✗ 未运行${NC}"
fi
echo ""
# 检查前端
echo -e "${YELLOW}前端服务:${NC}"
if curl -s http://localhost:5173 > /dev/null 2>&1; then
echo -e " 状态: ${GREEN}✓ 运行中${NC}"
echo -e " 地址: http://localhost:5173"
else
echo -e " 状态: ${RED}✗ 未运行${NC}"
fi
echo ""
# 显示进程信息
if [ -f "$PID_FILE" ]; then
echo -e "${YELLOW}进程信息:${NC}"
while read pid; do
if kill -0 "$pid" 2>/dev/null; then
PROCESS_INFO=$(ps -p "$pid" -o pid,ppid,cmd --no-headers 2>/dev/null || echo "$pid (进程信息不可用)")
echo -e " ${GREEN}${NC} PID $PROCESS_INFO"
else
echo -e " ${RED}${NC} PID $pid (已停止)"
fi
done < "$PID_FILE"
else
echo -e "${YELLOW}未找到 PID 文件${NC}"
fi
echo ""
echo -e "${BLUE}========================================${NC}"
echo ""
# 日志提示
if [ -d "$PROJECT_ROOT/logs" ]; then
echo -e "${YELLOW}💡 查看日志:${NC}"
echo -e " 后端: tail -f $PROJECT_ROOT/logs/backend.log"
echo -e " 前端: tail -f $PROJECT_ROOT/logs/frontend.log"
echo ""
fi

39
stop.bat Normal file
View File

@@ -0,0 +1,39 @@
@echo off
REM ERP AI Assistant - Windows 停止脚本
echo ========================================
echo ERP AI Assistant - 停止中...
echo ========================================
echo.
echo 查找并停止后端进程...
for /f "tokens=2" %%i in ('tasklist ^| findstr /i "python.*app.main"') do (
echo 停止进程: %%i
taskkill /PID %%i /F > nul 2>&1
)
echo 查找并停止前端进程...
for /f "tokens=2" %%i in ('tasklist ^| findstr /i "node.*vite"') do (
echo 停止进程: %%i
taskkill /PID %%i /F > nul 2>&1
)
REM 也尝试通过端口查找进程
echo 检查端口占用...
for /f "tokens=5" %%a in ('netstat -aon ^| findstr ":8000" ^| findstr "LISTENING"') do (
echo 停止后端进程: %%a
taskkill /PID %%a /F > nul 2>&1
)
for /f "tokens=5" %%a in ('netstat -aon ^| findstr ":5173" ^| findstr "LISTENING"') do (
echo 停止前端进程: %%a
taskkill /PID %%a /F > nul 2>&1
)
echo.
echo ========================================
echo 停止完成
echo ========================================
echo.
pause

69
stop.sh Executable file
View File

@@ -0,0 +1,69 @@
#!/bin/bash
# ERP AI Assistant - 停止脚本
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PID_FILE="$PROJECT_ROOT/logs/pids.txt"
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} ERP AI Assistant - 停止中...${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
if [ ! -f "$PID_FILE" ]; then
echo -e "${YELLOW}⚠ 未找到 PID 文件,服务可能未运行${NC}"
exit 0
fi
# 读取并停止进程
STOPPED=0
FAILED=0
while read pid; do
if kill -0 "$pid" 2>/dev/null; then
PROCESS_NAME=$(ps -p "$pid" -o comm= 2>/dev/null || echo "Unknown")
echo -e "${YELLOW}停止进程: $pid ($PROCESS_NAME)${NC}"
if kill "$pid" 2>/dev/null; then
echo -e "${GREEN}✓ 进程 $pid 已停止${NC}"
((STOPPED++))
else
echo -e "${RED}✗ 无法停止进程 $pid${NC}"
((FAILED++))
fi
else
echo -e "${YELLOW} 进程 $pid 已不存在${NC}"
fi
done < "$PID_FILE"
# 等待进程完全停止
sleep 2
# 强制杀死残留进程
while read pid; do
if kill -0 "$pid" 2>/dev/null; then
echo -e "${YELLOW}强制停止进程: $pid${NC}"
kill -9 "$pid" 2>/dev/null || true
fi
done < "$PID_FILE"
# 清理 PID 文件
rm -f "$PID_FILE"
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} ✅ 停止完成${NC}"
echo -e "${GREEN}========================================${NC}"
echo -e " 已停止: $STOPPED 个进程"
if [ $FAILED -gt 0 ]; then
echo -e " 失败: ${RED}$FAILED${NC} 个进程"
fi
echo ""