Files
meida_front/sheep/store/fittingRoom.js
T
guigongli f0cd843f85 feat(fittingRoom): 新增衣服长度选择功能在上传衣服页面增加分类和长度选择功能,支持用户选择衣服类型和具体长度部位。新增 pattern 常量定义各种长度选项,并在 store 中添加相应的状态管理。同时更新了相关样式和组件依赖。
fix(uploadClothes): 修复上传页面分类选择逻辑

调整上传衣服页面的分类选择逻辑,使用 uv-radio-group 实现单选功能,支持衣服类型和长度部位的选择。引入 fittingRoom store 中的 tabs 和 pattern 数据,优化用户交互体验。

chore(deps): 更新 uv-icon 和 uv-radio 组件版本更新 uv-icon 和 uv-radio 组件的 package.json 配置文件,设置版本号为1.0.13。更新 changelog 文档,记录组件的优化和 bug 修复历史。完善组件的平台兼容性配置和依赖关系。

style(components): 调整上传页面样式布局优化上传衣服页面的样式布局,新增 warp、title、container 等样式类,改善分类和长度选择区域的显示效果。调整单选框的间距和对齐方式,提升用户界面的美观性和可用性。
2025-09-27 16:42:34 +08:00

181 lines
5.7 KiB
JavaScript

import { defineStore } from 'pinia';
import app from './app';
import FittingRoomApi from '../api/fittingRoom';
import sheep from '@/sheep';
const _tabsMap = [undefined, 'topCloth', 'bottomCloth', 'dress', 'suit', 'hair'];
export const pattern = [
{ value: 'body', label: '腰部以上' },
{ value: 'waist', label: '腰' },
{ value: 'thigh', label: '跨' },
{ value: 'thigh1', label: '大腿上部1/3' },
{ value: 'thigh2', label: '大腿中部' },
{ value: 'knee', label: '膝盖' },
{ value: 'leg', label: '小腿' },
{ value: 'leg1', label: '小腿上部1/3' },
{ value: 'foot', label: '脚踝' },
{ value: 'mopping', label: '拖地' },
];
const fittingRoom = defineStore({
id: 'fittingRoom',
state: () => ({
visable: false, // 上传模特, 选模特的
modelList: [], // 模特列表
currentModel: {},
type: true, // true: 我的衣橱, false: 衣服库
tab: 0, // 对应下面tabs的序号
tabs: ['全部', '上衣', '下装', '连衣裙', '外套', '套装', '发型'],
tabsMap: _tabsMap,
disableTabs: [6], // 不允许上传图的tab索引
clothes: [], // 接口返回的衣服数据
currentClothes: [], // 当前选的衣服
selectClothesType: 1, // 选中的衣服类型, 默认选中上衣
selectPattern: pattern[0].value, // 上传或者编辑衣服的时候的长短
sex: 'female',
testResults: [], // 当前模特的试穿结果列表
}),
getters: {
// 能上传图片的场景
canUpload(state) {
console.log(this.type, this.tab, state.type, '123');
// 除了发型其他都能上传
return this.type && !this.disableTabs.includes(this.tab);
},
},
actions: {
// 获取衣服分类
async getCategory(templateId = null) {
const httpResponse = await FittingRoomApi.getCategory();
let result = httpResponse.data[0]?.children;
this.tabs = ['全部', ...result?.map((item) => item.name), '发型'];
this.tabsMap = [undefined, ...result?.map((item) => item.id), 'hair'];
this.selectClothesType = result[0].id;
},
async getTestResults(modelId = '') {
const httpResponse = await FittingRoomApi.getTestResults({
modelId,
pageNo: '1',
pageSize: '30',
});
const result = httpResponse.data?.list ?? [];
// 将模特放到最后一张
result.push({
id: 100000,
modelId: modelId,
modelImageUrl:
'https://tupian05.oss-cn-beijing.aliyuncs.com/digital_cloth/1758853865858.png',
clothingImageUrl:
'https://tupian05.oss-cn-beijing.aliyuncs.com/digital_cloth/1758795488865.jpg',
tryOnResultUrl: this.currentModel.thumbnailFileUrl,
// "userId": 284,
// "createTime": 1758857790000
});
this.testResults = result;
console.log('🚀 ~ getTestResults 🐶76 ~ httpResponse: ', httpResponse.data?.list);
},
// 获取衣服类型数据查询
async getCloths(templateId = null) {
const httpResponse = await FittingRoomApi.getClothList({
sex: 'female',
isPerson: this.type ? 'yes' : 'no',
clothType: this.tabsMap[this.tab],
});
// 如果我的衣橱就往前加个空数组
this.clothes = this.canUpload
? [{}, ...(httpResponse.result || [])]
: httpResponse.result || [];
},
// 获取模特数据查询
async getModelList(templateId = null) {
const httpResponse = await FittingRoomApi.getModelList({
sex: this.sex,
});
let modelList = (httpResponse.result || []).slice(0, 4);
this.modelList = modelList;
this.currentModel = modelList?.[0] ?? {};
this.getTestResults(modelList?.[0]?.id);
},
// 试穿
async tryOn() {
if (!this.currentModel?.id) {
sheep.$helper.toast('请选择模特');
return
}
if (!this.currentClothes?.[0]?.fileUrl) {
sheep.$helper.toast('请选择衣服');
return
}
const httpResponse = await FittingRoomApi.tryOnApi({
"modelId": this.currentModel.id,
"modelImageUrl": this.currentModel.fileUrl,
"clothingImageUrl": this.currentClothes[0]?.fileUrl,
});
if (httpResponse.code !== 0) {
sheep.$helper.toast(httpResponse.msg);
return
}
this.getTestResults(this.currentModel.id)
},
// 切换模特
switchModels(item) {
if (item.id === this.currentModel.id) {
return;
}
console.log('🚀 ~ switchModels 🐶106 ~ item: ', item);
this.currentModel = item;
this.getTestResults(item.id);
},
async uploadAndEditCloth(data = {}) {
await FittingRoomApi.uploadAndEditCloth({
clothType: this.selectClothesType,
isSync: 'yes',
sex: this.sex,
len: this.selectPattern,
...data,
});
},
setVisable(visable) {
console.log('🚀 ~ setVisable ?1207 ~ visable: ', visable);
this.visable = visable ?? !this.visable;
},
// 我的衣服库和衣橱的切换
changeType(visable) {
console.log('🚀 ~ setVisable ?1128 ~ visable: ', visable);
this.type = visable ?? !this.type;
this.getCloths();
},
changeTheSelected(data) {
console.log('🚀 ~ changeTheSelected ?1310 ~ data: ', data);
this.selectPattern = data.selectPattern;
this.selectClothesType = data.selectClothesType;
},
changeTab(index) {
console.log('切换tab');
this.tab = index;
this.getCloths();
},
// 点击衣服
changeClothes(data) {
console.log("🚀 ~ changeClothes ~ data: ", data);
this.currentClothes = [data];
console.log('切换衣服');
},
},
persist: {
enabled: true,
strategies: [
{
key: 'fittingRoom-store',
},
],
},
});
export default fittingRoom;