Merge branch 'dev_vite' of ssh://18.167.251.121:10002/aidlab/aida_front into dev_vite
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
VITE_USER_NODE_ENV = 'development'
|
||||
VITE_USER_NODE_ENV = 'development_cloud'
|
||||
# VITE_APP_BASE_URL = 'https://aida.com.hk/test'
|
||||
# VITE_APP_BASE_URL = 'http://18.167.251.121:10088'
|
||||
# VITE_APP_BASE_URL = 'https://api.aida.com.hk'
|
||||
|
||||
@@ -409,7 +409,7 @@ export class BrushIndicator {
|
||||
// this.show(e.e);
|
||||
this._mouseEnterHandler && this._mouseEnterHandler(e)
|
||||
} else {
|
||||
// requestIdleCallback(() => {
|
||||
// setTimeout(() => {
|
||||
// this.updatePosition(e.e);
|
||||
// });
|
||||
|
||||
|
||||
@@ -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, // 恢复红绿图模式下的透明度
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
// });
|
||||
|
||||
@@ -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 ()=>{
|
||||
|
||||
@@ -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: () =>
|
||||
|
||||
@@ -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
6
src/store/seller/index.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
export const ApplyStatus = {
|
||||
Null: null,// 未申请过
|
||||
Pending: 0,// 已提交, 待审核
|
||||
Approved: 1,// 审核通过
|
||||
Rejected: 2,// 审核拒绝
|
||||
}
|
||||
40
src/store/seller/index.ts
Normal file
40
src/store/seller/index.ts
Normal 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
|
||||
@@ -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', // 设置是否勾选发布作品提示
|
||||
|
||||
},
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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 = () => {
|
||||
|
||||
@@ -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%;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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(()=>{
|
||||
})
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user