save code

This commit is contained in:
xsl
2026-01-18 20:04:25 +08:00
parent 9a00ac3907
commit bf2d7d2bba
6 changed files with 516 additions and 98 deletions
+34 -10
View File
@@ -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:
+205
View File
@@ -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: 文件<br>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)
+16 -33
View File
@@ -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);
}
/* 分类导航 */
+6 -18
View File
@@ -30,29 +30,17 @@
</div>
</div>
<!-- 发型分类入口 -->
<div class="category-section">
<h2>选择发型分类</h2>
<div class="category-buttons">
<button id="maleBtn" class="category-btn">
<span class="gender-icon">👨</span>
<span>男士发型</span>
</button>
<button id="femaleBtn" class="category-btn">
<span class="gender-icon">👩</span>
<span>女士发型</span>
</button>
</div>
<!-- 下一步按钮 -->
<div class="next-section">
<button id="nextBtn" class="next-btn">
<span>下一步选择发型</span>
</button>
</div>
</section>
<!-- 发型选择页 -->
<section id="hairstylePage" class="page">
<!-- 分类导航 -->
<div class="category-nav">
<button id="navMaleBtn" class="nav-category-btn active">男士</button>
<button id="navFemaleBtn" class="nav-category-btn">女士</button>
</div>
<!-- 发型列表 -->
<div class="hairstyle-list">
+10 -37
View File
@@ -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;
+245
View File
@@ -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