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

This commit is contained in:
X1627315083@163.com
2026-05-06 16:06:56 +08:00
6 changed files with 1862 additions and 1802 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1909,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")
}, },

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

@@ -96,24 +96,26 @@
return label return label
} }
const centerLabelTop = "8px"
const cropLabelMap = { const cropLabelMap = {
cover: [ cover: [
{ text: "crown", top: "2.67%", className: "label-h" }, { text: "crown", top: "2.67%", className: "label-h" },
{ text: "hip line", top: "63.47%", className: "label-h" }, { text: "hip line", top: "63.47%", className: "label-h" },
{ text: "mid-thigh", top: "92.8%", className: "label-h" }, { text: "mid-thigh", top: "92.8%", className: "label-h" },
{ text: "center", top: "0", className: "label-v" } { text: "center", top: centerLabelTop, className: "label-v" }
], ],
mainProductImage: [ mainProductImage: [
{ text: "crown", top: "2.67%", className: "label-h" }, { text: "crown", top: "2.67%", className: "label-h" },
{ text: "footbase", top: "97.6%", className: "label-h" }, { text: "footbase", top: "97.6%", className: "label-h" },
{ text: "center", top: "0", className: "label-v" } { text: "center", top: centerLabelTop, className: "label-v" }
], ],
sketch: [ sketch: [
{ text: "crown", top: "2.67%", className: "label-h" }, { text: "crown", top: "2.67%", className: "label-h" },
{ text: "footbase", top: "97.6%", className: "label-h" }, { text: "footbase", top: "97.6%", className: "label-h" },
{ text: "center", top: "0", className: "label-v" } { text: "center", top: centerLabelTop, className: "label-v" }
], ],
apparel: [{ text: "center", top: "0", className: "label-v" }] apparel: [{ text: "center", top: centerLabelTop, className: "label-v" }]
} }
const injectCropLabel = () => { const injectCropLabel = () => {
@@ -288,11 +290,16 @@
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
box-sizing: border-box;
border: 1px solid rgba(75, 165, 255, 0.85);
pointer-events: none; pointer-events: none;
z-index: 9; /* 位于图片之上,但在控制点之下 */ z-index: 9; /* 位于图片之上,但在控制点之下 */
background-image: none; background-image: none;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
:deep(.vue-cropper .crop-point) {
z-index: 10;
}
} }
&[data-crop-type="cover"] { &[data-crop-type="cover"] {