feat: add ci cd files dont edit those files
This commit is contained in:
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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">-->
|
||||
|
||||
<!-- <!– <div class="s3-right-view-title">–>-->
|
||||
<!-- <!– <h1 class="s3-right-title"></h1>–>-->
|
||||
<!-- <!– <div class="br"></div>–>-->
|
||||
<!-- <!– </div>–>-->
|
||||
<!-- <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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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">-->
|
||||
<!--<!– <h2 class="s2-title1" :title="newsFile.news.docs[1].summaryTitle">{{ newsFile.news.docs[1].summaryTitle }}</h2>–>-->
|
||||
<!-- <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
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user