# model-pic **Repository Path**: jianxia84/model-pic ## Basic Information - **Project Name**: model-pic - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-15 - **Last Updated**: 2026-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ✿ 集美寄拍 模特拍摄管理平台 —— 商家发布服装拍摄任务、指派模特;模特接单、收货、拍摄并上传成片,全程状态流转可追踪。 **技术栈**:静态 HTML / JS / CSS 前端 + Node.js 云端函数(Cloud Functions)+ 文件 / Blob 存储(无数据库),可一键部署到 **腾讯云 EdgeOne Makers**(静态托管 + Cloud Functions + Blob 对象存储)。 --- ## ✨ 功能 | 角色 | 功能 | | --- | --- | | 商家 | 发布拍摄任务(标题 / 分类 / 服装照片 / 拍摄数量 / 奖励金 / 是否赠送 / 赠送说明 / 拍摄备注 / 指派模特);编辑未接单任务;接单后确认寄出服装;查看模特交付成片;全程状态与时间线 | | 模特 | 查看商家指派的待接任务并接单;确认收货进入待拍摄;上传成片(前端自动压缩);完成拍摄交付;查看历史记录与累计收益;历史记录隐藏编辑(见下) | **任务状态流转**:`已发布 → 已接单 → 邮寄中 → 待拍摄 → 已完成` > 🕹️ **隐藏编辑(测试/演示用)**:模特在「我的任务」或「历史记录」中,对任务卡片的标题**连续快速点击 5 次(间隔 ≤ 3s)**即进入隐藏编辑模式,可全量修改该任务的任意字段——服装名称、分类、数量、奖励金、赠送规则、描述、备注、商品照片(更换/删除/新增成片)、状态,以及时间线(增删改每条状态流转事件)。保存后直接覆写任务数据(限本人任务)。此入口刻意隐藏,不影响正常业务流程。 ## 🔑 演示账号(登录页已隐藏提示,账号仍可用) | 角色 | 账号 | 密码 | 说明 | | --- | --- | --- | --- | | 商家 | `merchant` | `123456` | 风雨工作室 | | 模特 | `yanbeauty8886` | `yanbeauty8886` | 烟雨楼台(身高 160cm · 体重 95 斤 · 胸围 82 · 腰围 64 · 臀围 88) | 内置测试数据:18 个任务(16 条已完成历史记录 + 2 条拍摄中「2026-08-10 蓝色开叉牛仔半身裙」「2026-08-12 三防面料天丝拖地牛仔裤」),全部指派给模特「烟雨楼台」。商品主图与模特成片均为**真实照片**,存放于项目 `photos/` 目录(每个商品一个子目录:`p.jpg` 为商品主图,其余为模特拍摄图),由静态服务直接提供。 --- ## 🚀 本地运行(零依赖,仅需 Node ≥ 18) ```bash node server.js ``` - 访问 `http://localhost:8080` - 首次启动自动在 `data/` 目录生成 JSON 数据文件(`users.json` / `tasks.json` / `photos.json` / `seq.json`),修改即"数据库" - 端口可用环境变量覆盖:`PORT=9090 node server.js` > 本地存储 = 真实 JSON 文件;EdgeOne 部署后存储 = Blob 对象存储(`@edgeone/pages-blob` SDK,**仅支持 Cloud Functions**,见下方部署章节)。二者由同一份业务代码驱动(`cloud-functions/_lib/core.js`),仅存储实现不同(`fs-store.js` / `blob-store.js`),数据模型完全一致。 --- ## ☁️ 部署到腾讯云 EdgeOne Makers 平台要求(已按官方文档适配): - 后端函数位于 `./cloud-functions/` 目录,文件路径即路由(`api/tasks/[id].js` → `/api/tasks/:id`) - 函数处理器为 Handler 模式:导出 `onRequestGet` / `onRequestPost` 等方法(`export function onRequestX(context)`),context 含 `{ request, params, env }` - 运行时为 Node.js v20(完整 npm 生态),数据持久化使用 **Blob 对象存储**(`@edgeone/pages-blob` SDK,**Blob 仅支持 Cloud Functions,不支持 Edge Functions**;读操作统一强一致模式,保证状态机读取最新值) - 函数自定义日志(`console.log` / `console.error`)可在控制台「日志分析」中按关键字检索 - 请求/响应 body 上限 6MB,最大执行时长默认 30s → 前端上传图片已做 canvas 压缩(≤900px JPEG,≤1MB) - `edgeone.json` 已配置安装命令 `npm install` 与 API 响应 `Cache-Control: no-store`,避免边缘缓存 ### 方式一:Git 仓库导入(推荐) 1. 推送本仓库到 GitHub / Gitee / CNB 2. 打开 [EdgeOne Makers 控制台](https://console.cloud.tencent.com/edgeone/makers) → 新建项目 → **导入 Git 仓库** 3. 构建配置:无构建命令(纯静态 + 云端函数),安装命令 `npm install`(已写入 `edgeone.json`,自动安装 `@edgeone/pages-blob` 依赖) 4. 部署后**无需任何存储配置**:Blob 命名空间 `jimei-blob` 由 SDK 在首次请求时自动创建(见下),数据自动写入 5. 排查:函数 `console.log` / `console.error` 输出可在控制台「日志分析」按关键字检索(选择来源 **Cloud Functions**) ### 方式二:EdgeOne CLI ```bash npm install -g edgeone edgeone login # 选择 China 国内站,浏览器完成登录 edgeone makers dev # 本地联调(静态 + 云端函数同一端口) edgeone makers deploy -n jimei-jipai ``` ### Blob 存储(无需申请 / 绑定,零配置) 项目使用 [EdgeOne Makers Blob](https://pages.edgeone.ai/zh/document/blob-storage)(`@edgeone/pages-blob` SDK)持久化数据。**注意:Blob 仅支持 Cloud Functions**(`cloud-functions/` 目录),因此后端全部部署为 Cloud Functions 而非 Edge Functions: 1. **命名空间自动创建**:代码调用 `getStore("jimei-blob")`,平台在首次请求时自动创建命名空间,**无需控制台申请、无需审核、无需绑定变量**(Cloud Functions 内无需 projectId/token) 2. 数据在控制台 **存储 → Blob** 页可见(只读浏览,含命名空间与对象目录) 3. 首次请求时函数自动将种子数据写入 Blob(幂等,通过 `users` 键判断);如需重置数据,用 SDK/控制台删除对应对象即可 4. 免费版存储容量 1GB(本项目全部数据约 30KB,余量充足);读写采用强一致模式保证任务状态流转立即生效 ### 可选环境变量 | 变量 | 说明 | 默认值 | | --- | --- | --- | | `JIMEI_SECRET` | Token 签名密钥 | `jimei-jipai-demo-secret-2026`(生产环境请务必设置) | --- ## 📁 项目结构 ``` ├── index.html / merchant.html / model.html # 登录 / 商家 / 模特页面 ├── css/style.css # 品牌视觉体系 ├── js/ # 前端逻辑(api / common / 各页面) ├── photos/ # 真实商品主图与模特成片(静态资源,按商品分目录) ├── cloud-functions/ │ ├── _lib/ # 共享逻辑(非路由,自动复制到构建产物) │ │ ├── core.js # 纯业务逻辑:登录鉴权 / 任务 / 状态流转(双端共用) │ │ ├── blob-store.js # EdgeOne Blob 对象存储实现(SDK 自动创建命名空间) │ │ └── seed.js # 种子数据唯一数据源 │ └── api/ # 云端函数路由(Cloud Functions) │ ├── login.js / me.js / models.js │ ├── tasks.js / tasks/[id].js │ └── tasks/[id]/{accept,ship,receive,photos,complete,rewrite}.js ├── server.js # 本地开发服务器(复用同一 core.js + 文件存储) ├── fs-store.js # 本地 JSON 文件存储 ├── data/ # 本地运行生成(已 gitignore) ├── edgeone.json # EdgeOne 项目配置 └── package.json ``` ## 📡 API 一览 | 方法 | 路径 | 说明 | | --- | --- | --- | | POST | `/api/login` | 登录,返回 token + user | | GET | `/api/me` | 当前用户 | | GET | `/api/models` | 模特列表(商家) | | GET | `/api/tasks` | 任务列表(按角色过滤) | | POST | `/api/tasks` | 发布任务(商家) | | GET / PUT | `/api/tasks/:id` | 详情(含成片) / 编辑(仅已发布) | | POST | `/api/tasks/:id/accept` | 模特接单 | | POST | `/api/tasks/:id/ship` | 商家确认寄出 | | POST | `/api/tasks/:id/receive` | 模特确认收货 | | POST | `/api/tasks/:id/photos` | 上传单张成片(base64 dataURL) | | POST | `/api/tasks/:id/complete` | 完成拍摄 | | PUT | `/api/tasks/:id/rewrite` | 隐藏编辑(仅模特本人):全量覆写业务字段 / 状态 / 时间线 / 成片 | 除登录外均需 `Authorization: Bearer `。 ## ⚠️ 说明 - 演示项目出于简单性,密码为明文存储、Token 使用 HMAC 签名(无过期刷新);生产使用请接入正式鉴权与密钥管理 - 商品主图与模特成片为 `photos/` 目录下的真实照片(静态路径 `/photos/...`);模特新上传的成片为压缩后的 JPG dataURL,存储于 Blob / JSON 文件中