feat: add ci cd files dont edit those files

This commit is contained in:
mahyargdz
2024-10-21 10:22:26 +03:30
commit fb5b440d42
321 changed files with 188273 additions and 0 deletions
+105
View File
@@ -0,0 +1,105 @@
<template>
<div class="archive-page">
<div class="container">
<LineTxt label="آرشیو"/>
<!-- <div class="col-12 col-md-3 mb-3 stretch" v-for="item in archive.docs" :key="item._id" v-if="archive.docs.length">-->
<!-- <div class="news-card justifyBetween">-->
<!-- <img :src="item.thumbCover" :alt="item.title">-->
<!-- <h2>{{ item.title }}</h2>-->
<!-- <nuxt-link :to="{name: 'portal-news-details',params: {portal: currentPortal,details: item.title}}">-->
<!-- <div class="whole-wrapper">-->
<!-- <span class="whole-wrapper-date">{{-->
<!-- jData2(item.customDate) + ' ' + jData(item.customDate)-->
<!-- }}</span>-->
<!-- <span class="whole-wrapper-title"> ادامه مطلب<i class="fas fa-chevron-left"></i></span>-->
<!-- </div>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<div class="row align-items-stretch">
<template v-if="archive.docs.length">
<NewsBox v-for="item in archive.docs" :key="item._id" :item="item"/>
</template>
<div class="not-found" v-else>
<p>موردی وجود ندارد!</p>
</div>
</div>
<div class="paginate">
<div class="row">
<div class="col-12">
<el-pagination
layout="prev, pager, next"
v-if="archive.totalPages > 1"
class="el-pagination"
@current-change="pageNumber"
:current-page="Number($route.query.page)"
:page-count="Number(archive.totalPages)"
>
</el-pagination>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import moment from "moment-jalaali";
export default {
data() {
return {
archive: null
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
pageQuery() {
return this.$route.query.page
},
query() {
return this.$route.query
}
},
watch: {
pageQuery(newVal, oldVal) {
this.$nuxt.refresh()
}
},
methods: {
jData(data) {
return moment(data).locale('fa').format('LL')
},
jData2(data) {
return moment(data).locale('fa').fromNow()
},
pageNumber(val) {
if(this.query.flag === 'all')
this.$router.push({name: 'portal-archive', params: {portal: this.currentPortal}, query: {flag: 'all' ,page: val}})
else
this.$router.push({name: 'portal-archive', params: {portal: this.currentPortal}, query: {flag: 'category', catId: this.query.catId ,page: val}})
},
},
async asyncData({$axios, error, params, query}) {
const portalQuery = params.portal
try {
const archive = await $axios.get(`/api/public/getNews?flag=${query.flag}&catId=${query.catId || ''}&portal=${portalQuery}&page=${query.page}`)
return {
archive: archive.data
}
} catch (e) {
error({status: 500, message: "مشکلی پیش آمده است!"})
}
}
}
</script>
+643
View File
@@ -0,0 +1,643 @@
<template>
<div class="category">
<!----------------------Page Top Button----------------------------->
<section class="s1">
<div class="container">
<div class="row">
<div class="col-12 top-btns" v-if="btnsLength > 1">
<div class="mt-2 view-link" v-if="category.category.hasNewsTab">
<button
@click="setChangeInPage({id: $route.query.id ,type: 'news', page: 1})"
class="btn bigBtn btn-primary"
:class="type === 'news' && 'btn-active'"
>
<span>اخبار</span>
</button>
</div>
<div class="mt-2 view-link" v-if="category.category.hasNewsFileTab">
<button
@click="setChangeInPage({id: $route.query.id ,type: 'newsFile'})"
class="btn bigBtn btn-primary"
:class="type === 'newsFile' && 'btn-active'"
>
<span>پرونده خبری</span>
</button>
</div>
<div class="mt-2 view-link" v-if="category.category.hasContentTab">
<button
@click="setChangeInPage({id: $route.query.id ,type: 'content'})"
class="btn bigBtn btn-primary"
:class="type === 'content' && 'btn-active'"
>
<span>درباره ی ...</span>
</button>
</div>
<div class="mt-2 view-link" v-if="category.category.hasMediaTab">
<button
@click="setChangeInPage({id: $route.query.id ,type: 'gallery', galleryType: 'image',page: 1})"
class="btn bigBtn btn-primary"
:class="type === 'gallery' && 'btn-active'"
>
<span>چند رسانه ای</span>
</button>
</div>
<div class="mt-2 view-link" v-if="category.category.hasSubMenusTab">
<button
@click="setChangeInPage({id: $route.query.id ,type: 'subMenu'})"
class="btn bigBtn btn-primary"
:class="type === 'subMenu' && 'btn-active'"
>
<span>صفحات مرتبط</span>
<!-- <span>{{ category.category.title }}</span>-->
</button>
</div>
<div class="mt-2 view-link" v-if="category.category.hasTermsTab">
<button
@click="setChangeInPage({id: $route.query.id ,type: 'terms'})"
class="btn bigBtn btn-primary"
:class="type === 'terms' && 'btn-active'"
>
<span>قوانین و دستوالعمل ها</span>
</button>
</div>
<div class="mt-2 view-link" v-if="category.category.hasNazarTab">
<button
@click="setChangeInPage({id: $route.query.id ,type: 'survey'})"
class="btn bigBtn btn-primary"
:class="type === 'survey' && 'btn-active'"
>
<span>نظر سنجی</span>
</button>
</div>
<div class="mt-2 view-link" v-if="category.category.hasNotificationsTab">
<button
@click="setChangeInPage({id: $route.query.id,type: 'event'})"
class="btn bigBtn btn-primary"
:class="type === 'event' && 'btn-active'"
>
<span>اطلاعیه ها</span>
</button>
</div>
<div class="mt-2 view-link" v-if="category.category.hasSpecNewsTab">
<button
@click="setChangeInPage({id: $route.query.id,type: 'special'})"
class="btn bigBtn btn-primary"
:class="type === 'special' && 'btn-active'"
>
<span>مطالب ویژه</span>
</button>
</div>
</div>
</div>
</div>
</section>
<div class="container">
<div class="row">
<main class="col-12 main-content" :class="(noSideBar && type !== 'gallery') && 'col-lg-9'">
<!-------------------------------News Category------------------------->
<section class="s2" v-if="type === 'news'">
<LineTxt :label="` اخبار ${category.category.title}`"/>
<div class="sectionStyle" v-if="category.news.docs.length">
<template>
<!-- <div class="heronews" v-if="category.heroNews">-->
<!-- <div class="title-holder">-->
<!-- <div class="row">-->
<!-- <div class="col-12 col-md-6 view-img">-->
<!-- <img class="image" :src="category.heroNews.thumbCover" :alt="category.heroNews.title">-->
<!-- </div>-->
<!-- <div class="col-12 col-md-6">-->
<!-- <h2 class="title" :title="category.heroNews.title">{{ category.heroNews.title }}</h2>-->
<!-- <p class="paragraph" :title="category.heroNews.summaryTitle">{{ category.heroNews.summaryTitle }}</p>-->
<!-- <span class="s1-date">-->
<!-- {{ jData2(category.heroNews.customDate) }}-->
<!-- </span>-->
<!-- <nuxt-link class="btn btn-primary" :to="{name: 'portal-news-details',params: {portal: currentPortal,details: category.heroNews.title}}">ادامه مطلب</nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<CategoryHeroNews v-if="category.heroNews" :data="category.heroNews"/>
<CategoryHeroNews v-else :data="category.news.docs[0]"/>
<!-- <div class="heronews" v-else>-->
<!-- <div class="title-holder">-->
<!-- <div class="row">-->
<!-- <div class="col-12 col-md-6 view-img">-->
<!-- <img class="image" :src="category.news.docs[0].thumbCover" :alt="category.news.docs[0].title">-->
<!-- </div>-->
<!-- <div class="col-12 col-md-6">-->
<!-- <h2 class="title" :title="category.news.docs[0].title">{{ category.news.docs[0].title }}</h2>-->
<!-- <p class="paragraph" :title="category.news.docs[0].summaryTitle">{{ category.news.docs[0].summaryTitle }}</p>-->
<!-- <span class="s1-date">-->
<!-- {{ jData2(category.news.docs[0].customDate) }}-->
<!-- </span>-->
<!-- <nuxt-link class="btn btn-primary" :to="{name: 'portal-news-details',params: {portal: currentPortal,details: category.news.docs[0].title}}">ادامه مطلب</nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<div class="list-news">
<div class="mt-3 mb-4">
<div class="line"></div>
</div>
<div class="row">
<NewsBox v-for="(item,index) in category.news.docs" :key="item._id" v-if="category.heroNews || index > 0" :item="item" :timeIsAgo="false"/>
<!-- ******************************************* old style ******************************************* -->
<!-- <div class="col-12 col-sm-6 col-lg-3 mb-5 stretch" v-for="item in category.news.docs" :key="item._id">-->
<!-- <div class="news-card justifyBetween">-->
<!-- <img :src="item.thumbCover" :alt="item.title">-->
<!-- <h2>{{ item.title }}</h2>-->
<!-- <nuxt-link :to="{name: 'portal-news-details',params: {portal: currentPortal,details: item.title}}">-->
<!-- <div class="whole-wrapper">-->
<!-- <span class="whole-wrapper-date">-->
<!-- {{ jData2(item.customDate) + ' ' + jData(item.customDate) }}-->
<!-- </span>-->
<!-- <span class="whole-wrapper-title"> ادامه مطلب<i class="fas fa-chevron-left"></i> </span>-->
<!-- </div>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<!-- ******************************************* old style ******************************************* -->
</div>
</div>
</template>
</div>
<div class="not-found" v-else>
<p>موردی وجود ندارد!</p>
</div>
<div class="paginate">
<div class="row">
<div class="col-12">
<el-pagination
layout="next, pager, prev"
v-if="paginate"
class="el-pagination"
@current-change="newsPageNumber"
:current-page="Number($route.query.page)"
:page-count="Number(category.news.totalPages)"
>
</el-pagination>
</div>
</div>
</div>
</section>
<!-------------------------------Child Category------------------------->
<section class="s3" v-if="type === 'subMenu'">
<LineTxt :label="` صفحات مرتبط با ${category.category.title}`"/>
<div class="link" v-if="category.category.childs.length">
<ul>
<nuxt-link
v-for="item in category.category.childs"
:key="item._id"
class="btn bigBtn btn-primary"
:to="{name: 'portal-category-details',params: {portal: currentPortal,details: item.title},query: {type: 'news',page: 1, id: item._id}}" v-slot="{navigate,href,isActive}" custom
exact>
<li @click="navigate">
<a :href="href">{{ item.title }}</a>
</li>
</nuxt-link>
</ul>
</div>
<div class="not-found" v-else>
<p>موردی وجود ندارد!</p>
</div>
</section>
<!-----------------------------Page Gallery--------------------------->
<CategoryGallerySection
v-if="type === 'gallery'"
:url="url"
:setChangeInPage="setChangeInPage"
:galleryType="galleryType"
:media="media"
:category="category"
:pageNumber="pageNumber"
:key="galleryComponentKey"
/>
<!-----------------------------Page content--------------------------->
<section class="s5" v-if="type === 'content'">
<LineTxt :label="` درباره ${category.category.title}`"/>
<div class="view-page-content ck-content" v-html="category.category.pageContent"
v-if="category.category.pageContent.length"></div>
<div class="not-found" v-else>
<p>موردی وجود ندارد!</p>
</div>
</section>
<!-----------------------------Page Terms--------------------------->
<section class="s6" v-if="type === 'terms'">
<LineTxt :label="` قوانین و دستورالعمل ها ${category.category.title}`"/>
<div class="row">
<div class="col-12 view-page-terms" v-for="item in category.category.terms" :key="item._id">
<div class="view-item-terms">
<div class="view-title-terms">
<i class="far fa-folder-open"></i>
<h3 :title="item.title">{{ item.title }}</h3>
</div>
<div>
<a class="btn btn-primary" :href="item.file" target="_blank">مطالعه کنید</a>
<a class="btn btn-primary" :href="item.file" target="_blank" download>دانلود</a>
</div>
</div>
</div>
</div>
<div class="not-found" v-if="!category.category.terms.length">
<p>موردی وجود ندارد!</p>
</div>
</section>
<!-----------------------------Page Survey--------------------------->
<section class="s7" v-if="type === 'survey'">
<LineTxt :label="` نظرسنجی ${category.category.title}`"/>
<div class="view-page-survey" v-for="item in category.polls" :key="item._id">
<div class="survey-item1">
<h2>{{ item.title }}</h2>
<p class="about-title">درباره نظر سنجی :</p>
<p class="about-txt">{{ item.description }}</p>
</div>
<div class="row survey-item2" v-if="!item.userIds.includes(userToken)">
<div class="col-12 col-md-6 mb-3">
<el-radio-group v-model="radio" v-for="(itemSelect, index) in item.options" :key="index"
v-if="item.surveyType === 'radio'">
<el-radio :label="itemSelect">{{ itemSelect }}</el-radio>
</el-radio-group>
<el-checkbox-group v-model="checkList"
v-if="item.surveyType === 'check'">
<el-checkbox v-for="(itemSelect2, index) in item.options" :key="index" :label="itemSelect2">
{{ itemSelect2 }}
</el-checkbox>
</el-checkbox-group>
</div>
<div class="col-12 col-md-6 comment-btn">
<button @click="post(item._id, item.surveyType)"
class="btn bigBtn btn-primary "
:disabled="item.surveyType === 'check' ? !checkList.length : !radio"
> ثبت نظر
</button>
</div>
</div>
<div class="survey-item2"
v-for="(answerItem, index) in item.options" :key="index"
v-if="item.userIds.includes(userToken)">
<h4>{{ answerItem }}</h4>
<el-progress :percentage="progress(item, answerItem)" color="#CC0000"></el-progress>
</div>
</div>
<div class="not-found" v-if="!category.polls.length">
<p>موردی وجود ندارد!</p>
</div>
</section>
<!-----------------------------Page Survey--------------------------->
<section class="s8" v-if="type === 'event'">
<LineTxt :label="` اطلاعیه ها ${category.category.title}`"/>
<ul>
<nuxt-link
v-for="item in category.events"
:key="item._id"
:to="{name: 'portal-news-details', params: {portal:currentPortal, details: item._id}}"
v-slot="{href,navigate}"
custom
>
<li @click="navigate">
<i class="fas fa-megaphone"></i>
<a :href="href">{{ item.title }}</a>
</li>
</nuxt-link>
</ul>
<div class="not-found" v-if="!category.events.length">
<p>موردی وجود ندارد!</p>
</div>
</section>
<!-----------------------------Page Survey--------------------------->
<section class="s9" v-if="type === 'special'">
<LineTxt :label="` مطالب ویژه ${category.category.title}`"/>
<ul>
<nuxt-link
:to="{name: 'portal-news-details', params: {portal:currentPortal, details: item._id}}"
v-for="item in category.specials"
:key="item._id"
v-slot="{href,navigate}"
>
<li>
<i class="fas fa-sparkles"></i>
<a :href="href">{{ item.title }}</a>
</li>
</nuxt-link>
</ul>
<div class="not-found" v-if="!category.specials.length">
<p>موردی وجود ندارد!</p>
</div>
</section>
<!-----------------------------Page Terms--------------------------->
<section class="s10" v-if="type === 'newsFile'">
<div class="container">
<LineTxt :label="` پرونده خبری ${category.category.title}`"/>
<div class="row">
<div class="col-12 view-page-newsFile" v-for="(item, index) in category.newsFile"
:key="item._id"
>
<div class="view-item-newsFile">
<nuxt-link :to="{name: 'portal-newsfile-details', params: {portal:currentPortal, details: item.title}, query: { page: 1 }}" class="view-title-newsFile">
<span>{{ index + 1 }}</span>
<h3>{{ item.title }}</h3>
</nuxt-link>
</div>
</div>
</div>
<div class="not-found" v-if="!category.newsFile.length">
<p>موردی وجود ندارد!</p>
</div>
</div>
</section>
</main>
<!-- <aside class="col-lg-3 d-none side-bar" :class="noSideBar && 'd-lg-block'"-->
<!-- v-if="type === 'gallery'">-->
<!-- <div-->
<!-- class="managerInfo sideBarItem"-->
<!-- v-if="category.category.hasManagerInfo"-->
<!-- :class="type === 'gallery' && 'galleryPage'"-->
<!-- >-->
<!-- <SideBarLineTxt label="برگزیده ها"/>-->
<!-- <div class="sectionStyle" v-for="(item,index) in media.favorites" :key="item._id + 1" v-if="index < 3">-->
<!-- <img :src="item.cover" :alt="item.title">-->
<!-- <nuxt-link class="view-title" :to="url(item.title)" :title="item.title">-->
<!-- <div class="title">-->
<!-- <h4>{{ item.title }}</h4>-->
<!-- </div>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- <div class="not-found" v-if="!media.favorites.length">-->
<!-- <p>موردی وجود ندارد!</p>-->
<!-- </div>-->
<!-- </div>-->
<!-- </aside>-->
<aside class="col-lg-3 d-none side-bar" :class="noSideBar && 'd-lg-block'" v-if="type !== 'gallery'">
<div
class="managerInfo sideBarItem"
v-if="category.category.hasManagerInfo"
:class="type === 'gallery' && 'galleryPage'"
>
<SideBarLineTxt label="معرفی مدیر"/>
<div class="sectionStyle">
<img :src="category.category.managerCover" :alt="category.category.managerName">
<div class="txtBox">
<h2>{{ category.category.managerName }}</h2>
<p>{{ category.category.managerDescription }}</p>
</div>
</div>
</div>
<div
class="specNews sidebarLinks mt-3 sideBarItem"
v-if="category.specials.length"
:class="type === 'gallery' && !category.category.hasManagerInfo && 'galleryPage'"
>
<SideBarLineTxt label="مطالب ویژه"/>
<div class="sectionStyle">
<!-- <ul>-->
<!-- <li v-for="(item,index) in category.specials" :key="item._id + 1" v-if="index < 4">-->
<!-- <nuxt-link :to="{name: 'portal-news-details', params: {portal: currentPortal,details: item.title}}" :title="item.title">-->
<!-- <i class="fas fa-sparkles"></i>-->
<!-- <span>{{ item.title }}</span>-->
<!-- </nuxt-link>-->
<!-- </li>-->
<!-- </ul>-->
<div id="slides-spec">
<nuxt-link
v-for="(item,index) in category.specials"
:key="item._id + 1"
v-if="index < 4"
:to="{name: 'portal-news-details', params: {portal: currentPortal,details: item._id}}"
v-slot="{href,navigate}"
custom
>
<div @click="navigate" class="slide pointer" :title="item.title">
<img :src="item.cover" :alt="item.title">
<a :href="href">{{ item.title }}</a>
</div>
</nuxt-link>
</div>
</div>
</div>
<div
class="notifications sidebarLinks mt-3 sideBarItem"
v-if="category.events.length"
:class="type === 'gallery' && !category.category.hasManagerInfo && !category.specials.length && 'galleryPage'"
>
<SideBarLineTxt label="اطلاعیه ها"/>
<div class="sectionStyle">
<ul>
<li v-for="(item,index) in category.events" :key="item._id + 2" v-if="index < 4">
<nuxt-link :to="{name: 'portal-news-details', params: {portal: currentPortal,details: item._id}}" :title="item.title">
<i class="fal fa-megaphone"></i>
<span>{{ item.title }}</span>
</nuxt-link>
</li>
</ul>
</div>
</div>
<div
class="latestNews sidebarLinks mt-3 sideBarItem"
v-if="category.events.length"
:class="type === 'gallery' && !category.category.hasManagerInfo && !category.specials.length && !category.events.length && 'galleryPage'"
>
<SideBarLineTxt label="آخرین اخبار"/>
<div class="sectionStyle">
<ul>
<li v-for="item in category.latestNews" :key="item._id + 3">
<nuxt-link :to="{name: 'portal-news-details', params: {portal: currentPortal,details: item._id}}" :title="item.title">
<i class="fas fa-circle"></i>
<span>{{ item.title }}</span>
</nuxt-link>
</li>
</ul>
</div>
</div>
</aside>
</div>
</div>
</div>
</template>
<script>
if (process.client) require("slick-carousel")
import moment from "moment-jalaali"
export default {
data() {
return {
category: null,
terms: [],
survey: [],
media: null,
radio: null,
checkList: [],
galleryComponentKey: 0
}
},
computed: {
paginate() {
return this.category.news.totalPages > 1
},
currentPortal() {
return this.$route.params.portal
},
pageQuery() {
return this.$route.query.page
},
type() {
return this.$route.query.type
},
galleryType() {
return this.$route.query.galleryType
},
btnsLength() {
let count = 0
if (this.category.category.hasNewsTab) count++
if (this.category.category.hasContentTab) count++
if (this.category.category.hasMediaTab) count++
if (this.category.category.hasSubMenusTab) count++
if (this.category.category.hasTermsTab) count++
if (this.category.category.hasNotificationsTab) count++
if (this.category.category.hasSpecNewsTab) count++
if (this.category.category.hasNazarTab) count++
return count
},
userToken() {
return this.$store.state.front.pollToken
},
noSideBar() {
return this.category.category.hasManagerInfo || this.category.specials?.length || this.category.events?.length
}
},
watch: {
pageQuery(newVal, oldVal) {
this.$nuxt.refresh()
},
galleryType(newVal, oldVal) {
this.$nuxt.refresh()
},
type(newVal, oldVal) {
},
media(newVal, oldVal) {
this.galleryComponentKey = Math.random()
},
},
methods: {
url(title) {
if (this.galleryType === 'image') {
return {name: 'portal-gallery-media', params: {portal: this.currentPortal, media: title}}
}
if (this.galleryType === 'video') {
return {name: 'portal-videos-video', params: {portal: this.currentPortal, video: title}}
}
if (this.galleryType === 'graphic') {
return {name: 'portal-graphics-graphic', params: {portal: this.currentPortal, graphic: title}}
}
},
pageNumber(val) {
this.$router.push({
name: 'portal-category-details',
params: {portal: this.currentPortal, details: this.$route.params.details},
query: {type: 'gallery', galleryType: this.galleryType, page: val, id: this.$route.query.id}
})
$(window).scrollTop(0)
},
newsPageNumber(val) {
this.$router.push({
name: 'portal-category-details',
params: {portal: this.currentPortal, details: this.$route.params.details},
query: {type: 'news', page: val, id: this.$route.query.id}
})
$(window).scrollTop(0)
},
jData(data) {
return moment(data).locale('fa').format('LL')
},
jData2(data) {
return moment(data).locale('fa').fromNow()
},
setChangeInPage(query) {
this.$router.push({name: 'portal-category-details', params: {portal: this.currentPortal, details: this.$route.params.details, id: this.$route.params.id}, query: query})
},
post(id, type) {
this.$axios.post('/api/public/answer', {
surveyId: id,
option: type === 'radio' ? [this.radio] : this.checkList,
pollToken: this.$store.state.front.pollToken
})
.then(res => {
this.$nuxt.refresh()
this.$message({
type: 'success',
message: 'نظر شما با موفقیت ثبت شد'
})
})
.catch(e => {
console.log(e)
})
},
progress(item, answerItem) {
let filteredAnswers = item.answers.filter(item0 => item.options.includes(item0))
let num = filteredAnswers.filter(item1 => item1 === answerItem).length
return Number(((num * 100 / filteredAnswers.length) || 0).toFixed(0))
}
},
mounted() {
$(document).ready(() => {
$("#slides-spec").slick({
dots: true,
slidesToShow: 1,
rtl: true,
autoplay: true,
autoplaySpeed: 3000,
speed: 1000,
arrows: false,
infinite: false,
pauseOnHover: true
})
})
},
async asyncData({$axios, params, error, query}) {
try {
const request = [
$axios.get(`/api/public/getCategory/${encodeURIComponent(params.details)}?page=${query.page}`),
$axios.get(`/api/public/getGalleryCat/${query.id}?type=${query.galleryType}&page=${query.page}`)
]
const fetch = await Promise.all(request)
const [category, media] = fetch
return {
category: category.data,
media: media.data
}
} catch (e) {
console.log('e', e)
error({status: 404, message: 'مشکلی پیش آمده است!'})
}
}
}
</script>
+197
View File
@@ -0,0 +1,197 @@
<template>
<div class="contact-page">
<div class="container">
<div class="row">
<main class="col-12 col-right">
<section class="s1-right">
<div class="row">
<div class="col-12 col-lg-6 s1-col1-right">
<h2 class="s1-col1-title">تماس با ما</h2>
<p class="s1-col1-desc">برای ارتباط با ما میتوانید از طریق فرم زیر اقدام نمایید</p>
<form @submit.prevent="post">
<div class="formRow" :class="validation.name ? 'err' : null">
<input v-model="message.name" class="input" name="name" type="text"
placeholder="نام و نام خانوادگی خود را وارد کنید"/>
<p v-if="validation.name">{{ validation.name.msg }}</p>
</div>
<div class="formRow" :class="validation.email ? 'err' : null">
<input v-model="message.email" class="input" name="email" type="text" placeholder="ایمیل خود را وارد کنید"/>
<p v-if="validation.email">{{ validation.email.msg }}</p>
</div>
<div class="formRow" :class="validation.description ? 'err' : null">
<textarea v-model="message.description" name="description" class="input" rows="4" placeholder="توضیحات خود را وارد کنید"></textarea>
<p v-if="validation.description">{{ validation.description.msg }}</p>
</div>
<div class="row view-captcha">
<div class="formRow" :class="validation.captcha ? 'err' : null">
<input v-model="message.captcha" class="input" name="captcha" type="text" placeholder="متن داخل عکس را وارد کنید"/>
</div>
<div class="new-captcha">
<div class="captcha" v-html="captcha"></div>
<button @click="reloadCaptcha" type="button" class="btn btn-primary">
<i class="fas fa-sync-alt"></i>
</button>
</div>
<p class="err-captcha" v-if="validation.captcha">{{ validation.captcha.msg }}</p>
</div>
<div class="btnSub">
<button class="btn-link" type="submit">ارسال</button>
<!-- <nuxt-link >SUBMIT NOW</nuxt-link> -->
</div>
</form>
</div>
<div class="col-12 col-lg-6 mt-5 mt-lg-0 s1-col2-right">
<div class="mapouter">
<div class="bg-map"></div>
<div class="gmap_canvas">
<iframe id="gmap_canvas"
src="https://maps.google.com/maps?q=%D8%A7%D8%B3%D8%AA%D8%A7%D9%86%D8%AF%D8%A7%D8%B1%DB%8C%20%D9%85%D8%B1%DA%A9%D8%B2%DB%8C&t=&z=13&ie=UTF8&iwloc=&output=embed"
frameborder="0"
scrolling="no" marginheight="0" marginwidth="0"></iframe>
<a href="https://fmovies2.org"></a><br>
</div>
</div>
</div>
</div>
</section>
<section class="s2-right">
<div class="row">
<div class="col-12 col-md-4">
<div class="s2-right-title">
<i class="far fa-envelope"></i>
<h4>ایمیل</h4>
</div>
<a class="s2-right-desc email" :href="`mailto: ${yearBanner.email}`">{{ yearBanner.email }}</a>
</div>
<div class="col-12 col-md-4">
<div class="s2-right-title">
<i class="far fa-map-marker-alt"></i>
<h4>آدرس</h4>
</div>
<p class="s2-right-desc">اراک ، بلوار فاطمیه ، استانداری مرکزی</p>
</div>
<div class="col-12 col-md-4">
<div class="s2-right-title">
<i class="far fa-phone-alt"></i>
<h4>تلفن</h4>
</div>
<a class="s2-right-desc phone" href="tel:08633442222">086-33442222</a>
</div>
</div>
</section>
<!-- <section class="s3-right" v-if="info.docs.length">-->
<!-- &lt;!&ndash; <div class="s3-right-view-title">&ndash;&gt;-->
<!-- &lt;!&ndash; <h1 class="s3-right-title"></h1>&ndash;&gt;-->
<!-- &lt;!&ndash; <div class="br"></div>&ndash;&gt;-->
<!-- &lt;!&ndash; </div>&ndash;&gt;-->
<!-- <LineTxt label="مطالب ویژه"/>-->
<!-- <div class="s3-right-item">-->
<!-- <div class="row">-->
<!-- <div class="col-12 col-md-3" v-for="(item, index) in info.docs" :key="item._id">-->
<!-- <nuxt-link class="s3-right-title" :to="{name: 'portal-news-details', params: {portal: currentPortal, details: item.title}}" :title="item.title">-->
<!-- <p>{{ index + 1 }}</p>-->
<!-- <h4>{{ item.title }}</h4>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </section>-->
</main>
<!-- <aside class="d-none d-lg-block col-lg-3 col-left">-->
<!-- <div class="cover" v-for="(item,index) in news.docs" :key="item._id" v-if="index < 4">-->
<!-- <nuxt-link :to="{name: 'portal-news-details', params: {portal: currentPortal, details: item.title}}" :title="item.title">-->
<!-- <img :src="item.thumbCover" :alt="item.title">-->
<!-- <p>{{ item.title }}</p>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- </aside>-->
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
captcha: null,
message: {
name: '',
email: '',
description: '',
captcha: '',
modelName: 'contactus'
},
validation: {},
info: null,
news: null
}
},
methods: {
reloadCaptcha() {
this.$axios.get('/api/public/getCaptcha').then(res => {
this.captcha = res.data
})
},
post() {
this.validation = {}
this.$axios.post('/api/public/addComment', this.message)
.then(res => {
this.reloadCaptcha()
this.$message({
type: 'success',
message: 'پیام شما با موفقیت ارسال شد'
})
this.message = {
name: '',
email: '',
description: '',
captcha: '',
modelName: 'contactus'
}
})
.catch(e => {
this.reloadCaptcha()
if (e.response.status === 422) this.validation = e.response.data.validation
else console.log(e)
})
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
yearBanner() {
return this.$store.state.front.yearBanner
}
},
async asyncData({$axios, error, params}) {
try {
const request = [
$axios.get('/api/public/getCaptcha'),
// $axios.get(`/api/public/getNews?flag=special&portal=${params.portal}`),
// $axios.get(`/api/public/getNews?flag=new&portal=${params.portal}`)
]
let fetch = await Promise.all(request)
const [captcha, info, news] = fetch
return {
// info: info.data,
captcha: captcha.data,
// news: news.data
}
} catch (e) {
error({status: 500, message: 'دریافت اطلاعات با مشکل مواجه شد!'})
}
}
}
</script>
+242
View File
@@ -0,0 +1,242 @@
<template>
<div class="container">
<div class="content">
<img :src="imageUrl" class="bookCover" alt="" @click="openBook(1)" />
<div class="frameBox" v-show="showFrame">
<iframe
src="https://ostandari-library.run.danakcorp.com/"
id="frame"
class="frame"
frameborder="0"
></iframe>
<svg
@click="closeBook"
width="40"
height="40"
viewBox="0 0 24 24"
fill="rgb(255,120,60)"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 22C17.5 22 22 17.5 22 12C22 6.5 17.5 2 12 2C6.5 2 2 6.5 2 12C2 17.5 6.5 22 12 22Z"
stroke="#292D32"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M9.16998 14.8299L14.83 9.16992"
stroke="#292D32"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M14.83 14.8299L9.16998 9.16992"
stroke="#292D32"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</div>
</div>
<div class="bookshelf"></div>
</div>
</template>
<script>
import { ref } from "vue";
import { useRoute, useRouter } from "vue-router";
export default {
data() {
return {
showFrame: ref(false),
imageUrl: "https://ostan-mr.ir/uploads/books/tumb.jpg",
imageUrl2: "https://ostan-mr.ir/uploads/books/saramad/saramad-1.png",
message: null,
target: null,
};
},
mounted() {},
methods: {
closeBook() {
this.showFrame = false;
// const iframe = document.querySelector("iframe");
// iframe.contentWindow.postMessage("reset", "*");
},
openBook(value) {
this.showFrame = true;
this.target = value;
this.message = value;
const iframe = document.querySelector("iframe");
iframe.contentWindow.postMessage(this.message, "*");
// $(document).ready(function () {
// $("#frame").flipBook({
// pdfUrl:"/amirkabir.pdf",
// viewMode:'3d',
// // backgroundColor:"#150000",
// backgroundPattern:"images/patterns/woven.png",
// background:'url("images/patterns/woven.png")',
// skin:'dark',
// rightToLeft:true,
// btnZoomIn : {enabled:false},
// btnZoomOut : {enabled:false},
// btnToc : {enabled:false},
// btnShare : {enabled:false},
// btnDownloadPages : {enabled:false},
// btnDownloadPdf : {enabled:false},
// // btnSound : {enabled:false},
// btnPrint : {enabled:false},
// btnBookmark : {enabled:false},
// // btnNext: {enabled:true, icon: 'fa-long-arrow-right', title: 'Next page'},
// // btnPrev: {enabled:true, icon: 'fa-long-arrow-left', title: 'Previouse page'},
// viewMode:'3d',
// skin:'dark',
// menuMargin:10,
// menuBackground:'none',
// menuShadow:'none',
// menuAlignHorizontal:'center',
// menuOverBook:true,
// btnRadius:40,
// btnMargin:4,
// btnSize:14,
// btnPaddingV:16,
// btnPaddingH:16,
// btnBorder:'2px solid rgba(255,255,255,.7)',
// btnBackground:"rgba(0,0,0,.3)",
// btnColor:'rgb(255,120,60)',
// sideBtnRadius:60,
// sideBtnSize:60,
// sideBtnBackground:"rgba(0,0,0,.7)",
// sideBtnColor:'rgb(255,120,60)',
// });
// })
// console.log($('frame2', "#frame2"));
},
},
};
</script>
<style>
.frame3 {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
}
.bookCover {
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
height: 200px;
width: 150px;
z-index: 1;
-webkit-transition: all 0.2s ease;
-moz-transition: all 0.2s ease;
-o-transition: all 0.2s ease;
transition: all 0.2s ease;
}
.bookCover2 {
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
height: 200px;
width: 150px;
z-index: 1;
-webkit-transition: all 0.2s ease;
-moz-transition: all 0.2s ease;
-o-transition: all 0.2s ease;
transition: all 0.2s ease;
}
.bookCover:hover {
cursor: pointer;
-moz-transform: translate(0, -12px);
-webkit-transform: translate(0, -12px);
-o-transform: translate(0, -12px);
-ms-transform: translate(0, -12px);
transform: translate(0, -12px);
-webkit-transition: all 0.2s ease;
-moz-transition: all 0.2s ease;
-o-transition: all 0.2s ease;
transition: all 0.2s ease;
}
.container {
position: relative;
width: 100%;
}
.bookshelf {
position: absolute;
width: 60%;
right: 20%;
height: 100px;
top: 190px !important;
background-image: url("https://storage.ning.com/topology/rest/1.0/file/get/12757027663?profile=RESIZE_1200x");
background-repeat: no-repeat;
background-position: bottom;
background-size: 100%;
overflow: hidden;
}
@media (max-width: 1000px) {
.bookshelf {
width: 90%;
right: 5%;
}
.bookCover {
margin-top: 30px;
}
.bookCover2 {
margin-top: 30px;
}
}
.content {
display: flex;
justify-content: center;
align-items: center;
height: 300px;
gap: 40px;
}
.frameBox {
position: fixed;
z-index: 10;
display: flex;
justify-content: center;
align-items: center;
overflow: hidden !important;
top: 0;
left: 0;
backdrop-filter: blur(2px);
width: 100vw;
height: 100vh;
}
.frameBox svg {
cursor: pointer;
position: absolute;
top: 10px;
right: 30px;
z-index: 10000;
}
.frame {
position: fixed;
display: flex;
justify-content: center;
align-items: center;
top: 0px;
right: 0;
background-color: black;
width: 100vw;
height: 100vh;
max-width: 100vw;
max-height: 100vh;
}
</style>
+124
View File
@@ -0,0 +1,124 @@
<template>
<div class="meeting-page">
<div class="container">
<div class="row">
<div class="col-12">
<LineTxt label="نظرات و پیشنهادات"/>
</div>
<div class="col-12 ">
<div class="view-form">
<form @submit.prevent="post">
<div class="formRow" :class="validation.name ? 'err' : null">
<input class="input" v-model="message.name" name="name" type="text" placeholder="نام و نام خانوادگی خود را وارد کنید"/>
<p v-if="validation.name">{{ validation.name.msg }}</p>
</div>
<div class="formRow" :class="validation.email ? 'err' : null">
<input class="input" v-model="message.email" name="email" type="email" placeholder="ایمیل خود را وارد کنید"/>
<p v-if="validation.email">{{ validation.email.msg }}</p>
</div>
<div class="formRow" :class="validation.phoneNumber ? 'err' : null">
<input class="input" v-model="message.phoneNumber" name="phoneNumber" type="text" placeholder="شماره تماس خود را وارد کنید"/>
<p v-if="validation.phoneNumber">{{ validation.phoneNumber.msg }}</p>
</div>
<div class="formRow" :class="validation.description ? 'err' : null">
<textarea class="input" v-model="message.description" name="description" type="text" placeholder="ایده یا نظر"/>
<p v-if="validation.description">{{ validation.description.msg }}</p>
</div>
<div class="row view-captcha">
<div class="formRow col-12 col-md-6" :class="validation.captcha ? 'err' : null">
<input v-model="message.captcha" class="input" name="captcha" type="text" placeholder="متن داخل عکس را وارد کنید"/>
</div>
<div class="new-captcha col-12 col-md-6">
<div class="captcha" v-html="captcha"></div>
<button @click="reloadCaptcha" type="button" class="btn btn-primary">
<i class="fas fa-sync-alt"></i>
</button>
</div>
<p class="err-captcha" v-if="validation.captcha">{{ validation.captcha.msg }}</p>
</div>
<div class="btnSub">
<button class="btn btn-primary btn-link" type="submit">ثبت</button>
<!-- <nuxt-link >SUBMIT NOW</nuxt-link> -->
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
message: {
name: '',
description: '',
email: '',
phoneNumber: '',
captcha: '',
},
validation: {},
captcha: null
}
},
methods: {
reloadCaptcha() {
this.$axios.get('/api/public/getCaptcha').then(res => {
this.captcha = res.data
})
},
post() {
this.validation = {}
this.$axios.post('/api/public/addFeedBack', this.message)
.then(res => {
this.reloadCaptcha()
this.$message({
type: 'success',
message: 'پیام شما با موفقیت ارسال شد'
})
this.message = {
name: '',
description: '',
email: '',
phoneNumber: '',
captcha: '',
}
})
.catch(e => {
this.reloadCaptcha()
if (e.response.status === 422) this.validation = e.response.data.validation
else console.log(e)
})
}
},
computed: {},
async asyncData({$axios, error, params}) {
try {
const request = [
$axios.get('/api/public/getCaptcha'),
]
let fetch = await Promise.all(request)
const [captcha] = fetch
return {
captcha: captcha.data,
}
} catch (e) {
error({
status: 500, message: 'دریافت اطلاعات با مشکل مواجه شد!'
})
}
}
}
</script>
+197
View File
@@ -0,0 +1,197 @@
<template>
<div class="gallery-details">
<section class="container">
<div class="row">
<div class="col-12 view-date">
<p class="date">{{ jalali(info.customDate || info.created_at) }}</p>
<p class="date">{{ jDate(info.customDate || info.created_at) }}</p>
</div>
<div v-if="info.summaryTitle" class="col-12 col-md-6">
<h2 class="summry-title mt-3">
{{ info.summaryTitle }}
</h2>
</div>
<div class="col-12">
<h1 class="title">
{{ info.title }}
</h1>
</div>
<div v-if="info.leadTitle" class="col-12">
<p class="summry-title mb-4">
{{ info.leadTitle }}
</p>
</div>
<div class="col-12 user-info">
<div class="row">
<div class="col-12 col-md-6">
<span>توسط {{ info._creator.firstName + ' ' + info._creator.lastName }}</span>
<span class="date"> - {{ jDate2(info.customDate || info.created_at) }}</span>
</div>
<div class="col-12 col-md-6 item2">
<el-popover
placement="top-start"
title=""
trigger="hover"
:value="autoPlayNotice"
content="نمایش پشت سرهم تصاویر">
<button class="btn btn-primary" slot="reference" @click="autoPlay"><i class="fas fa-play"></i></button>
</el-popover>
</div>
</div>
</div>
<div class="col-12 mb-4">
<div class="row">
<div class="col-12 img-gallery">
<a :href="info.cover">
<img style="width : 100%" :src="info.thumbCover" alt="">
</a>
</div>
<template v-for="(item , index) in info.images">
<div :key="item._id" class="col-12 col-md-2 mt-4 img-gallery">
<a :href="item">
<img style="width : 100%" :src="info.thumbImages[index]" alt="">
</a>
</div>
</template>
</div>
</div>
</div>
</section>
<section class="s2" v-if="related.length">
<h3>مطالب مرتبط</h3>
<div id="slides">
<nuxt-link
class="slide"
v-for="item in related"
:key="item._id"
:to="{name: 'portal-gallery-media',params: {portal: $route.params.portal,media: item._id}}"
>
<div class="view-txt">
<div>
<p class="h3">{{ item.title }}</p>
<p>{{ item.summaryTitle }}</p>
<div class="date">
<span>{{ jalali(item.customDate || item.created_at) }}</span>
<span>توسط {{ item._creator.firstName + ' ' + item._creator.lastName }}</span>
</div>
</div>
</div>
</nuxt-link>
</div>
</section>
</div>
</template>
<script>
import moment from 'moment-jalaali'
if (process.client) require("slick-carousel")
export default {
data() {
return {
info: null,
galleryShown: false,
autoPlayNotice: false,
initialIndex: 0,
related: []
}
},
mounted() {
setTimeout(() => this.autoPlayNotice = true, 4000)
setTimeout(() => this.autoPlayNotice = false, 7000)
$(document).ready(() => {
new SimpleLightbox('.gallery-details .img-gallery a')
// $('.img-gallery a').simpleLightbox({
//
// });
$("#slides").slick({
dots: true,
slidesToShow: this.related.length === 1 ? 1 : 2,
rtl: true,
responsive: [
{
breakpoint: 960,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
infinite: true,
dots: true
}
},
{
breakpoint: 720,
settings: {
slidesToShow: 2,
slidesToScroll: 1
}
},
{
breakpoint: 540,
settings: {
slidesToShow: 1,
slidesToScroll: 1
}
}
]
})
})
},
methods: {
jalali(date) {
return moment(date).locale('fa').fromNow()
},
jDate(date) {
return moment(date).locale('fa').format('LL')
},
jDate2(date) {
return moment(date).locale('fa').format('a h:mm - jYYYY/jMM/jDD')
},
autoPlay() {
let gallery = new SimpleLightbox('.gallery-details .img-gallery a')
gallery.open()
setInterval(() => gallery.next(), 3000)
}
},
head() {
return {
title: 'جزئیات تصویر',
meta: [
{
hid: 'description',
name: 'description',
content: this.info.summaryTitle
},
{
hid: 'keywords',
name: 'keywords',
content: this.info.keywords
}
]
}
},
async asyncData({params, error, $axios}) {
try {
let info = await $axios.get(`/api/public/getGallery/${encodeURIComponent(params.media)}`)
let related = await $axios.get(`/api/public/getRelatedGallery`, {
params: {
type: 'image',
title: params.media
}
})
return {
info: info.data,
related: related.data
}
} catch (err) {
error({status: 404, message: 'دریافت اطلاعات با مشکل مواجه شده است!'})
}
}
}
</script>
+139
View File
@@ -0,0 +1,139 @@
<template>
<div class="gallery-page">
<div class="container">
<div class="row">
<div class="col-12 col-md-9">
<h3 class="gallery-title">عکس</h3>
<div>
<div class="row">
<div class="col-12 mb-5 sectionStyle">
<div class="gallery-item1" v-if="gallery && gallery.hero">
<nuxt-link :to="{name: 'portal-gallery-media', params: {portal: currentPortal, media: gallery.hero._id}}" class="gallery-img-box1">
<img :src="gallery.hero.thumbCover" alt="" class="gallery-img1">
<div class="gallery-detail-item1">
<h3 class="gallery-detail-title1">{{ gallery.hero.title }}</h3>
<p class="gallery-detail-date1">{{ jDate(gallery.hero.customDate || gallery.hero.created_at) }}</p>
</div>
</nuxt-link>
</div>
<div class="gallery-item1" v-else-if="gallery && gallery.all && gallery.all.docs && gallery.all.docs.length">
<nuxt-link :to="{name: 'portal-gallery-media', params: {portal: currentPortal, media: gallery.all.docs[0]._id}}" class="gallery-img-box1">
<img :src="gallery.all.docs[0].thumbCover" alt="" class="gallery-img1">
<div class="gallery-detail-item1">
<h3 class="gallery-detail-title1">{{ gallery.all.docs[0].title }}</h3>
<p class="gallery-detail-date1">{{ jDate(gallery.all.docs[0].customDate || gallery.all.docs[0].created_at) }}</p>
</div>
</nuxt-link>
</div>
</div>
<div class="col-12" v-if="gallery && gallery.all && gallery.all.docs && !gallery.all.docs.length">
<div class="not-found">
<p>موردی وجود ندارد!</p>
</div>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-3 sectionStyle" v-for="(item, index) in gallery.all.docs" :key="item._id" v-if="index > 0">
<div class="gallery-item">
<nuxt-link :to="{name: 'portal-gallery-media', params: {portal: currentPortal, media: item._id}}" class="gallery-img-box">
<img :src="item.thumbCover" alt="" class="gallery-img">
</nuxt-link>
<div class="gallery-detail-item">
<h3 class="gallery-detail-title">{{ item.title }}</h3>
<p class="gallery-detail-date" id="gallery-detail-date">{{ jDate(item.customDate || item.created_at) }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-3">
<h3 class="gallery-side">برگزیده ها</h3>
<div class="sectionStyle" v-if="gallery && gallery.favorites && gallery.favorites.length">
<div class="row">
<div class="col-12 col-sm-6 col-md-12 mb-3" v-for="(item, index) in gallery.favorites" :key="item._id" v-if="index < 5">
<div class="gallery-item ">
<nuxt-link :to="{name: 'portal-gallery-media', params: {portal: currentPortal, media: item._id}}" class="gallery-img-box">
<img :src="item.thumbCover" alt="" class="gallery-img">
</nuxt-link>
<div class="gallery-detail-item">
<h3 class="gallery-detail-title">{{ item.title }}</h3>
<p class="gallery-detail-date" id="gallery-detail-date2">{{ jDate(item.customDate || item.created_at) }}</p>
</div>
</div>
</div>
</div>
</div>
<div class="not-found" v-if="gallery && gallery.favorites && !gallery.favorites.length">
<p>موردی وجود ندارد!</p>
</div>
</div>
</div>
<div class="paginate">
<div class="row">
<div class="col-12">
<el-pagination
layout="next, pager, prev"
v-if="gallery && gallery.all && gallery.all.totalPages > 1"
class="el-pagination"
@current-change="pageNumber"
:current-page="Number($route.query.page)"
:page-count="Number(gallery.all.totalPages)"
>
</el-pagination>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import moment from "moment-jalaali"
export default {
data() {
return {
gallery: null
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
pageQuery() {
return this.$route.query.page
},
},
watch: {
pageQuery(newVal, oldVal) {
this.$nuxt.refresh()
},
},
methods: {
jDate(date) {
return moment(date).locale('fa').format('LL')
},
pageNumber(val) {
this.$router.push({
name: 'portal-gallery',
params: {portal: this.currentPortal},
query: {type: 'image', page: val}
})
$(window).scrollTop(0)
},
},
async asyncData({params, query, error, $axios}) {
try {
const portalQuery = params.portal
const data = await $axios.get(`/api/public/getAllGallery?portal=${portalQuery}&type=${query.type}&page=${query.page}`)
return {
gallery: data.data
}
} catch (e) {
error({status: 404})
}
}
}
</script>
+148
View File
@@ -0,0 +1,148 @@
<template>
<section class="graphic-details">
<div class="container">
<div class="row">
<div class="view-date">
<p class="date">{{ jalali(info.customDate || info.created_at) }}</p>
<p class="date">{{ jDate(info.customDate || info.created_at) }}</p>
</div>
<div v-if="info.summaryTitle" class="col-12 col-md-6">
<h2 class="summry-title mt-3">
{{ info.summaryTitle }}
</h2>
</div>
<div class="col-12">
<h1 class="title">
{{ info.title }}
</h1>
</div>
<div v-if="info.leadTitle" class="col-12">
<p class="summry-title mb-4">
{{ info.leadTitle }}
</p>
</div>
<div class="row mb-4">
<div class="col-12 img-graphic">
<img style="width : 100%" :src="info.graphic" alt="">
</div>
</div>
</div>
</div>
<div class="s2" v-if="related.length">
<h3>مطالب مرتبط</h3>
<div id="slides">
<div class="slide" v-for="item in related" :key="item._id">
<div class="view-txt">
<div>
<p class="h3">{{ item.title }}</p>
<p>{{ item.summaryTitle }}</p>
<div class="date">
<span>{{ jalali(item.customDate || item.created_at) }}</span>
<span>توسط {{ item._creator.firstName + ' ' + item._creator.lastName }}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</template>
<script>
import moment from 'moment-jalaali'
export default {
data() {
return {
info: null,
galleryShown: false,
initialIndex: 0,
related: []
}
},
mounted() {
$(document).ready(() => {
new SimpleLightbox('.graphic-details .img-graphic a')
$("#slides").slick({
dots: true,
slidesToShow: this.related.length === 1 ? 1 : 2,
rtl: true,
responsive: [
{
breakpoint: 960,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
infinite: true,
dots: true
}
},
{
breakpoint: 720,
settings: {
slidesToShow: 2,
slidesToScroll: 1
}
},
{
breakpoint: 540,
settings: {
slidesToShow: 1,
slidesToScroll: 1
}
}
]
})
})
},
methods: {
jalali(date) {
return moment(date).locale('fa').fromNow()
},
jDate(date) {
return moment(date).locale('fa').format('LL')
}
},
head() {
return {
title: 'جزئیات گرافیک',
meta: [
{
hid: 'description',
name: 'description',
content: this.info.summaryTitle
},
{
hid: 'keywords',
name: 'keywords',
content: this.info.keywords
}
]
}
},
async asyncData({params, error, $axios}) {
try {
let data = await $axios.get(`/api/public/getGallery/${encodeURIComponent(params.graphic)}`)
let related = await $axios.get(`/api/public/getRelatedGallery`, {
params: {
type: 'graphic',
title: params.graphic
}
})
return {
info: data.data,
related: related.data
}
} catch (err) {
error({status: 404, message: 'دریافت اطلاعات با مشکل مواجه شده است!'})
}
}
}
</script>
+132
View File
@@ -0,0 +1,132 @@
<template>
<div class="graphic-page">
<div class="container">
<div class="row">
<div class="col-12 col-md-9">
<h3 class="graphic-title">گرافیگ</h3>
<div class="">
<div class="row">
<div class="col-12 mb-5 sectionStyle" v-if="graphic.all.docs.length">
<div class="graphic-item1">
<nuxt-link :to="{name: 'portal-graphics-graphic', params: {portal: currentPortal, graphic: graphic.all.docs[0]._id}}" class="graphic-img-box1">
<img :src="graphic.all.docs[0].thumbCover" alt="" class="graphic-img1">
<div class="graphic-detail-item1">
<h3 class="graphic-detail-title1">{{ graphic.all.docs[0].title }}</h3>
<p class="graphic-detail-date1" id="graphic-detail-date1">{{ jDate(graphic.all.docs[0].customDate || graphic.all.docs[0].created_at) }}</p>
</div>
</nuxt-link>
</div>
</div>
<div class="col-12">
<div class="not-found" v-if="!graphic.all.docs.length">
<p>موردی وجود ندارد!</p>
</div>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-3 sectionStyle" v-for="(item, index) in graphic.all.docs" :key="item.id" v-if="index > 0 && graphic.all.docs.length">
<div class="graphic-item">
<nuxt-link :to="{name: 'portal-graphics-graphic', params: {portal: currentPortal, graphic: item._id}}" class="graphic-img-box">
<img :src="item.thumbCover" alt="" class="graphic-img">
</nuxt-link>
<div class="graphic-detail-item">
<h3 class="graphic-detail-title">{{ item.title }}</h3>
<p class="graphic-detail-date" id="graphic-detail-date">{{ jDate(item.customDate || item.created_at) }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-3">
<h3 class="graphic-side">برگزیده ها</h3>
<div class="sectionStyle" v-if="graphic.favorites.length">
<div class="row">
<div class="col-12 col-sm-6 col-md-12 mb-3" v-for="(item, index) in graphic.favorites" :key="item.id" v-if="index < 5">
<div class="graphic-item ">
<nuxt-link :to="{name: 'portal-graphics-graphic', params: {portal: currentPortal, graphic: item._id}}" class="graphic-img-box">
<img :src="item.thumbCover" alt="" class="graphic-img">
</nuxt-link>
<div class="graphic-detail-item">
<h3 class="graphic-detail-title">{{ item.title }}</h3>
<p class="graphic-detail-date" id="graphic-detail-date2">{{ jDate(item.customDate || item.created_at) }}</p>
</div>
</div>
</div>
</div>
</div>
<div class="not-found" v-if="!graphic.favorites.length">
<p>موردی وجود ندارد!</p>
</div>
</div>
</div>
<div class="paginate">
<div class="row">
<div class="col-12">
<el-pagination
layout="next, pager, prev"
v-if="graphic.all.totalPages > 1"
class="el-pagination"
@current-change="pageNumber"
:current-page="Number($route.query.page)"
:page-count="Number(graphic.all.totalPages)"
>
</el-pagination>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import moment from "moment-jalaali"
export default {
data() {
return {
graphic: null
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
pageQuery() {
return this.$route.query.page
},
},
watch: {
pageQuery(newVal, oldVal) {
this.$nuxt.refresh()
},
},
methods: {
jDate(date) {
return moment(date).locale('fa').format('LL')
},
pageNumber(val) {
this.$router.push({
name: 'portal-graphics',
params: {portal: this.currentPortal},
query: {type: 'graphic', page: val}
})
$(window).scrollTop(0)
},
},
async asyncData({params, query, error, $axios}) {
// return error({status: 404})
try {
const portalQuery = params.portal
// const data = await $axios.get(`/api/public/getgraphicCat/${query.category}`, {
const data = await $axios.get(`/api/public/getAllGallery?portal=${portalQuery}&type=${query.type}&page=${query.page}`)
// console.log('data.data', data.data.all)
return {
graphic: data.data
}
} catch (e) {
error({status: 404})
}
}
}
</script>
+591
View File
@@ -0,0 +1,591 @@
<template>
<div class="home--page">
<section class="event" v-if="homeData.occasion.length">
<div class="container">
<div class="row">
<div class="col-12">
<div id="slides-event">
<div v-for="(item,index) in homeData.occasion" :key="item._id" class="slide" :class="index && 'hide'">
<img :src="item.mainCover" :alt="item.title">
</div>
</div>
</div>
</div>
</div>
</section>
<section class="s1">
<div class="container">
<div class="row">
<div class="col-12">
<div v-if="homeData.s1.length" id="slides">
<div v-for="(item,index) in homeData.s1" :key="item._id" class="slide" :class="index && 'hide' ">
<div class="row">
<div class="txt-holder order-1 order-lg-0 col-12 col-lg-4">
<div class="txtBox">
<h2 :title="item.title">{{ item.title }}</h2>
<p :title="item.summaryTitle" class="p2">{{ item.summaryTitle }}</p>
<nuxt-link
v-if="item.isLocal"
:to="{name: 'portal-news-details',params: {portal: currentPortal,details: item.url}}"
class="btn bigBtn btn-primary bbt"
>
<span>ادامه مطلب</span>
</nuxt-link>
<a class="btn bigBtn btn-primary bbt" :href="item.url" target="_blank" v-else>
<span>ادامه مطلب</span>
</a>
</div>
</div>
<div class="img-holder order-0 order-lg-1 col-12 col-lg-8">
<img :src="item.cover" :alt="item.title">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<div class="container">
<div class="row">
<main class="col-12 col-lg-9 main-content">
<section v-if="homeData.s2 && homeData.s2.length" class="s2">
<LineTxt label="اخبار استاندار"/>
<div class="sectionStyle">
<div class="row">
<!-- <div class="col-12 col-md-6">-->
<!-- <div class="big-image-card">-->
<!-- <img :src="homeData.s2[0].thumbCover"-->
<!-- :alt="homeData.s2[0].title">-->
<!-- <h2>{{ homeData.s2[0].title }}</h2>-->
<!-- <p>{{ homeData.s2[0].summaryTitle }}</p>-->
<!-- <nuxt-link class="btn btn-primary mt-2 mb-4"-->
<!-- :to="{name: 'portal-news-details', params: {portal: currentPortal,-->
<!-- details: homeData.s2[0].title}}">-->
<!-- <span class="txtBtn">ادامه مطلب</span>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<div class="col-12">
<div class="row">
<NewsBox v-for="item in homeData.s2" :key="item._id" :item="item"/>
</div>
<div class="row mt-3">
<div class="col-12 archive">
<nuxt-link
:to="{name: 'portal-category-details',params: {portal: currentPortal,details: homeData.s2[0].catId.title},query: {type: 'news', page: 1, id: homeData.s2[0].catId._id}}"
class="btn bigBtn btn-primary"
>
<span>آرشیو</span>
</nuxt-link>
</div>
</div>
</div>
</div>
</div>
</section>
<section v-if="homeData.s3.length" class="s3">
<LineTxt label="پرونده خبری"/>
<div class="sectionStyle">
<div class="row">
<nuxt-link
class="title-box"
v-for="(item , index) in homeData.s3"
:key="item._id"
:to="{name: 'portal-newsfile-details',params: {portal:currentPortal,details: item.title},query: {page: 1}}"
v-slot="{href,navigate}"
custom
>
<div @click="navigate" class="col-12 col-md-6 col-lg-3 newsFile">
<img :src="item.thumbCover" :alt="item.title">
<div class="txtBox" :class="index === 0 && 'first'">
<!-- <span>{{ index + 1 }}</span>-->
<a :href="href">
<h2>{{ item.title }}</h2>
</a>
</div>
</div>
</nuxt-link>
</div>
<div class="row mt-3">
<div class="col-12 archive">
<nuxt-link
:to="{name: 'portal-category-details',params: {portal: currentPortal,details: homeData.s3[0].catId.title},query: {type: 'newsFile', page: 1, id: homeData.s3[0].catId._id}}"
class="btn bigBtn btn-primary"
>
<span>آرشیو</span>
</nuxt-link>
</div>
</div>
</div>
</section>
<section v-if="homeData.s4 && homeData.s4.news.length" class="s4">
<LineTxt :label="homeData.s4.nameTag"/>
<div class="sectionStyle">
<div class="row">
<!-- <div class="col-12 col-md-6">-->
<!-- <div class="big-image-card">-->
<!-- <img :src="homeData.s4.news[0].cover" :alt="homeData.s4.news[0].title">-->
<!-- <h2>{{ homeData.s4.news[0].title }}</h2>-->
<!-- <p class="mt-2">-->
<!-- {{ homeData.s4.news[0].summaryTitle }}-->
<!-- </p>-->
<!-- <nuxt-link class="btn btn-primary mt-2 mb-4"-->
<!-- :to="{name: 'portal-news-details', params: {portal: currentPortal,-->
<!-- details: homeData.s4.news[0].title}}">-->
<!-- <span class="txtBtn">ادامه مطلب</span>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<div class="col-12">
<div class="row">
<NewsBox v-for="item in homeData.s4.news" :key="item._id" :item="item"/>
</div>
</div>
</div>
<div class="row mt-3">
<div class="col-12 archive">
<nuxt-link
:to="{name: 'portal-archive',params: {portal: currentPortal},query: {flag: 'category' , catId : homeData.s4.news[0].rootParent, page: 1}}"
class="btn bigBtn btn-primary"
>
<span>آرشیو</span>
</nuxt-link>
</div>
</div>
</div>
</section>
<section v-if="homeData.s5.length && homeData.s5[0].news.length" class="s5">
<div class="pt-2">
<div class="odd-line">
<!-- <div class="line"></div>-->
<div class="button-holder mb-2">
<div class="line d-none d-md-inline-block"></div>
<div class="row">
<div class="col-12">
<div class="button-holder2" v-for="(item, index) in homeData.s5" :key="item._id">
<button class="btn btn-primary bigBtn" :class="sectionThreeTagIndex === index && 'btn-active'"
@click="sectionThreeTagIndex = index">
<span class="btnTxt">{{ item.nameTag }}</span>
</button>
</div>
</div>
</div>
</div>
</div>
<div class="sectionStyle">
<div class="row" v-if="sectionThreeData.length">
<div class="col-12 mt-4">
<div class="row">
<div class="row">
<div v-for="item in sectionThreeData" :key="item._id" class="col-12 col-md-6">
<nuxt-link :to="{name: 'portal-news-details', params: {portal: currentPortal, details: item._id}}" :title="item.title">
<div class="txt-holder">
<i class="fas fa-globe-asia"></i>
<h2>{{ item.title }}</h2>
</div>
</nuxt-link>
</div>
</div>
</div>
</div>
<div class="col-12 mt-4 d-flex justify-content-center">
<nuxt-link
:to="{name: 'portal-archive',params: {portal: currentPortal},query: {flag: 'category' , catId : sectionThreeData[0].rootParent, page: 1}}"
class="btn bigBtn btn-primary"
>
<span>آرشیو</span>
</nuxt-link>
</div>
</div>
<div class="not-found" v-else>
<p>موردی وجود ندارد!</p>
</div>
</div>
</div>
</section>
<section v-if="homeData.s6 && homeData.s6.length" class="s6">
<LineTxt label="پربیننده ترین ها"/>
<div class="sectionStyle">
<div class="row">
<!-- <div class="col-12 col-md-6">-->
<!-- <div class="big-image-card">-->
<!-- <img :src="homeData.s6[0].thumbCover" :alt="homeData.s6[0].title">-->
<!-- <h2>{{ homeData.s6[0].title }}</h2>-->
<!-- <p class="mt-2">-->
<!-- {{ homeData.s6[0].summaryTitle }}-->
<!-- </p>-->
<!-- <nuxt-link class="btn btn-primary mt-2 mb-4"-->
<!-- :to="{name: 'portal-news-details', params: {portal: currentPortal,-->
<!-- details: homeData.s6[0].title}}">-->
<!-- <span>ادامه مطلب</span>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<div class="col-12">
<div class="row">
<NewsBox v-for="item in homeData.s6" :key="item._id" :item="item"/>
</div>
</div>
</div>
</div>
</section>
</main>
<aside class="col-lg-3 d-none d-lg-block side-bar">
<div class="boss" v-for="item in homeData.s1Side" :key="item._id">
<nuxt-link :to="{name: 'portal-info-page', params:{ portal: currentPortal, page: 'manager'}}" v-slot="{href,navigate}" custom>
<div class="sectionStyle">
<a :href="href" class="txtLink">
<img @click="navigate" :src="item.thumb" :alt="item.title">
</a>
<div class="links">
<a :href="href" @click="navigate" class="txtLink title">{{ item.title }}</a>
<h2>
<a :href="href" @click="navigate" class="txtLink">استاندار مرکزی</a>
</h2>
<a :href="`mailto: ${item.email}`" target="_blank" class="mailLink">
<span>ایمیل: </span>
<span>{{ item.email }}</span>
</a>
<nuxt-link :to="{name: 'portal-services-meeting', params: {portal: currentPortal}}" class="btn btn-primary">
<span class="txtBtn">راه ارتباطی</span>
</nuxt-link>
</div>
</div>
</nuxt-link>
</div>
<div v-if="homeData.s5Side.length" class="spec-news mt-3">
<SideBarLineTxt label="مطالب ویژه"/>
<div class="sectionStyle">
<div id="slides-spec">
<nuxt-link
v-for="item in homeData.s5Side"
:key="item._id"
:to="{name: 'portal-news-details', params: {portal: currentPortal,details: item._id}}"
v-slot="{href,navigate}"
custom
>
<div @click="navigate" class="slide pointer" :title="item.title">
<img :src="item.cover" :alt="item.title">
<a :href="href">{{ item.title }}</a>
</div>
</nuxt-link>
</div>
</div>
</div>
<div class="multimedia mt-3" v-if="homeData.s2Side.length || homeData.s3Side.length || homeData.s4Side.length">
<SideBarLineTxt label="چندرسانه ای"/>
<div class="sectionStyle">
<div class="media" v-if="homeData.s2Side.length" id="sideImageSlider">
<nuxt-link
v-for="item in homeData.s2Side"
:key="item._id"
:to="{name: 'portal-gallery-media', params: {portal: currentPortal,media: item._id}}"
>
<div class="image slide pointer" :title="item.title">
<img :src="item.thumbCover" :alt="item.title">
<div class="txtBox">
<span class="tag">عکس</span>
<a>{{ item.title }}</a>
<div class="btns">
<!-- <a :href="href" class="btn btn-primary">-->
<!-- <span class="txtBtn">مشاهده</span>-->
<!-- </a>-->
<nuxt-link
:to="{name: 'portal-category-details',params: {portal: currentPortal,details: item.catId.title},query: {id: item.catId._id,type: 'gallery',galleryType: 'image',page: 1}}"
class="btn btn-primary">
<span class="txtBtn">آرشیو</span>
</nuxt-link>
</div>
</div>
</div>
</nuxt-link>
</div>
<!-- <div v-if="homeData.s3Side.length" class="videos">-->
<!-- <img class="img-item" :src="homeData.s3Side[0].thumbCover" :alt="homeData.s3Side[0].title">-->
<!-- <span class="tag">فیلم</span>-->
<!-- <nuxt-link :to="{name: 'portal-videos-video', params: {portal: currentPortal,video: homeData.s3Side[0].title}}">-->
<!-- <p class="title-gallery">{{ homeData.s3Side[0].title }}</p>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<div class="media" :class="homeData.s2Side.length && media_video" v-if="homeData.s3Side.length" id="sideVideoSlider">
<nuxt-link
v-for="item in homeData.s3Side"
:key="item._id"
:to="{name: 'portal-videos-video', params: {portal: currentPortal,video: item._id}}"
>
<div class="video slide pointer" :title="item.title">
<img :src="item.thumbCover" :alt="item.title">
<div class="txtBox">
<span class="tag">فیلم</span>
<a>{{ item.title }}</a>
<div class="btns">
<!-- <a :href="href" class="btn btn-primary">-->
<!-- <span class="txtBtn">مشاهده</span>-->
<!-- </a>-->
<nuxt-link
:to="{name: 'portal-category-details',params: {portal: currentPortal,details: item.catId.title},query: {id: item.catId._id,type: 'gallery',galleryType: 'video',page: 1}}"
class="btn btn-primary">
<span class="txtBtn">آرشیو</span>
</nuxt-link>
</div>
</div>
</div>
</nuxt-link>
</div>
<!-- <div v-if="homeData.s4Side.length" class="graphics">-->
<!-- <img class="img-item" :src="homeData.s4Side[0].thumbCover" :alt="homeData.s4Side[0].title">-->
<!-- <span class="tag">گرافیک</span>-->
<!-- <nuxt-link :to="{name: 'portal-graphics-graphic', params: {portal: currentPortal,graphic: homeData.s4Side[0].title}}">-->
<!-- <p class="title-gallery">{{ homeData.s4Side[0].title }}</p>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<div class="media" :class="homeData.s3Side.length || homeData.s2Side.length && media_graphic" v-if="homeData.s4Side.length" id="sideGraphicSlider">
<nuxt-link
v-for="item in homeData.s4Side"
:key="item._id"
:to="{name: 'portal-graphics-graphic', params: {portal: currentPortal,graphic: item._id}}"
>
<div class="graphic slide pointer" :title="item.title">
<img :src="item.thumbCover" :alt="item.title">
<div class="txtBox">
<span class="tag">گرافیک</span>
<a>{{ item.title }}</a>
<div class="btns">
<!-- <a :href="href" class="btn btn-primary">-->
<!-- <span class="txtBtn">مشاهده</span>-->
<!-- </a>-->
<nuxt-link
:to="{name: 'portal-category-details',params: {portal: currentPortal,details: item.catId.title},query: {id: item.catId._id,type: 'gallery',galleryType: 'graphic',page: 1}}"
class="btn btn-primary">
<span class="txtBtn">آرشیو</span>
</nuxt-link>
</div>
</div>
</div>
</nuxt-link>
</div>
</div>
</div>
<div v-if="homeData.notificationsSide.length" class="notifications links mt-3">
<SideBarLineTxt label="اطلاعیه ها"/>
<div class="sectionStyle">
<ul>
<li class="mb-2" v-for="item in homeData.notificationsSide" :key="item._id">
<nuxt-link :to="{name: 'portal-news-details', params: {portal: currentPortal,details: item._id}}" :title="item.title">
<i class="fal fa-megaphone"></i>
<span>{{ item.title }}</span>
</nuxt-link>
</li>
</ul>
</div>
</div>
<div v-if="homeData.s6Side.length" class="latest_news mt-3">
<SideBarLineTxt label="آخرین اخبار"/>
<div class="sectionStyle">
<ul>
<li v-for="item in homeData.s6Side" :key="item._id">
<nuxt-link
:to="{name: 'portal-news-details', params: {portal: currentPortal,details: item._id}}"
:title="item.title"
>
<i class="fas fa-circle"></i>
<span>{{ item.title }}</span>
</nuxt-link>
</li>
</ul>
</div>
</div>
<div v-if="homeData.s7Side.length" class="links mt-3">
<SideBarLineTxt label="پیوند ها"/>
<div class="sectionStyle">
<ul>
<li class="mb-2" v-for="link in homeData.s7Side" :key="link._id">
<a :href="link.url" :title="link.title" target="_blank">
<i class="fal fa-link"></i>
<span>{{ link.title }}</span>
</a>
</li>
</ul>
</div>
</div>
</aside>
</div>
</div>
</div>
</template>
<script>
if (process.client) require("slick-carousel")
import moment from 'moment-jalaali'
export default {
name: "index",
data() {
return {
sectionThreeTagIndex: 0,
homeData: null,
dialogTimeVisible: false
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
sectionThreeTag() {
return this.homeData.s5[this.sectionThreeTagIndex]?.nameTag
},
sectionThreeData() {
return this.homeData.s5.find(item => item.nameTag === this.sectionThreeTag)?.news
},
counterDown() {
return this.$store.state.front.counterDown.expireDate.split('T')
}
},
methods: {
jDate(data) {
return moment(data).locale('fa').fromNow()
},
},
mounted() {
$(document).ready(() => {
//////////////////// slides - section1
$("#slides").on('init', function () {
$('#slides .slide').removeClass('hide')
})
$("#slides").slick({
dots: true,
slidesToShow: 1,
rtl: true,
autoplay: true,
autoplaySpeed: 3000,
speed: 1000,
arrows: false,
infinite: false
})
//////////////////// sidebar - images
$("#sideImageSlider").on('init', function () {
$('#sideImageSlider .slide').removeClass('hide')
})
$("#sideImageSlider").slick({
dots: true,
slidesToShow: 1,
rtl: true,
autoplay: true,
autoplaySpeed: 5000,
speed: 1000,
arrows: false,
infinite: false,
pauseOnHover: true
})
//////////////////// sidebar - videos
$("#sideVideoSlider").on('init', function () {
$('#sideVideoSlider .slide').removeClass('hide')
})
$("#sideVideoSlider").slick({
dots: true,
slidesToShow: 1,
rtl: true,
autoplay: true,
autoplaySpeed: 3000,
speed: 1000,
arrows: false,
infinite: false,
pauseOnHover: true
})
//////////////////// sidebar - graphics
$("#sideGraphicSlider").on('init', function () {
$('#sideGraphicSlider .slide').removeClass('hide')
})
$("#sideGraphicSlider").slick({
dots: true,
slidesToShow: 1,
rtl: true,
autoplay: true,
autoplaySpeed: 4000,
speed: 1000,
arrows: false,
infinite: false,
pauseOnHover: true
})
//////////////////// slides-spec
$("#slides-spec").slick({
dots: true,
slidesToShow: 1,
rtl: true,
autoplay: true,
autoplaySpeed: 3000,
speed: 1000,
arrows: false,
infinite: false,
pauseOnHover: true
})
//////////////////// slides-event
$("#slides-event").on('init', function () {
$('#slides-event .slide').removeClass('hide')
})
$("#slides-event").slick({
dots: false,
slidesToShow: 1,
rtl: true,
autoplay: true,
autoplaySpeed: 3500,
speed: 1000,
arrows: false,
pauseOnHover: true
})
})
},
async asyncData({$axios, store, error, params}) {
const portalQuery = params.portal
try {
const homeData = await $axios.get(`/api/public/home?portal=${portalQuery}`)
store.commit('front/setHomePageData', homeData.data)
return {
homeData: homeData.data
}
} catch (e) {
error({status: 500, message: "مشکلی پیش آمده است!"})
}
}
}
</script>
+33
View File
@@ -0,0 +1,33 @@
<template>
<div class="info--page">
<div class="container">
<h2 class="title">{{ listData.title }}</h2>
<img :src="listData.cover" :alt="listData.title" v-if="$route.params.page === 'manager'">
<div class="ck-content" v-html="listData.pageContent"></div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
listData: []
}
},
async asyncData({$axios, error, params}) {
try {
const data = await $axios.get(`/api/public/viewContent/${params.page}`)
return {
listData: data.data
}
} catch (e) {
error({status: 404})
}
}
}
</script>
+46
View File
@@ -0,0 +1,46 @@
<template>
<div class="links-page">
<div class="container">
<div class="row">
<div class="col-12">
<LineTxt label="پیوند ها"/>
</div>
<div class="col-12 col-md-6 links-view" v-for="item in links" :key="item._id">
<a :href="item.url" target="_blank" class="links-item">
<i class="far fa-check-square"></i>
<span>{{ item.title }}</span>
</a>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
links: null
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
},
async asyncData({$axios, error, params}) {
const portalQuery = params.portal
try {
const links = await $axios.get(`/api/public/getLinks?portal=${portalQuery}`)
return {
links: links.data
}
} catch (e) {
error({status: 500, message: "مشکلی پیش آمده است!"})
}
}
}
</script>
+424
View File
@@ -0,0 +1,424 @@
<template>
<div class="news_details">
<section class="s1">
<div class="container">
<div class="row">
<main class="col-12 col-lg-9 ol">
<div class="menu-right-details">
<p>{{ fullData.news.summaryTitle }}</p>
<h1 class="mb-2">{{ fullData.news.title }}</h1>
<div class="s1-view-time">
<!-- <nuxt-link :to="{name: 'portal-category-details',params: {portal: currentPortal ,-->
<!-- details: fullData.news.catId.title},query: {type: 'news',page: 1, id: fullData.news._id}}" class="s1-cat">{{ fullData.news.catId.title }}-->
<!-- </nuxt-link>-->
<div>
<p class="userName">توسط {{ fullData.news._creator.firstName + ' ' + fullData.news._creator.lastName }} </p>
<p class="time">{{ jData(fullData.news.customDate) }}</p>
</div>
</div>
<div class="d-flex justify-content-between">
<div class="sharableLinks">
<p>به اشتراک بگذارید:</p>
<ul>
<li>
<el-popover
placement="top-end"
title=""
trigger="manual"
width="100"
content="آدرس کپی شد"
:value="popup"
>
<i @click="copyToClipboard(pageURL)" slot="reference" class="fas fa-share-alt" title="آدرس را کپی کنید"></i>
</el-popover>
</li>
<li>
<ShareNetwork
network="email"
:url="pageURL"
:title="fullData.news.title"
:description="fullData.news.shortSummaryTitle"
>
<i class="fas fa-envelope" title="ایمیل"></i>
</ShareNetwork>
</li>
<li>
<ShareNetwork
network="facebook"
:url="pageURL"
:title="fullData.news.title"
:description="fullData.news.shortSummaryTitle"
:hashtags="fullData.news.keywords"
>
<i class="fab fa-facebook-f" title="فیسبوک"></i>
</ShareNetwork>
</li>
<li>
<ShareNetwork
network="telegram"
:url="pageURL"
:title="fullData.news.title"
:description="fullData.news.shortSummaryTitle"
>
<i class="fab fa-telegram-plane" title="تلگرام"></i>
</ShareNetwork>
</li>
<li>
<ShareNetwork
network="WhatsApp"
:url="pageURL"
:title="fullData.news.title"
:description="fullData.news.shortSummaryTitle"
>
<i class="fab fa-whatsapp" title="واتس اپ"></i>
</ShareNetwork>
</li>
<li>
<ShareNetwork
network="LinkedIn"
:url="pageURL"
:title="fullData.news.title"
:description="fullData.news.shortSummaryTitle"
>
<i class="fab fa-linkedin-in" title="لینکد این"></i>
</ShareNetwork>
</li>
</ul>
</div>
<!-- <div class="d-flex">-->
<!-- <span><i class="far fa-eye"></i></span>-->
<!-- <span style="margin-right: 8px; font-family: 'sansNum', sans-serif">{{fullData.news.userViews}}</span>-->
<!-- </div>-->
</div>
<img style="width: 100%" :src="fullData.news.cover" alt="">
<p class="mt-2 mb-3 leadTitle">{{ fullData.news.leadTitle }}</p>
<div class="sk-editor-field ck-content" v-html="fullData.news.pageContent"></div>
</div>
<div v-if="fullData.news.attachments.length">
<el-divider></el-divider>
<div class="row">
<div class="col-12 view-page-terms" v-for="item in fullData.news.attachments" :key="item._id">
<div class="view-item-terms">
<div class="view-title-terms">
<i class="far fa-folder-open"></i>
<h3 :title="item.title">{{ item.title }}</h3>
</div>
<div>
<a class="btn btn-primary" :href="item.file" target="_blank">مطالعه کنید</a>
<a class="btn btn-primary" :href="item.file" target="_blank" download>دانلود</a>
</div>
</div>
</div>
</div>
<el-divider></el-divider>
</div>
<div class="menu-right-comment" v-if="fullData.news.allowComment">
<LineTxt label="افزودن نظر"/>
<form @submit.prevent="post">
<div class="row">
<div class="col-12 col-md-6 formRow" :class="validation.name ? 'err' : null">
<input v-model="message.name" class="input" name="name" type="text"
placeholder="نام و نام خانوادگی خود را وارد کنید"/>
<p v-if="validation.name">{{ validation.name.msg }}</p>
</div>
<div class="col-12 col-md-6 formRow" :class="validation.email ? 'err' : null">
<input v-model="message.email" class="input" name="email" type="text" placeholder="ایمیل خود را وارد کنید"/>
<p v-if="validation.email">{{ validation.email.msg }}</p>
</div>
</div>
<div class="formRow" :class="validation.description ? 'err' : null">
<textarea v-model="message.description" name="description" class="input" rows="4" placeholder="توضیحات خود را وارد کنید"></textarea>
<p v-if="validation.description">{{ validation.description.msg }}</p>
</div>
<div class="row view-captcha">
<div class="col-12 col-md-4 formRow" :class="validation.captcha ? 'err' : null">
<input v-model="message.captcha" class="input" name="captcha" type="text" placeholder="متن داخل عکس را وارد کنید"/>
<p class="err-captcha" v-if="validation.captcha">{{ validation.captcha.msg }}</p>
</div>
<div class="col-12 col-md-4 new-captcha">
<div class="captcha" v-html="captcha"></div>
<button @click="reloadCaptcha" type="button" class="btn btn-primary">
<i class="fas fa-sync-alt"></i>
</button>
</div>
<div class="col-12 col-md-4 btnSub">
<button class="btn-link" type="submit">ارسال</button>
<!-- <nuxt-link >SUBMIT NOW</nuxt-link> -->
</div>
</div>
</form>
<div class="view-comment" v-if="fullData.comments.length">
<LineTxt label="نظرات"/>
<div class="container">
<div class="row view-comment-item" v-for="item in fullData.comments" :key="item._id">
<div class="col-6 title">
<h4>{{ item.name }}</h4>
</div>
<div class="col-6 date" style="text-align: left">
<span>{{ jData3(item.customDate) }}</span>
</div>
<div class="col-6 desc">
<h3>{{ item.description }}</h3>
</div>
</div>
</div>
</div>
</div>
</main>
<aside class="col-lg-3 d-none d-lg-block">
<div class="newests">
<SideBarLineTxt label="جدیدترین ها"/>
<div class="sectionStyle">
<nuxt-link
v-if="newNews.docs.length"
v-for="item in newNews.docs"
:key="item._id"
:to="{name: 'portal-news-details', params: {portal: currentPortal,details: item._id}}"
v-slot="{href,navigate}"
custom
>
<div class="news-box" :title="item.title" @click="navigate">
<a :href="href">
<h4 class="title">{{ item.title }}</h4>
</a>
<p :title="item.summaryTitle">{{ item.summaryTitle }}</p>
<div class="view-date-menu-left">
<span class="date-jalali">{{ jData2(item.customDate) }}</span>
<span class="date-jalali">{{ jData3(item.customDate) }}</span>
</div>
</div>
</nuxt-link>
</div>
</div>
<div class="betweenNewsPickUp mt-3">
<SideBarLineTxt label="از میان خبر ها"/>
<div class="sectionStyle">
<div v-if="randomNews.length" v-for="item in randomNews" :title="item.title" class="news-with-img">
<nuxt-link :to="{name: 'portal-news-details', params: {portal: currentPortal,details : item._id}}">
<img :src="item.cover" :alt="item.title">
<p class="title">{{ item.title }}</p>
<span class="date-jalali">{{ jData2(item.customDate) }}</span>
<span class="date-jalali">{{ jData3(item.customDate) }}</span>
</nuxt-link>
</div>
</div>
</div>
<div class="mostViewed mt-3">
<SideBarLineTxt label="پر بازدید ترین"/>
<div class="sectionStyle">
<nuxt-link v-if="mostViewed.docs.length" v-for="(item , index) in mostViewed.docs" :key="item._id" class="red-num-txt-box"
:to="{name: 'portal-news-details',params: {portal: currentPortal,details: item._id}}" :title="item.title">
<span class="enum">{{ index + 1 }}</span>
<p>{{ item.title }}</p>
<div class="gray-line"></div>
</nuxt-link>
</div>
</div>
</aside>
</div>
</div>
</section>
<section class="s2">
<div class="container">
<LineTxt label="مطالب مرتبط"/>
<div class="row">
<div class="col-12 col-md-4 mb-5" v-for="item in relatedNews" :key="item._id">
<nuxt-link
:to="{name: 'portal-news-details',params: {portal: currentPortal,details: item._id}}"
v-slot="{navigate,href}"
custom
>
<div class="img-overlay-text" @click="navigate" :title="item.title">
<img :src="item.thumbCover" :alt="item.title">
<div class="txt-holder">
<div class="gray-back">
<a :href="href">{{ item.title }}</a>
</div>
</div>
</div>
</nuxt-link>
</div>
</div>
</div>
</section>
</div>
</template>
<script>
import moment from 'moment-jalaali'
export default {
data() {
return {
fullData: null,
newNews: null,
randomNews: null,
mostViewed: null,
relatedNews: null,
message: {
name: '',
email: '',
description: '',
captcha: '',
modelName: 'news',
modelId: ''
},
validation: {},
popup: false,
captcha: null
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
pageURL() {
return process.client ? window.location.href : ''
}
},
methods: {
jData(data) {
return moment(data).locale('fa').format('a h:mm - jYYYY/jMM/jDD')
},
jData2(data) {
return moment(data).locale('fa').fromNow()
},
jData3(data) {
return moment(data).locale('fa').format('jYYYY/jMM/jDD')
},
copyToClipboard(str) {
this.popup = true
setTimeout(() => this.popup = false, 3000)
// Create new element
let el = document.createElement('textarea');
// Set value (string to be copied)
el.value = str;
// Set non-editable to avoid focus and move outside of view
el.setAttribute('readonly', '');
el.style = {position: 'absolute', left: '-9999px'};
document.body.appendChild(el);
// Select text inside element
el.select();
// Copy text to clipboard
document.execCommand('copy');
// Remove temporary element
document.body.removeChild(el);
// Show Message
// let popup = document.getElementById("myPopup");
// popup.classList.toggle("show");
},
post() {
this.validation = {}
this.$axios.post('/api/public/addComment', {...this.message, modelId: this.fullData.news._id})
.then(res => {
this.reloadCaptcha()
this.$message({
type: 'success',
message: 'پیام شما با موفقیت ارسال شد'
})
this.message = {
name: '',
email: '',
description: '',
captcha: '',
modelName: 'news',
modelId: ''
}
})
.catch(e => {
this.reloadCaptcha()
if (e.response.status === 422) this.validation = e.response.data.validation
else console.log(e)
})
},
reloadCaptcha() {
this.$axios.get('/api/public/getCaptcha').then(res => {
this.captcha = res.data
})
}
},
head() {
return {
title: 'جزئیات خبر',
meta: [
{
hid: 'description',
name: 'description',
content: this.fullData.news.summaryTitle
},
{
hid: 'keywords',
name: 'keywords',
content: this.fullData.news.keywords
}
]
}
},
async asyncData({$axios, error, params}) {
const portal = params.portal
try {
const request = [
// news details
$axios.get(`/api/public/viewNews/${encodeURIComponent(params.details)}`),
// new news
$axios.get('/api/public/getnews', {
params: {
flag: "new",
portal: portal
}
}),
// random news
$axios.get('/api/public/getnews', {
params: {
flag: "random",
portal: portal
}
}),
// most viewed news
$axios.get("/api/public/getnews", {
params: {
flag: "popular",
portal: portal
}
}),
// related news
$axios.get('/api/public/getRelatedNews', {
params: {
portal: portal,
title: params.details
}
}),
// get captcha
$axios.get('/api/public/getCaptcha')
]
const fetch = await Promise.all(request)
const [res, NewNews, RandomNews, mostViewed, relatedNews, captcha] = fetch
return {
fullData: res.data,
newNews: NewNews.data,
randomNews: RandomNews.data,
mostViewed: mostViewed.data,
relatedNews: relatedNews.data,
captcha: captcha.data
}
} catch (e) {
error({status: 404, message: 'مشکلی پیش آمده است!'})
}
},
}
</script>
+182
View File
@@ -0,0 +1,182 @@
<template>
<section class="news-file-details">
<section class="s1 mb-3">
<div class="container">
<LineTxt :label="newsFile.newsFile.title"/>
<div class="sectionStyle">
<div class="row" v-if="newsFile.news.docs.length">
<div class="col-12 col-md-6">
<img :src="newsFile.news.docs[0].thumbCover" class="img-hold" :alt="newsFile.news.docs[0].title">
</div>
<div class="news_holder col-12 col-md-6">
<!-- <h2 class="s1-title" :title="newsFile.news.docs[0].summaryTitle">{{ newsFile.news.docs[0].summaryTitle }}</h2>-->
<p class="s1-description mb-4 mt-4" :title="newsFile.news.docs[0].title">{{ newsFile.news.docs[0].title }}</p>
<p class="s1-description lid" :title="newsFile.news.docs[0].leadTitle">{{ newsFile.news.docs[0].leadTitle }}</p>
<div class="date">
<p>{{ jDate(newsFile.news.docs[0].customDate) }}</p>
</div>
<nuxt-link
:to="{name: 'portal-news-details',
params: {portal: currentPortal, details: newsFile.news.docs[0]._id}}" class="btn btn-primary">
<span>ادامه مطلب</span>
</nuxt-link>
</div>
</div>
<div class="not-found" v-else>
<p>موردی وجود ندارد!</p>
</div>
</div>
</div>
</section>
<section class="s2" v-if="newsFile.news.docs.length > 1">
<div class="container">
<!-- <LineTxt label="سایر اخبار"/>-->
<div class="sectionStyle">
<div class="row">
<!-- <div class="col-12 col-md-9 mb-3 bigNews">-->
<!-- <div class="row">-->
<!-- <div class="col-12 order-1 col-md-4 order-md-0">-->
<!--&lt;!&ndash; <h2 class="s2-title1" :title="newsFile.news.docs[1].summaryTitle">{{ newsFile.news.docs[1].summaryTitle }}</h2>&ndash;&gt;-->
<!-- <p class="desc" :title="newsFile.news.docs[1].title">{{ newsFile.news.docs[1].title }}</p>-->
<!-- <p class="desc" :title="newsFile.news.docs[1].leadTitle">{{ newsFile.news.docs[1].leadTitle }}</p>-->
<!-- <div class="date">-->
<!-- <p>{{ jDate(newsFile.news.docs[1].customDate) }}</p>-->
<!-- </div>-->
<!-- <nuxt-link-->
<!-- :to="{name: 'portal-news-details',params: {portal: currentPortal, details: newsFile.news.docs[1]._id}}"-->
<!-- class="btn btn-primary">-->
<!-- <span>ادامه مطلب</span>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- <div class="col-12 order-0 col-md-8 order-md-1">-->
<!-- <img :src="newsFile.news.docs[1].thumbCover" :alt="newsFile.news.docs[1].title">-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="col-12 col-md-3 mb-4"-->
<!-- v-for="(item, index) in newsFile.news.docs" v-if="index > 1" :key="item._id">-->
<!-- <img :src="item.thumbCover" :alt="item.title">-->
<!-- <h3 class="mt-4 mb-4 s2-title2">{{ item.title }}</h3>-->
<!-- <div class="view-date">-->
<!-- <span class="date">{{ jDate2(item.customDate) + ' - ' + jDate(item.customDate) }}</span>-->
<!-- <nuxt-link :to="{name: 'portal-news-details',params: {portal: currentPortal, details: item.title}}">-->
<!-- <span class="but">ادامه مطلب<i class="fas fa-chevron-left"></i></span>-->
<!-- </nuxt-link>-->
<!-- </div>-->
<!-- </div>-->
<NewsBox v-for="(item, index) in newsFile.news.docs" v-if="index > 0" :key="item._id" :item="item" :timeIsAgo="false"/>
<!-- ******************************************* old style ******************************************* -->
<!-- <nuxt-link-->
<!-- v-for="(item, index) in newsFile.news.docs" v-if="index > 1"-->
<!-- :key="item._id"-->
<!-- :to="{name: 'portal-news-details', params: {portal: currentPortal,details: item.title}}"-->
<!-- v-slot="{href,navigate}"-->
<!-- custom-->
<!-- >-->
<!-- <div @click="navigate" class="small-pics justifyBetween col-12 col-md-3 mb-4 pointer">-->
<!-- <img :src="item.thumbCover" :alt="item.title">-->
<!-- <h2 class="mt-2">{{ item.title }}</h2>-->
<!-- <div class="row view-time-ago">-->
<!-- <div class="col-12 col-xxl-6">-->
<!-- <p>{{ jDate(item.customDate) }}</p>-->
<!-- </div>-->
<!-- <div class="col-12 col-xxl-6">-->
<!-- <a :href="href" class="btn btn-primary mt-2">-->
<!-- <span class="txtBtn">ادامه مطلب</span>-->
<!-- </a>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </nuxt-link>-->
<!-- ******************************************* old style ******************************************* -->
</div>
</div>
</div>
</section>
<div class="paginate">
<div class="row">
<div class="col-12">
<el-pagination
layout="prev, pager, next"
v-if="paginate"
class="el-pagination"
@current-change="newsPageNumber"
:current-page="Number($route.query.page)"
:page-count="Number(newsFile.news.totalPages)"
>
</el-pagination>
</div>
</div>
</div>
</section>
</template>
<script>
import moment from "moment-jalaali"
export default {
data() {
return {
newsFile: null
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
paginate() {
return this.newsFile.news.totalPages > 1
},
pageQuery() {
return this.$route.query.page
},
},
watch: {
pageQuery(newVal, oldVal) {
this.$nuxt.refresh()
},
},
methods: {
jDate(data) {
return moment(data).locale('fa').format('LL')
},
jDate2(data) {
return moment(data).locale('fa').fromNow()
},
newsPageNumber(val) {
this.$router.push({
name: 'portal-newsfile-details',
params: {portal: this.currentPortal, details: this.$route.params.details},
query: {page: val}
})
$(window).scrollTop(0)
},
},
head() {
return {
title: 'پرونده خبری'
}
},
async asyncData({$axios, params, error, query}) {
try {
const newsFile = await $axios.get(`/api/public/getnewsfile/${encodeURIComponent(params.details)}?page=${query.page}`)
return {
newsFile: newsFile.data
}
} catch (e) {
error({status: 404, message: 'در دریافت اطلاعات مشکلی پیش آمده است!'})
}
}
}
</script>
File diff suppressed because it is too large Load Diff
+266
View File
@@ -0,0 +1,266 @@
<template>
<div class="search-result">
<section class="results-for">
<div class="container">
<div class="row">
<div class="col-12">
<h2>
<span>نتایج جستجو برای: </span>
<b>{{ $route.query.sq }}</b>
</h2>
</div>
</div>
</div>
</section>
<section class="news">
<div class="container">
<div class="row title">
<div class="col-12">
<h2 @click="toggleResults('news')">
<i class="fas fa-chevron-circle-left" :class="newsOpen && 'open'"></i>
<span>نتایج جستجو در اخبار:</span>
<b>{{ result.news.length }}</b>
</h2>
<p v-if="!result.news.length">هیچ نتیجه ای پیدا نشد.</p>
</div>
</div>
<!----------------------- Short result ------------------------->
<div class="row align-items-stretch">
<div class="col-12 col-md-6 col-lg-3 mb-5" v-for="(item,index) in result.news" :key="item._id" :title="item.title" v-if="index < 4">
<div class="news-item">
<img :src="item.thumbCover" :alt="item.title">
<h2>{{ item.title }}</h2>
<p>{{ item.summaryTitle }}</p>
<nuxt-link class="btn btn-primary" :to="{name: 'portal-news-details',params: {portal: item.modelType,details: item._id}}">ادامه مطلب</nuxt-link>
</div>
</div>
</div>
<!----------------------- Short result ------------------------->
<!----------------------- Full result ------------------------->
<div class="row align-items-stretch results">
<div class="col-12 col-md-6 col-lg-3 mb-5" v-for="(item,index) in result.news" :key="item._id" :title="item.title" v-if="index >= 4">
<div class="news-item">
<img :src="item.thumbCover" :alt="item.title">
<h2>{{ item.title }}</h2>
<p>{{ item.summaryTitle }}</p>
<nuxt-link class="btn btn-primary" :to="{name: 'portal-news-details',params: {portal: item.modelType,details: item._id}}">ادامه مطلب</nuxt-link>
</div>
</div>
</div>
<!----------------------- Full result ------------------------->
<div class="row seeMore" v-if="result.news.length > 4">
<div class="col-12">
<button @click="toggleResults('news')">
<span v-if="!newsOpen">نتایج بیشتر</span>
<span v-else>نتایج کمتر</span>
<i class="fas fa-chevron-double-down" :class="newsOpen && 'open'"></i>
</button>
</div>
<!-- <div class="col-12">-->
<!-- <div class="line"></div>-->
<!-- </div>-->
</div>
</div>
</section>
<section class="pages">
<div class="container">
<div class="row title">
<div class="col-12">
<h2 @click="toggleResults('pages')">
<i class="fas fa-chevron-circle-left" :class="pagesOpen && 'open'"></i>
<span>نتایج جستجو در صفحات:</span>
<b>{{ result.pages.length }}</b>
</h2>
<p v-if="!result.pages.length">هیچ نتیجه ای پیدا نشد.</p>
</div>
</div>
<!----------------------- Short result ------------------------->
<div class="row align-items-stretch">
<div class="col-12 col-md-4 col-lg-3 mb-3" v-for="(item,index) in result.pages" :key="item._id" :title="item.title" v-if="index < 4">
<div class="pages-item">
<nuxt-link v-if="!item.url" :to="{name: 'portal-category-details',params: {portal: item.modelType,details: item.title}, query: categoryURLQuery(item)}">{{ item.title }}</nuxt-link>
<a v-else :href="item.url">ادامه مطلب</a>
</div>
</div>
</div>
<!----------------------- Short result ------------------------->
<!----------------------- full result ------------------------->
<div class="row align-items-stretch results">
<div class="col-12 col-md-4 col-lg-3 mb-3" v-for="(item,index) in result.pages" :key="item._id" :title="item.title" v-if="index >= 4">
<div class="pages-item">
<nuxt-link v-if="!item.url" :to="{name: 'portal-category-details',params: {portal: item.modelType,details: item.title}, query: categoryURLQuery(item)}">{{ item.title }}</nuxt-link>
<a v-else :href="item.url">ادامه مطلب</a>
</div>
</div>
</div>
<!----------------------- full result ------------------------->
<div class="row seeMore" v-if="result.pages.length > 4">
<div class="col-12">
<button @click="toggleResults('pages')">
<span v-if="!pagesOpen">نتایج بیشتر</span>
<span v-else>نتایج کمتر</span>
<i class="fas fa-chevron-double-down" :class="pagesOpen && 'open'"></i>
</button>
</div>
<!-- <div class="col-12 mt-4">-->
<!-- <div class="line"></div>-->
<!-- </div>-->
</div>
</div>
</section>
<section class="media">
<div class="container">
<div class="row title">
<div class="col-12">
<h2 @click="toggleResults('media')">
<i class="fas fa-chevron-circle-left" :class="mediaOpen && 'open'"></i>
<span>نتایج جستجو در رسانه:</span>
<b>{{ result.media.length }}</b>
</h2>
<p v-if="!result.media.length">هیچ نتیجه ای پیدا نشد.</p>
</div>
</div>
<!----------------------- Short result ------------------------->
<div class="row align-items-stretch">
<div class="col-12 col-md-6 col-lg-3 mb-3" v-for="(item,index) in result.media" :key="item._id" :title="item.title" v-if="index < 4">
<div class="media-item">
<img :src="item.thumbCover" :alt="item.title">
<div class="txtBox">
<h2>{{ item.title }}</h2>
<template v-if="item.galleryType === 'video'">
<nuxt-link class="btn btn-primary" :to="{name: 'portal-videos-video',params: {portal: item.modelType,video: item._id}}">ادامه مطلب</nuxt-link>
<span class="tag">فیلم</span>
</template>
<template v-if="item.galleryType === 'image'">
<nuxt-link class="btn btn-primary" :to="{name: 'portal-gallery-media',params: {portal: item.modelType,media: item._id}}">ادامه مطلب</nuxt-link>
<span class="tag">تصویر</span>
</template>
<template v-if="item.galleryType === 'graphic'">
<nuxt-link class="btn btn-primary" :to="{name: 'portal-graphics-graphic',params: {portal: item.modelType,graphic: item._id}}">ادامه مطلب</nuxt-link>
<span class="tag">گرافیک</span>
</template>
</div>
</div>
</div>
</div>
<!----------------------- Short result ------------------------->
<!----------------------- Full result ------------------------->
<div class="row align-items-stretch results">
<div class="col-12 col-md-6 col-lg-3 mb-3" v-for="(item,index) in result.media" :key="item._id" :title="item.title" v-if="index >= 4">
<div class="media-item">
<img :src="item.thumbCover" :alt="item.title">
<div class="txtBox">
<h2>{{ item.title }}</h2>
<template v-if="item.galleryType === 'video'">
<nuxt-link class="btn btn-primary" :to="{name: 'portal-videos-video',params: {portal: item.modelType,video: item._id}}">ادامه مطلب</nuxt-link>
<span class="tag">فیلم</span>
</template>
<template v-if="item.galleryType === 'image'">
<nuxt-link class="btn btn-primary" :to="{name: 'portal-gallery-media',params: {portal: item.modelType,media: item._id}}">ادامه مطلب</nuxt-link>
<span class="tag">تصویر</span>
</template>
<template v-if="item.galleryType === 'graphic'">
<nuxt-link class="btn btn-primary" :to="{name: 'portal-graphics-graphic',params: {portal: item.modelType,graphic: item._id}}">ادامه مطلب</nuxt-link>
<span class="tag">گرافیک</span>
</template>
</div>
</div>
</div>
</div>
<!----------------------- Full result ------------------------->
<div class="row seeMore" v-if="result.media.length > 4">
<!-- <div class="col-12 mt-4">-->
<!-- <div class="line"></div>-->
<!-- </div>-->
<div class="col-12">
<button @click="toggleResults('media')">
<span v-if="!mediaOpen">نتایج بیشتر</span>
<span v-else>نتایج کمتر</span>
<i class="fas fa-chevron-double-down" :class="mediaOpen && 'open'"></i>
</button>
</div>
</div>
</div>
</section>
</div>
</template>
<script>
export default {
data() {
return {
result: null,
newsOpen: false,
pagesOpen: false,
mediaOpen: false
}
},
computed: {
searchQuery() {
return this.$route.query.sq
}
},
watch: {
searchQuery(newVal, oldVal) {
this.$nuxt.refresh()
}
},
mounted() {
$(document).ready(() => {
$('.search-result .results').slideUp()
})
},
methods: {
toggleResults(item) {
if (item === 'news') this.newsOpen = !this.newsOpen
if (item === 'pages') this.pagesOpen = !this.pagesOpen
if (item === 'media') this.mediaOpen = !this.mediaOpen
$(`.search-result .${item} .results`).slideToggle(500)
},
categoryURLQuery(item) {
const query = {type: item.defaultPageType, id: item._id}
if (item.defaultPageType === 'news') return {...query, page: 1}
if (item.defaultPageType === 'gallery-image') return {...query, page: 1, type: 'gallery', galleryType: 'image'}
if (item.defaultPageType === 'gallery-video') return {...query, page: 1, type: 'gallery', galleryType: 'video'}
if (item.defaultPageType === 'gallery-graphic') return {...query, page: 1, type: 'gallery', galleryType: 'graphic'}
else return query
}
},
async asyncData({$axios, error, query}) {
const searchQuery = query.sq
try {
if (searchQuery?.length) {
const result = await $axios.get('/api/public/search', {
params: {
terms: searchQuery
}
})
return {
result: result.data
}
} else {
return {
result: {
news: [],
media: [],
pages: []
}
}
}
} catch (e) {
error({status: 404})
}
}
}
</script>
+217
View File
@@ -0,0 +1,217 @@
<template>
<div class="election-page">
<div class="container" v-if="!loggedIn">
<div class="row login-row">
<div class="col-12 col-md-8">
<div class="view-form">
<img src="~/static/img/logo-re3-150x150.png" alt="">
<form @submit.prevent="post">
<h2 class="title">ورود</h2>
<div class="formRow" :class="validation.username ? 'err' : null">
<input class="input" v-model="loginData.username" name="userName" type="text" placeholder="ایمیل یا نام کاربری را وارد کنید"/>
<p v-if="validation.username">{{ validation.username.msg }}</p>
</div>
<div class="formRow" :class="validation.password ? 'err' : null">
<input class="input" v-model="loginData.password" name="password" type="password" placeholder="پسوورد خود را وارد کنید"/>
<p v-if="validation.password">{{ validation.password.msg }}</p>
</div>
<div class="btnSub">
<button class="btn btn-primary btn-link" type="submit">ورود</button>
<!-- <nuxt-link >SUBMIT NOW</nuxt-link> -->
</div>
</form>
</div>
</div>
</div>
</div>
<div class="container" v-else>
<div class="row">
<div class="col-12">
<LineTxt label="انتخابات"/>
</div>
<div class="col-12 stretch">
<div class="election-view-item">
<div class="election-item1">
<h2>{{ election.title }} :</h2>
<p class="about-title">درباره انتخابات :</p>
<p class="about-txt">{{ election.description }}</p>
</div>
<div class="row election-item2">
<div class="col-12 col-md-6 col-lg-4 col-xl-3" v-for="item in election.candidates">
<div class="election-user" :class="[selectedCandide === item._id ? 'selected' : 'exclude',selectedCandide && 'clicked']">
<img :src="item.profilePic" :alt="item.firstName + ' ' + item.lastName">
<h3 class="user-name">{{ item.firstName + ' ' + item.lastName }}</h3>
<div class="view-btn">
<button type="button" @click="itemDialog(item)" class="btn bigBtn btn-primary p-2">مشاهده رزومه</button>
<button class="btn bigBtn p-2" :class="selectedCandide === item._id ? 'selectBTN' : 'btn-success'" @click="selectedCandide = item._id">انتخاب</button>
</div>
</div>
</div>
<!------------------------ CV modal ------------------------>
<el-dialog :visible.sync="showAlert">
<div class="container">
<div class="row align-items-center mb-3">
<div class="col-12 col-md-4">
<img class="img-alert" :src="dialogData.profilePic" :alt="dialogData.firstName + ' ' + dialogData.lastName">
</div>
<div class="col-12 col-md-8">
<h2 class="user-name">{{ dialogData.firstName + ' ' + dialogData.lastName }}</h2>
<p>تاریخ تولد : {{ dialogData.bornDate }}</p>
<p>کد ملی : {{ dialogData.nationalCode }}</p>
<p>مدرک تحصیلی : {{ dialogData.education }}</p>
</div>
</div>
<div>
<h3 class="about"> رزومه :</h3>
<p>{{ dialogData.resume }}</p>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button class="btn bigBtn btn-primary" @click="showAlert = false">بستن</el-button>
</div>
</el-dialog>
<!------------------------ CV modal ------------------------>
<div class="col-12">
<button class="btn bigBtn btn-primary pt-2 pb-2 voteBtn" :disabled="!selectedCandide" @click="vote">ثبت رای</button>
<button class="btn bigBtn btn-primary pt-2 pb-2" @click="logOutOfElection">خروج</button>
</div>
</div>
</div>
</div>
<div class="not-found" v-if="!election">
<p>موردی وجود ندارد!</p>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
showAlert: false,
loginData: {
username: '',
password: '',
},
validation: {},
election: null,
selectedCandide: '',
dialogData: {}
}
},
computed: {
loggedIn() {
return (this.$auth.loggedIn && this.$auth.hasScope('voter'))
}
},
methods: {
post() {
this.validation = {}
this.$auth.loginWith('vote', {
data: this.loginData
})
.then(res => {
this.loginData = {
username: '',
password: '',
}
this.$nuxt.refresh()
})
.catch(e => {
if (e.response.status === 422) this.validation = e.response.data.validation
else console.log(e)
})
},
itemDialog(item) {
this.showAlert = !this.showAlert
this.dialogData = item
},
vote() {
if (!this.selectedCandide.length) return this.$message({
type: 'warning',
message: 'ابتدا یک گزینه انتخاب کنید'
})
this.$confirm("از انتخاب خود اطمینان دارید؟", "هشدار", {
confirmButtonText: "بله",
cancelButtonText: "لغو",
type: "warning",
})
.then(() => {
this.$axios.post('/api/public/addVote', {
electionId: this.election._id,
candidateId: this.selectedCandide
})
.then(res => {
this.$message({
type: 'success',
message: 'انتخاب شما با موفقیت ثبت شد'
})
this.$auth.logout()
})
.catch(e => {
this.error({
status: 500, message: 'مشکلی در ارسال اطلاعات به وجود آمده است'
})
})
})
.catch(() => {
this.$message({
type: "warning",
message: "عملیات لغو شد",
});
})
},
logOutOfElection() {
this.$confirm("از صفحه انتخابات خارج میشوید؟", "هشدار", {
confirmButtonText: "بله",
cancelButtonText: "لغو",
type: "warning",
})
.then(() => {
this.$auth.logout()
})
.catch(() => {
this.$message({
type: "warning",
message: "عملیات لغو شد",
});
})
}
},
async asyncData({$axios, error, $auth}) {
try {
if ($auth.loggedIn && $auth.hasScope('voter')) {
const election = await $axios.get('/api/public/getElection')
return {
election: election.data,
}
} else {
return {
election: []
}
}
} catch (e) {
error({
status: 401, message: 'شما اجازه دسترسی به این صفحه را ندارید'
})
}
}
}
</script>
+33
View File
@@ -0,0 +1,33 @@
<template>
<div class="services-page">
<div class="container">
<div class="row">
<div class="col-12">
<LineTxt label="میز خدمت"/>
</div>
<div class="col-12 col-md-6 services-view">
<nuxt-link :to="{name: 'portal-services-election', params: {portal: currentPortal}}" class="services-item">
<i class="far fa-check-square"></i>
<span>شرکت در انتخابات استانداری مرکزی</span>
</nuxt-link>
</div>
<div class="col-12 col-md-6 services-view">
<nuxt-link :to="{name: 'portal-services-meeting', params: {portal: currentPortal}}" class="services-item">
<i class="far fa-check-square"></i>
<span>ارتباط با استاندار</span>
</nuxt-link>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
computed: {
currentPortal() {
return this.$route.params.portal
}
}
}
</script>
+138
View File
@@ -0,0 +1,138 @@
<template>
<div class="meeting-page">
<div class="container">
<div class="row">
<div class="col-12">
<LineTxt label="ارتباط با استاندار"/>
</div>
<div class="col-12 ">
<div class="view-form">
<form @submit.prevent="post">
<div class="formRow" :class="validation.name ? 'err' : null">
<input class="input" v-model="message.name" name="name" type="text" placeholder="نام و نام خانوادگی خود را وارد کنید"/>
<p v-if="validation.name">{{ validation.name.msg }}</p>
</div>
<div class="formRow" :class="validation.subject ? 'err' : null">
<input class="input" v-model="message.subject" name="subject" type="text" placeholder="موضوع خود را وارد کنید"/>
<p v-if="validation.subject">{{ validation.subject.msg }}</p>
</div>
<div class="formRow" :class="validation.description ? 'err' : null">
<input class="input" v-model="message.description" name="description" type="text" placeholder="توضیحات خود را وارد کنید"/>
<p v-if="validation.description">{{ validation.description.msg }}</p>
</div>
<div class="formRow" :class="validation.email ? 'err' : null">
<input class="input" v-model="message.email" name="email" type="email" placeholder="ایمیل خود را وارد کنید"/>
<p v-if="validation.email">{{ validation.email.msg }}</p>
</div>
<div class="formRow" :class="validation.phoneNumber ? 'err' : null">
<input class="input" v-model="message.phoneNumber" name="phoneNumber" type="text" placeholder="شماره تماس خود را وارد کنید"/>
<p v-if="validation.phoneNumber">{{ validation.phoneNumber.msg }}</p>
</div>
<div class="formRow" :class="validation.nationalCode ? 'err' : null">
<input class="input" v-model="message.nationalCode" name="nationalCode" type="text" placeholder="کدملی خود را وارد کنید"/>
<p v-if="validation.nationalCode">{{ validation.nationalCode.msg }}</p>
</div>
<div class="row view-captcha">
<div class="formRow col-12 col-md-6" :class="validation.captcha ? 'err' : null">
<input v-model="message.captcha" class="input" name="captcha" type="text" placeholder="متن داخل عکس را وارد کنید"/>
</div>
<div class="new-captcha col-12 col-md-6">
<div class="captcha" v-html="captcha"></div>
<button @click="reloadCaptcha" type="button" class="btn btn-primary">
<i class="fas fa-sync-alt"></i>
</button>
</div>
<p class="err-captcha" v-if="validation.captcha">{{ validation.captcha.msg }}</p>
</div>
<div class="btnSub">
<button class="btn btn-primary btn-link" type="submit">ثبت</button>
<!-- <nuxt-link >SUBMIT NOW</nuxt-link> -->
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
message: {
name: '',
subject: '',
description: '',
email: '',
phoneNumber: '',
nationalCode: '',
captcha: '',
},
validation: {},
captcha: null
}
},
methods: {
reloadCaptcha() {
this.$axios.get('/api/public/getCaptcha').then(res => {
this.captcha = res.data
})
},
post() {
this.validation = {}
this.$axios.post('/api/public/meetingOstandar', this.message)
.then(res => {
this.reloadCaptcha()
this.$message({
type: 'success',
message: 'پیام شما با موفقیت ارسال شد'
})
this.message = {
name: '',
subject: '',
description: '',
email: '',
phoneNumber: '',
nationalCode: '',
captcha: '',
}
})
.catch(e => {
this.reloadCaptcha()
if (e.response.status === 422) this.validation = e.response.data.validation
else console.log(e)
})
}
},
computed: {},
async asyncData({$axios, error, params}) {
try {
const request = [
$axios.get('/api/public/getCaptcha'),
]
let fetch = await Promise.all(request)
const [captcha] = fetch
return {
captcha: captcha.data,
}
} catch (e) {
error({
status: 500, message: 'دریافت اطلاعات با مشکل مواجه شد!'
})
}
}
}
</script>
+149
View File
@@ -0,0 +1,149 @@
<template>
<section class="video-details">
<div class="container">
<div class="row">
<div class="view-date">
<p class="date">{{ jalali(info.customDate || info.created_at) }}</p>
<p class="date">{{ jDate(info.customDate || info.created_at) }}</p>
</div>
<div v-if="info.summaryTitle" class="col-12 col-md-6">
<h2 class="summry-title mt-3">
{{ info.summaryTitle }}
</h2>
</div>
<div class="col-12">
<h1 class="title">
{{ info.title }}
</h1>
</div>
<div v-if="info.leadTitle" class="col-12">
<p class="summry-title mb-4">
{{ info.leadTitle }}
</p>
</div>
<div class="row mb-4">
<div class="col-12 img-video">
<div v-html="info.embeddedCode" v-if="info.isEmbedded"></div>
<video width="100%" controls :src="info.video" :poster="info.cover" v-else></video>
</div>
</div>
</div>
</div>
<div class="s2" v-if="related.length">
<h3>مطالب مرتبط</h3>
<div id="slides">
<div class="slide" v-for="item in related" :key="item._id">
<div class="view-txt">
<div>
<p class="h3">{{ item.title }}</p>
<p>{{ item.summaryTitle }}</p>
<div class="date">
<span>{{ jalali(item.customDate || item.created_at) }}</span>
<span>توسط {{ item._creator.firstName + ' ' + item._creator.lastName }}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</template>
<script>
import moment from 'moment-jalaali'
if (process.client) require("slick-carousel")
export default {
data() {
return {
info: [],
galleryShown: false,
initialIndex: 0,
related: []
}
},
mounted() {
// $(document).ready(() => {
$("#slides").slick({
dots: true,
slidesToShow: this.related.length === 1 ? 1 : 2,
rtl: true,
responsive: [
{
breakpoint: 960,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
infinite: true,
dots: true
}
},
{
breakpoint: 720,
settings: {
slidesToShow: 2,
slidesToScroll: 1
}
},
{
breakpoint: 540,
settings: {
slidesToShow: 1,
slidesToScroll: 1
}
}
]
})
// })
},
methods: {
jalali(date) {
return moment(date).locale('fa').fromNow()
},
jDate(date) {
return moment(date).locale('fa').format('LL')
}
},
head() {
return {
title: 'جزئیات فیلم',
meta: [
{
hid: 'description',
name: 'description',
content: this.info.summaryTitle
},
{
hid: 'keywords',
name: 'keywords',
content: this.info.keywords
}
]
}
},
async asyncData({params, error, $axios}) {
try {
let data = await $axios.get(`/api/public/getGallery/${encodeURIComponent(params.video)}`)
let related = await $axios.get(`/api/public/getRelatedGallery`, {
params: {
type: 'video',
title: params.video
}
})
return {
info: data.data,
related: related.data
}
} catch (err) {
error({status: 404, message: 'دریافت اطلاعات با مشکل مواجه شده است!'})
}
}
}
</script>
+131
View File
@@ -0,0 +1,131 @@
<template>
<div class="video-page">
<div class="container">
<div class="row">
<div class="col-12 col-md-9">
<h3 class="video-title">فیلم</h3>
<div class="">
<div class="row">
<div class="col-12 mb-5 sectionStyle" v-if="video.all.docs.length" >
<div class="video-item1">
<nuxt-link :to="{name: 'portal-videos-video', params: {portal: currentPortal, video: video.all.docs[0]._id}}" class="video-img-box1">
<img :src="video.all.docs[0].thumbCover" alt="" class="video-img1">
<div class="video-detail-item1">
<h3 class="video-detail-title1">{{ video.all.docs[0].title }}</h3>
<p class="video-detail-date1" id="video-detail-date1">{{ jDate(video.all.docs[0].customDate || video.all.docs[0].created_at) }}</p>
</div>
</nuxt-link>
</div>
</div>
<div class="col-12">
<div class="not-found" v-if="!video.all.docs.length">
<p>موردی وجود ندارد!</p>
</div>
</div>
<div class="col-12 col-sm-6 col-md-3 mb-3 sectionStyle" v-for="(item, index) in video.all.docs" :key="item.id" v-if="index > 0 && video.all.docs.length">
<div class="video-item">
<nuxt-link :to="{name: 'portal-videos-video', params: {portal: currentPortal, video: item._id}}" class="video-img-box">
<img :src="item.thumbCover" alt="" class="video-img">
</nuxt-link>
<div class="video-detail-item">
<h3 class="video-detail-title">{{ item.title }}</h3>
<p class="video-detail-date" id="video-detail-date">{{ jDate(item.customDate || item.created_at) }}</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-3">
<h3 class="video-side">برگزیده ها</h3>
<div class="sectionStyle" v-if="video.favorites.length">
<div class="row">
<div class="col-12 col-sm-6 col-md-12 mb-3" v-for="(item, index) in video.favorites" :key="item.id" v-if="index < 5">
<div class="video-item ">
<nuxt-link :to="{name: 'portal-videos-video', params: {portal: currentPortal, video: item._id}}" class="video-img-box">
<img :src="item.thumbCover" alt="" class="video-img">
</nuxt-link>
<div class="video-detail-item">
<h3 class="video-detail-title">{{ item.title }}</h3>
<p class="video-detail-date" id="video-detail-date2">{{ jDate(item.customDate || item.created_at) }}</p>
</div>
</div>
</div>
</div>
</div>
<div class="not-found" v-if="!video.favorites.length">
<p>موردی وجود ندارد!</p>
</div>
</div>
</div>
<div class="paginate">
<div class="row">
<div class="col-12">
<el-pagination
layout="next, pager, prev"
v-if="video.all.totalPages > 1"
class="el-pagination"
@current-change="pageNumber"
:current-page="Number($route.query.page)"
:page-count="Number(video.all.totalPages)"
>
</el-pagination>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import moment from "moment-jalaali"
export default {
data() {
return {
video: null
}
},
computed: {
currentPortal() {
return this.$route.params.portal
},
pageQuery() {
return this.$route.query.page
},
},
watch: {
pageQuery(newVal, oldVal) {
this.$nuxt.refresh()
},
},
methods: {
jDate(date) {
return moment(date).locale('fa').format('LL')
},
pageNumber(val) {
this.$router.push({
name: 'portal-videos',
params: {portal: this.currentPortal},
query: {type: 'video', page: val}
})
$(window).scrollTop(0)
},
},
async asyncData({params, query, error, $axios}) {
// return error({status: 404})
try {
const portalQuery = params.portal
// const data = await $axios.get(`/api/public/getvideoCat/${query.category}`, {
const data = await $axios.get(`/api/public/getAllGallery?portal=${portalQuery}&type=${query.type}&page=${query.page}`)
// console.log('data.data', data.data.all)
return {
video: data.data
}
} catch (e) {
error({status: 404})
}
}
}
</script>