chore: add shafafiat route

This commit is contained in:
mahyargdz
2024-11-18 19:35:42 +03:30
parent f75f890fa5
commit 1c89bc5f08
5 changed files with 397 additions and 215 deletions
+71 -124
View File
@@ -2,9 +2,7 @@
<div class="off-canvas">
<div class="side d-none d-md-block">
<div class="relativePos">
<div
class="closeBtn d-none d-md-inline-block"
@click="closeOffCanvas">
<div class="closeBtn d-none d-md-inline-block" @click="closeOffCanvas">
<div class="x"></div>
<span>بستن</span>
</div>
@@ -12,15 +10,12 @@
</div>
<div style="overflow-y: auto; width: 100%">
<div class="main">
<div
class="closeBtnMobile d-block d-md-none"
@click="closeOffCanvas">
<div class="closeBtnMobile d-block d-md-none" @click="closeOffCanvas">
<div class="x"></div>
</div>
<div class="container-fluid">
<div class="row">
<div
class="col-12 col-lg-4 order-0 order-lg-1 mb-5 mb-lg-0">
<div class="col-12 col-lg-4 order-0 order-lg-1 mb-5 mb-lg-0">
<div class="searchBox">
<div class="title">
<p class="title-search">
@@ -32,7 +27,8 @@
type="text"
name="search"
v-model="searchableText"
placeholder="عبارت مدنظر خود را بنویسید" />
placeholder="عبارت مدنظر خود را بنویسید"
/>
<button type="submit">
<i class="fal fa-search"></i>
</button>
@@ -52,11 +48,10 @@
},
}"
v-slot="{ navigate, href }"
custom>
custom
>
<div class="mt-3" @click="navigate">
<a
class="btn bigBtn btn-primary"
:href="href">
<a class="btn bigBtn btn-primary" :href="href">
{{
currentPortal === "ostandari"
? "برو به صفحه ستاد انتخابات"
@@ -77,13 +72,10 @@
params: { portal: currentPortal },
}"
v-slot="{ href, navigate, isActive }"
custom>
<li
@click="navigate"
:class="isActive ? 'active' : null">
<a class="mainLink" :href="href"
>صفحه اصلی</a
>
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a class="mainLink" :href="href">صفحه اصلی</a>
</li>
</nuxt-link>
@@ -94,13 +86,10 @@
params: { portal: currentPortal },
}"
v-slot="{ navigate, href, isActive }"
custom>
<li
@click="navigate"
:class="isActive ? 'active' : null">
<a class="mainLink" :href="href"
>تماس با ما</a
>
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a class="mainLink" :href="href">تماس با ما</a>
</li>
</nuxt-link>
@@ -111,13 +100,10 @@
params: { portal: currentPortal },
}"
v-slot="{ navigate, href, isActive }"
custom>
<li
@click="navigate"
:class="isActive ? 'active' : null">
<a class="mainLink" :href="href"
>میز خدمت</a
>
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a class="mainLink" :href="href">میز خ2دمت</a>
</li>
</nuxt-link>
@@ -137,20 +123,14 @@
page: 1,
},
}"
v-slot="{
navigate,
href,
isActive,
}"
custom>
v-slot="{ navigate, href, isActive }"
custom
>
<li
@click="navigate"
:class="
isActive ? 'active' : null
">
<a class="mainLink" :href="href"
>عکس</a
>
:class="isActive ? 'active' : null"
>
<a class="mainLink" :href="href">عکس</a>
</li>
</nuxt-link>
@@ -166,20 +146,14 @@
page: 1,
},
}"
v-slot="{
navigate,
href,
isActive,
}"
custom>
v-slot="{ navigate, href, isActive }"
custom
>
<li
@click="navigate"
:class="
isActive ? 'active' : null
">
<a class="mainLink" :href="href"
>فیلم</a
>
:class="isActive ? 'active' : null"
>
<a class="mainLink" :href="href">فیلم</a>
</li>
</nuxt-link>
@@ -195,42 +169,32 @@
page: 1,
},
}"
v-slot="{
navigate,
href,
isActive,
}"
custom>
v-slot="{ navigate, href, isActive }"
custom
>
<li
@click="navigate"
:class="
isActive ? 'active' : null
">
<a class="mainLink" :href="href"
>گرافیک</a
>
:class="isActive ? 'active' : null"
>
<a class="mainLink" :href="href">گرافیک</a>
</li>
</nuxt-link>
<nuxt-link
class="col-12 col-md-4 mb-2"
to="/ostandari/digital-books"
v-slot="{
navigate,
href,
isActive,
}"
custom>
<li
@click="navigate"
:class="
isActive ? 'active' : null
">
<a class="mainLink" :href="href"
>کتابخانه دیجیتال</a
class="col-12 col-md-4 mb-2"
to="/ostandari/digital-books"
v-slot="{ navigate, href, isActive }"
custom
>
<li
@click="navigate"
:class="isActive ? 'active' : null"
>
</li>
</nuxt-link>
<a class="mainLink" :href="href"
>کتابخانه دیجیتال</a
>
</li>
</nuxt-link>
</ul>
</div>
</li>
@@ -242,13 +206,10 @@
params: { portal: currentPortal },
}"
v-slot="{ navigate, href, isActive }"
custom>
<li
@click="navigate"
:class="isActive ? 'active' : null">
<a class="mainLink" :href="href"
>میز خدمت</a
>
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a class="mainLink" :href="href">میز خدمت</a>
</li>
</nuxt-link>
@@ -265,12 +226,11 @@
query: categoryURLQuery(item),
}"
v-slot="{ href, navigate, isActive }"
custom>
custom
>
<a class="mainLink">{{ item.title }}</a>
<li
@click="navigate"
:class="isActive ? 'active' : null">
<li @click="navigate" :class="isActive ? 'active' : null">
<div class="children">
<ul>
<!-- <nuxt-link-->
@@ -288,9 +248,9 @@
:data="item.childs"
:props="defaultProps"
accordion
ref="tree">
<div
slot-scope="{ node, data }">
ref="tree"
>
<div slot-scope="{ node, data }">
<nuxt-link
:to="{
name: 'portal-category-details',
@@ -298,31 +258,19 @@
portal: currentPortal,
details: node.label,
},
query:
categoryURLQuery(data),
}"
v-slot="{
href,
navigate,
isActive,
query: categoryURLQuery(data),
}"
v-slot="{ href, navigate, isActive }"
custom
:class="
!data.childs.length &&
'test'
">
:class="!data.childs.length && 'test'"
>
<li
@click="navigate"
:class="
isActive
? 'active'
: null
">
<a
class="subLink"
:href="href"
>{{ node.label }}</a
>
:class="isActive ? 'active' : null"
>
<a class="subLink" :href="href">{{
node.label
}}</a>
</li>
</nuxt-link>
</div>
@@ -441,8 +389,7 @@ export default {
type: item.defaultPageType,
id: item._id,
};
if (item.defaultPageType === "news")
return { ...query, page: 1 };
if (item.defaultPageType === "news") return { ...query, page: 1 };
if (item.defaultPageType === "gallery")
return { ...query, galleryType: "image", page: 1 };
else return query;
+205 -91
View File
@@ -2,12 +2,20 @@
<div class="site--header">
<div class="col-12">
<!------------------------ countDown modal ------------------------>
<el-dialog v-if="counterDown" append-to-body :visible.sync="showAlert" :show-close="false" :title="'مانده تا' + ' ' + counterDown.title">
<el-dialog
v-if="counterDown"
append-to-body
:visible.sync="showAlert"
:show-close="false"
:title="'مانده تا' + ' ' + counterDown.title"
>
<div>
<flip-countdown :deadline="counterDown1[0]"></flip-countdown>
</div>
<div slot="footer" class="dialog-footer">
<el-button class="btn bigBtn btn-primary" @click="showAlert = false">بستن</el-button>
<el-button class="btn bigBtn btn-primary" @click="showAlert = false"
>بستن</el-button
>
</div>
</el-dialog>
<!------------------------ countDown modal ------------------------>
@@ -21,15 +29,27 @@
</span>
</div>
<div class="col-12 col-md-6 site-top-left">
<el-button type="text" @click="showAlert = true" v-if="counterDown">
<span class="timer">{{ jDate2(counterDown.expireDate) + ' مانده تا ' + counterDown.title }}</span>
<el-button
type="text"
@click="showAlert = true"
v-if="counterDown"
>
<span class="timer">{{
jDate2(counterDown.expireDate) +
" مانده تا " +
counterDown.title
}}</span>
</el-button>
<div class="email-top" v-else>
<a class="email-text" :href="`mailto: ${yearBanner.email}`" target="_blank">{{ yearBanner.email }}</a>
<a
class="email-text"
:href="`mailto: ${yearBanner.email}`"
target="_blank"
>{{ yearBanner.email }}</a
>
<i class="far fa-envelope"></i>
</div>
</div>
</div>
</div>
@@ -37,9 +57,14 @@
</div>
<div class="view-banner">
<img v-if="yearBanner.iranFlag" class="iran-flag" src="~/assets/img/iran.png" alt="">
<img
v-if="yearBanner.iranFlag"
class="iran-flag"
src="~/assets/img/iran.png"
alt=""
/>
<div class="banner">
<img :src="yearBanner.mainCover" alt="">
<img :src="yearBanner.mainCover" alt="" />
</div>
<div class="relativePos">
<div class="container navigations">
@@ -47,18 +72,36 @@
<div class="col-12 col-lg-10 menu-desk">
<nav>
<ul>
<nuxt-link :to="{name: 'portal',params: {portal: currentPortal}}" v-slot="{navigate,href,isActive}" custom exact>
<nuxt-link
:to="{ name: 'portal', params: { portal: currentPortal } }"
v-slot="{ navigate, href, isActive }"
custom
exact
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a :href="href">صفحه اصلی</a>
</li>
</nuxt-link>
<nuxt-link
to="/ostandari/shafaf"
v-slot="{ navigate, href, isActive }"
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a :href="href">شفافیت</a>
</li>
</nuxt-link>
<!-- ***************** dynamic routes ***************** -->
<nuxt-link
v-for="item in header.categories"
:key="item._id"
:to="{name: 'portal-category-details',params: {portal: currentPortal,details: item.title},query: categoryURLQuery(item)}"
v-slot="{navigate,href,isActive}"
custom
v-for="item in header.categories"
:key="item._id"
:to="{
name: 'portal-category-details',
params: { portal: currentPortal, details: item.title },
query: categoryURLQuery(item),
}"
v-slot="{ navigate, href, isActive }"
custom
>
<li :class="isActive ? 'active' : null">
<a class="pointer">{{ item.title }}</a>
@@ -73,12 +116,20 @@
<!-- </li>-->
<!-- </ul>-->
<!-- recursive tree -->
<TreeItem :array="item.childs"/>
<TreeItem :array="item.childs" />
</div>
</li>
</nuxt-link>
<!-- ***************** dynamic routes ***************** -->
<nuxt-link :to="{name: 'portal-services' ,params: {portal: currentPortal}}" v-slot="{navigate,href,isActive}" custom>
<nuxt-link
:to="{
name: 'portal-services',
params: { portal: currentPortal },
}"
v-slot="{ navigate, href, isActive }"
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a :href="href">میز خدمت</a>
</li>
@@ -89,21 +140,23 @@
<ul class="tree">
<li class="treeItem">
<nuxt-link
:to="{
name: 'portal-gallery',
params: {portal: currentPortal},
query: {type:'image', page: 1}
}">
:to="{
name: 'portal-gallery',
params: { portal: currentPortal },
query: { type: 'image', page: 1 },
}"
>
عکس
</nuxt-link>
</li>
<li class="treeItem">
<nuxt-link
:to="{
name: 'portal-videos',
params: {portal: currentPortal},
query: {type:'video', page: 1}
}">
:to="{
name: 'portal-videos',
params: { portal: currentPortal },
query: { type: 'video', page: 1 },
}"
>
فیلم
</nuxt-link>
<!-- <nuxt-link-->
@@ -117,18 +170,17 @@
</li>
<li class="treeItem">
<nuxt-link
:to="{
name: 'portal-graphics',
params: {portal: currentPortal},
query: {type:'graphic', page: 1}
}">
:to="{
name: 'portal-graphics',
params: { portal: currentPortal },
query: { type: 'graphic', page: 1 },
}"
>
گرافیک
</nuxt-link>
</li>
<li class="treeItem">
<nuxt-link
to="/ostandari/digital-books"
>
<nuxt-link to="/ostandari/digital-books">
کتابخانه دیجیتال
</nuxt-link>
</li>
@@ -136,35 +188,70 @@
</div>
</li>
<nuxt-link
v-if="yearBanner.electionBtn"
:to="{name: 'portal',params: {portal: currentPortal === 'ostandari' ? 'election' : 'ostandari'}}"
v-slot="{navigate,href}"
custom
v-if="yearBanner.electionBtn"
:to="{
name: 'portal',
params: {
portal:
currentPortal === 'ostandari'
? 'election'
: 'ostandari',
},
}"
v-slot="{ navigate, href }"
custom
>
<li @click="navigate">
<a :href="href">{{ currentPortal === 'ostandari' ? 'ستاد انتخابات' : 'استانداری' }}</a>
<a :href="href">{{
currentPortal === "ostandari"
? "ستاد انتخابات"
: "استانداری"
}}</a>
</li>
</nuxt-link>
<nuxt-link :to="{name: 'portal-info-page', params:{portal: currentPortal,page: 'aboutState'}}" v-slot="{navigate,href,isActive}" custom
v-if="header.staticContents">
<nuxt-link
:to="{
name: 'portal-info-page',
params: { portal: currentPortal, page: 'aboutState' },
}"
v-slot="{ navigate, href, isActive }"
custom
v-if="header.staticContents"
>
<li :class="isActive ? 'active' : null">
<a class="pointer">درباره استان</a>
<div class="mega-menu">
<!-- item route -->
<ul class="tree">
<nuxt-link :to="{name: 'portal-info-page', params:{portal: currentPortal,page: 'sima'}}" v-slot="{navigate,href,isActive}" custom>
<li @click="navigate" :class="isActive ? 'active' : null" class="treeItem">
<a :href="href">
سیمای استان
</a>
<nuxt-link
:to="{
name: 'portal-info-page',
params: { portal: currentPortal, page: 'sima' },
}"
v-slot="{ navigate, href, isActive }"
custom
>
<li
@click="navigate"
:class="isActive ? 'active' : null"
class="treeItem"
>
<a :href="href"> سیمای استان </a>
</li>
</nuxt-link>
</ul>
</div>
</li>
</nuxt-link>
<nuxt-link :to="{name: 'portal-contact' ,params: {portal: currentPortal}}" v-slot="{navigate,href,isActive}" custom>
<nuxt-link
:to="{
name: 'portal-contact',
params: { portal: currentPortal },
}"
v-slot="{ navigate, href, isActive }"
custom
>
<li @click="navigate" :class="isActive ? 'active' : null">
<a :href="href">تماس با ما</a>
</li>
@@ -175,7 +262,11 @@
<div class="col-12 col-lg-2 left">
<ul>
<li class="searchBtns">
<i class="fal fa-search" v-if="!searching" @click="search(true)"></i>
<i
class="fal fa-search"
v-if="!searching"
@click="search(true)"
></i>
<i class="fal fa-times" v-else @click="search(false)"></i>
</li>
<li class="menu" @click="showOffCanvas">
@@ -185,12 +276,18 @@
</div>
</div>
</div>
<div class="searchBox" :class="searching? 'active-search' : null">
<div class="searchBox" :class="searching ? 'active-search' : null">
<div class="container">
<div class="row">
<div class="col-12">
<form @submit.prevent="doSearch" class="searchInput">
<input type="text" name="search" id="searchInput" placeholder="عبارت مدنظر خود را جستجو کنید" v-model="searchableText">
<input
type="text"
name="search"
id="searchInput"
placeholder="عبارت مدنظر خود را جستجو کنید"
v-model="searchableText"
/>
<button type="submit">
<i class="fas fa-arrow-circle-left"></i>
</button>
@@ -205,93 +302,110 @@
</template>
<script>
import moment from 'moment-jalaali'
import FlipCountdown from '~/components/vue2-flip-countdown.js'
import moment from "moment-jalaali";
import FlipCountdown from "~/components/vue2-flip-countdown.js";
export default {
name: "SiteHeader",
data() {
return {
searching: false,
searchableText: '',
searchableText: "",
date: Date.now(),
dialogTimeVisible: false,
showAlert: false
}
showAlert: false,
};
},
mounted() {
setInterval(() => this.date = Date.now(), 1000)
setInterval(() => (this.date = Date.now()), 1000);
$(window).scroll(() => {
if ($(window).scrollTop() > 300) $('.app-front').addClass('miniHeader')
if ($(window).scrollTop() < 290) $('.app-front').removeClass('miniHeader')
})
if ($(window).scrollTop() > 300) $(".app-front").addClass("miniHeader");
if ($(window).scrollTop() < 290)
$(".app-front").removeClass("miniHeader");
});
if (this.$route.name !== 'portal') {
if (this.$route.name !== "portal") {
(async () => {
try {
const homeData = await this.$axios.get(`/api/public/home?portal=${this.$route.params.portal}`, {progress: false})
this.$store.commit('front/setHomePageData', homeData.data)
const homeData = await this.$axios.get(
`/api/public/home?portal=${this.$route.params.portal}`,
{ progress: false }
);
this.$store.commit("front/setHomePageData", homeData.data);
} catch (e) {
console.log(e)
console.log(e);
}
})()
})();
}
},
components: {FlipCountdown},
components: { FlipCountdown },
computed: {
yearBanner() {
return this.$store.state.front.yearBanner
return this.$store.state.front.yearBanner;
},
currentPortal() {
return this.$route.params.portal
return this.$route.params.portal;
},
header() {
return this.$store.state.front.headerData
return this.$store.state.front.headerData;
},
jDate() {
return moment(this.date).locale('fa').format('dddd - LL - h:mm:ss ')
return moment(this.date).locale("fa").format("dddd - LL - h:mm:ss ");
},
counterDown() {
return this.$store.state.front.counterDown
return this.$store.state.front.counterDown;
},
counterDown1() {
return this.$store.state.front.counterDown.expireDate.split('T')
return this.$store.state.front.counterDown.expireDate.split("T");
},
homePageData() {
return this.$store.state.front.homePageData
return this.$store.state.front.homePageData;
},
},
methods: {
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
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;
},
showOffCanvas() {
this.$store.commit('front/setOffCanvas', true)
this.$store.commit("front/setOffCanvas", true);
},
search(status) {
this.searching = status
if (status) setTimeout(() => $('#searchInput').focus(), 100)
else this.searchableText = ''
this.searching = status;
if (status) setTimeout(() => $("#searchInput").focus(), 100);
else this.searchableText = "";
},
doSearch() {
if (this.searchableText.length) {
this.$router.push({name: 'portal-search', params: {portal: this.currentPortal}, query: {sq: this.searchableText}})
setTimeout(() => this.search(false), 100)
this.$router.push({
name: "portal-search",
params: { portal: this.currentPortal },
query: { sq: this.searchableText },
});
setTimeout(() => this.search(false), 100);
} else {
this.$message({
type: 'warning',
message: 'ابتدا عبارت مورد نظر را بنویسید'
})
type: "warning",
message: "ابتدا عبارت مورد نظر را بنویسید",
});
}
},
jDate2(e) {
return moment(e).locale('fa').fromNow(true)
}
}
}
return moment(e).locale("fa").fromNow(true);
},
},
};
</script>
<style scoped>
li:nth-child(6) {
display: none !important;
}
</style>
+120
View File
@@ -0,0 +1,120 @@
<template>
<div class="services-page">
<div class="container">
<div class="row">
<div class="col-12">
<LineTxt label="شفافیت" />
</div>
<div class="body">
<div class="main">
<div>
<img
class="tasvir"
src="../../../static/images/shafaf.jpg"
alt="logo"
/>
</div>
<div>
شفافیت سریع ترین، کم هزینه ترین، ساده ترین، مبنایی ترین و قابل
اعتمادترین سازوکار برای مبارزه با فساد)هم در پیشگیری و هم کشف
جرم(، افزایش مسئولیت پذیری و پاسخگویی، ارتقاء شایسته ساالری،
مشارکت فعال و مؤثر مردمی، کاهش هزینه و زمان در پیشگیری و مبارزه با
فساد، و در نتیجه افزایش کارآمدی و سرمایه اجتماعی است؛ با ایجاد
شفافیت می توان عدالت را مستقر کرد و از ایجاد تبعیض های ناروا در
نظام جلوگیری کرد.به همین جهت، سازمان فناوری اطالعات با همکاری
سازمان غیردولتی شفافیت برای ایران اقدام به تاسیس کمیته شفافیت
نموده است .پورتال شفافیت، اولین اقدام این استانداری در راستای
توسعه شفافیت است. این پورتال به صورت مستمر از نظر محتوا و بستر به
روز خواهد شد .
</div>
</div>
</div>
<div class="cards">
<div class="item">1</div>
<div class="item">1</div>
<div class="item">1</div>
<div class="item">1</div>
<div class="item">1</div>
<div class="item">1</div>
</div>
<div class="space"></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>
<style scoped>
.body {
display: flex;
justify-content: center;
}
.main {
width: 60%;
border: 1px solid rgb(224, 222, 222);
height: 280px;
color: rgb(94, 94, 94);
display: flex;
justify-content: space-between;
border-radius: 10px;
line-height: 25px;
padding: 10px;
align-items: center;
gap: 10px;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
.tasvir {
width: 230px;
height: 120px;
border-radius: 10px;
}
.cards {
margin: 50px 0px;
display: grid;
grid-template: 130px / auto auto auto auto auto auto;
gap: 10px;
}
.item {
background-color: aquamarine;
height: 200px;
border-radius: 10px;
}
.space {
height: 50px;
}
</style>
+1
View File
@@ -28,6 +28,7 @@ module.exports.sms = async (phoneNumber, message) => {
SendDateTime: "",
CanContinueInCaseOfError: "false",
};
const response = await axios.post(
`http://RestfulSms.com/api/MessageSend`,
data,
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB