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

This commit is contained in:
2026-05-06 16:33:32 +08:00
11 changed files with 1865 additions and 1803 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1889,6 +1889,7 @@ export default {
draftMessage: 'Product moved to drafts and stats reset.', draftMessage: 'Product moved to drafts and stats reset.',
publishMessage: 'Item is now live on the Marketplace.', publishMessage: 'Item is now live on the Marketplace.',
ActiveListings: 'Active Listings', ActiveListings: 'Active Listings',
Praka: 'Praka',
Drafts: 'Drafts', Drafts: 'Drafts',
Cancel: 'Cancel', Cancel: 'Cancel',
Delete: 'Delete', Delete: 'Delete',
@@ -1908,5 +1909,34 @@ export default {
SelectCollection: 'Select Collection', SelectCollection: 'Select Collection',
SelectSketch: 'Select Sketch', SelectSketch: 'Select Sketch',
EditListingDetails: 'Edit Listing Details', EditListingDetails: 'Edit Listing Details',
},
ApplySeller: {
applySellerTitle: 'Apply to Become a Seller',
applySellerDesc: 'Join the Stylish Parade and start selling your design work',
formTitle: 'Brand Information',
formTip: 'Share a few details to set up your seller profile',
termsTitle: 'Seller Terms',
termsTip: 'Please carefully read and agree to the following terms',
agreementTitle: 'AiDA Seller Agreement',
agreementTip: 'Please read and agree to the following agreement',
agreementItem1: "Provide accurate and truthful personal and store information",
agreementItem2: "Only sell original designs or content with proper licensing",
agreementItem3: "Maintain high quality standards for all products",
agreementItem4: "Respond to customer inquiries within 48 hours",
agreementItem5: "Ship orders within promised timeframes",
agreementItem6: "Comply with AiDA's terms of service and community guidelines",
agreementItem7: "Pay applicable platform fees and transaction charges",
agreementItem8: "Handle customer disputes professionally and fairly",
agreementAgreement: "I have read and agree to the Seller Agreement, understanding my responsibilities and obligations as a seller on the AiDA platform.",
submitApplication: "Submit Application",
applicationSubmitted: "Application Submitted",
applicationSubmittedTip: "Our team will review your application and get back to you within 13 business days. You'll receive a notification in your email once a decision has been made.",
auditStatus1_title: "Step 1: Submit Application",
auditStatus1_tip: "Fill out the seller information form and agree to our terms",
auditStatus2_title: "Step 2: Review & Verification",
auditStatus2_tip: "Our team will review your application (typically 1-3 business days)",
auditStatus3_title: "Step 3: Start Selling",
auditStatus3_tip: "Once approved, access your seller dashboard and start listing products",
backToHomepage: "Back to Homepage",
} }
} }

View File

@@ -224,8 +224,8 @@ const routes: Array<RouteRecordRaw> = [
name: "becomeSeller", name: "becomeSeller",
meta: { meta: {
enter: "all", enter: "all",
sellerHeaderTitle: "Apply to Become a Seller", sellerHeaderTitle: "ApplySeller.applySellerTitle",
sellerHeaderTip: "Join the Stylish Parade and start selling your design work" sellerHeaderTip: "ApplySeller.applySellerDesc"
}, },
component: () => import("@/views/SellerDashboard/BecomeSeller/index.vue") component: () => import("@/views/SellerDashboard/BecomeSeller/index.vue")
}, },
@@ -283,7 +283,7 @@ const routes: Array<RouteRecordRaw> = [
name: "myListingsSelectItem", name: "myListingsSelectItem",
meta: { meta: {
enter: "all", enter: "all",
sellerHeaderTitleKey: "Seller.SelectCollection", sellerHeaderTitleKey: "Seller.SelectSketch",
sellerBreadcrumbs: [ sellerBreadcrumbs: [
myListingsBreadcrumb, myListingsBreadcrumb,
selectCollectionBreadcrumb, selectCollectionBreadcrumb,

View File

@@ -2,56 +2,58 @@
<div class="seller-apply"> <div class="seller-apply">
<div class="session"> <div class="session">
<div class="content mini-scrollbar"> <div class="content mini-scrollbar">
<div class="title">Brand Information</div> <div class="title">{{ $t("ApplySeller.formTitle") }}</div>
<div class="tip">Share a few details to set up your seller profile</div> <div class="tip">{{ $t("ApplySeller.formTip") }}</div>
<div class="form"> <div class="form">
<a-form :model="formData" :rules="formRules" layout="vertical" ref="formRef"> <a-form :model="formData" :rules="formRules" layout="vertical" ref="formRef">
<a-form-item label="Store Name" name="storeName"> <a-form-item :label="$t('Seller.storeName')" name="storeName">
<a-input <a-input
v-model:value="formData.storeName" v-model:value="formData.storeName"
placeholder="Enter the store name" :placeholder="$t('Seller.storeNameDesc')"
:maxlength="80" :maxlength="80"
/> />
<span class="tip-length">{{ formData.storeName.length }}/80</span> <span class="tip-length">{{ formData.storeName.length }}/80</span>
</a-form-item> </a-form-item>
<a-form-item label="Owners Full Name" name="fullName"> <a-form-item :label="$t('Seller.ownerName')" name="fullName">
<a-input <a-input
v-model:value="formData.fullName" v-model:value="formData.fullName"
placeholder="Enter store owner's full name" :placeholder="$t('Seller.ownerNameDesc')"
/> />
</a-form-item> </a-form-item>
<div class="form-group"> <div class="form-group">
<a-form-item label="Email" name="email"> <a-form-item :label="$t('Seller.email')" name="email">
<a-input <a-input
type="email" type="email"
v-model:value="formData.email" v-model:value="formData.email"
placeholder="Enter email" :placeholder="$t('Seller.emailDesc')"
/> />
</a-form-item> </a-form-item>
<a-form-item label="Phone Number" name="phoneNumber"> <a-form-item :label="$t('Seller.mobile')" name="mobile">
<a-input <a-input
type="tel" type="tel"
v-model:value="formData.phoneNumber" v-model:value="formData.mobile"
placeholder="Enter phone number" :placeholder="$t('Seller.mobileDesc')"
/> />
</a-form-item> </a-form-item>
</div> </div>
<a-form-item label="Store Description" name="description"> <a-form-item :label="$t('Seller.storeDescription')" name="description">
<a-textarea <a-textarea
v-model:value="formData.description" v-model:value="formData.description"
placeholder="Briefly describe your design style and store features..." :placeholder="$t('Seller.storeDescriptionDesc')"
:maxlength="500" :maxlength="500"
/> />
<span class="tip-length">{{ formData.description.length }}/500</span> <span class="tip-length">{{ formData.description.length }}/500</span>
</a-form-item> </a-form-item>
<a-form-item label="Portfoilo/Social Media Links"> <a-form-item :label="$t('Seller.links')">
<a-input <a-input
placeholder="https://" placeholder="https://"
v-for="(v, i) in formData.links" v-for="(v, i) in formData.links"
:key="i" :key="i"
v-model:value="formData.links[i]" v-model:value="formData.links[i]"
> >
<template #prefix>Link {{ i + 1 }}</template> <template #prefix>{{
$t("Seller.link", { index: i + 1 })
}}</template>
</a-input> </a-input>
<a-input <a-input
placeholder="https://" placeholder="https://"
@@ -71,33 +73,25 @@
</div> </div>
<div class="session"> <div class="session">
<div class="content"> <div class="content">
<div class="title">Brand Information</div> <div class="title">{{ $t("ApplySeller.termsTitle") }}</div>
<div class="tip">Share a few details to set up your seller profile</div> <div class="tip">{{ $t("ApplySeller.termsTip") }}</div>
<div class="agreement"> <div class="agreement">
<div class="title">AiDA Seller Agreement</div> <div class="title">{{ $t("ApplySeller.agreementTitle") }}</div>
<div class="tip"> <div class="tip">{{ $t("ApplySeller.agreementTip") }}</div>
By checking the box below, you agree to comply with the following terms:
</div>
<ul> <ul>
<li>Provide accurate and truthful personal and store information</li> <li v-for="(v, i) in 8" :key="i">
<li>Only sell original designs or content with proper licensing</li> {{ $t(`ApplySeller.agreementItem${i + 1}`) }}
<li>Maintain high quality standards for all products</li> </li>
<li>Respond to customer inquiries within 48 hours</li>
<li>Ship orders within promised timeframes</li>
<li>Comply with AiDA's terms of service and community guidelines</li>
<li>Pay applicable platform fees and transaction charges</li>
<li>Handle customer disputes professionally and fairly</li>
</ul> </ul>
</div> </div>
<a-checkbox class="agree-agreement" v-model:checked="isAgreement"> <a-checkbox class="agree-agreement" v-model:checked="isAgreement">
I have read and agree to the Seller Agreement, understanding my responsibilities {{ $t("ApplySeller.agreementAgreement") }}
and obligations as a seller on the AiDA platform.
</a-checkbox> </a-checkbox>
</div> </div>
<div class="btns"> <div class="btns">
<button class="cancel" @click="onCancel">Cancel</button> <button class="cancel" @click="onCancel">{{ $t("Seller.cancel") }}</button>
<button class="submit" :disabled="!isAgreement" @click="onSubmit"> <button class="submit" :disabled="!isAgreement" @click="onSubmit">
Submit Application {{ $t("ApplySeller.submitApplication") }}
</button> </button>
</div> </div>
</div> </div>
@@ -106,24 +100,26 @@
<script setup> <script setup>
import { ref, reactive } from "vue" import { ref, reactive } from "vue"
import { useI18n } from "vue-i18n"
const { t } = useI18n()
import { useRoute, useRouter } from "vue-router" import { useRoute, useRouter } from "vue-router"
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
import { Https } from "@/tool/https" import { Https } from "@/tool/https"
const emit = defineEmits(["submit"]) const emit = defineEmits(["submit"])
const formRules = { const formRules = {
storeName: [{ required: true, message: "Enter the store name" }], storeName: [{ required: true, message: t("Seller.storeNameDesc") }],
fullName: [{ required: true, message: "Enter store owner's full name" }], fullName: [{ required: true, message: t("Seller.ownerNameDesc") }],
email: [{ required: true, message: "Enter email" }], email: [{ required: true, message: t("Seller.emailDesc") }],
phoneNumber: [{ required: true, message: "Enter phone number" }], mobile: [{ required: true, message: t("Seller.mobileDesc") }],
description: [{ required: true, message: "Enter store description" }] description: [{ required: true, message: t("Seller.storeDescriptionErr") }]
} }
const formRef = ref(null) const formRef = ref(null)
const formData = reactive({ const formData = reactive({
storeName: "", storeName: "",
fullName: "", fullName: "",
email: "", email: "",
phoneNumber: "", mobile: "",
description: "", description: "",
links: ["", ""] links: ["", ""]
}) })
@@ -140,7 +136,6 @@
formRef.value formRef.value
.validate() .validate()
.then(() => { .then(() => {
console.log(formData)
const data = { const data = {
// userId: 0, // userId: 0,
shopName: formData.storeName, shopName: formData.storeName,
@@ -148,7 +143,7 @@
// brandBanner: "", // brandBanner: "",
ownerName: formData.fullName, ownerName: formData.fullName,
email: formData.email, email: formData.email,
mobile: formData.phoneNumber, mobile: formData.mobile,
description: formData.description, description: formData.description,
socialLinks: JSON.stringify(formData.links.filter((v) => v)) socialLinks: JSON.stringify(formData.links.filter((v) => v))
} }

View File

@@ -1,11 +1,8 @@
<template> <template>
<div class="seller-review"> <div class="seller-review">
<img class="success" src="@/assets/images/seller/success-1.png" /> <img class="success" src="@/assets/images/seller/success-1.png" />
<div class="title">Application Submitted</div> <div class="title">{{ $t("ApplySeller.applicationSubmitted") }}</div>
<div class="tip"> <div class="tip">{{ $t("ApplySeller.applicationSubmittedTip") }}</div>
Our team will review your application and get back to you within 13 business days.
You'll receive a notification in your email once a decision has been made.
</div>
<div class="step-list"> <div class="step-list">
<div v-for="v in list" :key="v.title" class="step-item"> <div v-for="v in list" :key="v.title" class="step-item">
<img v-show="!v.active" src="@/assets/images/seller/success-0.png" /> <img v-show="!v.active" src="@/assets/images/seller/success-0.png" />
@@ -16,7 +13,7 @@
</div> </div>
</div> </div>
</div> </div>
<button class="home-btn" @click="onBackToHome">Back to Homepage</button> <button class="home-btn" @click="onBackToHome">{{ $t("ApplySeller.backToHomepage") }}</button>
<div class="tip">ID: {{ userId }}</div> <div class="tip">ID: {{ userId }}</div>
</div> </div>
</template> </template>
@@ -26,6 +23,9 @@
import { useRoute, useRouter } from "vue-router" import { useRoute, useRouter } from "vue-router"
import { useStore } from "vuex" import { useStore } from "vuex"
import { ApplyStatus } from "@/store/seller/index.d" import { ApplyStatus } from "@/store/seller/index.d"
import { useI18n } from "vue-i18n"
const { t } = useI18n()
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
const store = useStore() const store = useStore()
@@ -33,18 +33,18 @@
const applyStatus = computed(() => store.state.seller.applyStatus) const applyStatus = computed(() => store.state.seller.applyStatus)
const list = computed(() => [ const list = computed(() => [
{ {
title: "Step 1: Submit Application", title: t("ApplySeller.auditStatus1_title"),
tip: "Fill out the seller information form and agree to our terms", tip: t("ApplySeller.auditStatus1_tip"),
active: [ApplyStatus.Pending, ApplyStatus.Approved].includes(applyStatus.value) active: [ApplyStatus.Pending, ApplyStatus.Approved].includes(applyStatus.value)
}, },
{ {
title: "Step 2: Review & Verification", title: t("ApplySeller.auditStatus2_title"),
tip: "Our team will review your application (typically 1-3 business days)", tip: t("ApplySeller.auditStatus2_tip"),
active: applyStatus.value === ApplyStatus.Approved active: applyStatus.value === ApplyStatus.Approved
}, },
{ {
title: "Step 3: Start Selling", title: t("ApplySeller.auditStatus3_title"),
tip: "Once approved, access your seller dashboard and start listing products ", tip: t("ApplySeller.auditStatus3_tip"),
active: applyStatus.value === ApplyStatus.Approved active: applyStatus.value === ApplyStatus.Approved
} }
]) ])

View File

@@ -10,6 +10,7 @@
:closable="false" :closable="false"
wrapClassName="#app" wrapClassName="#app"
:keyboard="false" :keyboard="false"
:destroyOnClose="true"
> >
<div class="image-clip-dialog-box"> <div class="image-clip-dialog-box">
<div class="header" :class="{ 'is-product': data.isProduct }"> <div class="header" :class="{ 'is-product': data.isProduct }">

View File

@@ -178,7 +178,7 @@ const {} = toRefs(data);
<div class="title"> <div class="title">
<div class="left"> <div class="left">
<i class="fi fi-rs-comments"></i> <i class="fi fi-rs-comments"></i>
<span>{{ $t('Seller.ActiveListings') }}</span> <span>{{ $t('Seller.Praka') }}</span>
</div> </div>
<div class="right"> <div class="right">
<div class="generalModel_state"> <div class="generalModel_state">
@@ -317,6 +317,7 @@ const {} = toRefs(data);
margin: 0 auto; margin: 0 auto;
overflow-y: auto; overflow-y: auto;
align-content: flex-start; align-content: flex-start;
min-width: 90%;
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
} }

View File

@@ -400,6 +400,7 @@ const { showDrafts } = toRefs(data);
margin: 0 auto; margin: 0 auto;
align-items: flex-start; align-items: flex-start;
overflow: auto; overflow: auto;
min-width: 90%;
&::-webkit-scrollbar { &::-webkit-scrollbar {
display: none; display: none;
} }

View File

@@ -132,6 +132,7 @@ const {} = toRefs(data);
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: cover; object-fit: cover;
background-color: #fff;
} }
> .maskBtn{ > .maskBtn{
position: absolute; position: absolute;

View File

@@ -41,7 +41,7 @@ const {} = toRefs(data);
</script> </script>
<template> <template>
<div class="myListings-seller"> <div class="myListings-seller">
<seller-header> <seller-header :displayBack="false">
<template #right> <template #right>
<div class="button" @click="newListing"> <div class="button" @click="newListing">
<span>{{ $t('Seller.newListing') }}</span> <span>{{ $t('Seller.newListing') }}</span>

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="seller-header"> <div class="seller-header">
<div class="back" @click="() => router.back()"> <div class="back" v-if="displayBack" @click="() => router.back()">
<svg-icon name="seller-back" size="24" /> <svg-icon name="seller-back" size="24" />
</div> </div>
<div class="content"> <div class="content">
@@ -55,13 +55,16 @@
defineProps<{ defineProps<{
title?: string title?: string
tip?: string tip?: string
displayBack?: boolean
breadcrumbs?: SellerBreadcrumbSource[] breadcrumbs?: SellerBreadcrumbSource[]
}>(), }>(),
{ {
title: "", title: "",
tip: "", tip: "",
breadcrumbs: () => [] breadcrumbs: () => [],
displayBack: true
} }
) )
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()