Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite

This commit is contained in:
2026-04-27 09:40:03 +08:00
22 changed files with 304 additions and 225 deletions

View File

@@ -409,7 +409,7 @@ export class BrushIndicator {
// this.show(e.e);
this._mouseEnterHandler && this._mouseEnterHandler(e)
} else {
// requestIdleCallback(() => {
// setTimeout(() => {
// this.updatePosition(e.e);
// });

View File

@@ -133,11 +133,12 @@ export class RedGreenModeManager {
this.canvas.on("mouse:up", (event) => {
// 可以在这里添加更多逻辑,比如生成图片或更新状态
nextTick(() => {
requestIdleCallback(async () => {
setTimeout(async () => {
if (!this.isInitialized) {
console.warn("红绿图模式未初始化,无法处理鼠标事件");
return;
}
console.log("鼠标抬起事件触发", this.onImageGenerated);
if (this.onImageGenerated) {
const imageData = await this.canvasManager.exportImage({
restoreOpacityInRedGreen: true, // 恢复红绿图模式下的透明度

View File

@@ -37,7 +37,6 @@ export class ThumbnailManager {
// 延迟执行避免阻塞UI
fabricObjects.length > 0 &&
requestIdleCallback(() => {
setTimeout(async () => {
const base64 = await this._generateLayerThumbnailNow(fabricObjects, layer);
// this.layerThumbnails.set(layerId, base64);
@@ -55,7 +54,6 @@ export class ThumbnailManager {
console.error("生成图层缩略图时出错:", error);
}
});
});
}
/**
@@ -65,7 +63,7 @@ export class ThumbnailManager {
generateAllLayerThumbnails(layers) {
if (!layers || !Array.isArray(layers)) return;
requestIdleCallback(() => {
setTimeout(() => {
setTimeout(() => {
layers.forEach((layer) => {
if (layer && layer.id) {

View File

@@ -155,7 +155,7 @@ export class LiquifyRealTimeUpdater {
// 使用requestAnimationFrame进行批量渲染优化
// if (!this.renderingScheduled && !this.config.skipRenderDuringDrag) {
// this.renderingScheduled = true;
// requestIdleCallback(() => {
// setTimeout(() => {
// this.canvas.renderAll();
// this.renderingScheduled = false;
// });

View File

@@ -189,11 +189,11 @@ export default defineComponent({
}
return { scaleX, scaleY, rotate };
}
const initMoveableForSelected = () => {
const initMoveableForSelected = async (isDestroy:boolean = false) => {
// 销毁旧的实例
if(selectItem.imgDomIndex == -1)return
if (moveableInstance.value) {
moveableInstance.value.destroy();
if (moveableInstance?.value?.destroy && !isDestroy) {
moveableInstance?.value?.destroy();
}
const selectedEl = elementRefs.value[selectItem.imgDomIndex];
@@ -509,7 +509,7 @@ export default defineComponent({
watch(()=>detailData.frontBack.front.length,(newValue,oldValue)=>{
if(selectItem.selectDetail?.id)selectItem.imgDomIndex = detailData.frontBack.front.findIndex((item:any)=>item.id == selectItem.selectDetail?.id)
setTimeout(()=>{
initMoveableForSelected()
initMoveableForSelected(oldValue == 0)
},100)
})
const setRevocation = async ()=>{

View File

@@ -208,7 +208,7 @@ const routes: Array<RouteRecordRaw> = [
import("@/views/SellerDashboard/MyListings/createSelect/index.vue")
},
{
path: "select/:id",
path: "select/:collectionId",
name: "myListingsSelectItem",
meta: { enter: "all" },
component: () =>

View File

@@ -7,6 +7,7 @@ import UserHabit from './userHabit/userHabit'
import Workspace from './workspace/workspace'
import Guide from './guide/guide'
import adminPage from './adminPage/adminPage'
import seller from './seller/index'
export interface RootState{
}
@@ -41,5 +42,6 @@ export default createStore<RootState>({
Workspace,
Guide,
adminPage,
seller,
}
})

6
src/store/seller/index.d.ts vendored Normal file
View File

@@ -0,0 +1,6 @@
export const ApplyStatus = {
Null: null,// 未申请过
Pending: 0,// 已提交, 待审核
Approved: 1,// 审核通过
Rejected: 2,// 审核拒绝
}

40
src/store/seller/index.ts Normal file
View File

@@ -0,0 +1,40 @@
import { Module } from 'vuex'
import { RootState } from '../index'
import i18n from "@/lang/index";
import { Https } from '@/tool/https'
import { ApplyStatus } from "./index.d"
import store from '../index'
interface Seller {
isSeller: boolean,
applyStatus: number,
}
const seller: Module<Seller, RootState> = {
namespaced: true,
state: {
isSeller: false,
applyStatus: null,
},
mutations: {
set_isSeller(state: Seller, value: boolean) {
state.isSeller = value
},
set_applyStatus(state: Seller, value: number) {
state.applyStatus = value
if (value == ApplyStatus.Approved) {
state.isSeller = true
}
},
},
actions: {
get_isSeller({ commit }) {
// Https.axiosGet(Https.httpUrls.checkSellerDesigner).then(rv => {
// commit('set_isSeller', !!rv)
// })
},
}
}
export default seller

View File

@@ -475,6 +475,12 @@ export const Https = {
// 卖家端接口
checkSellerDesigner: '/seller/designer/check', // 检查卖家是否为设计师
getSellerApplyStatus: '/seller/designer/apply/status', // 获取卖家申请状态
submitSellerApply: '/seller/designer/apply', // 提交卖家申请
getSellerOrderSummary: '/seller/order/summary', // 获取卖家订单数据总览
getSellerOrderList: '/seller/order/page', // 获取卖家订单列表
getListingPopup: '/seller/listing/popup/check', // 获取是否勾选发布作品提示
setListingPopup: '/seller/listing/popup/set', // 设置是否勾选发布作品提示
},

View File

@@ -684,28 +684,28 @@ function isValidUrl(string) {
}
export {
isEmail,
getUploadUrl,
getUniversalZoomLevel,
rgbaToHex,
getMinioUrl,
base64ToFile,
dataURLtoFile,
blobToFile,
base64toFile,
rgbToHsv,
formatTime,
dataURLtoBlob,
isMoible,
downloadIamge,
downloadVideoWithFetch,
getBrowserInfo,
setPubDate,
murmur,
setGradual,
calculateGradientCoordinate,
segmentImage,
UrlToFile,
sketchToMask,
isEmail,
getUploadUrl,
getUniversalZoomLevel,
rgbaToHex,
getMinioUrl,
base64ToFile,
dataURLtoFile,
blobToFile,
base64toFile,
rgbToHsv,
formatTime,
dataURLtoBlob,
isMoible,
downloadIamge,
downloadVideoWithFetch,
getBrowserInfo,
setPubDate,
murmur,
setGradual,
calculateGradientCoordinate,
segmentImage,
UrlToFile,
sketchToMask,
isValidUrl
}

View File

@@ -373,11 +373,11 @@
<i class="fi fi-rs-notebook"></i>
<span class="select_item_des">{{ $t('Header.ViewOrders') }}</span>
</div>
<div class="select_item" @click="onBecomeSeller">
<div class="select_item" @click="onBecomeSeller" v-if="!isSeller">
<span class="icon"><svg-icon name="seller-sellerIndex" /></span>
<span class="select_item_des">{{ $t('Header.BecomeSeller') }}</span>
</div>
<div class="select_item" @click="onSellerDashboard">
<div class="select_item" @click="onSellerDashboard" v-else>
<span class="icon"><svg-icon name="seller-sellerIndex" /></span>
<span class="select_item_des">{{ $t('Header.SellerDashboard') }}</span>
<a-badge :dot="true"></a-badge>
@@ -1073,9 +1073,13 @@ export default defineComponent({
}
}
const isSeller = computed(() => {
return store.state.seller.isSeller
})
return {
store,
userDetail,
isSeller,
t,
...toRefs(homeMainData),
...toRefs(historyData),
@@ -1150,6 +1154,7 @@ export default defineComponent({
reject()
})
})
this.store.dispatch('seller/get_isSeller')//获取是否是卖家
let isMurmur = getCookie('isMurmur') //获取是否是试用用户
this.isMurmur = JSON.parse(isMurmur)
if (this.userDetail.userId && this.userDetail.userId > -1) {
@@ -1215,7 +1220,6 @@ export default defineComponent({
let payOrder = this.$refs.payOrder
payOrder.init(orderId)
}
this.getCheckSellerDesigner()
},
methods: {
setTask(data) {
@@ -1379,21 +1383,6 @@ export default defineComponent({
this.store.commit('set_dataLoading', false)
})
},
//获取是否为卖家
getCheckSellerDesigner() {
const config = {
params: {
userId: this.userDetail.userId
}
}
Https.axiosGet(Https.httpUrls.checkSellerDesigner, config).then(rv => {
if (rv) {
console.log(rv)
return rv
}
return null
})
},
setLocale(v) {
// 同步更新 localStorage 中的 loginLanguage
if (v) {

View File

@@ -5,8 +5,8 @@
tip="Join the Stylish Parade and start selling your design work"
/>
<div class="content">
<seller-review v-if="isSubmit" />
<seller-apply v-else @submit="isSubmit = true" />
<seller-apply v-if="applyStatus === null" @submit="onSubmit" />
<seller-review v-else />
</div>
</div>
</template>
@@ -16,7 +16,20 @@
import sellerHeader from "../seller-header.vue"
import sellerReview from "./sellerReview.vue"
import sellerApply from "./sellerApply.vue"
const isSubmit = ref(false)
import { Https } from "@/tool/https"
import { useStore } from "vuex"
import { ApplyStatus } from "@/store/seller/index.d"
const store = useStore()
const applyStatus = computed(() => store.state.seller.applyStatus)
const onSubmit = () => store.commit("seller/set_applyStatus", ApplyStatus.Pending)
const getSellerApplyStatus = () => {
store.commit("set_loading", true)
Https.axiosGet(Https.httpUrls.getSellerApplyStatus).then((res) => {
store.commit("set_loading", false)
store.commit("seller/set_applyStatus", res)
})
}
getSellerApplyStatus()
</script>
<style scoped lang="less">
.become-seller {

View File

@@ -109,6 +109,7 @@
import { useRoute, useRouter } from "vue-router"
const route = useRoute()
const router = useRouter()
import { Https } from "@/tool/https"
const emit = defineEmits(["submit"])
const formRules = {
storeName: [{ required: true, message: "Enter the store name" }],
@@ -140,7 +141,20 @@
.validate()
.then(() => {
console.log(formData)
emit("submit")
const data = {
// userId: 0,
shopName: formData.storeName,
// avatar: "",
// brandBanner: "",
ownerName: formData.fullName,
email: formData.email,
mobile: formData.phoneNumber,
description: formData.description,
socialLinks: JSON.stringify(formData.links.filter((v) => v))
}
Https.axiosPost(Https.httpUrls.submitSellerApply, data).then((res) => {
emit("submit")
})
})
.catch(() => {
console.log("validate failed")

View File

@@ -23,23 +23,27 @@
<script setup>
import { ref, computed } from "vue"
import { useRoute, useRouter } from "vue-router"
import { useStore } from "vuex"
import { ApplyStatus } from "@/store/seller/index.d"
const route = useRoute()
const router = useRouter()
const list = ref([
const store = useStore()
const applyStatus = computed(() => store.state.seller.applyStatus)
const list = computed(() => [
{
title: "Step 1: Submit Application",
tip: "Fill out the seller information form and agree to our terms",
active: true
active: [ApplyStatus.Pending, ApplyStatus.Approved].includes(applyStatus.value)
},
{
title: "Step 2: Review & Verification",
tip: "Our team will review your application (typically 1-3 business days)",
active: false
active: applyStatus.value === ApplyStatus.Approved
},
{
title: "Step 3: Start Selling",
tip: "Once approved, access your seller dashboard and start listing products ",
active: false
active: applyStatus.value === ApplyStatus.Approved
}
])
const onBackToHome = () => {

View File

@@ -1,116 +1,72 @@
<script setup lang="ts">
import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue";
import { Https } from '@/tool/https'
import { setPubDate } from "@/tool/util";
import { useI18n } from "vue-i18n";
//const props = defineProps({
//})
const props = defineProps({
getCollectionListData: {
type: Object,
default: () => ({})
}
})
const emit = defineEmits([
'selectCollectionItem',
])
const current = ref(1)
const {t} = useI18n()
const page = ref(1)
const size = ref(6)
const total = ref(0)
const list = ref([
{
imgList:[
{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},
],
type:'Series',
name:'Christmas',
sketchNum: 7,
date: 'today',
id:'1',
},{
imgList:[
{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},
],
type:'Series',
name:'Christmas',
sketchNum: 7,
date: 'today',
id:'2',
},{
imgList:[
{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},
],
type:'Series',
name:'Christmas',
sketchNum: 7,
date: 'today',
id:'1',
},{
imgList:[
{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},{
url:'https://www.minio-api.aida.com.hk/aida-users/83/avatar/2b3d5756-ea29-4020-86a9-3b02cfc73b5a.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20260410%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260410T013002Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=eedfd4114bde66f0ff8fe5e4d7a7274d9007b25deb40ee82a19427f29601e89b',
},
],
type:'Series',
name:'Christmas',
sketchNum: 7,
date: 'today',
id:'1',
},
])
const getListData = ()=>{
return {
...props.getCollectionListData,
page: page.value,
size: size.value,
}
}
const getCreateList = ()=>{
let data = getListData()
Https.axiosPost(Https.httpUrls.historyProject, data).then((rv)=>{
list.value = rv.content || []
total.value = rv.total || 0
})
}
const selectCollectionItem = (item:any)=>{
emit('selectCollectionItem',item)
}
onMounted(()=>{
getCreateList()
})
onUnmounted(()=>{
})
defineExpose({})
defineExpose({getCreateList})
</script>
<template>
<div class="historyList">
<div class="list">
<div v-for="(item,index) in list" :key="index" class="item" @click="selectCollectionItem(item)">
<div class="imgList">
<div v-for="(img,index) in item.imgList" :key="index" class="img">
<div v-for="(img,index) in item.userLikeGroupVO?.groupDetails" :key="index" class="img">
<img :src="img.url" alt="">
</div>
</div>
<div class="detail">
<div class="name">{{item.name}}</div>
<div class="bottom">
<div>{{item.sketchNum}} sketchs</div>
<div>{{item.date}}</div>
<div>{{item.userLikeGroupVO?.groupDetails?.length || 0}} sketchs</div>
<div>{{setPubDate(item.updateTime,t)}}</div>
</div>
</div>
<div class="type" :class="item.type">
{{item.type}}
{{item.process == "SERIES_DESIGN"?"Series":"Single"}}
</div>
</div>
</div>
<div class="pagination">
<a-pagination v-model:current="current" :pageSize="6" :showSizeChanger="false" show-quick-jumper :total="100" show-less-items />
<a-pagination v-model:current="page" @change="getCreateList" :pageSize="6" :showSizeChanger="false" show-quick-jumper :total="total" show-less-items />
</div>
</div>
</template>
@@ -154,11 +110,13 @@ defineExpose({})
padding: 1rem 1.3rem;
display: flex;
gap: .4rem;
justify-content: center;
> .img{
width: 9.7rem;
height: 17.2rem;
border-radius: 1rem;
overflow: hidden;
background-color: #fff;
> img{
object-fit: cover;
height: 100%;

View File

@@ -4,31 +4,38 @@ import sellerHeader from "../../seller-header.vue"
import historyList from "./historyList.vue"
import { useRouter } from "vue-router"
//const props = defineProps({
//})
//const emit = defineEmits([
//])
const router = useRouter()
let data = reactive({
})
const searchType = ref('all')
const searchText = ref('')
let getCollectionListData = reactive({
searchType: '',
searchText: '',
const historyListRef = ref(null)
})
const isShowMark = ref(false)
const historyListRef = ref(null) as any
const handleSearch = () => {
historyListRef.value.getCreateList()
}
const setSearchType = (type:any) => {
getCollectionListData.searchType = type
historyListRef.value.getCreateList()
}
const selectCollectionItem = (item:any) => {
router.push({path:'/home/seller/myListings/select/'+item.id})
}
onMounted(()=>{
})
onUnmounted(()=>{
})
defineExpose({})
const {} = toRefs(data);
</script>
<template>
<div class="myListings-seller">
<div class="create-select">
<seller-header
title="Select Collection"
:breadcrumbs="[
@@ -40,15 +47,15 @@ const {} = toRefs(data);
<div class="content">
<div class="title">
<div class="left">
<div :class="{active:searchType == 'all'}" @click="searchType = 'all'">All</div>
<div :class="{active:searchType == 'series'}" @click="searchType = 'series'">Series Design</div>
<div :class="{active:searchType == 'single'}" @click="searchType = 'single'">Single Design</div>
<div :class="{active:getCollectionListData.searchType == ''}" @click="setSearchType('')">All</div>
<div :class="{active:getCollectionListData.searchType == 'SERIES_DESIGN'}" @click="setSearchType('SERIES_DESIGN')">Series Design</div>
<div :class="{active:getCollectionListData.searchType == 'SINGLE_DESIGN'}" @click="setSearchType('SINGLE_DESIGN')">Single Design</div>
</div>
<div class="right">
<div class="search_input flex flex-align-center">
<input
class="search_input_inner"
v-model="searchText"
v-model="getCollectionListData.searchText"
:bordered="false"
@keydown.enter="handleSearch"
placeholder="123123"
@@ -58,12 +65,12 @@ const {} = toRefs(data);
</div>
</div>
</div>
<historyList ref="historyListRef" @selectCollectionItem="selectCollectionItem"></historyList>
<historyList ref="historyListRef" :getCollectionListData="getCollectionListData" @selectCollectionItem="selectCollectionItem"></historyList>
</div>
</div>
</template>
<style scoped lang="less">
.myListings-seller {
.create-select {
width: 100%;
height: 100%;
overflow: hidden;

View File

@@ -3,6 +3,9 @@ import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue";
import sellerHeader from "../../seller-header.vue"
import { VueDraggable } from "vue-draggable-plus"
import selectMenu from '@/component/modules/selectMenu.vue'
import { Https } from '@/tool/https'
import { useRoute } from 'vue-router'
import { useStore } from 'vuex'
//const props = defineProps({
//})
@@ -10,6 +13,8 @@ import selectMenu from '@/component/modules/selectMenu.vue'
//])
let data = reactive({
})
const store = useStore()
const route = useRoute()
const domSize = ref('Small')
const domSizeList = ref([
{
@@ -26,17 +31,8 @@ const domSizeList = ref([
},
])
const list = ref([
{ id: "1" },
{ id: "2" },
{ id: "3" },
{ id: "4" },
{ id: "5" },
{ id: "6" },
{ id: "7" },
{ id: "8" },
{ id: "9" },
{ id: "10" }
])
const showList = ref([])
const chooseList = ref([])
const chooseItem = (item:any)=>{
chooseList.value.push(item)
@@ -89,6 +85,32 @@ const changeDomSize = ()=>{
setDomSize(listingsBoxRef.value.clientWidth)
},350)
}
const changeGender = ()=>{
}
const setShowList = ()=>{
if(gender.value == 'All'){
showList.value = list.value
}else{
showList.value = list.value.filter((item:any)=>item.sex == gender.value)
}
}
const getCollectionDetail = ()=>{
store.commit("set_loading", true)
let moduleList = [] as any
moduleList = ['design',]
let value:any = {
"id":route.params.collectionId,
"moduleList":moduleList,
}
Https.axiosPost(Https.httpUrls.getModuleContent,value).then(async (rv)=>{
list.value = rv.design.userLikeDetails
setShowList()
store.commit("set_loading", false)
}).catch(()=>{
store.commit("set_loading", false)
})
}
onMounted(()=>{
// 创建观察器
nextTick(()=>{
@@ -105,6 +127,7 @@ onMounted(()=>{
// 开始监听
if(resizeObserver)resizeObserver.observe(listingsBoxRef.value)
})
getCollectionDetail()
})
onUnmounted(()=>{
})
@@ -112,7 +135,7 @@ defineExpose({})
const {} = toRefs(data);
</script>
<template>
<div class="myListings-seller">
<div class="create-select-item">
<seller-header
title="Select Collection"
:breadcrumbs="[
@@ -143,27 +166,6 @@ const {} = toRefs(data);
</div>
<div class="right">
<div class="generalModel_state">
<div>
<selectMenu
:selectList="domSizeList"
@change="changeDomSize"
:isBtnOpen='true'
:style="{
'border-radius':'0rem',
'border':'none',
'font-weight': '900',
'border-right':'2px solid rgba(0,0,0,.2)',
'line-height': '3rem',
'height': '3rem',
'background': 'rgba(0,0,0,0)',
}"
v-model:select="domSize"
>
<template v-slot:btnText>
{{ $t('Header.Filter') }}
</template>
</selectMenu>
</div>
<div>
<selectMenu
:selectList="domSizeList"
@@ -188,7 +190,7 @@ const {} = toRefs(data);
</div>
</div>
<VueDraggable
v-model="list"
v-model="showList"
class="list"
:class="domSize"
v-bind="config"
@@ -208,13 +210,14 @@ const {} = toRefs(data);
<div class="choose">
<i class="fi fi-rr-check"></i>
</div>
<img :src="v.designOutfitUrl || v.url" alt="">
</div>
</VueDraggable>
</div>
</div>
</template>
<style scoped lang="less">
.myListings-seller {
.create-select-item {
width: 100%;
height: 100%;
overflow: hidden;
@@ -329,6 +332,9 @@ const {} = toRefs(data);
border: 1.5px solid #C7C7C7;
// transition: all .3s;
position: relative;
overflow: hidden;
display: flex;
justify-content: center;
> .choose{
display: flex;
width: var(--iconWH);
@@ -347,6 +353,10 @@ const {} = toRefs(data);
display: flex;
}
}
> img{
height: 100%;
object-fit: cover;
}
&.active{
border: 1.5px solid #000;
> .choose{

View File

@@ -3,17 +3,32 @@ import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue";
import sellerHeader from "../../seller-header.vue"
import sellerContent from "./content.vue"
import myEvent from "@/tool/myEvents.js"
import Https from "@/tool/https.js"
import { useStore } from "vuex";
//const props = defineProps({
//})
//const emit = defineEmits([
//])
const store = useStore()
let data = reactive({
listingPopup: true,
})
const newListing = ()=>{
myEvent.emit('newListing')
myEvent.emit('newListing',)
}
const getListingPopup = ()=>{
store.commit("set_loading", true)
Https.getListingPopup().then(res=>{
store.commit("set_loading", false)
data.listingPopup = res.data
}).catch(()=>{
store.commit("set_loading", false)
})
}
onMounted(()=>{
let listingPopup = sessionStorage.getItem('listingPopup')
})
onUnmounted(()=>{
})

View File

@@ -42,8 +42,8 @@
<div class="item">
<div class="images">
<img
v-for="(v, i) in v.item.slice(0, maxItemNum)"
:key="i"
v-for="v in v.item.slice(0, maxItemNum)"
:key="v.id"
:src="v.url"
/>
<span v-if="v.item.length > maxItemNum"
@@ -51,7 +51,7 @@
>
</div>
<div class="titles">
<div v-for="(v, i) in v.item.slice(0, maxItemNum)" :key="i">
<div v-for="v in v.item.slice(0, maxItemNum)" :key="v.id">
{{ v.title }}
</div>
<span v-if="v.item.length > maxItemNum">...</span>
@@ -65,6 +65,7 @@
</div>
</div>
</div>
<div class="null" v-show="list.length === 0 && !loading && finish">no data</div>
<div class="placeholder" ref="placeholderRef" v-show="!loading"></div>
<div class="footer" :class="{ null: list.length === 0 }" v-if="!finish">
<a-spin :delay="0.5" v-show="loading" />
@@ -74,22 +75,28 @@
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount } from "vue"
const totals = ref([
import { ref, onMounted, onBeforeUnmount, computed } from "vue"
import { Https } from "@/tool/https"
const totals_obj = ref({
totalRevenue: "--",
totalPurchases: "--",
totalViews: "--"
})
const totals = computed(() => [
{
icon: "seller-qiandaizi",
title: "Total Revenue",
value: "HK$ 54,32.00"
value: `HK$ ${totals_obj.value.totalRevenue}`
},
{
icon: "seller-gouwudai",
title: "Total Purchases",
value: "128"
value: totals_obj.value.totalPurchases
},
{
icon: "seller-eye",
title: "Total Views",
value: "4,982"
value: totals_obj.value.totalViews
}
])
const maxItemNum = ref(2)
@@ -112,38 +119,41 @@
page: page.value,
size: size.value
}
if (nameOrId.value) data.nameOrId = nameOrId.value
console.log(data)
setTimeout(() => {
for (let i = 0; i < size.value; i++) {
let { date, time, dateTime } = formatTimestamp(new Date(2026, 4, 20, 13, 14).getTime())
list.value.push({
orderId: "SP" + Math.random().toString().substring(2, 10),
price: "HK$ " + (Math.random() * 500).toFixed(2),
username: "@liuyuchen",
date: date,
time: time,
item: [
{
url: "http://118.31.39.42:3000/falls/o-1.png",
title: "North Outfit Set"
},
{
url: "http://118.31.39.42:3000/falls/o-2.png",
title: "Heritage Layered Set"
},
{},
{}
]
})
}
total.value = 30
if (nameOrId.value) data.keyword = nameOrId.value
Https.axiosGet(Https.httpUrls.getSellerOrderList, { params: data }).then((res) => {
res.content?.forEach((v) => {
const obj = {
orderId: v.orderId,
items: v.items.map((item) => ({
id: item.productId,
url: item.thumbnailUrl,
title: item.productName
})),
price: "HK$ " + v.price,
username: v.buyerUsername,
date: v.date,
time: v.date
}
list.value.push(obj)
})
total.value = res.total
page.value++
finish.value = page.value > total.value / 10
finish.value = page.value > total.value / size.value
loading.value = false
}, 1000)
})
}
const getSummary = () => {
Https.axiosGet(Https.httpUrls.getSellerOrderSummary).then((res) => {
totals_obj.value.totalRevenue = res.totalRevenue
totals_obj.value.totalPurchases = res.totalPurchases
totals_obj.value.totalViews = res.totalViews
})
}
getSummary()
getList(true)
const placeholderRef = ref(null)
const observer = new IntersectionObserver(
(entries) => {
@@ -348,6 +358,11 @@
}
}
}
> .null {
margin-top: 10rem;
text-align: center;
color: #999;
}
> .footer {
min-height: 10rem;
display: flex;

View File

@@ -18,7 +18,8 @@
</template>
<script setup>
import { ref, computed } from "vue"
import { Https } from "@/tool/https"
import { ref, computed,onMounted,onUnmounted } from "vue"
import { useRoute, useRouter } from "vue-router"
import toolTipBox from "./toolTipBox.vue"
import myEvent from "@/tool/myEvents.js"