509 lines
19 KiB
Vue
509 lines
19 KiB
Vue
<template>
|
|
<div>
|
|
<CustomSubHeader>
|
|
<CBreadcrumb class="border-0 mb-0">{{ title }}</CBreadcrumb>
|
|
<CButton size="sm" color="success" class="mr-auto" @click="addInfo">بروزرسانی</CButton>
|
|
</CustomSubHeader>
|
|
|
|
<CRow>
|
|
<CCol sm="12">
|
|
<CCard>
|
|
<CCardBody>
|
|
<CCol>
|
|
<!-- <h5 style="margin-bottom: 16px"></h5>-->
|
|
<CCol sm="12">
|
|
<el-checkbox v-model="storeInfo.useSpecialMenu" label="نمایش منو سرآشپز"/>
|
|
</CCol>
|
|
<CCol class="mt-2" sm="6">
|
|
<CInput
|
|
v-if="$auth.user.permissions.includes('development')"
|
|
:class="validation.updateApp ? 'err' : null"
|
|
class="input-direction"
|
|
label="ورژن اپلیکیشن"
|
|
:description="validation.updateApp ? validation.updateApp.msg : null"
|
|
v-model="storeInfo.updateApp"
|
|
/>
|
|
</CCol>
|
|
</CCol>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CCol>
|
|
<CCol sm="12">
|
|
<CCard>
|
|
<CCardBody>
|
|
<CCol>
|
|
<h5 style="margin-bottom: 16px">پیام مدیر</h5>
|
|
<CCol sm="12">
|
|
<CInput
|
|
:class="validation.message ? 'err' : null"
|
|
label="پیام روز"
|
|
:description="validation.message ? validation.message.msg : null"
|
|
v-model="storeInfo.message"
|
|
/>
|
|
</CCol>
|
|
</CCol>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CCol>
|
|
<CCol sm="6">
|
|
<CCard>
|
|
<CCardBody>
|
|
<CCol>
|
|
<h5 style="margin-bottom: 16px">اطلاعات عمومی</h5>
|
|
<CCol sm="12">
|
|
<CTextarea
|
|
:class="validation.caption ? 'err' : null"
|
|
label="توضیحات"
|
|
:description="validation.caption ? validation.caption.msg : null"
|
|
v-model="storeInfo.caption"
|
|
/>
|
|
</CCol>
|
|
<CCol sm="12">
|
|
<CInput
|
|
class="input-direction"
|
|
:class="validation.email ? 'err' : null"
|
|
label="ایمیل"
|
|
:description="validation.email ? validation.email.msg : null"
|
|
v-model="storeInfo.email"
|
|
/>
|
|
</CCol>
|
|
<CCol sm="12">
|
|
<CInput
|
|
class="input-direction"
|
|
:class="validation.tel ? 'err' : null"
|
|
label="تلفن"
|
|
:description="validation.tel ? validation.tel.msg : null"
|
|
v-model="storeInfo.tel"
|
|
/>
|
|
</CCol>
|
|
<CCol sm="12">
|
|
<CInput
|
|
:class="validation.address ? 'err' : null"
|
|
label="آدرس"
|
|
:description="validation.address ? validation.address.msg : null"
|
|
v-model="storeInfo.address"
|
|
/>
|
|
</CCol>
|
|
|
|
</CCol>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CCol>
|
|
<CCol sm="6">
|
|
<CCard>
|
|
<CCardBody>
|
|
<CCol>
|
|
<h5 style="margin-bottom: 16px">شبکه های اجتماعی</h5>
|
|
<CCol sm="12">
|
|
<CInput
|
|
class="input-direction"
|
|
:class="validation.socials ? 'err' : null"
|
|
label="واتساپ"
|
|
:description="validation.socials ? validation.socials.msg : null"
|
|
v-model="storeInfo.socials.whatsaap"
|
|
/>
|
|
</CCol>
|
|
<CCol sm="12">
|
|
<CInput
|
|
class="input-direction"
|
|
:class="validation.socials ? 'err' : null"
|
|
label="تویتر"
|
|
:description="validation.socials ? validation.socials.msg : null"
|
|
v-model="storeInfo.socials.twitter"
|
|
/>
|
|
</CCol>
|
|
<CCol sm="12">
|
|
<CInput
|
|
class="input-direction"
|
|
:class="validation.socials ? 'err' : null"
|
|
label="فیس بوک"
|
|
:description="validation.socials ? validation.socials.msg : null"
|
|
v-model="storeInfo.socials.facebook"
|
|
/>
|
|
</CCol>
|
|
<CCol sm="12">
|
|
<CInput
|
|
:class="validation.socials ? 'err' : null"
|
|
class="input-direction"
|
|
label="اینستاگرام"
|
|
:description="validation.socials ? validation.socials.msg : null"
|
|
v-model="storeInfo.socials.instagram"
|
|
/>
|
|
</CCol>
|
|
<CCol sm="12">
|
|
<CInput
|
|
:class="validation.socials ? 'err' : null"
|
|
class="input-direction"
|
|
label="گوگل پلاس"
|
|
:description="validation.socials ? validation.socials.msg : null"
|
|
v-model="storeInfo.socials.googlePlus"
|
|
/>
|
|
</CCol>
|
|
</CCol>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CCol>
|
|
</CRow>
|
|
<CRow>
|
|
<CCard>
|
|
<CCardBody>
|
|
<h5 style="margin-bottom: 16px">تنظیمات هزینه ارسال و مالیات</h5>
|
|
<CCol>
|
|
<CCol sm="6">
|
|
<el-checkbox v-model="storeInfo.tax" label="گرفتن مالیات از مشتری"/>
|
|
</CCol>
|
|
<CCol sm="6">
|
|
<el-checkbox v-model="storeInfo.shippingType" label="هزینه ارسال ثابت باشد"/>
|
|
</CCol>
|
|
<CCol sm="6">
|
|
<CInput
|
|
:class="validation.socials ? 'err' : null"
|
|
label="هزینه ارسال به ریال(به ازای هر کیلومتر در صورت ثابت نبودن)"
|
|
placeholder=""
|
|
:description="validation.shippingCost ? validation.shippingCost.msg : null"
|
|
v-model="storeInfo.shippingCost"
|
|
/>
|
|
</CCol>
|
|
<el-divider/>
|
|
<CCol sm="6">
|
|
<CInput
|
|
:class="validation.limitPrice ? 'err' : null"
|
|
label="حداقل مبلغ خرید(ریال)"
|
|
placeholder=""
|
|
:description="validation.limitPrice ? validation.limitPrice.msg : null"
|
|
v-model="storeInfo.limitPrice"
|
|
/>
|
|
</CCol>
|
|
</CCol>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CRow>
|
|
<CRow>
|
|
<CCard>
|
|
<CCardBody>
|
|
<h5 style="margin-bottom: 16px">تنظیمات امتیازات</h5>
|
|
<CCol>
|
|
<CRow>
|
|
<CCol sm="12">
|
|
<el-checkbox class="mb-4" v-model="storeInfo.usePointWhenPay" label="اجازه استفاده از امتیاز هنگام پرداخت"/>
|
|
</CCol>
|
|
<CCol sm="12" class="mb-3">
|
|
<span>به ازای هر</span>
|
|
<CInput
|
|
type="number"
|
|
style="display: inline-block"
|
|
:class="validation.totalPricePoint ? 'err' : null"
|
|
placeholder="قیمت به ریال وارد شود"
|
|
:description="validation.totalPricePoint ? validation.totalPricePoint.msg : null"
|
|
v-model="storeInfo.totalPricePoint"
|
|
/>
|
|
<span><b>ریال</b> خرید مقدار</span>
|
|
<CInput
|
|
type="number"
|
|
style="display: inline-block"
|
|
:class="validation.pointForBuy ? 'err' : null"
|
|
placeholder=""
|
|
:description="validation.pointForBuy ? validation.pointForBuy.msg : null"
|
|
v-model="storeInfo.pointForBuy"
|
|
/>
|
|
<span>امتیاز به مشتری داده شود</span>
|
|
</CCol>
|
|
<CCol sm="12" class="mb-3">
|
|
<span>هر</span>
|
|
<CInput
|
|
type="number"
|
|
style="display: inline-block"
|
|
:class="validation.pointForChange ? 'err' : null"
|
|
placeholder=""
|
|
:description="validation.pointForChange ? validation.pointForChange.msg : null"
|
|
v-model="storeInfo.pointForChange"
|
|
/>
|
|
<span>امتیاز برابر با</span>
|
|
<CInput
|
|
type="number"
|
|
style="display: inline-block"
|
|
:class="validation.priceForChange ? 'err' : null"
|
|
placeholder=""
|
|
:description="validation.priceForChange ? validation.priceForChange.msg : null"
|
|
v-model="storeInfo.priceForChange"
|
|
/>
|
|
<span><b>ریال</b> می باشد</span>
|
|
</CCol>
|
|
<el-divider/>
|
|
<CCol sm="6">
|
|
<CInput
|
|
:class="validation.userRegistrationScore ? 'err' : null"
|
|
label="امتیاز ثبت نام"
|
|
placeholder=""
|
|
:description="validation.userRegistrationScore ? validation.userRegistrationScore.msg : null"
|
|
v-model="storeInfo.userRegistrationScore"
|
|
/>
|
|
<!-- <CInput-->
|
|
<!-- :class="validation.userEmailVerifyScore ? 'err' : null"-->
|
|
<!-- label="امتیاز وارد کردن ایمیل"-->
|
|
<!-- placeholder=""-->
|
|
<!-- :description="validation.userEmailVerifyScore ? validation.userEmailVerifyScore.msg : null"-->
|
|
<!-- v-model="storeInfo.userEmailVerifyScore"-->
|
|
<!-- />-->
|
|
<CInput
|
|
:class="validation.pointBirthDate ? 'err' : null"
|
|
label="امتیاز تاریخ تولد"
|
|
placeholder=""
|
|
:description="validation.pointBirthDate ? validation.pointBirthDate.msg : null"
|
|
v-model="storeInfo.pointBirthDate"
|
|
/>
|
|
</CCol>
|
|
<CCol sm="6">
|
|
<CInput
|
|
:class="validation.pointMarriageDate ? 'err' : null"
|
|
label="امتیاز تاریخ ازدواج"
|
|
placeholder=""
|
|
:description="validation.pointMarriageDate ? validation.pointMarriageDate.msg : null"
|
|
v-model="storeInfo.pointMarriageDate"
|
|
/>
|
|
<CInput
|
|
:class="validation.invitePoint ? 'err' : null"
|
|
label="امتیاز دعوت کردن"
|
|
placeholder=""
|
|
:description="validation.invitePoint ? validation.invitePoint.msg : null"
|
|
v-model="storeInfo.invitePoint"
|
|
/>
|
|
</CCol>
|
|
</CRow>
|
|
</CCol>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CRow>
|
|
<CRow>
|
|
<CCard>
|
|
<CCardBody>
|
|
<h5 style="margin-bottom: 16px">تنظیمات ساعت کار رستوران</h5>
|
|
<CCol>
|
|
<CRow>
|
|
<CCol sm="6">
|
|
<el-checkbox v-model="storeInfo.closeStore" label="فروشگاه تعطیل است"/>
|
|
</CCol>
|
|
<CRow v-if="!storeInfo.closeStore" class="mb-5">
|
|
<CCol sm="6">
|
|
<CCol col="md-3" class="mb-2">
|
|
<span>ساعت شروع</span>
|
|
</CCol>
|
|
<CCol col="md-9">
|
|
<date-picker type="time" format="HH:mm" display-format="HH:mm" clearable v-model="storeInfo.firstStartTime"></date-picker>
|
|
<p class="text-danger" v-if="validation.firstStartTime">
|
|
{{ validation.firstStartTime.msg }}
|
|
</p>
|
|
</CCol>
|
|
</CCol>
|
|
<CCol sm="6">
|
|
<CCol col="md-3" class="mb-2">
|
|
<span>ساعت پایان</span>
|
|
</CCol>
|
|
<CCol col="md-9">
|
|
<date-picker type="time" format="HH:mm" display-format="HH:mm" clearable v-model="storeInfo.firstEndTime"></date-picker>
|
|
<p class="text-danger" v-if="validation.firstEndTime">
|
|
{{ validation.firstEndTime.msg }}
|
|
</p>
|
|
</CCol>
|
|
</CCol>
|
|
</CRow>
|
|
<CRow v-if="!storeInfo.closeStore">
|
|
<el-divider/>
|
|
<CCol sm="6">
|
|
<CCol col="md-3" class="mb-2">
|
|
<span>ساعت شروع</span>
|
|
</CCol>
|
|
<CCol col="md-9">
|
|
<date-picker type="time" format="HH:mm" display-format="HH:mm" clearable v-model="storeInfo.secondStartTime"></date-picker>
|
|
<p class="text-danger" v-if="validation.secondStartTime">
|
|
{{ validation.secondStartTime.msg }}
|
|
</p>
|
|
</CCol>
|
|
</CCol>
|
|
<CCol sm="6">
|
|
<CCol col="md-3" class="mb-2">
|
|
<span>ساعت پایان</span>
|
|
</CCol>
|
|
<CCol col="md-9">
|
|
<date-picker type="time" format="HH:mm" display-format="HH:mm" clearable v-model="storeInfo.secondEndTime"></date-picker>
|
|
<p class="text-danger" v-if="validation.secondEndTime">
|
|
{{ validation.secondEndTime.msg }}
|
|
</p>
|
|
</CCol>
|
|
</CCol>
|
|
</CRow>
|
|
</CRow>
|
|
</CCol>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CRow>
|
|
<CRow>
|
|
<CCard>
|
|
<CCardHeader>
|
|
<h5>مشخص کردن مکان رستوران روی نقشه</h5>
|
|
</CCardHeader>
|
|
<CCardBody class="text-center">
|
|
<template>
|
|
<no-ssr>
|
|
<mapir class="d-inline-flex" id="map" :min-zoom="12" :max-zoom="18" :zoom="15" logo-position="top-left" :center="storeInfo.location.coordinates || center" @click="mapOnClick" :apiKey="apiKey">
|
|
<mapNavigationControl position="top-right"/>
|
|
<mapGeolocateControl position="top-right"/>
|
|
<mapMarker
|
|
:coordinates.sync="storeInfo.location.coordinates || center"
|
|
color="red"
|
|
@click="markerOnClick"
|
|
:draggable="true"
|
|
@dragend="getlatLng"
|
|
/>
|
|
</mapir>
|
|
</no-ssr>
|
|
</template>
|
|
</CCardBody>
|
|
</CCard>
|
|
</CRow>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import moment from 'moment-jalaali'
|
|
|
|
let mapirVue = {}
|
|
if (process.client)
|
|
mapirVue = require('mapir-vue')
|
|
|
|
|
|
export default {
|
|
components: {
|
|
'mapir': mapirVue.mapir,
|
|
'mapMarker': mapirVue.mapMarker,
|
|
'mapNavigationControl': mapirVue.mapNavigationControl,
|
|
'mapGeolocateControl': mapirVue.mapGeolocateControl,
|
|
},
|
|
data() {
|
|
return {
|
|
apiKey: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImRiYjIwMmRhYzAxYzFjNzgwYjgxNWQyZDgyMWNmNmY1Njk0MThhMGE3N2Q1M2Y0OTZkYzQzYTgxMmNmN2U3ZWJjNzI5MjY5YjkxMjA4MTYyIn0.eyJhdWQiOiIxNDk3OSIsImp0aSI6ImRiYjIwMmRhYzAxYzFjNzgwYjgxNWQyZDgyMWNmNmY1Njk0MThhMGE3N2Q1M2Y0OTZkYzQzYTgxMmNmN2U3ZWJjNzI5MjY5YjkxMjA4MTYyIiwiaWF0IjoxNjI3MzI2Mzc0LCJuYmYiOjE2MjczMjYzNzQsImV4cCI6MTYyOTkxODM3NCwic3ViIjoiIiwic2NvcGVzIjpbImJhc2ljIl19.hyKNSy4fmPps6yIdm33Wof-mES9ujh5lmI3VFWyecbkNCm9ATPwsZ9s53A3a1wPJmHfLBXpCcob5NGL-GjZlVfqfRBiReRMr_iniCjUOnqENfFwVEJutxI-xrzVe7PZzOgx1Vr6WwSUHvQ36eJSS1lBlHlqCgwRbkG0hs4YdZsKhzhfYdlAluNw9djjUAMbRWZVL0EluP9CYko4w8tB0KHUZMZYGQcevCfb_3OU9ygHo7B--Z5aTPfm7IK4eP0gHsZ_t857B3tu3ZJB1mkgxc2R9gZUflKqj1ZqkYiR0uMGP-571enXh6pYQLXL2k-gOxLIedCaE6XytxVXhENnotA',
|
|
title: 'اطلاعات فروشگاه',
|
|
list_title: 'لیست',
|
|
// base data
|
|
storeInfo: null,
|
|
center: [49.6848857, 34.0821617],
|
|
// validation
|
|
validation: {}
|
|
}
|
|
},
|
|
methods: {
|
|
mapOnClick(e) {
|
|
this.storeInfo.location = {
|
|
type: 'Point',
|
|
coordinates: [e.actualEvent.lngLat.lng , e.actualEvent.lngLat.lat]
|
|
}
|
|
},
|
|
markerOnClick(e) {
|
|
|
|
},
|
|
getlatLng(e) {
|
|
|
|
},
|
|
addInfo() {
|
|
this.validation = {}
|
|
this.storeInfo.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
this.$axios.post(`/api/admin/store/${this.$route.params.branch}`, this.storeInfo)
|
|
.then(res => {
|
|
this.$message({
|
|
type: 'success',
|
|
message: 'تغییرات با موفقیت انجام شد'
|
|
})
|
|
this.$nuxt.refresh()
|
|
})
|
|
.catch(err => {
|
|
if (err.response.status === 401) {
|
|
return this.$message({
|
|
type: "error",
|
|
message: "لطفا دوباره وارد سیستم شوید.",
|
|
});
|
|
}
|
|
if (err.response.status === 403) {
|
|
return this.$message({
|
|
type: "error",
|
|
message: err.response.data.message,
|
|
});
|
|
}
|
|
if (err.response.status === 500) {
|
|
return this.$message({
|
|
type: "error",
|
|
message: "مشکلی در ارسال درخواست پیش آمده",
|
|
});
|
|
}
|
|
if (err.response.status === 422){
|
|
this.$message({
|
|
type: 'warning',
|
|
message: 'پارامترها را بررسی کنید'
|
|
})
|
|
this.validation = err.response.data.validation;
|
|
} else console.log(err.response.data);
|
|
});
|
|
},
|
|
jDate(date) {
|
|
return moment(date, 'X').format('jYYYY/jMM/jDD')
|
|
}
|
|
},
|
|
head() {
|
|
return {
|
|
title: this.title
|
|
}
|
|
},
|
|
layout: 'admin',
|
|
async asyncData({$axios, error , params}) {
|
|
try {
|
|
const store = await $axios.get(`/api/admin/store/${params.branch}`)
|
|
return {
|
|
storeInfo: store.data
|
|
}
|
|
|
|
} catch (e) {
|
|
if (e?.response?.status === 401) {
|
|
error({
|
|
status: 401,
|
|
message: "لطفا دوباره وارد سیستم شوید.",
|
|
});
|
|
}
|
|
if (e?.response?.status === 403) {
|
|
error({
|
|
status: 403,
|
|
message: e?.response?.data?.message,
|
|
});
|
|
}
|
|
if (e?.response?.status === 500) {
|
|
error({
|
|
status: 500,
|
|
message: "مشکلی در گرفتن اطلاعات پیش آمده",
|
|
});
|
|
} else
|
|
error({
|
|
status: 404,
|
|
message: "اطلاعات مورد نظر پیدا نشد",
|
|
});
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
|
|
<style lang="scss">
|
|
.el-button:focus {
|
|
outline-color: #39f !important;
|
|
}
|
|
|
|
#map {
|
|
width: 100vh;
|
|
height: 50vh;
|
|
}
|
|
|
|
.holder-logo{
|
|
left: 0;
|
|
}
|
|
.mapboxgl-ctrl-attrib-button{
|
|
display: none;
|
|
}
|
|
</style>
|