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

View File

@@ -1535,7 +1535,7 @@ export default {
}, },
event: { event: {
back: '返回', back: '返回',
detail:'查看详情' detail: '查看详情'
}, },
admin: { admin: {
allUser: '所有用户', allUser: '所有用户',
@@ -1609,7 +1609,7 @@ export default {
Cancel: '取消', Cancel: '取消',
SelectPlan: '选择计划', SelectPlan: '选择计划',
AllPlan: '全部', AllPlan: '全部',
PlanStart:'订阅计划生效时间:' PlanStart: '订阅计划生效时间:'
}, },
Login: { Login: {
Login: '登录', Login: '登录',
@@ -1736,32 +1736,32 @@ export default {
showAgain: '不再提示', showAgain: '不再提示',
GetStarted: '开始体验', GetStarted: '开始体验',
}, },
SellerListEdit:{ SellerListEdit: {
saveDraft: "全部保存", saveDraft: "全部保存",
publish: "发布", publish: "发布",
sketch: "线稿图", sketch: "线稿图",
mainProductImage: "产品主图", mainProductImage: "产品主图",
cover: "封面", cover: "封面",
productImageDesc:'从产品图中选取', productImageDesc: '从产品图中选取',
cropDesc:'从主产品图或线稿图中裁剪', cropDesc: '从主产品图或线稿图中裁剪',
productImageMainTitle:'产品图 ', productImageMainTitle: '产品图 ',
productImageSubTitle:' (来自设计集)', productImageSubTitle: ' (来自设计集)',
apparelSketchTitle:'服装线稿图 ', apparelSketchTitle: '服装线稿图 ',
apparelSketchSubTitle:' (来自设计集)', apparelSketchSubTitle: ' (来自设计集)',
productName:'商品名称', productName: '商品名称',
price:'价格', price: '价格',
productDescription:'商品描述', productDescription: '商品描述',
designFor:'目标人群', designFor: '目标人群',
productCategory:'商品类别', productCategory: '商品类别',
categoryTips:'请选择所有适用选项', categoryTips: '请选择所有适用选项',
policy:'默认情况下,所有销售均遵循平台的许可政策——买家在下载后将获得使用许可', policy: '默认情况下,所有销售均遵循平台的许可政策——买家在下载后将获得使用许可',
learnMore:'了解更多', learnMore: '了解更多',
requiredFieldTips:'请填写{field}', requiredFieldTips: '请填写{field}',
requiredFieldTipsWithPage:'第 {index} 个商品:请填写{field}', requiredFieldTipsWithPage: '第 {index} 个商品:请填写{field}',
draftSaved: '草稿已保存', draftSaved: '草稿已保存',
draftDesc: '您的商品已保存为草稿。\n您可以继续编辑或稍后在“我的商品”中发布。', draftDesc: '您的商品已保存为草稿。\n您可以继续编辑或稍后在“我的商品”中发布。',
listingLive:'商品已上架', listingLive: '商品已上架',
publishDesc:'您的商品现已上架。\n买家可以浏览并购买您的设计。' publishDesc: '您的商品现已上架。\n买家可以浏览并购买您的设计。'
}, },
Seller: { Seller: {
// Brand Profile // Brand Profile
@@ -1835,6 +1835,7 @@ export default {
draftMessage: '商品已保存为草稿。您可以继续编辑,或稍后在“我的商品”中发布。', draftMessage: '商品已保存为草稿。您可以继续编辑,或稍后在“我的商品”中发布。',
publishMessage: '商品现已上架。买家可以浏览并购买您的设计。', publishMessage: '商品现已上架。买家可以浏览并购买您的设计。',
ActiveListings: '已发布商品', ActiveListings: '已发布商品',
Praka: '线稿',
Drafts: '草稿', Drafts: '草稿',
Cancel: '取消', Cancel: '取消',
Delete: '删除', Delete: '删除',
@@ -1854,5 +1855,34 @@ export default {
SelectCollection: '选择商品', SelectCollection: '选择商品',
SelectSketch: '选择线稿图', SelectSketch: '选择线稿图',
EditListingDetails: '编辑商品详情', EditListingDetails: '编辑商品详情',
},
ApplySeller: {
applySellerTitle: '申请成为卖家',
applySellerDesc: '加入Stylish Parade开始销售您的设计作品',
formTitle: '店铺信息',
formTip: '请提供一些详细信息来创建您的卖家资料。',
termsTitle: '服务条款',
termsTip: '请阅读并同意服务条款。',
agreementTitle: 'AiDA 卖家协议',
agreementTip: '请阅读并同意卖家协议。',
agreementItem1: '提供准确和真实的个人信息和店铺信息',
agreementItem2: '仅销售原创设计或内容,获得必要的许可证',
agreementItem3: '维护所有产品的高质量标准',
agreementItem4: '在48小时内回复客户咨询',
agreementItem5: '在承诺的时间内发货',
agreementItem6: '遵守AiDA的服务条款和社区指南',
agreementItem7: '支付适用的平台费用和交易费用',
agreementItem8: '专业和公平地处理客户纠纷',
agreementAgreement: '我已经阅读并同意了卖家协议,清楚地了解了自己在 AiDA 平台上作为卖家所应承担的责任和义务。',
submitApplication: '提交申请',
applicationSubmitted: '申请已提交',
applicationSubmittedTip: '我们的团队将审核您的申请并在1-3个工作日回复您。您会在邮箱中收到相关通知。',
auditStatus1_title: "步骤 1提交申请",
auditStatus1_tip: "请填写店铺信息并同意服务条款。",
auditStatus2_title: "步骤 2审核验证",
auditStatus2_tip: "我们的团队将在审核您的申请后1-3个工作日审核您的店铺信息。",
auditStatus3_title: "步骤 3开始销售",
auditStatus3_tip: "审核通过后,您可以开始销售您的商品。",
backToHomepage: "返回首页",
} }
} }

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()