From bf2d7d2bba7cfa8710ee76a902a8f49047ab8588 Mon Sep 17 00:00:00 2001 From: xiangsilian Date: Sun, 18 Jan 2026 20:04:25 +0800 Subject: [PATCH] save code --- backend/app.py | 44 ++++++-- docs/API.md | 205 ++++++++++++++++++++++++++++++++++ frontend/css/style.css | 49 +++------ frontend/index.html | 24 +--- frontend/js/main.js | 47 ++------ hair_res.txt | 245 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 516 insertions(+), 98 deletions(-) create mode 100644 docs/API.md create mode 100644 hair_res.txt diff --git a/backend/app.py b/backend/app.py index 0f9a38b..d558cf0 100644 --- a/backend/app.py +++ b/backend/app.py @@ -13,26 +13,50 @@ app.config.from_object(Config) CORS(app) # 启用CORS,允许跨域请求 # 加载发型数据 -hairstyles_data = None -with open('data/hairstyles.json', 'r', encoding='utf-8') as f: - hairstyles_data = json.load(f) +def load_hairstyles_from_file(): + """ + 从hair_res.txt文件加载发型数据 + """ + hairstyles = [] + try: + # 读取hair_res.txt文件 + with open('../hair_res.txt', 'r', encoding='utf-8') as f: + lines = f.readlines() + + # 解析文件内容,提取图片URL + for i, line in enumerate(lines): + line = line.strip() + # 查找以https开头的行,这些是图片URL + if line.startswith('https://'): + # 生成发型ID和名称 + hairstyle_id = f'hair_{i:03d}' + hairstyle_name = f'发型{i}' + + # 添加到发型列表 + hairstyles.append({ + 'id': hairstyle_id, + 'name': hairstyle_name, + 'image_url': line + }) + except Exception as e: + print(f'加载发型数据失败: {str(e)}') + + return hairstyles + +# 加载发型数据 +hairstyles_data = load_hairstyles_from_file() @app.route('/api/hairstyles', methods=['GET']) def get_hairstyles(): """ 获取发型列表 - 返回按性别分类的发型数据 + 返回所有发型数据,不再区分男女 """ try: - # 按性别分类发型 - male_hairstyles = [h for h in hairstyles_data['hairstyles'] if h['gender'] == 'male'] - female_hairstyles = [h for h in hairstyles_data['hairstyles'] if h['gender'] == 'female'] - return jsonify({ 'success': True, 'data': { - 'male': male_hairstyles, - 'female': female_hairstyles + 'hairstyles': hairstyles_data } }) except Exception as e: diff --git a/docs/API.md b/docs/API.md new file mode 100644 index 0000000..aacbb9e --- /dev/null +++ b/docs/API.md @@ -0,0 +1,205 @@ +# 发型更换H5项目API文档 + +## 1. 文档说明 + +本文档描述了发型更换H5项目的API接口规范,所有前后端交互都应遵循此文档。任何API变更都应先修改此文档,然后再进行代码实现。 + +### 1.1 文档版本 + +| 版本 | 日期 | 描述 | 作者 | +|------|------|------|------| +| v1.0 | 2026-01-18 | 初始版本 | 系统生成 | + +### 1.2 基本信息 + +- **API基础路径**: `/api` +- **响应格式**: JSON +- **字符编码**: UTF-8 +- **认证方式**: 无需认证 + +## 2. 响应格式 + +所有API响应均采用统一的格式: + +### 2.1 成功响应 + +```json +{ + "success": true, + "data": {...}, + "message": "" +} +``` + +### 2.2 失败响应 + +```json +{ + "success": false, + "data": null, + "message": "错误信息" +} +``` + +## 3. API接口列表 + +| 接口路径 | 方法 | 功能描述 | 请求参数 | 成功响应数据 | +|---------|------|----------|---------|-------------| +| `/api/hairstyles` | GET | 获取发型列表 | 无 | `{ "hairstyles": [...] }` | +| `/api/change-hair` | POST | 更换发型 | image: 文件
hairstyle_id: 字符串 | `{ "result_image": "data:image/jpeg;base64,..." }` | + +## 4. 详细接口说明 + +### 4.1 获取发型列表 + +#### 4.1.1 请求信息 +- **路径**: `/api/hairstyles` +- **方法**: GET +- **参数**: 无 + +#### 4.1.2 响应信息 +- **状态码**: 200 OK +- **响应示例**: + +```json +{ + "success": true, + "data": { + "hairstyles": [ + { + "id": "hair_001", + "name": "发型1", + "image_url": "https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953267183426772993.jpg" + }, + { + "id": "hair_002", + "name": "发型2", + "image_url": "https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953267306382794754.jpg" + } + ] + }, + "message": "" +} +``` + +#### 4.1.3 字段说明 + +| 字段名 | 类型 | 描述 | +|-------|------|------| +| `id` | 字符串 | 发型唯一标识符 | +| `name` | 字符串 | 发型名称 | +| `image_url` | 字符串 | 发型图片的OSS URL | + +### 4.2 更换发型 + +#### 4.2.1 请求信息 +- **路径**: `/api/change-hair` +- **方法**: POST +- **参数**: + - `image`: 文件 (必填) - 用户上传的图片文件 + - `hairstyle_id`: 字符串 (必填) - 要更换的发型ID + +#### 4.2.2 响应信息 +- **状态码**: 200 OK +- **响应示例**: + +```json +{ + "success": true, + "data": { + "result_image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD..." + }, + "message": "" +} +``` + +#### 4.2.3 字段说明 + +| 字段名 | 类型 | 描述 | +|-------|------|------| +| `result_image` | 字符串 | 发型更换后的图片,Base64编码格式 | + +## 5. 错误处理 + +### 5.1 常见错误状态码 + +| 状态码 | 描述 | 示例消息 | +|-------|------|---------| +| 400 | 请求参数错误 | "请上传图片"、"请选择发型" | +| 500 | 服务器内部错误 | "获取发型列表失败: [错误信息]" | + +### 5.2 错误响应示例 + +```json +{ + "success": false, + "data": null, + "message": "请上传图片" +} +``` + +## 6. API变更流程 + +1. **文档修改**: 先修改本API文档,记录变更内容、原因和影响范围 +2. **代码实现**: 根据文档修改后端API实现 +3. **前端适配**: 前端根据文档修改进行适配 +4. **测试验证**: 测试新API的功能和兼容性 +5. **部署上线**: 按计划部署变更 + +## 7. 版本控制 + +当API需要重大变更时,应采用版本控制机制: + +1. **URL版本控制**: 在API路径中添加版本号,如 `/api/v2/hairstyles` +2. **向后兼容**: 保留旧版本API一段时间,确保前端有足够时间迁移 +3. **弃用通知**: 在响应中添加弃用警告,提示开发者使用新API + +## 8. 最佳实践 + +1. **使用标准HTTP方法**: GET用于获取数据,POST用于提交数据 +2. **保持接口幂等性**: 相同请求应产生相同结果 +3. **合理设置缓存**: 对频繁访问的数据进行缓存,提高性能 +4. **限流保护**: 对API调用进行限流,防止滥用 +5. **日志记录**: 记录API调用日志,便于问题排查 + +## 9. 附录 + +### 9.1 数据结构定义 + +#### 9.1.1 发型对象 (Hairstyle) + +```json +{ + "id": "string", + "name": "string", + "image_url": "string" +} +``` + +#### 9.1.2 更换发型请求 (ChangeHairRequest) + +``` +FormData: +- image: File +- hairstyle_id: string +``` + +#### 9.1.3 更换发型响应 (ChangeHairResponse) + +```json +{ + "result_image": "string" +} +``` + +### 9.2 开发工具推荐 + +- **API测试**: Postman, Insomnia +- **文档生成**: Swagger, ReDoc +- **代码生成**: OpenAPI Generator + +### 9.3 相关链接 + +- [RESTful API设计指南](https://restfulapi.net/) +- [OpenAPI规范](https://swagger.io/specification/) +- [HTTP状态码](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) \ No newline at end of file diff --git a/frontend/css/style.css b/frontend/css/style.css index f2999d2..f7422c3 100644 --- a/frontend/css/style.css +++ b/frontend/css/style.css @@ -121,46 +121,29 @@ body { object-fit: cover; } -/* 发型分类入口 */ -.category-section { +/* 下一步按钮 */ +.next-section { text-align: center; + margin-top: 3rem; } -.category-section h2 { - margin-bottom: 2rem; - color: #333; -} - -.category-buttons { - display: flex; - justify-content: center; - gap: 2rem; - flex-wrap: wrap; -} - -.category-btn { - display: flex; - flex-direction: column; - align-items: center; - padding: 2rem; - border: 2px solid #4A90E2; - border-radius: 12px; - background-color: white; - cursor: pointer; - transition: all 0.3s; - min-width: 150px; -} - -.category-btn:hover { +.next-btn { + padding: 1.5rem 3rem; background-color: #4A90E2; color: white; - transform: translateY(-5px); - box-shadow: 0 5px 15px rgba(74, 144, 226, 0.3); + border: none; + border-radius: 12px; + font-size: 1.2rem; + font-weight: 600; + cursor: pointer; + transition: all 0.3s; + min-width: 200px; } -.gender-icon { - font-size: 3rem; - margin-bottom: 1rem; +.next-btn:hover { + background-color: #357ABD; + transform: translateY(-5px); + box-shadow: 0 5px 15px rgba(74, 144, 226, 0.3); } /* 分类导航 */ diff --git a/frontend/index.html b/frontend/index.html index 6abb28b..9a75490 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -30,29 +30,17 @@ - -
-

选择发型分类

-
- - -
+ +
+
- -
- - -
+
diff --git a/frontend/js/main.js b/frontend/js/main.js index f1ee4ea..39c6c3a 100644 --- a/frontend/js/main.js +++ b/frontend/js/main.js @@ -30,11 +30,7 @@ async function changeHair(imageFile, hairstyleId) { // 全局变量 let uploadedImage = null; let selectedHairstyle = null; -let currentGender = 'male'; -let hairstylesData = { - male: [], - female: [] -}; +let hairstylesData = []; // DOM元素 const elements = { @@ -42,13 +38,10 @@ const elements = { homePage: document.getElementById('homePage'), imagePreview: document.getElementById('imagePreview'), imageUpload: document.getElementById('imageUpload'), - maleBtn: document.getElementById('maleBtn'), - femaleBtn: document.getElementById('femaleBtn'), + nextBtn: document.getElementById('nextBtn'), // 发型选择页元素 hairstylePage: document.getElementById('hairstylePage'), - navMaleBtn: document.getElementById('navMaleBtn'), - navFemaleBtn: document.getElementById('navFemaleBtn'), hairstyleGrid: document.getElementById('hairstyleGrid'), confirmBtn: document.getElementById('confirmBtn'), @@ -78,13 +71,8 @@ function bindEventListeners() { // 图片上传 elements.imageUpload.addEventListener('change', handleImageUpload); - // 性别分类按钮 - elements.maleBtn.addEventListener('click', () => navigateToHairstylePage('male')); - elements.femaleBtn.addEventListener('click', () => navigateToHairstylePage('female')); - - // 导航栏性别切换 - elements.navMaleBtn.addEventListener('click', () => switchGender('male')); - elements.navFemaleBtn.addEventListener('click', () => switchGender('female')); + // 下一步按钮 + elements.nextBtn.addEventListener('click', navigateToHairstylePage); // 确认按钮 elements.confirmBtn.addEventListener('click', handleConfirmHairstyle); @@ -104,9 +92,8 @@ async function loadHairstyles() { showLoading(); const response = await getHairstyles(); if (response.success) { - hairstylesData.male = response.data.male; - hairstylesData.female = response.data.female; - renderHairstyles(currentGender); + hairstylesData = response.data.hairstyles; + renderHairstyles(); } } catch (error) { alert('加载发型数据失败,请刷新页面重试'); @@ -134,36 +121,22 @@ function handleImageUpload(e) { } // 导航到发型选择页 -function navigateToHairstylePage(gender) { +function navigateToHairstylePage() { if (!uploadedImage) { alert('请先上传图片'); return; } - currentGender = gender; - switchGender(gender); + renderHairstyles(); showPage(elements.hairstylePage); showBackBtn(); } -// 切换性别 -function switchGender(gender) { - currentGender = gender; - - // 更新导航按钮状态 - elements.navMaleBtn.classList.toggle('active', gender === 'male'); - elements.navFemaleBtn.classList.toggle('active', gender === 'female'); - - // 重新渲染发型列表 - renderHairstyles(gender); -} - // 渲染发型列表 -function renderHairstyles(gender) { - const hairstyles = hairstylesData[gender]; +function renderHairstyles() { elements.hairstyleGrid.innerHTML = ''; - hairstyles.forEach(hairstyle => { + hairstylesData.forEach(hairstyle => { const hairstyleItem = document.createElement('div'); hairstyleItem.className = 'hairstyle-item'; hairstyleItem.dataset.id = hairstyle.id; diff --git a/hair_res.txt b/hair_res.txt new file mode 100644 index 0000000..af6b4fb --- /dev/null +++ b/hair_res.txt @@ -0,0 +1,245 @@ +OSS 图片下载地址列表 +生成时间: 2026-01-18 19:43:03 +有效期: 7天 +---------------------------------------------------------------------------------------------------- + +1. 1953267183426772993.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953267183426772993.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=J30TNCKCN%2Fga2cHnxxl2sXf3HAQ%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953267183426772993.jpg + +2. 1953267306382794754.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953267306382794754.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=iwhuJi4QJNcXeTGSAbTXMAIICUs%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953267306382794754.jpg + +3. 1953270535736827906.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953270535736827906.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=tAGbcGZOZ1nwhb9iLxLgtYcRn0U%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953270535736827906.jpg + +4. 1953270765379166210.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953270765379166210.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=7Owy2MKtfo3J8z%2Bd6HV4bWlSFwc%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953270765379166210.jpg + +5. 1953271979655340033.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953271979655340033.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=9z9jlCoNvhssT0%2FE8TUhbyktXmk%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953271979655340033.jpg + +6. 1953273003010990081.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953273003010990081.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=qbuFkWtdcvoBrKZBSQMQ%2FeDmwf4%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953273003010990081.jpg + +7. 1953288832876322818.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953288832876322818.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=BA21g5N1j6gFI7tAC8JVAbRPUzs%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953288832876322818.jpg + +8. 1954536274779217921.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536274779217921.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=JCV%2Fg7TFB7BEew9HF9Y%2Fzqb%2Bjqw%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536274779217921.jpg + +9. 1954536378869260289.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536378869260289.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=qMc35r6evXIFcFY9att6DLc1EGA%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536378869260289.jpg + +10. 1954536462671454210.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536462671454210.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=n5xCbJpM5rEsZK7BUwy8GwY9ttk%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536462671454210.jpg + +11. 1954536908916039681.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536908916039681.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=vTCweNOaT1XPe91pNenaBcYCJd4%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536908916039681.jpg + +12. 1954536989530562562.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536989530562562.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=wXztzfZl%2B5TrvqZ9%2BrlVeDL%2F3VI%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536989530562562.jpg + +13. 1954537056534568962.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537056534568962.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=k1t6Ah%2BUnYx7JyoBxPoB7dVHMBo%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537056534568962.jpg + +14. 1954537118522187778.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537118522187778.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=lZq6QdHis005jUprFxNLOFEJWOc%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537118522187778.jpg + +15. 1954537220443774978.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537220443774978.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=b%2F%2BXRbP7VaIbgiNWc3sArWZl9OQ%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537220443774978.jpg + +16. 1954537722342580225.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537722342580225.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=sV4pQvEz2aJK%2BVAzgk5gJD%2BvRDw%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537722342580225.jpg + +17. 1954537836041773058.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537836041773058.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=rrrWyVsRXJzLm72gpzt7OglHGSk%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537836041773058.jpg + +18. 1954538018150064130.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538018150064130.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=EtojY0%2BajUSRIIPHBgW7B3HO%2BMs%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538018150064130.jpg + +19. 1954538127558483970.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538127558483970.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=FUcuPhab2Hy45Li8t%2FyrHSAxyeI%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538127558483970.jpg + +20. 1954538206658863106.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538206658863106.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=4ZzTGliU0xlyGRr2FOgCaa1lvDM%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538206658863106.jpg + +21. 1954538312665702402.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538312665702402.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=8XtLzjFoU%2F4UVM1vWW2Tb3JiHw4%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538312665702402.jpg + +22. 1954538399596847105.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538399596847105.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=cP6hECwOodfmvvDFJ7cRdPJ2pYo%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538399596847105.jpg + +23. 1980312959671640066.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980312959671640066.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=wyZoqiybARkhX0VzLaxNCATR8l0%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980312959671640066.jpg + +24. 1980313137564655617.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313137564655617.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=sCunXHIhDpwfzorRS%2FMELL5S51w%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313137564655617.jpg + +25. 1980313176303247362.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313176303247362.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=75xDKKqm6LMEx78V12pJd6K8V30%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313176303247362.jpg + +26. 1980313387905884161.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313387905884161.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=LtVwta24J10UN9NCgApt%2FhNL0ac%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313387905884161.jpg + +27. 1980313509876244482.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313509876244482.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=CVbR16xL4IMcv77Bo1fYfFcynSE%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313509876244482.jpg + +28. 1980313698993217538.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313698993217538.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=LVB21yqsCl%2FoniUuxHKkfYpsfK0%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313698993217538.jpg + +29. 1980313788407390209.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313788407390209.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=Y8nL5%2Ba1X0cSnDV2vxAoV55Yj%2FM%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313788407390209.jpg + +30. 1980313965625122818.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313965625122818.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=Cr3kp3pVEMU4JkJXVmb47H9Pf5A%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313965625122818.jpg + +31. 1980314095635963906.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314095635963906.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=Naaq3DWK09vfFhiZocB7vB4vc5U%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314095635963906.jpg + +32. 1980314270513274881.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314270513274881.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=pQz2WLnrvgfXGHH5gMNp0XDvgkU%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314270513274881.jpg + +33. 1980314359856144386.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314359856144386.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=usf%2FpFGpN19DnJbiuSPMz70ytYE%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314359856144386.jpg + +34. 1980314448372736001.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314448372736001.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=XbnCavqYxxdrlwqNoGUvqt7BK3M%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314448372736001.jpg + +35. 1980314530165858305.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314530165858305.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=IF8pHMgpj5ehMrKwJ9f%2FSqg3Sy4%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314530165858305.jpg + +36. 1980314735825166337.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314735825166337.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=x3vi49fohgoiSOVu2F4fDFKOgtA%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314735825166337.jpg + +37. 1980314825046401025.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314825046401025.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=IDYtf4CqcQv80hkeAkun2IgpFZI%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314825046401025.jpg + +38. 1980314913021927426.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314913021927426.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=k0Vj6KBMo5oQZdRE1B%2FfAvKxWIc%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314913021927426.jpg + +39. 1980315190596771842.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980315190596771842.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=O4JoBUGCr7tdaP0TKHTfsXslomY%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980315190596771842.jpg + +40. 1980315251485483009.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980315251485483009.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=AlASa41wpcIckobaL78w6bFqi94%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980315251485483009.jpg + +41. 1980361645583802369.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980361645583802369.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=t09flD8Er%2Fz7E7JdrSJHP1UHDCk%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980361645583802369.jpg + +42. 1980367759775932418.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980367759775932418.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=2CZztgTQcXsofVDjpkmUgtbTinA%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367759775932418.jpg + +43. 1980367786975993857.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980367786975993857.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=goyLdGIttHQFCOE1s74HWG7IhEQ%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367786975993857.jpg + +44. 1980367822954733569.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980367822954733569.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=01BmPdUDD5DmWrgKHHEzVN3x6no%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367822954733569.jpg + +45. 1980367945432604674.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980367945432604674.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=7xcWvSmpGTDl%2FfWBdoEEVAi%2F%2F%2Fw%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367945432604674.jpg + +46. 1980368060729827329.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368060729827329.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=Iq0vyIpE5SlUDKrnDptmw1Zxfqw%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368060729827329.jpg + +47. 1980368182154928129.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368182154928129.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=23QZbeAHpSpWl1GByEPqhZRt1Uc%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368182154928129.jpg + +48. 1980368318314618881.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368318314618881.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=2rLl6YDVxzNA5b7OTNoR5TJjiBQ%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368318314618881.jpg + +49. 1980368442726064130.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368442726064130.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=OIRFLuemfFMp874fESBXFU6CXHo%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368442726064130.jpg + +50. 1980368569217884162.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368569217884162.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=SOURnVC0Xg0OHDw5JtgmhMb5b6I%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368569217884162.jpg + +51. 1980368701497843714.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368701497843714.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=0Kyv6mvAqCW4SW6Dsh1mkYGwyQk%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368701497843714.jpg + +52. 1980413331509649409.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980413331509649409.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=aF%2F%2BT54NeSsVPs%2B8%2FlFjQcQLH04%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980413331509649409.jpg + +53. 1980415354346971137.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980415354346971137.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=FVbFJ6Iob2oKWj0R3FhVlyV1eKc%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980415354346971137.jpg + +54. 1980415913099567106.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980415913099567106.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=xDxM7XKPshiaoch4Tf6rhNIciO0%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980415913099567106.jpg + +55. 1981177348821991426.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177348821991426.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=j1kSUgMSRd4mHom2wXplTwk%2F%2Bdk%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177348821991426.jpg + +56. 1981177450269622273.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177450269622273.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=7UUYMWTEZsTFgceH6geSHc60Uz8%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177450269622273.jpg + +57. 1981177567613665282.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177567613665282.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=sw07uihKbWggf8pn2%2Bppnx1pwIo%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177567613665282.jpg + +58. 1981177689399476226.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177689399476226.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=kwm9YVWio8Q8%2FFLOnqCyNy3FvwQ%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177689399476226.jpg + +59. 1981177812825260034.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177812825260034.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=gFs3LlHWc9eF%2Bm8DT6%2F8cSXDLoI%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177812825260034.jpg + +60. 1981177943427497985.jpg + http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177943427497985.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=hAyOiP9nLt9y7S3sYSPl8aH%2Flpw%3D + https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177943427497985.jpg +