卖家端多语言
This commit is contained in:
@@ -167,8 +167,7 @@ li {
|
|||||||
padding: 0.6rem 0.5rem;
|
padding: 0.6rem 0.5rem;
|
||||||
}
|
}
|
||||||
.ant-modal-mask {
|
.ant-modal-mask {
|
||||||
background-color: #666666;
|
background-color: rgba(102, 102, 102, 0.5);
|
||||||
opacity: 0.5;
|
|
||||||
}
|
}
|
||||||
.select_block {
|
.select_block {
|
||||||
height: 4rem;
|
height: 4rem;
|
||||||
@@ -1251,8 +1250,8 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
|
|||||||
border-color: #000 !important;
|
border-color: #000 !important;
|
||||||
}
|
}
|
||||||
.ant-spin .ant-spin-dot {
|
.ant-spin .ant-spin-dot {
|
||||||
width: 1.5em;
|
width: 4.5rem;
|
||||||
height: 1.5em;
|
height: 4.5rem;
|
||||||
}
|
}
|
||||||
.ant-spin-dot-item {
|
.ant-spin-dot-item {
|
||||||
background-color: #000000 !important;
|
background-color: #000000 !important;
|
||||||
|
|||||||
@@ -172,8 +172,9 @@ input:focus{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.ant-modal-mask{
|
.ant-modal-mask{
|
||||||
background-color: #666666;
|
background-color: rgba(102,102,102,0.5);
|
||||||
opacity: .5;
|
// background-color: #666666;
|
||||||
|
// opacity: .5;
|
||||||
}
|
}
|
||||||
.select_block{
|
.select_block{
|
||||||
height: 4rem;
|
height: 4rem;
|
||||||
|
|||||||
@@ -1762,5 +1762,74 @@ export default {
|
|||||||
draftDesc: '您的商品已保存为草稿。\n您可以继续编辑,或稍后在“我的商品”中发布。',
|
draftDesc: '您的商品已保存为草稿。\n您可以继续编辑,或稍后在“我的商品”中发布。',
|
||||||
listingLive:'商品已上架',
|
listingLive:'商品已上架',
|
||||||
publishDesc:'您的商品现已上架。\n买家可以浏览并购买您的设计。'
|
publishDesc:'您的商品现已上架。\n买家可以浏览并购买您的设计。'
|
||||||
|
},
|
||||||
|
Seller: {
|
||||||
|
// Brand Profile
|
||||||
|
brandProfile: "店铺详情",
|
||||||
|
myListings: "我的商品",
|
||||||
|
myOrders: "我的订单",
|
||||||
|
settings: "设置",
|
||||||
|
brandProfileBgNullTip: "您的店铺横幅尚未设置。",
|
||||||
|
changeBrandBanner: "更改店铺横幅",
|
||||||
|
edit: "编辑",
|
||||||
|
cancel: "取消",
|
||||||
|
confirm: "确认",
|
||||||
|
saveChange: "保存更改",
|
||||||
|
brandProfileEditTip: "这些更改将会在您的“Stylish Parade”品牌页面上得到体现。",
|
||||||
|
storeName: "店铺名称",
|
||||||
|
storeNameDesc: "请输入您的店铺名称",
|
||||||
|
ownerName: "姓名",
|
||||||
|
ownerNameDesc: "请输入姓名",
|
||||||
|
email: "邮箱",
|
||||||
|
emailDesc: "请输入邮箱",
|
||||||
|
mobile: "手机号",
|
||||||
|
mobileDesc: "请输入手机号",
|
||||||
|
link: "链接{index}",
|
||||||
|
links: "投资组合/社交媒体链接",
|
||||||
|
storeDescription: "店铺描述",
|
||||||
|
storeDescriptionDesc: "请输入店铺描述",
|
||||||
|
storeDescriptionErr: "请输入店铺描述",
|
||||||
|
cropBrandBanner: "裁剪店铺横幅",
|
||||||
|
cropAvatar: "裁剪头像",
|
||||||
|
cropFrom: "裁剪来源:",
|
||||||
|
sketch: "线稿图",
|
||||||
|
mainProductImage: "产品主图",
|
||||||
|
cropPreview: "裁剪预览",
|
||||||
|
imageClipCoverTip: "将封面图片裁剪为正方形,保持比例。",
|
||||||
|
imageClipMainProductImageTip: "将产品主图裁剪为正方形,保持比例。",
|
||||||
|
imageClipSketchTip: "将线稿图裁剪为正方形,保持比例。",
|
||||||
|
imageClipApparelTip: "将服装线稿图裁剪为正方形,保持比例。",
|
||||||
|
// 我的订单
|
||||||
|
totalRevenue: "总销售额",
|
||||||
|
totalPurchases: "总购买量",
|
||||||
|
totalViews: "总浏览量",
|
||||||
|
allInvoice: "所有订单",
|
||||||
|
myOrdersTip: "所有已完成交易的摘要",
|
||||||
|
myOrdersSearchPlaceholder: "按项目名称或订单ID搜索",
|
||||||
|
orderId: "订单ID",
|
||||||
|
item: "项目",
|
||||||
|
price: "价格",
|
||||||
|
buyerUsername: "买家用户名",
|
||||||
|
date: "日期",
|
||||||
|
// 设置
|
||||||
|
notifications: "通知",
|
||||||
|
notificationsTitle: "新订单通知",
|
||||||
|
notificationsTip: "当有新订单时收到通知。",
|
||||||
|
unbound: "未绑定",
|
||||||
|
manage: "管理",
|
||||||
|
bindNow: "立即绑定",
|
||||||
|
paymentCurrency: "支付货币",
|
||||||
|
HKD: "HKD - 香港元",
|
||||||
|
fixed: "固定",
|
||||||
|
dataPrivacy: "数据与隐私",
|
||||||
|
dataPrivacyTitle: "版权许可",
|
||||||
|
dataPrivacyTip1: "每笔购买下载都会自动附带一份许可证证书。请查看适用于您商品列表的默认许可条款。",
|
||||||
|
dataPrivacyTip2: "此许可证由 Code-Create 颁发,购买时即具有法律约束力。它证明购买者有权按照以下条款使用所购买的设计资产。",
|
||||||
|
dataPrivacyTip3: "对于定制的许可安排,请<span onclick='{click}()'>联系我们</span>。",
|
||||||
|
downloadToView: "下载以查看",
|
||||||
|
stopSelling: "停止销售",
|
||||||
|
stopSellingTitle: "停用卖家账户",
|
||||||
|
stopSellingTip: "永久停用您的卖家账户。所有商品列表和发票记录将被删除。您以后可以重新注册为卖家,但您的先前销售数据无法恢复。",
|
||||||
|
deactivate: "停用卖家账户",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1813,5 +1813,77 @@ export default {
|
|||||||
draftDesc: 'Your listing has been saved as a draft. \nYou can continue editing or publish it later from My Listings.',
|
draftDesc: 'Your listing has been saved as a draft. \nYou can continue editing or publish it later from My Listings.',
|
||||||
listingLive:'Listing Live',
|
listingLive:'Listing Live',
|
||||||
publishDesc:'Your listing is now live on the marketplace.\nBuyers can discover and purchase your design.'
|
publishDesc:'Your listing is now live on the marketplace.\nBuyers can discover and purchase your design.'
|
||||||
|
},
|
||||||
|
Seller: {
|
||||||
|
brandProfile: "Brand Profile",
|
||||||
|
myListings: "My Listings",
|
||||||
|
myOrders: "My Orders",
|
||||||
|
settings: "Settings",
|
||||||
|
// Brand Profile
|
||||||
|
brandProfileBgNullTip: "Your brand banner has not been set up yet.",
|
||||||
|
changeBrandBanner: "Change Brand Banner",
|
||||||
|
edit: "Edit",
|
||||||
|
cancel: "Cancel",
|
||||||
|
confirm: "Confirm",
|
||||||
|
saveChange: "Save Change",
|
||||||
|
brandProfileEditTip: "Changes will be reflected on your Stylish Parade brand page.",
|
||||||
|
storeName: "Store Name",
|
||||||
|
storeNameDesc: "Enter your store name",
|
||||||
|
ownerName: "Owner’s Full Name",
|
||||||
|
ownerNameDesc: "Enter store owner's full name",
|
||||||
|
email: "Email",
|
||||||
|
emailDesc: "Enter email",
|
||||||
|
mobile: "Phone Number",
|
||||||
|
mobileDesc: "Enter phone number",
|
||||||
|
link: "Link {index}",
|
||||||
|
links: "Portfoilo/Social Media Links",
|
||||||
|
storeDescription: "Store Description",
|
||||||
|
storeDescriptionDesc: "Briefly describe your design style and store features...",
|
||||||
|
storeDescriptionErr: "Please enter store description",
|
||||||
|
cropBrandBanner: "Crop Brand Banner",
|
||||||
|
cropAvatar: "Crop Avatar",
|
||||||
|
cropFrom: "Crop from:",
|
||||||
|
sketch: "Sketch",
|
||||||
|
mainProductImage: "Main Product Image",
|
||||||
|
cropPreview: "Crop Preview",
|
||||||
|
imageClipCoverTip: "Align crown to top, mid-thigh to bottom for best results.",
|
||||||
|
imageClipMainProductImageTip: "Align crown to top, foot base to bottom for best results.",
|
||||||
|
imageClipSketchTip: "Align crown to top, foot base to bottom for best results.",
|
||||||
|
imageClipApparelTip: "Trim whitespace and center your apparel sketch.",
|
||||||
|
// 我的订单
|
||||||
|
totalRevenue: "Total Revenue",
|
||||||
|
totalPurchases: "Total Purchases",
|
||||||
|
totalViews: "Total Views",
|
||||||
|
allInvoice: "All Invoice",
|
||||||
|
myOrdersTip: "A summary of all completed transactions.",
|
||||||
|
myOrdersSearchPlaceholder: "Search by item name or order ID",
|
||||||
|
orderId: "Order ID",
|
||||||
|
item: "Item",
|
||||||
|
price: "Price",
|
||||||
|
buyerUsername: "Buyer Username",
|
||||||
|
date: "Date",
|
||||||
|
// 设置
|
||||||
|
notifications: "Notifications",
|
||||||
|
notificationsTitle: "New order notification",
|
||||||
|
notificationsTip: "Receive an inbox message when a new order is placed.",
|
||||||
|
payout: "Payout",
|
||||||
|
payoutTitle: "Payment Providers",
|
||||||
|
payoutTip: "Select how you want to receive payments.",
|
||||||
|
unbound: "Unbound",
|
||||||
|
manage: "Manage",
|
||||||
|
bindNow: "Bind Now",
|
||||||
|
paymentCurrency: "Payment Currency",
|
||||||
|
HKD: "HKD - Hong Kong Dollar",
|
||||||
|
fixed: "Fixed",
|
||||||
|
dataPrivacy: "Data & Privacy",
|
||||||
|
dataPrivacyTitle: "Copyright licence",
|
||||||
|
dataPrivacyTip1: "A licence certificate is automatically included with every purchase download. View the default licensing terms applied to your listings.",
|
||||||
|
dataPrivacyTip2: "BThis licence is issued by Code-Create and is legally binding upon purchase. It certifies the buyer's right to use the purchased design asset in accordance with the terms below.",
|
||||||
|
dataPrivacyTip3: "For custom licensing arrangements, <span onclick='{click}()'>contact us</span>.",
|
||||||
|
downloadToView: "Download to View",
|
||||||
|
stopSelling: "Stop Selling",
|
||||||
|
stopSellingTitle: "Deactivate seller account",
|
||||||
|
stopSellingTip: "Permanently deactivate your seller account. All listings and invoice records will be deleted. You may re-register as a seller in the future, but your previous sales data cannot be recovered.",
|
||||||
|
deactivate: "Deactivate",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
<div class="brand-info">
|
<div class="brand-info">
|
||||||
<a-form :model="formData" :rules="isEdit ? formRules : {}" layout="vertical" ref="formRef">
|
<a-form :model="formData" :rules="isEdit ? formRules : {}" layout="vertical" ref="formRef">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<a-form-item label="Store Name" name="shopName">
|
<a-form-item :label="$t('Seller.storeName')" name="shopName">
|
||||||
<a-input
|
<a-input
|
||||||
v-model:value="formData.shopName"
|
v-model:value="formData.shopName"
|
||||||
placeholder="Enter the store name"
|
:placeholder="$t('Seller.storeNameDesc')"
|
||||||
:maxlength="80"
|
:maxlength="80"
|
||||||
:readonly="!isEdit"
|
:readonly="!isEdit"
|
||||||
/>
|
/>
|
||||||
@@ -13,34 +13,34 @@
|
|||||||
>{{ formData.shopName.length }}/80</span
|
>{{ formData.shopName.length }}/80</span
|
||||||
>
|
>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="Owner’s Full Name" name="ownerName">
|
<a-form-item :label="$t('Seller.ownerName')" name="ownerName">
|
||||||
<a-input
|
<a-input
|
||||||
v-model:value="formData.ownerName"
|
v-model:value="formData.ownerName"
|
||||||
placeholder="Enter store owner's full name"
|
:placeholder="$t('Seller.ownerNameDesc')"
|
||||||
:readonly="!isEdit"
|
:readonly="!isEdit"
|
||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
<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')"
|
||||||
:readonly="!isEdit"
|
:readonly="!isEdit"
|
||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="Phone Number" name="mobile">
|
<a-form-item :label="$t('Seller.mobile')" name="mobile">
|
||||||
<a-input
|
<a-input
|
||||||
type="tel"
|
type="tel"
|
||||||
v-model:value="formData.mobile"
|
v-model:value="formData.mobile"
|
||||||
placeholder="Enter phone number"
|
:placeholder="$t('Seller.mobileDesc')"
|
||||||
:readonly="!isEdit"
|
:readonly="!isEdit"
|
||||||
/>
|
/>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<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.socialLinks"
|
v-for="(v, i) in formData.socialLinks"
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
v-model:value="formData.socialLinks[i]"
|
v-model:value="formData.socialLinks[i]"
|
||||||
:readonly="!isEdit"
|
:readonly="!isEdit"
|
||||||
>
|
>
|
||||||
<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://"
|
||||||
@@ -63,10 +63,10 @@
|
|||||||
</template>
|
</template>
|
||||||
</a-input>
|
</a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<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"
|
||||||
:readonly="!isEdit"
|
:readonly="!isEdit"
|
||||||
/>
|
/>
|
||||||
@@ -83,6 +83,9 @@
|
|||||||
import { ref, reactive, watch } from "vue"
|
import { ref, reactive, watch } from "vue"
|
||||||
import { useRoute, useRouter } from "vue-router"
|
import { useRoute, useRouter } from "vue-router"
|
||||||
import { useStore } from "vuex"
|
import { useStore } from "vuex"
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const designerInfo = computed(() => store.state.seller.designerInfo)
|
const designerInfo = computed(() => store.state.seller.designerInfo)
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
@@ -94,11 +97,11 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
const formRules = {
|
const formRules = {
|
||||||
shopName: [{ required: true, message: "Enter the store name" }],
|
shopName: [{ required: true, message: t("Seller.storeNameDesc") }],
|
||||||
ownerName: [{ required: true, message: "Enter store owner's full name" }],
|
ownerName: [{ required: true, message: t("Seller.ownerNameDesc") }],
|
||||||
email: [{ required: true, message: "Enter email" }],
|
email: [{ required: true, message: t("Seller.emailDesc") }],
|
||||||
mobile: [{ 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)
|
||||||
|
|||||||
@@ -16,28 +16,28 @@
|
|||||||
<div class="title">{{ data.title }}</div>
|
<div class="title">{{ data.title }}</div>
|
||||||
<div class="right flex">
|
<div class="right flex">
|
||||||
<div v-if="coverOrigin.length > 1" class="origin-container flex align-center">
|
<div v-if="coverOrigin.length > 1" class="origin-container flex align-center">
|
||||||
<span>Crop from: </span>
|
<span>{{ $t("Seller.cropFrom") }}</span>
|
||||||
<div class="origin-select flex align-center">
|
<div class="origin-select flex align-center">
|
||||||
<div
|
<div
|
||||||
class="origin-item sketch"
|
class="origin-item sketch"
|
||||||
:class="{ selected: currentOrigin === 'sketch' }"
|
:class="{ selected: currentOrigin === 'sketch' }"
|
||||||
@click="handleChangeOrigin('sketch')"
|
@click="handleChangeOrigin('sketch')"
|
||||||
>
|
>
|
||||||
Sketch
|
{{ $t("Seller.sketch") }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
class="origin-item product"
|
class="origin-item product"
|
||||||
:class="{ selected: currentOrigin === 'mainProducImage' }"
|
:class="{ selected: currentOrigin === 'mainProducImage' }"
|
||||||
@click="handleChangeOrigin('mainProductImage')"
|
@click="handleChangeOrigin('mainProductImage')"
|
||||||
>
|
>
|
||||||
Main product image
|
{{ $t("Seller.mainProductImage") }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="submit" v-if="!data.isPreview" @click="onSubmit">
|
<div class="submit" v-if="!data.isPreview" @click="onSubmit">
|
||||||
<svg-icon name="seller-dui" size="24" />
|
<svg-icon name="seller-dui" size="24" />
|
||||||
</div>
|
</div>
|
||||||
<button @click="onCancel">Cancel</button>
|
<button @click="onCancel">{{ $t("Seller.cancel") }}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="content" :class="{ 'is-product': data.isProduct }">
|
<div class="content" :class="{ 'is-product': data.isProduct }">
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
>
|
>
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<span class="icon"><svg-icon name="seller-preview" size="24" /></span>
|
<span class="icon"><svg-icon name="seller-preview" size="24" /></span>
|
||||||
<span class="label">Crop Preview</span>
|
<span class="label">{{ $t("Seller.cropPreview") }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="preview-image">
|
<div class="preview-image">
|
||||||
<img :src="data.preview_url" />
|
<img :src="data.preview_url" />
|
||||||
@@ -81,6 +81,10 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, reactive, computed } from "vue"
|
import { ref, reactive, computed } from "vue"
|
||||||
import ImageClip from "./image-clip.vue"
|
import ImageClip from "./image-clip.vue"
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
type: {
|
type: {
|
||||||
@@ -95,16 +99,16 @@ const props = defineProps({
|
|||||||
|
|
||||||
const tips = computed(() => {
|
const tips = computed(() => {
|
||||||
if (props.type === "cover") {
|
if (props.type === "cover") {
|
||||||
return "Align crown to top, mid-thigh to bottom for best results."
|
return t("Seller.imageClipCoverTip")
|
||||||
}
|
}
|
||||||
if (props.type === "mainProductImage") {
|
if (props.type === "mainProductImage") {
|
||||||
return "Align crown to top, foot base to bottom for best results."
|
return t("Seller.imageClipMainProductImageTip")
|
||||||
}
|
}
|
||||||
if (props.type === "sketch") {
|
if (props.type === "sketch") {
|
||||||
return "Align crown to top, foot base to bottom for best results."
|
return t("Seller.imageClipSketchTip")
|
||||||
}
|
}
|
||||||
if (props.type === "apparel") {
|
if (props.type === "apparel") {
|
||||||
return "Trim whitespace and center your apparel sketch."
|
return t("Seller.imageClipApparelTip")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
<img v-if="banner" :src="banner" />
|
<img v-if="banner" :src="banner" />
|
||||||
<div v-else class="null">
|
<div v-else class="null">
|
||||||
<span class="icon"><svg-icon name="seller-picture" size="60" /></span>
|
<span class="icon"><svg-icon name="seller-picture" size="60" /></span>
|
||||||
<span class="tip">Your brand banner has not been set up yet.</span>
|
<span class="tip">{{ $t("Seller.brandProfileBgNullTip") }}</span>
|
||||||
</div>
|
</div>
|
||||||
<button @click="onChangeBanner">Change Brand Banner</button>
|
<button @click="onChangeBanner">{{ $t("Seller.changeBrandBanner") }}</button>
|
||||||
</div>
|
</div>
|
||||||
<!-- 头像 -->
|
<!-- 头像 -->
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
@@ -25,14 +25,14 @@
|
|||||||
<div class="and-profile-footer">
|
<div class="and-profile-footer">
|
||||||
<template v-if="isEdit">
|
<template v-if="isEdit">
|
||||||
<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" @click="onSubmit()">Save Change</button>
|
<button class="submit" @click="onSubmit()">{{ $t("Seller.saveChange") }}</button>
|
||||||
</div>
|
</div>
|
||||||
<p class="tip">Changes will be reflected on your Stylish Parade brand page.</p>
|
<p class="tip">{{ $t("Seller.brandProfileEditTip") }}</p>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div class="btns">
|
<div class="btns">
|
||||||
<button class="edit" @click="onEdit">Edit</button>
|
<button class="edit" @click="onEdit">{{ $t("Seller.edit") }}</button>
|
||||||
</div>
|
</div>
|
||||||
<p class="tip"> </p>
|
<p class="tip"> </p>
|
||||||
</template>
|
</template>
|
||||||
@@ -46,6 +46,8 @@
|
|||||||
import BrandInfo from "./brand-info.vue"
|
import BrandInfo from "./brand-info.vue"
|
||||||
import ImageClipDialog from "./image-clip-dialog.vue"
|
import ImageClipDialog from "./image-clip-dialog.vue"
|
||||||
import { useStore } from "vuex"
|
import { useStore } from "vuex"
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
const { t } = useI18n()
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
store.dispatch("seller/get_designerInfo")
|
store.dispatch("seller/get_designerInfo")
|
||||||
const designerInfo = computed(() => store.state.seller.designerInfo)
|
const designerInfo = computed(() => store.state.seller.designerInfo)
|
||||||
@@ -90,7 +92,7 @@
|
|||||||
onSubmit({ brandBanner: res })
|
onSubmit({ brandBanner: res })
|
||||||
store.commit("set_loading", false)
|
store.commit("set_loading", false)
|
||||||
},
|
},
|
||||||
{ ratio: [40, 7], isPreview: false, title: "Crop Brand Banner" }
|
{ ratio: [40, 7], isPreview: false, title: t("Seller.cropBrandBanner") }
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -104,7 +106,7 @@
|
|||||||
onSubmit({ avatar: res })
|
onSubmit({ avatar: res })
|
||||||
store.commit("set_loading", false)
|
store.commit("set_loading", false)
|
||||||
},
|
},
|
||||||
{ ratio: [1, 1], isPreview: true, title: "Crop Avatar" }
|
{ ratio: [1, 1], isPreview: true, title: t("Seller.cropAvatar") }
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="filter-box">
|
<div class="filter-box">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<div class="title">All Invoice</div>
|
<div class="title">{{ t("Seller.allInvoice") }}</div>
|
||||||
<div class="tip">A summary of all completed transactions.</div>
|
<div class="tip">{{ t("Seller.myOrdersTip") }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<div class="input">
|
<div class="input">
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
v-model="nameOrId"
|
v-model="nameOrId"
|
||||||
placeholder="Search by item name or order ID"
|
:placeholder="t('Seller.myOrdersSearchPlaceholder')"
|
||||||
@keydown.enter.prevent="getList(true)"
|
@keydown.enter.prevent="getList(true)"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -30,11 +30,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="table">
|
<div class="table">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<div class="order-id">Order ID</div>
|
<div class="order-id">{{ t("Seller.orderId") }}</div>
|
||||||
<div class="item">Item</div>
|
<div class="item">{{ t("Seller.item") }}</div>
|
||||||
<div class="price">Price</div>
|
<div class="price">{{ t("Seller.price") }}</div>
|
||||||
<div class="buyer-username">Buyer Username</div>
|
<div class="buyer-username">{{ t("Seller.buyerUsername") }}</div>
|
||||||
<div class="date">Date</div>
|
<div class="date">{{ t("Seller.date") }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<div class="item" v-for="v in list" :key="v.orderId">
|
<div class="item" v-for="v in list" :key="v.orderId">
|
||||||
@@ -79,6 +79,8 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted, onBeforeUnmount, computed } from "vue"
|
import { ref, onMounted, onBeforeUnmount, computed } from "vue"
|
||||||
import { Https } from "@/tool/https"
|
import { Https } from "@/tool/https"
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
const { t } = useI18n()
|
||||||
const totals_obj = ref({
|
const totals_obj = ref({
|
||||||
totalRevenue: "--",
|
totalRevenue: "--",
|
||||||
totalPurchases: "--",
|
totalPurchases: "--",
|
||||||
@@ -87,17 +89,17 @@
|
|||||||
const totals = computed(() => [
|
const totals = computed(() => [
|
||||||
{
|
{
|
||||||
icon: "seller-qiandaizi",
|
icon: "seller-qiandaizi",
|
||||||
title: "Total Revenue",
|
title: t("Seller.totalRevenue"),
|
||||||
value: `HK$ ${totals_obj.value.totalRevenue}`
|
value: `HK$ ${totals_obj.value.totalRevenue}`
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: "seller-gouwudai",
|
icon: "seller-gouwudai",
|
||||||
title: "Total Purchases",
|
title: t("Seller.totalPurchases"),
|
||||||
value: totals_obj.value.totalPurchases
|
value: totals_obj.value.totalPurchases
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: "seller-eye",
|
icon: "seller-eye",
|
||||||
title: "Total Views",
|
title: t("Seller.totalViews"),
|
||||||
value: totals_obj.value.totalViews
|
value: totals_obj.value.totalViews
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
<div class="settings-index">
|
<div class="settings-index">
|
||||||
<div>
|
<div>
|
||||||
<div class="notification">
|
<div class="notification">
|
||||||
<div class="header">Notifications</div>
|
<div class="header">{{ $t("Seller.notifications") }}</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<div class="title">New order notification</div>
|
<div class="title">{{ $t("Seller.notificationsTitle") }}</div>
|
||||||
<div class="tip">Receive an inbox message when a new order is placed.</div>
|
<div class="tip">{{ $t("Seller.notificationsTip") }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<a-switch v-model:checked="checked" />
|
<a-switch v-model:checked="checked" />
|
||||||
@@ -14,29 +14,29 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="payout">
|
<div class="payout">
|
||||||
<div class="header">Payout</div>
|
<div class="header">{{ $t("Seller.payout") }}</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<div class="title">Payment Providers</div>
|
<div class="title">{{ $t("Seller.payoutTitle") }}</div>
|
||||||
<div class="tip">Select how you want to receive payments.</div>
|
<div class="tip">{{ $t("Seller.payoutTip") }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="pay-item" v-for="v in payList" :key="v.type">
|
<div class="pay-item" v-for="v in payList" :key="v.type">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<img :src="v.icon" />
|
<img :src="v.icon" />
|
||||||
<div class="value">{{ v.value || "Unbound" }}</div>
|
<div class="value">{{ v.value || $t("Seller.unbound") }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<button v-if="v.value" class="manage">Manage</button>
|
<button v-if="v.value" class="manage">{{ $t("Seller.manage") }}</button>
|
||||||
<button v-else class="bind-now">Bind Now</button>
|
<button v-else class="bind-now">{{ $t("Seller.bindNow") }}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<div class="left">
|
<div class="left">
|
||||||
<div class="title">Payment Currency</div>
|
<div class="title">{{ $t("Seller.paymentCurrency") }}</div>
|
||||||
<div class="tip">HKD - Hong Kong Dollar</div>
|
<div class="tip">{{ $t("Seller.HKD") }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="right">
|
<div class="right">
|
||||||
<button>Fixed</button>
|
<button>{{ $t("Seller.fixed") }}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -44,40 +44,32 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="data-privacy">
|
<div class="data-privacy">
|
||||||
<div class="header">Data & Privacy</div>
|
<div class="header">{{ $t("Seller.dataPrivacy") }}</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="title">Copyright licence</div>
|
<div class="title">{{ $t("Seller.dataPrivacyTitle") }}</div>
|
||||||
<div class="tip">
|
<div class="tip">{{ $t("Seller.dataPrivacyTip1") }}</div>
|
||||||
A licence certificate is automatically included with every purchase
|
<div class="tip">{{ $t("Seller.dataPrivacyTip2") }}</div>
|
||||||
download. View the default licensing terms applied to your listings.
|
<div
|
||||||
</div>
|
class="tip"
|
||||||
<div class="tip">
|
v-html="
|
||||||
This licence is issued by Code-Create and is legally binding upon purchase.
|
$t('Seller.dataPrivacyTip3', { click: 'onSellerSettingsContactUs' })
|
||||||
It certifies the buyer's right to use the purchased design asset in
|
"
|
||||||
accordance with the terms below.
|
></div>
|
||||||
</div>
|
|
||||||
<div class="tip">
|
|
||||||
For custom licensing arrangements, <span>contact us</span>.
|
|
||||||
</div>
|
|
||||||
<div class="btns">
|
<div class="btns">
|
||||||
<button>
|
<button @click="onDownloadDataPrivacy">
|
||||||
<span class="icon"><svg-icon name="seller-download" size="14" /></span>
|
<span class="icon"><svg-icon name="seller-download" size="14" /></span>
|
||||||
<span class="label">Download to View</span>
|
<span class="label">{{ $t("Seller.downloadToView") }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="stop">
|
<div class="stop">
|
||||||
<div class="header">Stop Selling</div>
|
<div class="header">{{ $t("Seller.stopSelling") }}</div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="title">Deactivate seller account</div>
|
<div class="title">{{ $t("Seller.stopSellingTitle") }}</div>
|
||||||
<div class="tip">
|
<div class="tip">{{ $t("Seller.stopSellingTip") }}</div>
|
||||||
Permanently deactivate your seller account. All listings and invoice records
|
|
||||||
will be deleted. You may re-register as a seller in the future, but your
|
|
||||||
previous sales data cannot be recovered.
|
|
||||||
</div>
|
|
||||||
<div class="btns">
|
<div class="btns">
|
||||||
<button>Deactivate</button>
|
<button @click="onStopSelling">{{ $t("Seller.deactivate") }}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -87,10 +79,14 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from "vue"
|
import { ref } from "vue"
|
||||||
|
import { Modal } from "ant-design-vue"
|
||||||
import paypal from "@/assets/images/seller/setting/paypal.png"
|
import paypal from "@/assets/images/seller/setting/paypal.png"
|
||||||
import stripe from "@/assets/images/seller/setting/stripe.png"
|
import stripe from "@/assets/images/seller/setting/stripe.png"
|
||||||
import alipayHk from "@/assets/images/seller/setting/alipay-hk.png"
|
import alipayHk from "@/assets/images/seller/setting/alipay-hk.png"
|
||||||
import alipayChinese from "@/assets/images/seller/setting/alipay-chinese.png"
|
import alipayChinese from "@/assets/images/seller/setting/alipay-chinese.png"
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
const checked = ref(true)
|
const checked = ref(true)
|
||||||
const payList = ref([
|
const payList = ref([
|
||||||
{
|
{
|
||||||
@@ -114,6 +110,24 @@
|
|||||||
value: "123123"
|
value: "123123"
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
window.onSellerSettingsContactUs = () => {
|
||||||
|
console.log("contact us")
|
||||||
|
}
|
||||||
|
const onDownloadDataPrivacy = () => {
|
||||||
|
console.log("download data privacy")
|
||||||
|
}
|
||||||
|
const onStopSelling = () => {
|
||||||
|
Modal.confirm({
|
||||||
|
title: t("Seller.stopSellingTitle"),
|
||||||
|
content: t("Seller.stopSellingTip"),
|
||||||
|
okText: t("Seller.confirm"),
|
||||||
|
cancelText: t("Seller.cancel"),
|
||||||
|
centered: true,
|
||||||
|
onOk() {
|
||||||
|
console.log("stop selling")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
<style scoped lang="less">
|
<style scoped lang="less">
|
||||||
.settings-index {
|
.settings-index {
|
||||||
@@ -281,7 +295,7 @@
|
|||||||
font-size: 1.4rem;
|
font-size: 1.4rem;
|
||||||
color: #999;
|
color: #999;
|
||||||
margin-bottom: 3rem;
|
margin-bottom: 3rem;
|
||||||
> span {
|
&:deep(*) {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
color: #0080ed;
|
color: #0080ed;
|
||||||
|
|||||||
@@ -28,6 +28,9 @@
|
|||||||
import toolTipBox from "./toolTipBox.vue"
|
import toolTipBox from "./toolTipBox.vue"
|
||||||
import myEvent from "@/tool/myEvents.js"
|
import myEvent from "@/tool/myEvents.js"
|
||||||
import { useStore } from "vuex"
|
import { useStore } from "vuex"
|
||||||
|
import { useI18n } from "vue-i18n"
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
cachedRoutes: {
|
cachedRoutes: {
|
||||||
type: Array,
|
type: Array,
|
||||||
@@ -35,7 +38,7 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
const isSeller = computed(() => store.state.seller.isSeller)
|
const isSeller = computed(() => store.state.seller.isSeller)
|
||||||
// store.dispatch("seller/get_designerInfo")
|
// store.dispatch("seller/get_designerInfo")
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@@ -43,22 +46,22 @@
|
|||||||
const list = ref([
|
const list = ref([
|
||||||
{
|
{
|
||||||
icon: "seller-brandProfile",
|
icon: "seller-brandProfile",
|
||||||
layer: "Brand Profile",
|
layer: t("Seller.brandProfile"),
|
||||||
path: "/home/seller/brandProfile"
|
path: "/home/seller/brandProfile"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: "seller-myListings",
|
icon: "seller-myListings",
|
||||||
layer: "My Listings",
|
layer: t("Seller.myListings"),
|
||||||
path: "/home/seller/myListings"
|
path: "/home/seller/myListings"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: "seller-myOrders",
|
icon: "seller-myOrders",
|
||||||
layer: "My Orders",
|
layer: t("Seller.myOrders"),
|
||||||
path: "/home/seller/myOrders"
|
path: "/home/seller/myOrders"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: "seller-settings",
|
icon: "seller-settings",
|
||||||
layer: "Settings",
|
layer: t("Seller.settings"),
|
||||||
path: "/home/seller/settings"
|
path: "/home/seller/settings"
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
|||||||
Reference in New Issue
Block a user