feat: 更新 Dockerfile 安装 Playwright,更新 README 文档
This commit is contained in:
@@ -15,6 +15,12 @@ uploads/
|
|||||||
*.xlsx
|
*.xlsx
|
||||||
*.xls
|
*.xls
|
||||||
|
|
||||||
|
# 下载的临时文件
|
||||||
|
downloads/
|
||||||
|
|
||||||
|
# 配置数据(含凭据)
|
||||||
|
data/config.json
|
||||||
|
|
||||||
# IDE文件
|
# IDE文件
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
.idea/
|
||||||
|
|||||||
+25
-5
@@ -10,8 +10,26 @@ ENV PYTHONDONTWRITEBYTECODE=1
|
|||||||
# 确保 Python 输出不被缓冲
|
# 确保 Python 输出不被缓冲
|
||||||
ENV PYTHONUNBUFFERED=1
|
ENV PYTHONUNBUFFERED=1
|
||||||
|
|
||||||
# 安装系统依赖(如有需要)
|
# 安装 Playwright 所需的系统依赖
|
||||||
# RUN apt-get update && apt-get install -y --no-install-recommends gcc && rm -rf /var/lib/apt/lists/*
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
wget \
|
||||||
|
ca-certificates \
|
||||||
|
fonts-liberation \
|
||||||
|
libasound2 \
|
||||||
|
libatk-bridge2.0-0 \
|
||||||
|
libatk1.0-0 \
|
||||||
|
libcups2 \
|
||||||
|
libdbus-1-3 \
|
||||||
|
libdrm2 \
|
||||||
|
libgbm1 \
|
||||||
|
libgtk-3-0 \
|
||||||
|
libnspr4 \
|
||||||
|
libnss3 \
|
||||||
|
libxcomposite1 \
|
||||||
|
libxdamage1 \
|
||||||
|
libxrandr2 \
|
||||||
|
xdg-utils \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# 复制依赖文件
|
# 复制依赖文件
|
||||||
COPY requirements.txt .
|
COPY requirements.txt .
|
||||||
@@ -20,15 +38,17 @@ COPY requirements.txt .
|
|||||||
# 使用阿里云镜像源加速
|
# 使用阿里云镜像源加速
|
||||||
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
|
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
|
||||||
|
|
||||||
|
# 安装 Playwright Chromium 浏览器
|
||||||
|
RUN playwright install --with-deps chromium
|
||||||
|
|
||||||
# 复制当前目录内容到容器中的 /app
|
# 复制当前目录内容到容器中的 /app
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
# 创建上传目录(确保权限)
|
# 创建上传目录和数据目录(确保权限)
|
||||||
RUN mkdir -p uploads && chmod 777 uploads
|
RUN mkdir -p uploads data downloads && chmod 777 uploads data downloads
|
||||||
|
|
||||||
# 暴露端口 5000
|
# 暴露端口 5000
|
||||||
EXPOSE 5000
|
EXPOSE 5000
|
||||||
|
|
||||||
# 运行 app.py
|
# 运行 app.py
|
||||||
# 生产环境建议使用 gunicorn (需添加到 requirements.txt),但这里为了简单直接运行 python app.py
|
|
||||||
CMD ["python", "app.py"]
|
CMD ["python", "app.py"]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# 📊 销售数据分析器
|
# 📊 销售数据分析器
|
||||||
|
|
||||||
一个现代化的Web应用程序,用于分析和可视化销售数据。支持Excel文件上传,自动解析销售数据,提供丰富的分析功能和美观的界面展示。
|
一个现代化的Web应用程序,用于分析和可视化销售数据。支持Excel文件上传、自动从 secsion.com 获取数据,提供丰富的分析功能和美观的界面展示。
|
||||||
|
|
||||||
## ✨ 功能特性
|
## ✨ 功能特性
|
||||||
|
|
||||||
@@ -11,6 +11,14 @@
|
|||||||
- **数据筛选** - 按金额范围进行数据筛选
|
- **数据筛选** - 按金额范围进行数据筛选
|
||||||
- **搜索功能** - 支持商品名称搜索
|
- **搜索功能** - 支持商品名称搜索
|
||||||
|
|
||||||
|
### 🤖 自动化功能
|
||||||
|
- **自动获取数据** - 从 secsion.com 自动下载销售报表
|
||||||
|
- **店铺筛选** - 支持指定店铺 ID,仅导出目标店铺数据
|
||||||
|
- **Web UI 触发** - 在页面上选择日期范围一键下载
|
||||||
|
- **定时自动下载** - 每日凌晨自动获取前一天数据(APScheduler)
|
||||||
|
- **设置页面** - 在 Web UI 配置 secsion.com 账号密码、店铺 ID、定时任务
|
||||||
|
- **CLI 支持** - 命令行直接运行 `python -m automation.secsion --start 2026-04-28`
|
||||||
|
|
||||||
### 📊 数据展示
|
### 📊 数据展示
|
||||||
- **销售总览** - 显示总销售额、销售天数、商品种类等统计信息
|
- **销售总览** - 显示总销售额、销售天数、商品种类等统计信息
|
||||||
- **每日详情** - 按日期分组展示销售数据
|
- **每日详情** - 按日期分组展示销售数据
|
||||||
@@ -90,6 +98,21 @@ python app.py
|
|||||||
- **清理文件** - 点击"清理文件"按钮可删除所有上传的Excel文件
|
- **清理文件** - 点击"清理文件"按钮可删除所有上传的Excel文件
|
||||||
- **自动加载** - 页面刷新时自动加载最新上传的文件
|
- **自动加载** - 页面刷新时自动加载最新上传的文件
|
||||||
|
|
||||||
|
### 自动获取数据
|
||||||
|
1. **配置凭据** - 点击"设置"进入设置页面,填写 secsion.com 账号密码和店铺 ID
|
||||||
|
2. **手动获取** - 点击"自动获取"按钮,选择日期范围,点击"开始下载"
|
||||||
|
3. **定时获取** - 在设置页面启用定时任务,系统每日凌晨自动下载前一天数据
|
||||||
|
4. **CLI 模式** - 命令行运行:
|
||||||
|
```bash
|
||||||
|
# 下载指定日期数据
|
||||||
|
python -m automation.secsion --start 2026-04-28 --end 2026-04-28
|
||||||
|
|
||||||
|
# 指定用户名密码
|
||||||
|
python -m automation.secsion --start 2026-04-28 --username 18190686888 --password yourpassword
|
||||||
|
```
|
||||||
|
|
||||||
|
> **配置优先级**: Web UI 设置页 > 环境变量 (.env) > 默认值
|
||||||
|
|
||||||
## 🏗️ 部署说明
|
## 🏗️ 部署说明
|
||||||
|
|
||||||
### 开发环境部署
|
### 开发环境部署
|
||||||
@@ -125,30 +148,53 @@ gunicorn -w 4 -b 0.0.0.0:8000 app:app
|
|||||||
```
|
```
|
||||||
|
|
||||||
### 环境变量配置
|
### 环境变量配置
|
||||||
|
|
||||||
|
复制 `.env.example` 为 `.env` 并填写:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 设置Flask环境
|
cp .env.example .env
|
||||||
export FLASK_DEBUG=False
|
|
||||||
# 设置端口 (手动运行 python app.py 时生效,Docker使用映射端口)
|
|
||||||
export PORT=5000
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
主要配置项:
|
||||||
|
|
||||||
|
| 变量 | 说明 | 默认值 |
|
||||||
|
|------|------|--------|
|
||||||
|
| `SECSION_USERNAME` | secsion.com 用户名 | - |
|
||||||
|
| `SECSION_PASSWORD` | secsion.com 密码 | - |
|
||||||
|
| `SECSION_SHOP_ID` | 店铺 ID(留空导出所有) | 空 |
|
||||||
|
| `SCHEDULER_ENABLED` | 是否启用定时任务 | true |
|
||||||
|
| `SCHEDULER_HOUR` | 定时任务执行小时 | 1 |
|
||||||
|
| `SCHEDULER_MINUTE` | 定时任务执行分钟 | 0 |
|
||||||
|
| `FLASK_DEBUG` | Flask 调试模式 | False |
|
||||||
|
| `PORT` | 服务端口 | 5000 |
|
||||||
|
|
||||||
## 📁 项目结构
|
## 📁 项目结构
|
||||||
|
|
||||||
```
|
```
|
||||||
SaleShow/
|
SaleShow/
|
||||||
├── app.py # Flask应用主文件
|
├── app.py # Flask应用主文件
|
||||||
|
├── config.py # 配置管理模块
|
||||||
|
├── automation/ # 自动化模块
|
||||||
|
│ ├── __init__.py
|
||||||
|
│ ├── secsion.py # secsion.com 登录+导出逻辑
|
||||||
|
│ ├── uploader.py # 本地文件导入
|
||||||
|
│ └── scheduler.py # APScheduler 定时任务
|
||||||
├── requirements.txt # Python依赖包列表
|
├── requirements.txt # Python依赖包列表
|
||||||
├── Dockerfile # Docker构建文件
|
├── Dockerfile # Docker构建文件
|
||||||
├── docker-compose.yml # Docker Compose配置
|
├── docker-compose.yml # Docker Compose配置
|
||||||
|
├── .env.example # 环境变量配置示例
|
||||||
├── static/ # 静态资源目录
|
├── static/ # 静态资源目录
|
||||||
│ ├── css/
|
│ ├── css/
|
||||||
│ │ └── style.css # 样式文件
|
│ │ └── style.css # 样式文件
|
||||||
│ └── js/
|
│ └── js/
|
||||||
│ └── main.js # 交互逻辑
|
│ └── main.js # 交互逻辑
|
||||||
├── templates/
|
├── templates/
|
||||||
│ └── index.html # 前端HTML模板
|
│ ├── index.html # 前端HTML模板
|
||||||
├── uploads/ # 上传文件存储目录(持久化挂载)
|
│ └── settings.html # 设置页面
|
||||||
└── README.md # 项目说明文档
|
├── uploads/ # 上传文件存储目录(持久化挂载)
|
||||||
|
├── data/ # 配置数据目录(持久化挂载)
|
||||||
|
├── downloads/ # 自动下载临时目录
|
||||||
|
└── README.md # 项目说明文档
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🛠️ 技术栈
|
## 🛠️ 技术栈
|
||||||
@@ -158,6 +204,9 @@ SaleShow/
|
|||||||
- **pandas** 2.3.3 - 数据处理
|
- **pandas** 2.3.3 - 数据处理
|
||||||
- **openpyxl** 3.1.5 - Excel文件处理
|
- **openpyxl** 3.1.5 - Excel文件处理
|
||||||
- **xlrd** 2.0.1 - 旧版Excel文件支持
|
- **xlrd** 2.0.1 - 旧版Excel文件支持
|
||||||
|
- **Playwright** - 浏览器自动化(secsion.com 数据获取)
|
||||||
|
- **APScheduler** - 定时任务调度
|
||||||
|
- **python-dotenv** - 环境变量管理
|
||||||
|
|
||||||
### 前端
|
### 前端
|
||||||
- **HTML5** - 页面结构
|
- **HTML5** - 页面结构
|
||||||
@@ -168,6 +217,23 @@ SaleShow/
|
|||||||
### 开发工具
|
### 开发工具
|
||||||
- **Git** - 版本控制
|
- **Git** - 版本控制
|
||||||
- **pip** - 包管理
|
- **pip** - 包管理
|
||||||
|
- **Docker** - 容器化部署
|
||||||
|
|
||||||
|
## 📡 API 接口
|
||||||
|
|
||||||
|
| 路由 | 方法 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| `/` | GET | 首页(数据分析页面) |
|
||||||
|
| `/settings` | GET | 设置页面 |
|
||||||
|
| `/files` | GET | 获取已上传文件列表 |
|
||||||
|
| `/load/<filename>` | GET | 加载指定文件数据 |
|
||||||
|
| `/upload` | POST | 上传 Excel 文件 |
|
||||||
|
| `/delete/<filename>` | POST | 删除指定文件 |
|
||||||
|
| `/cleanup` | POST | 清理所有上传文件 |
|
||||||
|
| `/api/settings` | GET/POST | 获取/保存配置 |
|
||||||
|
| `/api/auto-download` | POST | 触发自动下载 |
|
||||||
|
| `/api/auto-download/status` | GET | 查询下载任务状态 |
|
||||||
|
| `/api/scheduler/status` | GET | 查询定时任务状态 |
|
||||||
|
|
||||||
## 🔒 安全说明
|
## 🔒 安全说明
|
||||||
|
|
||||||
@@ -196,6 +262,6 @@ SaleShow/
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**最后更新时间:** 2026年1月10日
|
**最后更新时间:** 2026年4月29日
|
||||||
|
|
||||||
*享受数据分析的乐趣!📊✨*
|
*享受数据分析的乐趣!📊✨*
|
||||||
|
|||||||
+9
-2
@@ -5,10 +5,17 @@ services:
|
|||||||
build: .
|
build: .
|
||||||
container_name: saleshow-app
|
container_name: saleshow-app
|
||||||
ports:
|
ports:
|
||||||
- "${APP_PORT:-5000}:5000" # 映射主机端口:容器端口,支持通过 APP_PORT 环境变量修改主机端口
|
- "${APP_PORT:-5000}:5000"
|
||||||
environment:
|
environment:
|
||||||
- PORT=5000
|
- PORT=5000
|
||||||
- FLASK_DEBUG=False
|
- FLASK_DEBUG=False
|
||||||
|
- SECSION_USERNAME=${SECSION_USERNAME:-}
|
||||||
|
- SECSION_PASSWORD=${SECSION_PASSWORD:-}
|
||||||
|
- SCHEDULER_ENABLED=${SCHEDULER_ENABLED:-true}
|
||||||
|
- SCHEDULER_HOUR=${SCHEDULER_HOUR:-1}
|
||||||
|
- SCHEDULER_MINUTE=${SCHEDULER_MINUTE:-0}
|
||||||
volumes:
|
volumes:
|
||||||
- ./uploads:/app/uploads # 挂载上传目录,持久化数据
|
- ./uploads:/app/uploads
|
||||||
|
- ./data:/app/data
|
||||||
|
- ./downloads:/app/downloads
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
@@ -3,3 +3,6 @@ pandas>=2.0.0
|
|||||||
openpyxl>=3.0.0
|
openpyxl>=3.0.0
|
||||||
xlrd>=2.0.0
|
xlrd>=2.0.0
|
||||||
Werkzeug>=2.0.0
|
Werkzeug>=2.0.0
|
||||||
|
playwright>=1.40.0
|
||||||
|
apscheduler>=3.10.0
|
||||||
|
python-dotenv>=1.0.0
|
||||||
Reference in New Issue
Block a user