diff --git a/.gitignore b/.gitignore index 0a787ec..728c100 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,12 @@ uploads/ *.xlsx *.xls +# 下载的临时文件 +downloads/ + +# 配置数据(含凭据) +data/config.json + # IDE文件 .vscode/ .idea/ diff --git a/Dockerfile b/Dockerfile index 9189bb3..55f8f20 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,8 +10,26 @@ ENV PYTHONDONTWRITEBYTECODE=1 # 确保 Python 输出不被缓冲 ENV PYTHONUNBUFFERED=1 -# 安装系统依赖(如有需要) -# RUN apt-get update && apt-get install -y --no-install-recommends gcc && rm -rf /var/lib/apt/lists/* +# 安装 Playwright 所需的系统依赖 +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 . @@ -20,15 +38,17 @@ COPY requirements.txt . # 使用阿里云镜像源加速 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 COPY . . -# 创建上传目录(确保权限) -RUN mkdir -p uploads && chmod 777 uploads +# 创建上传目录和数据目录(确保权限) +RUN mkdir -p uploads data downloads && chmod 777 uploads data downloads # 暴露端口 5000 EXPOSE 5000 # 运行 app.py -# 生产环境建议使用 gunicorn (需添加到 requirements.txt),但这里为了简单直接运行 python app.py CMD ["python", "app.py"] diff --git a/README.md b/README.md index 753fae7..499fecf 100644 --- a/README.md +++ b/README.md @@ -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文件 - **自动加载** - 页面刷新时自动加载最新上传的文件 +### 自动获取数据 +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 -# 设置Flask环境 -export FLASK_DEBUG=False -# 设置端口 (手动运行 python app.py 时生效,Docker使用映射端口) -export PORT=5000 +cp .env.example .env ``` +主要配置项: + +| 变量 | 说明 | 默认值 | +|------|------|--------| +| `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/ ├── app.py # Flask应用主文件 +├── config.py # 配置管理模块 +├── automation/ # 自动化模块 +│ ├── __init__.py +│ ├── secsion.py # secsion.com 登录+导出逻辑 +│ ├── uploader.py # 本地文件导入 +│ └── scheduler.py # APScheduler 定时任务 ├── requirements.txt # Python依赖包列表 ├── Dockerfile # Docker构建文件 ├── docker-compose.yml # Docker Compose配置 +├── .env.example # 环境变量配置示例 ├── static/ # 静态资源目录 │ ├── css/ │ │ └── style.css # 样式文件 │ └── js/ │ └── main.js # 交互逻辑 ├── templates/ -│ └── index.html # 前端HTML模板 -├── uploads/ # 上传文件存储目录(持久化挂载) -└── README.md # 项目说明文档 +│ ├── index.html # 前端HTML模板 +│ └── settings.html # 设置页面 +├── uploads/ # 上传文件存储目录(持久化挂载) +├── data/ # 配置数据目录(持久化挂载) +├── downloads/ # 自动下载临时目录 +└── README.md # 项目说明文档 ``` ## 🛠️ 技术栈 @@ -158,6 +204,9 @@ SaleShow/ - **pandas** 2.3.3 - 数据处理 - **openpyxl** 3.1.5 - Excel文件处理 - **xlrd** 2.0.1 - 旧版Excel文件支持 +- **Playwright** - 浏览器自动化(secsion.com 数据获取) +- **APScheduler** - 定时任务调度 +- **python-dotenv** - 环境变量管理 ### 前端 - **HTML5** - 页面结构 @@ -168,6 +217,23 @@ SaleShow/ ### 开发工具 - **Git** - 版本控制 - **pip** - 包管理 +- **Docker** - 容器化部署 + +## 📡 API 接口 + +| 路由 | 方法 | 说明 | +|------|------|------| +| `/` | GET | 首页(数据分析页面) | +| `/settings` | GET | 设置页面 | +| `/files` | GET | 获取已上传文件列表 | +| `/load/` | GET | 加载指定文件数据 | +| `/upload` | POST | 上传 Excel 文件 | +| `/delete/` | 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日 *享受数据分析的乐趣!📊✨* diff --git a/docker-compose.yml b/docker-compose.yml index 008ce02..c3d61fa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,10 +5,17 @@ services: build: . container_name: saleshow-app ports: - - "${APP_PORT:-5000}:5000" # 映射主机端口:容器端口,支持通过 APP_PORT 环境变量修改主机端口 + - "${APP_PORT:-5000}:5000" environment: - PORT=5000 - 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: - - ./uploads:/app/uploads # 挂载上传目录,持久化数据 + - ./uploads:/app/uploads + - ./data:/app/data + - ./downloads:/app/downloads restart: unless-stopped diff --git a/requirements.txt b/requirements.txt index 93552b6..04861af 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,7 @@ Flask>=2.0.0 pandas>=2.0.0 openpyxl>=3.0.0 xlrd>=2.0.0 -Werkzeug>=2.0.0 \ No newline at end of file +Werkzeug>=2.0.0 +playwright>=1.40.0 +apscheduler>=3.10.0 +python-dotenv>=1.0.0 \ No newline at end of file