店铺信息

This commit is contained in:
李志鹏
2026-04-27 10:49:37 +08:00
parent 39c0ee110a
commit 0c140c2896
5 changed files with 104 additions and 48 deletions

View File

@@ -5,9 +5,20 @@ import { Https } from '@/tool/https'
import { ApplyStatus } from "./index.d" import { ApplyStatus } from "./index.d"
import store from '../index' import store from '../index'
interface DesignerInfo {
shopName: string,
avatar: string,
brandBanner: string,
ownerName: string,
email: string,
mobile: string,
socialLinks: string,
description: string,
}
interface Seller { interface Seller {
isSeller: boolean, isSeller: boolean,
applyStatus: number, applyStatus: number,
designerInfo: DesignerInfo,
} }
const seller: Module<Seller, RootState> = { const seller: Module<Seller, RootState> = {
@@ -15,6 +26,16 @@ const seller: Module<Seller, RootState> = {
state: { state: {
isSeller: false, isSeller: false,
applyStatus: null, applyStatus: null,
designerInfo: {
shopName: "--",
avatar: null,
brandBanner: null,
ownerName: "--",
email: "--",
mobile: "--",
socialLinks: ["--"],
description: "--"
},
}, },
mutations: { mutations: {
set_isSeller(state: Seller, value: boolean) { set_isSeller(state: Seller, value: boolean) {
@@ -26,13 +47,24 @@ const seller: Module<Seller, RootState> = {
state.isSeller = true state.isSeller = true
} }
}, },
set_designerInfo(state: Seller, value: DesignerInfo) {
state.designerInfo = {
...value,
socialLinks: JSON.parse(value.socialLinks)
}
},
}, },
actions: { actions: {
get_isSeller({ commit }) { get_isSeller({ commit }) {
// Https.axiosGet(Https.httpUrls.checkSellerDesigner).then(rv => { Https.axiosGet(Https.httpUrls.checkSellerDesigner).then(rv => {
// commit('set_isSeller', !!rv) commit('set_isSeller', !!rv)
// }) })
},
async get_designerInfo({ commit }) {
const rv = await Https.axiosGet(Https.httpUrls.getDesignerInfo)
commit('set_designerInfo', rv)
return rv
}, },
} }
} }

View File

@@ -477,6 +477,8 @@ export const Https = {
checkSellerDesigner: '/seller/designer/check', // 检查卖家是否为设计师 checkSellerDesigner: '/seller/designer/check', // 检查卖家是否为设计师
getSellerApplyStatus: '/seller/designer/apply/status', // 获取卖家申请状态 getSellerApplyStatus: '/seller/designer/apply/status', // 获取卖家申请状态
submitSellerApply: '/seller/designer/apply', // 提交卖家申请 submitSellerApply: '/seller/designer/apply', // 提交卖家申请
getDesignerInfo: '/seller/designer/info', // 获取设计师信息
updateDesignerInfo: '/seller/designer/update', // 更新设计师信息
getSellerOrderSummary: '/seller/order/summary', // 获取卖家订单数据总览 getSellerOrderSummary: '/seller/order/summary', // 获取卖家订单数据总览
getSellerOrderList: '/seller/order/page', // 获取卖家订单列表 getSellerOrderList: '/seller/order/page', // 获取卖家订单列表
getListingPopup: '/seller/listing/popup/check', // 获取是否勾选发布作品提示 getListingPopup: '/seller/listing/popup/check', // 获取是否勾选发布作品提示

View File

@@ -2,20 +2,20 @@
<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="storeName"> <a-form-item label="Store Name" name="shopName">
<a-input <a-input
v-model:value="formData.storeName" v-model:value="formData.shopName"
placeholder="Enter the store name" placeholder="Enter the store name"
:maxlength="80" :maxlength="80"
:readonly="!isEdit" :readonly="!isEdit"
/> />
<span v-show="isEdit" class="tip-length" <span v-show="isEdit" class="tip-length"
>{{ formData.storeName.length }}/80</span >{{ formData.shopName.length }}/80</span
> >
</a-form-item> </a-form-item>
<a-form-item label="Owners Full Name" name="fullName"> <a-form-item label="Owners Full Name" name="ownerName">
<a-input <a-input
v-model:value="formData.fullName" v-model:value="formData.ownerName"
placeholder="Enter store owner's full name" placeholder="Enter store owner's full name"
:readonly="!isEdit" :readonly="!isEdit"
/> />
@@ -30,10 +30,10 @@
:readonly="!isEdit" :readonly="!isEdit"
/> />
</a-form-item> </a-form-item>
<a-form-item label="Phone Number" name="phoneNumber"> <a-form-item label="Phone Number" 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="Enter phone number"
:readonly="!isEdit" :readonly="!isEdit"
/> />
@@ -43,9 +43,9 @@
<a-form-item label="Portfoilo/Social Media Links"> <a-form-item label="Portfoilo/Social Media Links">
<a-input <a-input
placeholder="https://" placeholder="https://"
v-for="(v, i) in formData.links" v-for="(v, i) in formData.socialLinks"
:key="v + i" :key="i"
v-model:value="formData.links[i]" v-model:value="formData.socialLinks[i]"
:readonly="!isEdit" :readonly="!isEdit"
> >
<template #prefix>Link {{ i + 1 }}</template> <template #prefix>Link {{ i + 1 }}</template>
@@ -82,6 +82,9 @@
<script setup> <script setup>
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"
const store = useStore()
const designerInfo = computed(() => store.state.seller.designerInfo)
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
const props = defineProps({ const props = defineProps({
@@ -91,42 +94,49 @@
} }
}) })
const formRules = { const formRules = {
storeName: [{ required: true, message: "Enter the store name" }], shopName: [{ required: true, message: "Enter the store name" }],
fullName: [{ required: true, message: "Enter store owner's full name" }], ownerName: [{ required: true, message: "Enter store owner's full name" }],
email: [{ required: true, message: "Enter email" }], email: [{ required: true, message: "Enter email" }],
phoneNumber: [{ required: true, message: "Enter phone number" }], mobile: [{ required: true, message: "Enter phone number" }],
description: [{ required: true, message: "Enter store description" }] description: [{ required: true, message: "Enter store description" }]
} }
const formRef = ref(null) const formRef = ref(null)
const formData = reactive({ const formData = reactive({
storeName: "", shopName: "",
fullName: "", ownerName: "",
email: "", email: "",
phoneNumber: "", mobile: "",
description: "", description: "",
links: ["", ""] socialLinks: ["", ""]
}) })
const newLink = ref("") const newLink = ref("")
const addLink = () => { const addLink = () => {
formData.links.push(newLink.value) formData.socialLinks.push(newLink.value)
newLink.value = "" newLink.value = ""
} }
watch(
() => designerInfo.value,
(v) => updateFormData()
)
const updateFormData = () => {
formData.shopName = designerInfo.value.shopName
formData.ownerName = designerInfo.value.ownerName
formData.email = designerInfo.value.email
formData.mobile = designerInfo.value.mobile
formData.description = designerInfo.value.description
formData.socialLinks = JSON.parse(JSON.stringify(designerInfo.value.socialLinks))
}
updateFormData()
watch( watch(
() => props.isEdit, () => props.isEdit,
(v) => (v ? edit() : cancel()) (v) => (v ? edit() : cancel())
) )
const edit = () => { const edit = () => {}
formData.storeName = "测试"
formData.fullName = "测试"
formData.email = "测试"
formData.phoneNumber = "测试"
formData.description = "测试"
formData.links = ["https://www.baidu.com", "https://www.taobao.com"]
}
const cancel = () => { const cancel = () => {
formRef.value.clearValidate() formRef.value.clearValidate()
edit() updateFormData()
} }
const submit = async () => { const submit = async () => {
await formRef.value.validate() await formRef.value.validate()

View File

@@ -41,11 +41,15 @@
</template> </template>
<script setup> <script setup>
import { ref } from "vue" import { Https } from "@/tool/https"
import { ref, computed } from "vue"
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"
const banner = ref("") import { useStore } from "vuex"
const avatar = ref("") const store = useStore()
const designerInfo = computed(() => store.state.seller.designerInfo)
const avatar = computed(() => designerInfo.value.avatar)
const banner = computed(() => designerInfo.value.brandBanner)
const isEdit = ref(false) const isEdit = ref(false)
const brandInfoRef = ref(null) const brandInfoRef = ref(null)
const imageClipDialogRef = ref(null) const imageClipDialogRef = ref(null)
@@ -70,7 +74,8 @@
imageClipDialogRef.value.open( imageClipDialogRef.value.open(
url, url,
(file) => { (file) => {
banner.value = URL.createObjectURL(file) // banner.value = URL.createObjectURL(file)
console.log(URL.createObjectURL(file))
}, },
{ ratio: [40, 7], isPreview: false, title: "Crop Brand Banner" } { ratio: [40, 7], isPreview: false, title: "Crop Brand Banner" }
) )
@@ -81,7 +86,8 @@
imageClipDialogRef.value.open( imageClipDialogRef.value.open(
url, url,
(file) => { (file) => {
avatar.value = URL.createObjectURL(file) // avatar.value = URL.createObjectURL(file)
console.log(URL.createObjectURL(file))
}, },
{ ratio: [1, 1], isPreview: true, title: "Crop Avatar" } { ratio: [1, 1], isPreview: true, title: "Crop Avatar" }
) )
@@ -93,14 +99,17 @@
const onCancel = () => { const onCancel = () => {
isEdit.value = false isEdit.value = false
} }
const onSubmit = () => { const onSubmit = async () => {
brandInfoRef.value const res = await brandInfoRef.value.submit()
.submit() const data = {
.then((res) => { ...designerInfo.value,
console.log(res) ...res,
isEdit.value = false socialLinks: JSON.stringify(res.socialLinks)
}) }
.catch(() => {}) Https.axiosPut(Https.httpUrls.updateDesignerInfo, data).then((res) => {
isEdit.value = false
store.commit("seller/set_designerInfo", data)
})
} }
</script> </script>
<style scoped lang="less"> <style scoped lang="less">

View File

@@ -19,10 +19,13 @@
<script setup> <script setup>
import { Https } from "@/tool/https" import { Https } from "@/tool/https"
import { ref, computed,onMounted,onUnmounted } from "vue" import { ref, computed, onMounted, onUnmounted } from "vue"
import { useRoute, useRouter } from "vue-router" import { useRoute, useRouter } from "vue-router"
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"
const store = useStore()
store.dispatch("seller/get_designerInfo")
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
const visible = ref(false) const visible = ref(false)
@@ -53,13 +56,13 @@
if (path === activePath.value) return if (path === activePath.value) return
router.push(path) router.push(path)
} }
onMounted(()=>{ onMounted(() => {
myEvent.add('newListing',()=>{ myEvent.add("newListing", () => {
visible.value = true visible.value = true
}) })
}) })
onUnmounted(()=>{ onUnmounted(() => {
myEvent.remove('newListing') myEvent.remove("newListing")
}) })
</script> </script>
<style scoped lang="less"> <style scoped lang="less">