front-end almost done | started back-end

This commit is contained in:
Amir Mohamadi
2020-11-23 19:39:26 +03:30
parent 95149f0e72
commit 80a7abafb7
191 changed files with 60163 additions and 950 deletions
@@ -1,17 +1,20 @@
<template>
<section class="customers-communication">
<div class="container">
<div class="container clearfix">
<div class="panel">
<div class="row align-items-center">
<div class="col-6">
<div class="imgBox imgBox-reverse">
<img src="~/assets/img/customersCommunication.jpg" alt="">
<div class="img">
<div class="shape"></div>
<img src="~/assets/img/customersCommunication.jpg" alt="">
</div>
</div>
</div>
<div class="col-6">
<h2 class="title title-shape">{{staticData.t1}}</h2>
<p>{{staticData.t2}}</p>
<nuxt-link :to="{name: staticData.link.url}" class="btn btn-reverse-fill">{{staticData.link.txt}}</nuxt-link>
<nuxt-link :to="{name: 'lang-contact',params: {lang: $route.params.lang}}" class="btn btn-reverse-fill">{{staticData.link}}</nuxt-link>
</div>
</div>
</div>
@@ -23,11 +26,7 @@
export default {
computed: {
staticData() {
if (this.$route.params.lang === 'fa') {
return this.$store.state.staticData.customersCommunication.fa
} else if (this.$route.params.lang === 'en') {
return this.$store.state.staticData.customersCommunication.en
}
return this.$store.state.staticData.customersCommunication[this.$route.params.lang]
}
}
}
-29
View File
@@ -1,29 +0,0 @@
<template>
<svg class="NuxtLogo" width="245" height="180" viewBox="0 0 452 342" xmlns="http://www.w3.org/2000/svg">
<path
d="M139 330l-1-2c-2-4-2-8-1-13H29L189 31l67 121 22-16-67-121c-1-2-9-14-22-14-6 0-15 2-22 15L5 303c-1 3-8 16-2 27 4 6 10 12 24 12h136c-14 0-21-6-24-12z"
fill="#00C58E"
/>
<path
d="M447 304L317 70c-2-2-9-15-22-15-6 0-15 3-22 15l-17 28v54l39-67 129 230h-49a23 23 0 0 1-2 14l-1 1c-6 11-21 12-23 12h76c3 0 17-1 24-12 3-5 5-14-2-26z"
fill="#108775"
/>
<path
d="M376 330v-1l1-2c1-4 2-8 1-12l-4-12-102-178-15-27h-1l-15 27-102 178-4 12a24 24 0 0 0 2 15c4 6 10 12 24 12h190c3 0 18-1 25-12zM256 152l93 163H163l93-163z"
fill="#2F495E"
/>
</svg>
</template>
<style>
.NuxtLogo {
animation: 1s appear;
margin: auto;
}
@keyframes appear {
0% {
opacity: 0;
}
}
</style>
@@ -6,8 +6,8 @@
<logo/>
<div class="box">
<p><b>{{staticData.t1}}</b> <span>{{staticData.address}}</span></p>
<hr>
<p>
<!-- <hr>-->
<p class="red">
<b>{{staticData.t2}}</b> <a :href="'tel:' + staticData.fax">{{staticData.tell}}</a>
&nbsp &nbsp - &nbsp &nbsp
<b>{{staticData.t3}}</b> <a :href="'tel:' + staticData.fax">{{staticData.fax}}</a>
@@ -33,10 +33,11 @@
</li>
</ul>
<p>{{staticData.t5}}</p>
<p><b>{{staticData.t4}}</b> <a :href="'mailto:' + staticData.email">{{staticData.email}}</a></p>
<p class="blue"><b>{{staticData.t4}}</b> <a :href="'mailto:' + staticData.email">{{staticData.email}}</a></p>
</div>
</div>
</div>
<div class="footer-bar"></div>
</footer>
</template>
@@ -44,11 +45,7 @@
export default {
computed: {
staticData() {
if (this.$route.params.lang === 'fa') {
return this.$store.state.staticData.footer.fa
} else if (this.$route.params.lang === 'en') {
return this.$store.state.staticData.footer.en
}
return this.$store.state.staticData.footer[this.$route.params.lang]
}
}
}
@@ -3,13 +3,16 @@
<div class="container">
<div class="row">
<div class="col-8 links">
<logo/>
<div class="logo">
<logo/>
<span>{{staticData.t6}}</span>
</div>
<div class="box">
<p><b>{{staticData.t1}}</b> <span>{{staticData.address}}</span></p>
<hr>
<p><b>{{staticData.t2}}</b> <a :href="'tel:' + staticData.fax">{{staticData.tell}}</a></p>
<p><b>{{staticData.t3}}</b> <a :href="'tel:' + staticData.fax">{{staticData.fax}}</a></p>
<ul class="social-links">
<p class="red"><b>{{staticData.t2}}</b> <a :href="'tel:' + staticData.fax">{{staticData.tell}}</a></p>
<p class="red"><b>{{staticData.t3}}</b> <a :href="'tel:' + staticData.fax">{{staticData.fax}}</a></p>
<ul class="social-links red">
<li>
<a href="" target="_blank">
<em class="fab fa-facebook-f"></em>
@@ -26,7 +29,7 @@
</a>
</li>
</ul>
<p><b>{{staticData.t4}}</b> <a :href="'mailto:' + staticData.email">{{staticData.email}}</a></p>
<p class="blue"><b>{{staticData.t4}}</b> <a :href="'mailto:' + staticData.email">{{staticData.email}}</a></p>
</div>
</div>
<div class="col-4 map">
@@ -35,6 +38,7 @@
</div>
</div>
</div>
<div class="footer-bar"></div>
</footer>
</template>
@@ -42,11 +46,7 @@
export default {
computed: {
staticData() {
if (this.$route.params.lang === 'fa') {
return this.$store.state.staticData.footer.fa
} else if (this.$route.params.lang === 'en') {
return this.$store.state.staticData.footer.en
}
return this.$store.state.staticData.footer[this.$route.params.lang]
}
}
}
+125
View File
@@ -0,0 +1,125 @@
<template>
<header class="header">
<div class="lang-bar">
<a :href="catalog_link" download="catalog.pdf" target="_blank" class="catalog-download">
<span>{{staticData.catalog}}</span>
<span>&nbsp;</span>
<i class="fas fa-download"></i>
</a>
<div class="dropdown" @mouseenter="drop" @mouseleave="drop">
<div class="title">
<p class="current-lang">
<span>FA / EN</span>
<i class="fas fa-sort-down"></i>
</p>
</div>
<div class="dropMenu">
<div class="drop-item">
<nuxt-link :to="{to: this.$route.fullPath, params: {lang: 'fa'}}">FA</nuxt-link>
</div>
<div class="drop-item">
<nuxt-link :to="{to: this.$route.fullPath, params: {lang: 'en'}}">EN</nuxt-link>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<nav class="row align-items-center">
<div class="col-12 links">
<div class="container-fluid">
<ul class="row justify-content-start">
<nuxt-link :to="{name: 'lang',params: {lang: $route.params.lang}}" tag="li" exact class="">
<a class="logo">
<Logo/>
</a>
</nuxt-link>
<nuxt-link :to="{name: 'lang',params: {lang: $route.params.lang}}" tag="li" exact class="">
<a>{{staticData.home}}</a>
</nuxt-link>
<nuxt-link :to="{name: 'lang-about',params: {lang: $route.params.lang}}" tag="li" exact class="">
<a>{{staticData.about}}</a>
</nuxt-link>
<nuxt-link :to="{name: 'lang-services',params: {lang: $route.params.lang}}" tag="li" exact class="">
<a>{{staticData.services}}</a>
</nuxt-link>
<nuxt-link :to="{name: 'lang-products',params: {lang: $route.params.lang}}" tag="li" class="">
<a>{{staticData.products}}</a>
</nuxt-link>
<nuxt-link :to="{name: 'lang-projects',params: {lang: $route.params.lang}}" tag="li" exact class="">
<a>{{staticData.projects}}</a>
</nuxt-link>
<li class="tech_info" @mouseenter="tech_info" @mouseleave="tech_info"
:class="$route.name === 'lang-tech-gDesign' ||
$route.name === 'lang-tech-gStandard' ||
$route.name === 'lang-tech-gTech' ||
$route.name === 'lang-tech-gUsage' ? 'active' : null">
<a>{{staticData.tech_info}}</a>
<div class="drop-down">
<ul>
<li>
<nuxt-link :to="{name: 'lang-tech-gTech',params: {lang: $route.params.lang}}">{{staticData.ti_1}}</nuxt-link>
</li>
<li>
<nuxt-link :to="{name: 'lang-tech-gStandard',params: {lang: $route.params.lang}}">{{staticData.ti_2}}</nuxt-link>
</li>
<li>
<nuxt-link :to="{name: 'lang-tech-gDesign',params: {lang: $route.params.lang}}">{{staticData.ti_3}}</nuxt-link>
</li>
<li>
<nuxt-link :to="{name: 'lang-tech-gUsage',params: {lang: $route.params.lang}}">{{staticData.ti_4}}</nuxt-link>
</li>
</ul>
</div>
</li>
<nuxt-link :to="{name: 'lang-blog',params: {lang: $route.params.lang}}" tag="li" class="">
<a>{{staticData.blog}}</a>
</nuxt-link>
<nuxt-link :to="{name: 'lang-contact',params: {lang: $route.params.lang}}" tag="li" exact class="">
<a>{{staticData.contact}}</a>
</nuxt-link>
</ul>
</div>
</div>
</nav>
</div>
</header>
</template>
<script>
export default {
data() {
return {
catalog_link: this.$store.state.staticData.catalog_link
}
},
computed: {
staticData() {
return this.$store.state.staticData.header[this.$route.params.lang]
}
},
methods: {
drop() {
$('.dropdown').toggleClass('dropdown-active')
},
tech_info() {
const el = $('.tech_info .drop-down')
if (el.height() === 0) {
el.css({height: $('.tech_info .drop-down ul').height() + 10})
} else {
el.css({height: 0})
}
}
},
mounted() {
/////////////////////////////////////////////////////////// small header
$(window).scroll(function (e) {
if ($(window).scrollTop() > 50) {
$('.header').addClass('header-small')
} else {
$('.header').removeClass('header-small')
}
})
}
}
</script>
+47
View File
@@ -0,0 +1,47 @@
<template>
<ul>
<admin-aside-item icon="fas fa-home" :link="{name: 'admin'}" text="صفحه اصلی"/>
<admin-aside-item icon="fas fa-presentation" :link="{name: 'admin-slider'}" text="اسلایدر"/>
<admin-aside-item icon="fas fa-image" :link="{name: 'admin-gallery'}" text="گالری"/>
<admin-aside-item icon="fa fa-gift" text="محصولات" :hasChild="true">
<admin-aside-item :link="{name: 'admin-products'}" text="لیست محصولات"/>
<admin-aside-item :link="{name: 'admin-products-category'}" text="دسته بندی محصولات"/>
</admin-aside-item>
<admin-aside-item icon="fa fa-newspaper" text="بلاگ" :hasChild="true">
<admin-aside-item :link="{name: 'admin-blog'}" text="لیست بلاگ"/>
<admin-aside-item :link="{name: 'admin-blog-category'}" text="دسته بندی بلاگ"/>
</admin-aside-item>
<admin-aside-item icon="fas fa-user-friends" :link="{name: 'admin-customers'}" text="لیست مشتریان"/>
<admin-aside-item icon="fas fa-bags-shopping" :link="{name: 'admin-orders'}" text="لیست سفارشات"/>
<admin-aside-item icon="fas fa-envelope" :badge="$store.state.admin.unread" :link="{name: 'admin-messages'}" text="پیام های ارتباط با ما"/>
<admin-aside-item icon="fa fa-bullhorn" :link="{name: 'admin-broadcast'}" text="ارسال پیام برای مشتریان"/>
<admin-aside-item icon="far fa-file" :link="{name: 'admin-about'}" text="محتوای صفحه درباره ما"/>
</ul>
</template>
<script>
export default {
mounted() {
if (this.$auth.loggedIn) {
this.$axios.get('/api/private/contact')
.then(response => {
let unread = response.data.filter(item => {
return !item.read
})
this.$store.commit('admin/unreadCount', unread.length)
})
}
}
}
</script>
+60
View File
@@ -0,0 +1,60 @@
<template>
<nuxt-link :to="link" tag="li" v-if="!hasChild">
<a>
<i :class="icon"></i>
<span>{{text}}</span>
<span class="badge" v-if="badge">{{badge}}</span>
</a>
</nuxt-link>
<li v-else>
<ul>
<li @click="toggle">
<a>
<i :class="icon"></i>
<span>{{text}}</span>
</a>
</li>
</ul>
<ul class="menu-group" :data-key="componentUniqueID">
<slot/>
</ul>
</li>
</template>
<script>
export default {
data() {
return {
componentUniqueID: null
}
},
props: {
link: {
required: false
},
icon: {
required: false
},
text: {
required: true
},
badge: {
required: false
},
hasChild: {
required: false,
default: false
}
},
mounted() {
this.componentUniqueID = Math.random() * 100
$('.menu-group').slideUp()
},
methods: {
toggle(e) {
$(`.menu-group:not([data-key="${this.componentUniqueID}"])`).slideUp()
$(`.menu-group[data-key="${this.componentUniqueID}"]`).slideToggle()
}
}
}
</script>
+48
View File
@@ -0,0 +1,48 @@
<template>
<header class="admin--header container-fluid">
<div class="row">
<div class="col-6 headerSubDIV right">
<!-- customer info -->
<a href="/" target="_blank" class="customer">
<!-- customer logo -->
<div class="logo">
<img src="~static/favicon.png" alt="">
</div>
<div class="name">
<!-- customer name -->
<p>هیما</p>
</div>
</a>
</div>
<div class="col-6 headerSubDIV left">
<!-- logout button -->
<button class="logout" title="خارج شدن از حساب" @click="logOut">
<i class="fa fa-power-off"></i>
</button>
</div>
</div>
</header>
</template>
<script>
export default {
methods: {
logOut() {
this.$confirm('از اکانت خارج شوید؟', 'هشدار', {
confirmButtonText: 'بله',
cancelButtonText: 'لغو',
type: 'warning'
}).then(() => {
this.$auth.logout()
this.$router.push('/admin/login')
}).catch(() => {
this.$message({
type: 'warning',
message: 'عملیات لغو شد'
})
})
}
}
}
</script>
+33
View File
@@ -0,0 +1,33 @@
<template>
<div class="language">
<select v-model="selectedLocale">
<option v-for="item in locale" :value="item.value">{{item.name}}</option>
</select>
</div>
</template>
<script>
export default {
data() {
return {
selectedLocale: 'fa'
}
},
computed: {
locale() {
return this.$store.state.admin.languages
}
},
created() {
this.$axios.get('/api/public/locale')
.then(response => {
this.$store.commit('admin/updateLanguages', response.data)
})
},
watch: {
selectedLocale(oldVal, newVal) {
this.$store.commit('admin/changeLocale', this.selectedLocale)
}
}
}
</script>
+5
View File
@@ -0,0 +1,5 @@
<template>
<div class="panel mb-3">
<slot/>
</div>
</template>
+18
View File
@@ -0,0 +1,18 @@
<template>
<div class="col-12 mb-3">
<div class="row align-items-center justify-content-end title">
<h2>{{title}}</h2>
<slot/>
</div>
</div>
</template>
<script>
export default {
props: {
title: {
required: true
}
}
}
</script>
+26
View File
@@ -0,0 +1,26 @@
<template>
<div class="container-fluid">
<div class="user row align-items-center justify-content-lg-start">
<el-avatar :size="50" :src="avatar"></el-avatar>
<h2>{{user}}</h2>
</div>
</div>
</template>
<script>
export default {
data() {
return {}
},
props: {
user: {
required: false,
default: 'Admin'
},
avatar: {
required: false,
default: require('~/assets/admin/img/avatar.png')
}
}
}
</script>
-86
View File
@@ -1,86 +0,0 @@
<template>
<header class="header">
<div class="container-fluid">
<nav class="row align-items-center">
<div class="col-7 links">
<div class="container-fluid">
<ul class="row align-items-center">
<nuxt-link :to="{name: staticData.home.url}" tag="li" exact class="col">
<a class="logo">
<logo/>
</a>
</nuxt-link>
<nuxt-link :to="{name: staticData.home.url}" tag="li" exact class="col">
<a>{{staticData.home.title}}</a>
</nuxt-link>
<nuxt-link :to="{name: staticData.about.url}" tag="li" exact class="col">
<a>{{staticData.about.title}}</a>
</nuxt-link>
<nuxt-link :to="{name: staticData.services.url}" tag="li" exact class="col">
<a>{{staticData.services.title}}</a>
</nuxt-link>
<nuxt-link :to="{name: staticData.products.url}" tag="li" exact class="col">
<a>{{staticData.products.title}}</a>
</nuxt-link>
<nuxt-link :to="{name: staticData.contact.url}" tag="li" exact class="col">
<a>{{staticData.contact.title}}</a>
</nuxt-link>
</ul>
</div>
</div>
<div class="col-5 lag-switcher">
<div class="container-fluid">
<ul class="row flex-row-reverse align-items-center">
<li>
<div class="dropdown" @mouseenter="drop" @mouseleave="drop">
<div class="title">
<p v-if="this.$route.params.lang === 'fa'" class="current-lang">فا</p>
<p v-else-if="this.$route.params.lang === 'en'" class="current-lang">EN</p>
</div>
<div class="dropMenu">
<div class="drop-item">
<nuxt-link :to="{to: this.$route.fullPath, params: {lang: 'fa'}}">فا</nuxt-link>
</div>
<div class="drop-item">
<nuxt-link :to="{to: this.$route.fullPath, params: {lang: 'en'}}">EN</nuxt-link>
</div>
</div>
</div>
</li>
</ul>
</div>
</div>
</nav>
</div>
</header>
</template>
<script>
export default {
computed: {
staticData() {
if (this.$route.params.lang === 'fa') {
return this.$store.state.staticData.header.fa
} else if (this.$route.params.lang === 'en') {
return this.$store.state.staticData.header.en
}
}
},
methods: {
drop(target) {
$(target.path).toggleClass('dropdown-active')
}
},
mounted() {
/////////////////////////////////////////////////////////// small header
$(window).scroll(function (e) {
if ($(window).scrollTop() > 50) {
$('.header').addClass('header-small')
} else {
$('.header').removeClass('header-small')
}
})
}
}
</script>
+5
View File
@@ -0,0 +1,5 @@
<template>
<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 60 60">
<path d="M5.654,60A5.64,5.64,0,0,1,0,54.375V5.625A5.64,5.64,0,0,1,5.654,0H35.807a1.89,1.89,0,0,1,1.338.544l11.308,11.25A1.867,1.867,0,0,1,49,13.125v7.5H45.23V15H37.692a3.76,3.76,0,0,1-3.769-3.75V3.75H5.654A1.879,1.879,0,0,0,3.769,5.625v48.75A1.88,1.88,0,0,0,5.654,56.25H18.846V60ZM49,49V31.9A1.867,1.867,0,0,1,50.833,30H60v3.8H52.667v3.8H60v3.8H52.667V49ZM35.857,49A1.881,1.881,0,0,1,34,47.1V31.9A1.881,1.881,0,0,1,35.857,30h7.429A3.762,3.762,0,0,1,47,33.8V45.2A3.762,3.762,0,0,1,43.285,49Zm1.858-3.8h5.571V33.8H37.715Z" transform="translate(0 0)" fill="rgba(0,0,0,0.25)"/>
</svg>
</template>