Files
yidaima_tools/.trae/documents/project-screenshot-automation-plan.md
2026-04-10 14:37:23 +08:00

464 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 项目截图自动化功能实施计划
## 需求分析
根据用户提供的八爪鱼 RPA 流程图,需要实现以下功能:
### 项目结构
* **服务后端**: Java SpringBoot 项目
* **前台前端**: Vue3 前端项目(部分项目可能没有)
* **后台前端**: Vue3 管理后台项目
### 脚本文件
* `run_install_server.bat` - 后端 Maven 构建
* `run_install_front.bat` - 前台前端依赖安装
* `run_install_admin.bat` - 后台前端依赖安装
* `run_server.bat` - 启动服务后端
* `run_front.bat` - 启动前台前端
* `run_admin.bat` - 启动后台前端
* `run_sql.bat` - 导入 SQL 脚本SQL 脚本在后端项目文件夹下的 db 文件夹中)
### 执行流程(根据八爪鱼流程图)
```
主流程
├── 初始化变量
├── 打开网页
├── 导入 SQL
├── 更换图片
├── 后台网页截图
├── 启动后端服务
├── 启动前端服务
├── 前端依赖 install
├── 前台网页截图
├── 收尾工作
└── 准备工作
```
## 实施步骤
### 阶段 1: 创建核心模块
#### 1.1 创建 `project_screenshot.py` 模块
* 实现 `ProjectScreenshotAutomation`
* 功能包括:
* 项目路径配置管理
* 执行 bat 脚本(构建、安装依赖、启动服务)
* SQL 导入功能
* 使用 Playwright 进行浏览器控制和截图
* 菜单识别和遍历截图
#### 1.2 关键功能实现
**脚本执行功能:**
```python
def execute_bat(bat_path: str, cwd: str = None, timeout: int = 300) -> tuple[bool, str]:
"""执行 bat 脚本并返回结果"""
def wait_for_service(url: str, timeout: int = 120) -> bool:
"""等待服务启动完成"""
```
**SQL 导入功能:**
```python
def import_sql(sql_file: str, db_config: dict) -> bool:
"""导入 SQL 脚本到数据库"""
```
**更换前台轮播图片功能:**
```python
def get_random_images(bg_pic_folder: str, count: int = 3) -> list:
"""从指定文件夹随机获取指定数量的图片文件"""
def copy_images_to_target(source_images: list, target_folder: str) -> bool:
"""将源图片复制到目标文件夹并重命名为 swiperPicture1.jpg 等"""
def replace_swiper_images(project_path: str, desktop_path: str) -> str:
"""
更换前台轮播图片
1. 从桌面 bg_pic 文件夹随机选择 3 张图片
2. 复制到项目 server/src/main/resources/static/file 目录
3. 重命名为 swiperPicture1.jpg、swiperPicture2.jpg、swiperPicture3.jpg
"""
```
**更换后台登录背景图功能:**
```python
def update_login_vue_background(project_path: str) -> bool:
"""
修改 login.vue 文件中的背景图片链接
1. 从预设图片列表中随机选择一张
2. 替换 front/manage_code/src/views/login.vue 中的 background: url()
"""
# 预设后台登录背景图片列表
LOGIN_BACKGROUND_IMAGES = [
"http://img.yidaima.cn/7-dcd4fc1e8d0144aaa064bc282d1af289",
"http://img.yidaima.cn/6-3db67e2e6ff64e018d48282638900a67",
"http://img.yidaima.cn/5-74ee6fe2f0954a8db2574e8f7fbb8ef2",
"http://img.yidaima.cn/4-a926593ba8c444a3984100e99ae322bb",
"http://img.yidaima.cn/3-f91e9a0ed55d45c9aff80a08f554c625",
"http://img.yidaima.cn/2-2bd41cdd57b54b529dc3a139e66233e0",
"http://img.yidaima.cn/1-5a0b7ee2344a46bd987c1cafff19b3ba",
"http://img.yidaima.cn/8-495b9767a2f34197b963a13226d3e1d2",
"http://img.yidaima.cn/10-991483f941914f3d85bf87a4f8748fee",
"http://img.yidaima.cn/11-d274f1d695f7472a8fcd2c8c6238a79e",
"http://img.yidaima.cn/14-0e30653336d849379060ad8c436fe512",
"http://img.yidaima.cn/16-7a58235a2a4040f99e3431c3cac9ea7a",
"http://img.yidaima.cn/17-3406a546b81c412d9e3501cdb0f88b12",
"http://img.yidaima.cn/18-0a2fae1d6634480dabf5471fa86b3623",
"http://img.yidaima.cn/19-107196938e074c92a40b62c60aed18a4"
]
```
**截图功能:**
```python
def capture_screenshots(base_url: str, menu_selectors: list, output_dir: str) -> list:
"""根据菜单进行截图"""
```
### 阶段 2: 配置管理扩展
#### 2.1 更新 `config_loader.py`
添加项目截图自动化相关配置:
```yaml
project_screenshot:
# 项目路径配置
project_path: ""
has_front: true # 是否有前台前端
# 脚本路径配置(相对项目路径或绝对路径)
scripts:
install_server: "run_install_server.bat" # 后端 Maven 构建
install_front: "run_install_front.bat" # 前台前端依赖安装
install_admin: "run_install_admin.bat" # 后台前端依赖安装
run_server: "run_server.bat" # 启动服务后端
run_front: "run_front.bat" # 启动前台前端
run_admin: "run_admin.bat" # 启动后台前端
run_sql: "run_sql.bat" # 导入 SQL 脚本
# SQL 配置
sql:
script_path: "server/db/init.sql" # SQL 脚本路径(相对项目路径)
# 服务配置
services:
backend:
url: "http://localhost:8080"
health_endpoint: "/actuator/health"
startup_timeout: 120
front:
url: "http://localhost:8082" # 前台前端地址
login_url: "http://localhost:8082/#/login" # 前台登录页面
startup_timeout: 60
admin:
url: "http://localhost:8081" # 后台前端地址
login_url: "http://localhost:8081/#/login" # 后台登录页面
startup_timeout: 60
# 登录配置
login:
admin: # 后台登录配置
username: "admin"
password: "admin"
username_selector: "input[placeholder='请输入用户名'], input[name='username'], #username"
password_selector: "input[placeholder='请输入密码'], input[name='password'], #password, input[type='password']"
submit_selector: "button[type='submit'], .login-btn, .el-button--primary"
front: # 前台登录配置
username: "2"
password: "123456"
username_selector: "input[placeholder='请输入用户名'], input[name='username'], #username"
password_selector: "input[placeholder='请输入密码'], input[name='password'], #password, input[type='password']"
submit_selector: "button[type='submit'], .login-btn, .el-button--primary"
# 截图配置
screenshot:
output_dir: "./screenshots"
full_page: true
menu_selectors: # 菜单识别选择器
admin: ".el-menu-item, .el-sub-menu__title"
front: ".nav-item, .menu-item"
delay: 2000 # 截图前等待时间(ms)
# 轮播图片配置
swiper_images:
source_folder: "{desktop_path}/bg_pic" # 图片来源文件夹(桌面 bg_pic
target_subpath: "server/src/main/resources/static/file" # 目标路径(相对于项目路径)
target_names:
- "swiperPicture1.jpg"
- "swiperPicture2.jpg"
- "swiperPicture3.jpg"
count: 3 # 随机选择的图片数量
# 后台登录背景图配置
login_background:
vue_file_subpath: "front/manage_code/src/views/login.vue" # login.vue 相对项目路径
images: # 预设背景图片列表
- "http://img.yidaima.cn/7-dcd4fc1e8d0144aaa064bc282d1af289"
- "http://img.yidaima.cn/6-3db67e2e6ff64e018d48282638900a67"
- "http://img.yidaima.cn/5-74ee6fe2f0954a8db2574e8f7fbb8ef2"
- "http://img.yidaima.cn/4-a926593ba8c444a3984100e99ae322bb"
- "http://img.yidaima.cn/3-f91e9a0ed55d45c9aff80a08f554c625"
- "http://img.yidaima.cn/2-2bd41cdd57b54b529dc3a139e66233e0"
- "http://img.yidaima.cn/1-5a0b7ee2344a46bd987c1cafff19b3ba"
- "http://img.yidaima.cn/8-495b9767a2f34197b963a13226d3e1d2"
- "http://img.yidaima.cn/10-991483f941914f3d85bf87a4f8748fee"
- "http://img.yidaima.cn/11-d274f1d695f7472a8fcd2c8c6238a79e"
- "http://img.yidaima.cn/14-0e30653336d849379060ad8c436fe512"
- "http://img.yidaima.cn/16-7a58235a2a4040f99e3431c3cac9ea7a"
- "http://img.yidaima.cn/17-3406a546b81c412d9e3501cdb0f88b12"
- "http://img.yidaima.cn/18-0a2fae1d6634480dabf5471fa86b3623"
- "http://img.yidaima.cn/19-107196938e074c92a40b62c60aed18a4"
```
### 阶段 3: GUI 界面开发
#### 3.1 在 `gui.py` 中添加新的 Tab
创建 "项目截图" Tab包含以下区域
**配置区域:**
* 项目路径选择(文件夹浏览器)
* 是否有前台前端复选框
* 各脚本路径配置(可编辑,有默认值)
* SQL 脚本路径配置
**服务配置区域:**
* 后端服务 URL 和端口
* 前台前端 URL 和端口
* 后台前端 URL 和端口
**操作按钮区域:**
1. **构建/安装按钮:**
* "Maven 构建后端" - 执行 run\_install\_server.bat
* "安装前台依赖" - 执行 run\_install\_front.bat
* "安装后台依赖" - 执行 run\_install\_admin.bat
* "导入 SQL" - 执行 run\_sql.bat
2. **启动按钮:**
* "启动后端服务" - 执行 run\_server.bat
* "启动前台前端" - 执行 run\_front.bat
* "启动后台前端" - 执行 run\_admin.bat
3. **截图按钮:**
* "后台截图" - 遍历后台菜单截图
* "前台截图" - 遍历前台菜单截图(如果有)
* "一键完整流程" - 按顺序执行所有步骤
**日志输出区域:**
* 显示执行日志
* 进度条显示当前步骤
### 阶段 4: 流程实现
#### 4.1 完整流程执行顺序
根据八爪鱼流程图,实现以下执行顺序:
```
1. 初始化变量
- 加载项目配置
- 检查必要文件是否存在
2. 准备工作
- 检查项目路径
- 验证脚本文件存在
- 创建截图输出目录
3. 导入 SQL
- 执行 run_sql.bat
- 或使用 Python 直接执行 SQL 文件
4. 更换图片
- **更换前台轮播图片**
- 从桌面 bg_pic 文件夹随机选择 3 张图片
- 复制到项目 server/src/main/resources/static/file 目录
- 重命名为 swiperPicture1.jpg、swiperPicture2.jpg、swiperPicture3.jpg
- **更换后台登录背景图**
- 修改 front/manage_code/src/views/login.vue 文件
- 从预设图片列表中随机选择一张背景图
- 替换 CSS 中的 background: url() 属性
5. 前端依赖 install
- 执行 run_install_front.bat如果有前台
- 执行 run_install_admin.bat
6. 启动后端服务
- 执行 run_server.bat
- 等待服务健康检查通过
7. 启动前端服务
- 执行 run_front.bat如果有前台
- 执行 run_admin.bat
- 等待服务启动
8. 打开后台网页并登录
- 使用 Playwright 打开后台登录页面 http://localhost:8081/#/login
- 输入用户名 admin密码 admin
- 点击登录按钮
- 等待登录成功跳转
9. 后台网页截图
- 登录成功后访问 http://localhost:8081
- 识别菜单项
- 遍历每个菜单进行截图
10. 前台网页截图(如果有前台)
- 打开前台登录页面 http://localhost:8082/#/login
- 输入用户名 2密码 123456
- 点击登录按钮
- 登录成功后访问 http://localhost:8082
- 识别菜单项
- 遍历每个菜单进行截图
11. 收尾工作
- 关闭浏览器
- 停止服务(可选)
- 生成截图报告
```
### 阶段 5: 截图功能实现
#### 5.1 菜单识别和截图
```python
class ScreenshotCapture:
def __init__(self, browser, output_dir: str):
self.browser = browser
self.output_dir = output_dir
async def login(self, login_url: str, username: str, password: str,
username_selector: str, password_selector: str, submit_selector: str):
"""
执行登录操作
1. 打开登录页面
2. 输入用户名和密码
3. 点击登录按钮
4. 等待登录成功
"""
async def capture_menu_screenshots(self, base_url: str, menu_selector: str):
"""
1. 访问基础页面(已登录状态)
2. 识别所有菜单项
3. 点击每个菜单并截图
4. 保存到输出目录
"""
async def capture_full_page(self, url: str, filename: str):
"""截取整页截图"""
```
### 阶段 6: 测试和验证
#### 6.1 功能测试
* [ ] 单个 bat 脚本执行测试
* [ ] SQL 导入功能测试
* [ ] 服务启动和等待测试
* [ ] 菜单识别和截图测试
* [ ] 完整流程测试
#### 6.2 边界情况处理
* 项目没有前台前端的情况
* 服务启动超时处理
* 菜单识别失败处理
* 截图保存失败处理
## 文件结构
```
yidaima/
├── gui.py # 主 GUI添加项目截图 Tab
├── config_loader.py # 配置加载器(扩展)
├── project_screenshot.py # 项目截图自动化核心模块(新增)
├── core/
│ └── browser.py # 浏览器控制(扩展 Playwright
└── utils/
└── screenshot.py # 截图工具(扩展)
```
## 依赖项
需要添加的依赖:
```
playwright>=1.40.0
```
安装命令:
```bash
pip install playwright
playwright install chromium
```
## 实施顺序
1. **创建** **`project_screenshot.py`** - 核心自动化模块
2. **扩展** **`config_loader.py`** - 添加项目截图配置
3. **扩展** **`gui.py`** - 添加项目截图 Tab
4. **测试验证** - 完整流程测试
5. **打包发布** - PyInstaller 打包 exe
## 注意事项
1. **服务进程管理**: 启动的服务进程需要在适当的时候关闭
2. **端口占用检查**: 启动服务前检查端口是否被占用
3. **超时处理**: 每个步骤都需要有合理的超时时间
4. **错误恢复**: 某一步失败时能够优雅地停止并报告
5. **并发安全**: 避免同时执行多个自动化流程