完成搜索页面

This commit is contained in:
2021-11-27 11:05:29 +08:00
parent 84380ef55a
commit 6f4b7a7b02
19 changed files with 1174 additions and 599 deletions
+21 -22
View File
@@ -3,7 +3,7 @@
<router-view /> <router-view />
<van-tabbar v-if="showTabbar" class="tabbar" ref="tabbar" route active-color="#CF9E3B" inactive-color="#999"> <van-tabbar v-if="showTabbar" class="tabbar" ref="tabbar" route active-color="#CF9E3B" inactive-color="#999">
<van-tabbar-item replace v-for="(tab, index) in tabbar" :key="index" :to="tab.path"> <van-tabbar-item replace v-for="(tab, index) in tabbar" :key="index" :to="tab.path">
<span>{{tab.title}}</span> <span>{{ tab.title }}</span>
<template #icon="props"> <template #icon="props">
<img :src="props.active ? tab.active: tab.inactive" alt=""> <img :src="props.active ? tab.active: tab.inactive" alt="">
</template> </template>
@@ -13,49 +13,47 @@
</template> </template>
<script> <script>
import { tabbar } from '../src/router' import { tabbar } from '../src/router';
import { getWechatSign } from './api' import { getWechatSign } from './api';
import { signToWechat } from './common/wechat-web'; import { signToWechat } from './common/wechat-web';
export default { export default {
name: 'App', name: 'App',
data(){ data() {
return { return {
active: '3', active: '3',
tabbar tabbar
} };
}, },
provide(){ provide() {
return { return {
root: this, root: this,
tabbar: this.$refs.tabbar, tabbar: this.$refs.tabbar
} };
},
components: {
}, },
components: {},
beforeCreate: () => { beforeCreate: () => {
getWechatSign(location.href).then(res => { getWechatSign(location.href).then(res => {
signToWechat(res) signToWechat(res);
}) });
}, },
watch: { watch: {
'$route': { '$route': {
handler(val){ handler(val) {
console.log(val) this.active = tabbar.map(v => v.name).indexOf(val.name).toString();
this.active = tabbar.map(v => v.name).indexOf(val.name).toString()
} }
} }
}, },
computed: { computed: {
showTabbar(){ showTabbar() {
const path = tabbar.map(tab => tab.path); const path = tabbar.map(tab => tab.path);
return path.includes(this.$route.path) return path.includes(this.$route.path);
}, },
paddingBottom(){ paddingBottom() {
return this.showTabbar ? this.$refs.tabbar ? this.$refs.tabbar.$el.offsetHeight : 0 : 0 return this.showTabbar ? this.$refs.tabbar ? this.$refs.tabbar.$el.offsetHeight : 0 : 0;
} }
}, }
} };
</script> </script>
<style> <style>
@@ -70,7 +68,8 @@ export default {
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
} }
.tabbar{
.tabbar {
/* padding-top: .57rem; */ /* padding-top: .57rem; */
/* background: url('~@/assets/img/bg.png') top center no-repeat; */ /* background: url('~@/assets/img/bg.png') top center no-repeat; */
/* background-size: contain; */ /* background-size: contain; */
+5 -1
View File
@@ -114,7 +114,7 @@ const getDynamicDetail = (dynamic_id) => service.get(`/api/dynamic/detail?id=${d
const getCommonGoods = (temple_id, page, size = 10) => service.get(`/api/common/get-list?temple_id=${temple_id}&page=${page}&size=${size}`); const getCommonGoods = (temple_id, page, size = 10) => service.get(`/api/common/get-list?temple_id=${temple_id}&page=${page}&size=${size}`);
// 获取订单榜 // 获取订单榜
const getOrderCompare = (temple_id, type = '', goods_id = '', goods_type = '') => service.get(`/api/order/get-compare?temple_id=${temple_id}&type=${type}&goods_id=${goods_id}&goods_type=${goods_type}`); const getOrderCompare = (temple_id = '1', type = '', goods_id = '', goods_type = '') => service.get(`/api/order/get-compare?temple_id=${temple_id}&type=${type}&goods_id=${goods_id}&goods_type=${goods_type}`);
// 寺院列表 // 寺院列表
const getTempleList = (keywords = '', lng = '', lat = '', page = 1, size = 10) => service.get(`/api/temple/get-List?keywords=${keywords}&lng=${lng}&lat=${lat}&page=${page}&size=${size}`) const getTempleList = (keywords = '', lng = '', lat = '', page = 1, size = 10) => service.get(`/api/temple/get-List?keywords=${keywords}&lng=${lng}&lat=${lat}&page=${page}&size=${size}`)
@@ -131,7 +131,11 @@ const getCustomerList = () => service.get(`/api/customer/get-list`);
// 功德证书 // 功德证书
const getCertList = () => service.get(`/api/user/get-cert-list`); const getCertList = () => service.get(`/api/user/get-cert-list`);
// 热门搜索
const getHotWords = () => service.get(`/api/keywords/get-list`);
export { export {
getHotWords,
getMonkAppellation, getMonkAppellation,
getRegion, getRegion,
postTemple, postTemple,
+3 -1
View File
@@ -27,6 +27,7 @@ import {
Switch, Switch,
Cascader, Cascader,
ActionSheet, ActionSheet,
ShareSheet,
Dialog Dialog
} from "vant"; } from "vant";
@@ -35,8 +36,9 @@ Vue.use(NavBar);
Vue.use(Search); Vue.use(Search);
Vue.use(Swipe); Vue.use(Swipe);
Vue.use(SwipeItem); Vue.use(SwipeItem);
Vue.use(Grid);
Vue.use(GridItem); Vue.use(GridItem);
Vue.use(Grid);
Vue.use(ShareSheet);
Vue.use(NoticeBar); Vue.use(NoticeBar);
Vue.use(Tabbar); Vue.use(Tabbar);
Vue.use(TabbarItem); Vue.use(TabbarItem);
+65 -28
View File
@@ -1,39 +1,44 @@
let wechatInstance; let wechatInstance;
function signToWechat(config){ function signToWechat(config) {
if(!wx){ if (!wx) {
console.warn('请安装微信网页JS-SDK, url: https://res2.wx.qq.com/open/js/jweixin-1.6.0.js'); console.warn('请安装微信网页JS-SDK, url: https://res2.wx.qq.com/open/js/jweixin-1.6.0.js');
} }
const defaultConfig = { const defaultConfig = {
debug: true,
}
return new Promise((resolve) => {
wx.config({
...defaultConfig,
debug: true,
...config, ...config,
}) jsApiList: [
wx.ready(function(){ 'onMenuShareTimeline',
console.warn('wechat sdk config success') 'onMenuShareAppMessage',
'scanQRCode',
'getLocation',
'openLocation',
'updateAppMessageShareData',
'updateTimelineShareData'
],
};
return new Promise((resolve) => {
console.log('defaultConfig', defaultConfig);
wx.config(defaultConfig);
wx.ready(function() {
console.warn('wechat sdk config success');
wechatInstance = wx; wechatInstance = wx;
resolve(wx) resolve(wx);
}) });
}) });
} }
function getLocation(){ function getLocation() {
return new Promise(resolve => { return new Promise(resolve => {
wechatInstance.getLocation({ wechatInstance.getLocation({
type: 'wgs84', type: 'wgs84',
success: res => { success: res => {
resolve(res) resolve(res);
} }
}) });
}) });
} }
function requestPayment(paymentConfig){ function requestPayment(paymentConfig) {
return new Promise(resolve => { return new Promise(resolve => {
wechatInstance.chooseWXPay({ wechatInstance.chooseWXPay({
timestamp: paymentConfig.timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 timestamp: paymentConfig.timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
@@ -41,18 +46,50 @@ function requestPayment(paymentConfig){
package: paymentConfig.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) package: paymentConfig.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: paymentConfig.signType, // 微信支付V3的传入RSA,微信支付V2的传入格式与V2统一下单的签名格式保持一致 signType: paymentConfig.signType, // 微信支付V3的传入RSA,微信支付V2的传入格式与V2统一下单的签名格式保持一致
paySign: paymentConfig.paySign, // 支付签名 paySign: paymentConfig.paySign, // 支付签名
success: function (res) { success: function(res) {
// 支付成功后的回调函数 // 支付成功后的回调函数
resolve(res) resolve(res);
}, },
fail(res){ fail(res) {
alert(JSON.stringify(res)) alert(JSON.stringify(res));
} }
}); });
}) });
} }
function openLocation(config){ function openLocation(config) {
return wechatInstance.openLocation(config) return wechatInstance.openLocation(config);
} }
export { signToWechat, getLocation, requestPayment, openLocation };
// 分享给朋友
function updateAppMessageShareData(title = '', desc = '', link = '', imgUrl = '') {
return new Promise((resolve) => {
wechatInstance.updateAppMessageShareData({
title,
desc,
link,
imgUrl,
complete: res => {
resolve(res);
}
});
});
}
// 分享到朋友圈
function updateTimelineShareData(title = '', desc = '', link = '', imgUrl = '') {
return new Promise((resolve) => {
wechatInstance.updateTimelineShareData({
title,
desc,
link,
imgUrl,
complete: res => {
resolve(res);
}
});
});
}
export { signToWechat, getLocation, requestPayment, openLocation, updateAppMessageShareData, updateTimelineShareData };
+17 -13
View File
@@ -3,17 +3,17 @@
<div class="head"> <div class="head">
<span class="title">感恩功德</span> <span class="title">感恩功德</span>
<div class="list"> <div class="list">
<span :class="[nav.id === type_id && 'current']" v-for="nav in type_nav" :key="nav.id" >{{ nav.title }}</span> <span :class="[nav.id === type_id && 'current']" v-for="nav in type_nav" :key="nav.id" @click="onSetType(nav)">{{ nav.title }}</span>
</div> </div>
</div> </div>
<div class="body"> <div class="body">
<swiper :options="swiperOptions"> <div :options="swiperOptions">
<swiper-slide v-for="slide in type_nav" :key="slide.id"> <div v-for="slide in type_nav" :key="slide.id">
<scroll-view> <div v-if="type_id === slide.id">
<user-merit v-for="dynamic in slide.list" :key="dynamic.id" :data="dynamic" ></user-merit> <user-merit v-for="dynamic in slide.list" :key="dynamic.id" :data="dynamic" ></user-merit>
</scroll-view> </div>
</swiper-slide> </div>
</swiper> </div>
<div class="thanks-more" @click="onThankMore">查看更多</div> <div class="thanks-more" @click="onThankMore">查看更多</div>
</div> </div>
</div> </div>
@@ -48,10 +48,11 @@ export default {
{ id: 3, title: "总榜", list: [] }, { id: 3, title: "总榜", list: [] },
], ],
swiperOptions: { swiperOptions: {
onSlideChangeEnd: ({realIndex}) => {
this.type_id = this.type_nav[realIndex].id; // onSlideChangeEnd: ({realIndex}) => {
this.getOrderCompare(); // this.type_id = this.type_nav[realIndex].id;
} // this.getOrderCompare();
// }
} }
} }
}, },
@@ -59,9 +60,12 @@ export default {
this.getOrderCompare(); this.getOrderCompare();
}, },
methods: { methods: {
onSetType(type){
this.type_id = type.id;
this.getOrderCompare();
},
async getOrderCompare(){ async getOrderCompare(){
const res = await getOrderCompare(this.templeId, this.type_id, this.goodsId, this.goodsType) const res = await getOrderCompare(this.templeId || '1', this.type_id, this.goodsId, this.goodsType)
console.log(res)
const current = this.type_nav.find(item => item.id === this.type_id); const current = this.type_nav.find(item => item.id === this.type_id);
current.list = res.list current.list = res.list
}, },
+1 -1
View File
@@ -12,7 +12,7 @@
<div class="bar"> <div class="bar">
<span class="join">已有{{ privateData.sales }}人参与</span> <span class="join">已有{{ privateData.sales }}人参与</span>
<div class="btn-group"> <div class="btn-group">
<span class="btn" :class="[privateData.is_collected === 1 ? 'collect' : 'un-collect']" @click.stop="onCollect"> <span class="btn" :class="[privateData.is_collected === 1 || privateData.collect === 1 ? 'collect' : 'un-collect']" @click.stop="onCollect">
<i class="iconfont icon-guanzhu-yiguanzhu"></i> <i class="iconfont icon-guanzhu-yiguanzhu"></i>
<b>关注</b> <b>关注</b>
</span> </span>
+8 -4
View File
@@ -1,5 +1,5 @@
<template> <template>
<div class="user-merit border-bottom" v-if="data"> <div class="user-merit border-bottom" v-if="data && data.user_info">
<img <img
:src="data.user_info.avatar" :src="data.user_info.avatar"
alt="" alt=""
@@ -10,7 +10,7 @@
<span>{{data.user_info.nickname}}</span> <span>{{data.user_info.nickname}}</span>
<span>{{data.user_info.region}}</span> <span>{{data.user_info.region}}</span>
</div> </div>
<p>{{data.goods_name}}</p> <p class="goods_name">{{data.goods_name}}</p>
</div> </div>
</div> </div>
<div class="result"> <div class="result">
@@ -27,7 +27,7 @@ export default {
}; };
</script> </script>
<style lang="scss"> <style lang="scss" scoped>
.user-merit { .user-merit {
display: flex; display: flex;
padding: .27rem 0.4rem; padding: .27rem 0.4rem;
@@ -58,8 +58,12 @@ export default {
display: inline-block; display: inline-block;
} }
} }
p { p.goods_name{
font-size: 0.32rem; font-size: 0.32rem;
max-width: 4rem;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
} }
} }
.result { .result {
+1
View File
@@ -8,6 +8,7 @@ import '@/assets/js/flexable.js';
import './common/vant'; import './common/vant';
import './components/index' import './components/index'
import 'swiper/css/swiper.css' import 'swiper/css/swiper.css'
Vue.mixin(globalMixin) Vue.mixin(globalMixin)
Vue.config.productionTip = false Vue.config.productionTip = false
Vue.prototype.$delay = delay; Vue.prototype.$delay = delay;
+32 -2
View File
@@ -1,7 +1,7 @@
<template> <template>
<div class="process-detail-wrapper" v-if="data"> <div class="process-detail-wrapper" v-if="data">
<div class="process-detail"> <div class="process-detail">
<h1 class="title">{{ data.title }} </h1> <h1 class="title">{{ data.title }} 123456</h1>
<p class="date">{{ data.time || data.date }}</p> <p class="date">{{ data.time || data.date }}</p>
<p class="desc">{{ data.description }}</p> <p class="desc">{{ data.description }}</p>
@@ -19,24 +19,37 @@
<i class="iconfont icon-guanzhu-yiguanzhu"></i> <i class="iconfont icon-guanzhu-yiguanzhu"></i>
<b>关注</b> <b>关注</b>
</span> </span>
<span class="btn"> <span class="btn" @click="onShare">
<i class="iconfont icon-zhuanfa"></i> <i class="iconfont icon-zhuanfa"></i>
<b>转发</b> <b>转发</b>
</span> </span>
</div> </div>
</div> </div>
</div> </div>
<van-share-sheet
v-model="showShare"
title="立即分享给好友"
:options="options"
@select="onSelect"
/>
</div> </div>
</template> </template>
<script> <script>
import { getDynamicDetail, toggleCollect } from '@/api'; import { getDynamicDetail, toggleCollect } from '@/api';
import { updateAppMessageShareData, updateTimelineShareData } from '@/common/wechat-web';
export default { export default {
name: 'buddha-detail', name: 'buddha-detail',
data() { data() {
return { return {
data: null, data: null,
showShare: false,
options: [
{ name: '微信', icon: 'wechat' },
{ name: '朋友圈', icon: 'wechat-moments' },
],
}; };
}, },
computed: { computed: {
@@ -51,6 +64,22 @@ export default {
this.getDynamicDetail(); this.getDynamicDetail();
}, },
methods: { methods: {
onShare(){
this.showShare = true;
},
onSelect(option) {
this.showShare = false;
if(option.icon === 'wechat'){
updateAppMessageShareData(this.data.title, this.data.description, location.href, this.data.covers[0]).then(result => {
console.log('result', result)
})
}
if(option.icon === 'wechat-moments'){
updateTimelineShareData(this.data.title, this.data.description, location.href, this.data.covers[0]).then(result => {
console.log('result', result)
})
}
},
async getDynamicDetail(){ async getDynamicDetail(){
const data = await getDynamicDetail(this.$route.query.id); const data = await getDynamicDetail(this.$route.query.id);
this.data = data; this.data = data;
@@ -74,6 +103,7 @@ export default {
display: flex; display: flex;
position: relative; position: relative;
padding: .5rem .4rem env(safe-area-inset-bottom) .4rem; padding: .5rem .4rem env(safe-area-inset-bottom) .4rem;
margin-bottom: 1rem;
&::after { &::after {
content: ''; content: '';
height: 1px; height: 1px;
-1
View File
@@ -166,7 +166,6 @@ export default {
title = '添砖加瓦' title = '添砖加瓦'
} }
document.title = title; document.title = title;
console.log( JSON.stringify(query))
for(let i in query){ for(let i in query){
query[i] = query[i].toString() query[i] = query[i].toString()
} }
+3 -1
View File
@@ -200,7 +200,7 @@ export default {
this.listType = lType.id; this.listType = lType.id;
const res = await getOrderCompare(this.query.temple_id, this.listType, this.query.goods_id, 3 ); const res = await getOrderCompare(this.query.temple_id, this.listType, this.query.goods_id, 3 );
console.log('pay record', res) console.log('pay record', res)
this.payList = res.results; this.payList = res.list;
}, },
} }
} }
@@ -217,6 +217,7 @@ export default {
} }
} }
.support{ .support{
margin-bottom: .5rem;
.support-head{ .support-head{
padding: 0 .4rem; padding: 0 .4rem;
display: flex; display: flex;
@@ -307,6 +308,7 @@ export default {
margin-right: auto; margin-right: auto;
border: .01rem solid $primary-color; border: .01rem solid $primary-color;
border-radius: .13rem; border-radius: .13rem;
margin-bottom: .3rem;
} }
.caret-spec{ .caret-spec{
.head{ .head{
+2 -2
View File
@@ -58,7 +58,7 @@
</div> </div>
</div> </div>
<div class="divider"></div> <div class="divider"></div>
<thanks-giving :temple-id="query.temple_id"></thanks-giving> <thanks-giving :temple-id="query.temple_id || '1' "></thanks-giving>
</div> </div>
</div> </div>
</template> </template>
@@ -102,7 +102,7 @@ export default {
}, },
onSearch() { onSearch() {
this.$router.push({ this.$router.push({
name: 'temple-list', name: 'search',
query: {}, query: {},
}); });
}, },
+5 -2
View File
@@ -90,7 +90,7 @@ export default {
}, },
async getMeritBox(){ async getMeritBox(){
const current = this.nav.find(item => item.id === this.type_id); const current = this.nav.find(item => item.id === this.type_id);
const res = await getMeritBox(this.query.temple_id, current.id, current.page, current.size); const res = await getMeritBox(this.query.temple_id || '1', current.id, current.page, current.size);
this.info = res.merit_box_info; this.info = res.merit_box_info;
// this.list = res.merit_box_order.list; // this.list = res.merit_box_order.list;
current.list = res.merit_box_order.list current.list = res.merit_box_order.list
@@ -112,8 +112,9 @@ export default {
query: { query: {
...this.$route.query, ...this.$route.query,
title: '功德箱/供奉', title: '功德箱/供奉',
subTitle: '', subTitle: '随喜',
amount: obj.money, amount: obj.money,
quantity: 1,
from: 'meritBox', // 标识为功德箱 from: 'meritBox', // 标识为功德箱
} }
}) })
@@ -181,6 +182,7 @@ export default {
background: white; background: white;
padding: .4rem 0; padding: .4rem 0;
border-top: .01rem solid #ddd; border-top: .01rem solid #ddd;
padding-bottom: calc(env(safe-area-inset-bottom) + 0rem);
.merit-button{ .merit-button{
display: inline-block; display: inline-block;
background: $primary-color; background: $primary-color;
@@ -190,6 +192,7 @@ export default {
padding: 0 .53rem; padding: 0 .53rem;
border: .01rem solid $primary-color; border: .01rem solid $primary-color;
border-radius: $btn-border-radius; border-radius: $btn-border-radius;
} }
} }
} }
+1 -4
View File
@@ -24,10 +24,7 @@
</ul> </ul>
</div> </div>
<div> <div>
<user-merit></user-merit>
<user-merit></user-merit>
<user-merit></user-merit>
<user-merit></user-merit>
</div> </div>
</div> </div>
<div class="merit-button-group"> <div class="merit-button-group">
+27 -2
View File
@@ -1,6 +1,9 @@
<template> <template>
<div class="pay-result"> <div class="pay-result">
<div class="cert-show"></div> <div class="cert-show">
<img :src="src">
<span class="long-press">长按图片保存到手机</span>
</div>
<div class="pay-info"> <div class="pay-info">
<span> <span>
<i class="iconfont icon-zhifuchenggong"></i> <i class="iconfont icon-zhifuchenggong"></i>
@@ -15,7 +18,13 @@
</template> </template>
<script> <script>
export default {}; export default {
computed: {
src(){
return `https://wdx-temple.oss-cn-hangzhou.aliyuncs.com/uploads/merit/certificate/66.jpg`
}
}
};
</script> </script>
<style lang="scss"> <style lang="scss">
@@ -23,6 +32,22 @@ export default {};
.cert-show { .cert-show {
height: 70vh; height: 70vh;
background: #f5f5f5; background: #f5f5f5;
display: flex;
justify-content: center;
align-items: center;
padding: .2rem;
position: relative;
img{
max-width: 90%;
max-height: 100%;
display: inline-block;
}
.long-press{
position: absolute;
font-size: .3rem;
bottom: .1rem;
color: #999;
}
} }
.pay-info{ .pay-info{
text-align: center; text-align: center;
+88 -19
View File
@@ -3,7 +3,7 @@
<form action="/"> <form action="/">
<van-search <van-search
v-model="value" v-model="value"
show-action :show-action="showAction"
placeholder="请输入搜索关键词" placeholder="请输入搜索关键词"
@search="onSearch" @search="onSearch"
@cancel="onCancel" @cancel="onCancel"
@@ -12,46 +12,100 @@
<div class="search-history"> <div class="search-history">
<h1 class="title">热门搜索</h1> <h1 class="title">热门搜索</h1>
<div class="search-text-group"> <div class="search-text-group">
<span class="search-text">放生修福<i class="iconfont icon-hotfill"></i></span> <span class="search-text"
<span class="search-text">在宮腔佛</span> v-for="(hot, index) in hotWords"
<span class="search-text">在宮腔</span> :key="index"
<span class="search-text">在宮腔</span> @click="onHotSearch(hot)"
<span class="search-text">在宮腔</span> >{{hot.keywords}}<i class="iconfont icon-hotfill"></i></span>
<span class="search-text">在宮腔</span>
</div> </div>
</div> </div>
<div class="search-history"> <div class="search-history">
<div class="flex"> <div class="flex">
<h1 class="title">历史记录</h1> <h1 class="title">历史记录</h1>
<span> <span @click="clearHistory">
<i class="iconfont icon-delete"></i> <i class="iconfont icon-delete"></i>
</span> </span>
</div> </div>
<div class="search-text-group"> <div class="search-text-group">
<span class="search-text">放生修福</span> <span class="search-text" v-for="(history, index) in historyList" :key="index" @click="onHistorySearch(history)">{{history}}</span>
<span class="search-text">在宮腔佛</span>
<span class="search-text">在宮腔</span>
<span class="search-text">在宮腔</span>
<span class="search-text">在宮腔</span>
<span class="search-text">在宮腔</span>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { getHotWords } from '@/api';
const sessionStorageKey = 'searchHistory';
export default { export default {
data(){ data(){
return { return {
value: '', value: '',
hotWords: [],
historyList: [],
} }
}, },
computed: {
showAction(){
return this.value !== '';
}
},
mounted() {
this.getHotWords();
this.setHistoryList()
},
methods: { methods: {
async getHotWords(){
const res = await getHotWords();
this.hotWords = res.hot_data;
},
setHistoryList(){
const sessionStore = sessionStorage.getItem(sessionStorageKey);
this.historyList = sessionStore ? JSON.parse(sessionStore) : [];
},
onHotSearch({keywords}){
this.value = keywords;
this.onSearch();
},
onHistorySearch(keyword){
this.value = keyword;
this.onSearch();
},
onSearch(){ onSearch(){
const sessionStore = sessionStorage.getItem(sessionStorageKey);
let searchHistory = sessionStore ? JSON.parse(sessionStore) : [];
if(!searchHistory.includes(this.value)){
searchHistory.unshift(this.value)
} else {
// 历史记录关键词置顶
const topKey = searchHistory.splice(searchHistory.indexOf(this.value), 1);
searchHistory = [...topKey, ...searchHistory]
}
sessionStorage.setItem(sessionStorageKey, JSON.stringify(searchHistory));
this.setHistoryList();
this.$router.push({
name: 'temple-list',
query: { search: this.value }
})
this.value = '';
},
confirmDeleteHistory(){
return new Promise(resolve => {
this.$dialog.confirm({
title: '删除确认',
message: '是否删除当前历史记录?'
}).then(() => {
resolve();
})
})
},
async clearHistory(){
if(!this.historyList.length) return;
await this.confirmDeleteHistory();
sessionStorage.setItem(sessionStorageKey, JSON.stringify([]));
this.setHistoryList();
}, },
onCancel(){ onCancel(){
this.value = ''
} }
} }
}; };
@@ -61,29 +115,44 @@ export default {
.search-history{ .search-history{
padding: 0 .4rem; padding: 0 .4rem;
margin-bottom: .53rem; margin-bottom: .53rem;
margin-top: .5rem;
.title{ .title{
font-size: .4rem; font-size: .4rem;
color: #222; color: #222;
margin-bottom: .3rem;
} }
.flex{ .flex{
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-bottom: .6rem;
.title{
margin-bottom: 0;
}
span{
display: inline-flex;
}
} }
.search-text-group{ .search-text-group{
.search-text{ .search-text{
font-size: .37rem; font-size: .35rem;
color: #222; color: #222;
display: inline-block; display: inline-block;
padding: .16rem .27rem; padding: .2rem .27rem;
border: .01rem solid #ddd; border: .01rem solid #ddd;
border-radius: .11rem; border-radius: .11rem;
margin-right: .4rem; margin-right: .2rem;
margin-bottom: .2rem;
height: .9rem;
line-height: .5rem;
box-sizing: border-box;
vertical-align: top;
} }
.iconfont{ .iconfont{
display: inline-block; display: inline-block;
color: red; color: red;
margin-left: .13rem; margin-left: .13rem;
font-size: .35rem;
} }
} }
} }
+174 -108
View File
@@ -1,10 +1,10 @@
<template> <template>
<div class="temple-home-page" v-if="data"> <div class="temple-home-page" v-if="data">
<div class="temple-home"> <div class="temple-home">
<span class="temple-name">{{data.temple_data.unit_name}}</span> <span class="temple-name">{{ data.temple_data.unit_name }}</span>
<div class="visitor"> <div class="visitor">
<span>{{data.temple_data.region}}</span> <span>{{ data.temple_data.region }}</span>
<span>{{data.temple_data.visit}}到访</span> <span>{{ data.temple_data.visit }}到访</span>
</div> </div>
</div> </div>
<div class="certed-temple" @click="$router.push({name: 'temple-detail', query: { temple_id: query.temple_id}})"> <div class="certed-temple" @click="$router.push({name: 'temple-detail', query: { temple_id: query.temple_id}})">
@@ -29,15 +29,22 @@
</van-grid> </van-grid>
</van-swipe-item> </van-swipe-item>
</van-swipe> </van-swipe>
<user-dynamic></user-dynamic> <div class="user-dynamic-container" v-if="data.order_data.length > 0">
<van-swipe vertical loop :autoplay="3000" :touchable="false">
<van-swipe-item v-for="order in data.order_data" :key="order.id">
<user-dynamic :data="order"></user-dynamic>
</van-swipe-item>
</van-swipe>
</div>
</div> </div>
<div class="divider"></div> <div class="divider"></div>
<div class="temple-manager"> <div class="temple-manager">
<div class="manager" v-for="manager in data.member_data" :key="manager.id" @click="$router.push({ name: 'monk', query: { master_id: manager.id }})"> <div class="manager" v-for="manager in data.member_data" :key="manager.id"
@click="$router.push({ name: 'monk', query: { master_id: manager.id }})">
<img class="avatar" :src="manager.avatar_url" alt=""> <img class="avatar" :src="manager.avatar_url" alt="">
<div class="manager-container"> <div class="manager-container">
<h3 class="name">{{manager.title}}</h3> <h3 class="name">{{ manager.title }}</h3>
<p class="content"> <p class="content">
<span v-html="manager.description"></span> <span v-html="manager.description"></span>
</p> </p>
@@ -50,20 +57,14 @@
<arrow-more></arrow-more> <arrow-more></arrow-more>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div class="merit-group"> <van-swipe class="merit-group" :width="140" :loop="false" :show-indicators="false">
<div class="merit"> <van-swipe-item v-for="goods in data.common_data" :key="goods.id">
<img src="https://img0.baidu.com/it/u=4049979356,2546472874&fm=26&fmt=auto" alt=""> <div class="merit" @click="onToGoods(goods)">
<p class="title">为佛像贴金身,菩萨菩萨</p> <img :src="goods.cover_url" alt="" />
</div> <p class="title">{{ goods.alias }}</p>
<div class="merit">
<img src="https://img0.baidu.com/it/u=4049979356,2546472874&fm=26&fmt=auto" alt="">
<p class="title">为佛像贴金身,菩萨菩萨</p>
</div>
<div class="merit">
<img src="https://img0.baidu.com/it/u=4049979356,2546472874&fm=26&fmt=auto" alt="">
<p class="title">为佛像贴金身,菩萨菩萨</p>
</div>
</div> </div>
</van-swipe-item>
</van-swipe>
</div> </div>
</div> </div>
<div class="divider"></div> <div class="divider"></div>
@@ -90,12 +91,7 @@
</div> </div>
</div> </div>
<div class="body"> <div class="body">
<user-merit></user-merit>
<user-merit></user-merit>
<user-merit></user-merit>
<user-merit></user-merit>
<user-merit></user-merit>
<user-merit></user-merit>
</div> </div>
</div> </div>
</div> </div>
@@ -106,28 +102,28 @@
</div> </div>
<van-popup v-model="showUserMenu" position="left" style="width: 80%; height: 100%"> <van-popup v-model="showUserMenu" position="left" style="width: 80%; height: 100%">
<div class="user-menu"> <div class="user-menu" v-if="user">
<div class="user"> <div class="user">
<img class="avatar" src="https://img1.baidu.com/it/u=3715184423,1831753068&fm=26&fmt=auto" alt=""> <img class="avatar" :src="user.avatar" alt="">
<div class="profile"> <div class="profile">
<h5 class="name">奔跑</h5> <h5 class="name">{{user.nickname}}</h5>
<p class="account">用户号: 1452134</p> <p class="account">用户号: {{user.account_no}}</p>
</div> </div>
</div> </div>
<ul class="user-list"> <ul class="user-list">
<li> <li @click="onPushForRouteName('user-order')">
<img src="@/assets/img/user-popup/我的善缘.png" alt=""> <img src="@/assets/img/user-popup/我的善缘.png" alt="">
<span>我的善缘</span> <span>我的善缘</span>
</li> </li>
<li> <li @click="onPushForRouteName('user-customer')">
<img src="@/assets/img/user-popup/联系客服.png" alt=""> <img src="@/assets/img/user-popup/联系客服.png" alt="">
<span>联系客服</span> <span>联系客服</span>
</li> </li>
<li> <li @click="onPushForRouteName('merit-box')">
<img src="@/assets/img/user-popup/功德箱.png" alt=""> <img src="@/assets/img/user-popup/功德箱.png" alt="">
<span>功德箱</span> <span>功德箱</span>
</li> </li>
<li> <li @click="onPushForRouteName('temple-list')">
<img src="@/assets/img/user-popup/查看更多寺院.png" alt=""> <img src="@/assets/img/user-popup/查看更多寺院.png" alt="">
<span>查看更多寺院</span> <span>查看更多寺院</span>
</li> </li>
@@ -141,48 +137,68 @@
</template> </template>
<script> <script>
import { getTempleIndex } from "@/api" import { getTempleIndex, getUserData } from '@/api';
export default { export default {
data(){ data() {
return { return {
query: this.$route.query, query: this.$route.query,
showUserMenu: false, showUserMenu: false,
data: null data: null,
} user: null,
};
}, },
mounted(){ mounted() {
this.getTempleIndex(); this.getTempleIndex();
this.getUserData();
}, },
methods: { methods: {
async getTempleIndex(){ onPushForRouteName(routeName){
this.$router.push({ name: routeName })
},
async getUserData(){
const res = await getUserData();
console.log(res);
this.user = res;
},
onToGoods(goods) {
this.$router.push({
name: 'goods-detail',
query: {
goods_id: goods.goods_id,
temple_id: goods.temple_id
}
});
},
async getTempleIndex() {
const res = await getTempleIndex(this.query.temple_id); const res = await getTempleIndex(this.query.temple_id);
this.data = res; this.data = res;
this.data.icon_data = this.sliceNav(res.icon_data) this.data.icon_data = this.sliceNav(res.icon_data);
}, },
sliceNav(navData){ sliceNav(navData) {
const nav = []; const nav = [];
const slice = 8; const slice = 8;
for(let i = 0; i < Math.ceil(navData.length / slice); i++){ for (let i = 0; i < Math.ceil(navData.length / slice); i++) {
const b = navData.slice(i * slice, i * slice + slice); const b = navData.slice(i * slice, i * slice + slice);
nav.push(b) nav.push(b);
} }
return nav; return nav;
}, },
onMoreDynamic(){ onMoreDynamic() {
this.$router.push({ name: 'buddha-activity'}) this.$router.push({ name: 'buddha-activity' });
} }
} }
} };
</script> </script>
<style lang="scss" scope> <style lang="scss" scope>
.van-nav-bar__title{ .van-nav-bar__title {
color: white; color: white;
} }
.van-popup{
.put-away{ .van-popup {
.put-away {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
left: 0; left: 0;
@@ -191,56 +207,66 @@ export default {
line-height: 1.3rem; line-height: 1.3rem;
border-top: 1px solid #f1f1f1; border-top: 1px solid #f1f1f1;
text-align: right; text-align: right;
.iconfont{
.iconfont {
font-size: .8rem; font-size: .8rem;
} }
} }
} }
.user-menu{
.user{ .user-menu {
.user {
margin-top: 1.33rem; margin-top: 1.33rem;
display: flex; display: flex;
padding-left: 1rem; padding-left: 1rem;
align-items: center; align-items: center;
.avatar{
.avatar {
width: 1.33rem; width: 1.33rem;
height: 1.33rem; height: 1.33rem;
border-radius: 1.33rem; border-radius: 1.33rem;
margin-right: .4rem; margin-right: .4rem;
} }
.profile{
.name{ .profile {
.name {
font-size: .4rem; font-size: .4rem;
color: #666; color: #666;
} }
.account{
.account {
margin-top: .2rem; margin-top: .2rem;
color: #666; color: #666;
font-size: .3rem; font-size: .3rem;
} }
} }
} }
.user-list{
.user-list {
padding-left: 1rem; padding-left: 1rem;
margin-top: 1rem; margin-top: 1rem;
margin-right: .6rem; margin-right: .6rem;
li{
li {
height: 1.2rem; height: 1.2rem;
line-height: 1.2rem; line-height: 1.2rem;
font-size: .4rem; font-size: .4rem;
display: flex; display: flex;
align-items: center; align-items: center;
img{
img {
width: .8rem; width: .8rem;
margin-right: .27rem; margin-right: .27rem;
} }
& ~ li{
& ~ li {
border-top: 1px solid #ddd; border-top: 1px solid #ddd;
} }
} }
} }
} }
.panel-menu-btn{
.panel-menu-btn {
position: fixed; position: fixed;
left: .53rem; left: .53rem;
bottom: 1.33rem; bottom: 1.33rem;
@@ -254,21 +280,24 @@ export default {
background: #f1f1f1; background: #f1f1f1;
border: 1px solid #ddd; border: 1px solid #ddd;
border-radius: 50%; border-radius: 50%;
.menu-text{
.menu-text {
font-size: .27rem; font-size: .27rem;
margin-top: .1rem; margin-top: .1rem;
} }
} }
.temple-manager{ .temple-manager {
.manager{ .manager {
display: flex; display: flex;
margin: .4rem; margin: .4rem;
& ~ .manager{
& ~ .manager {
border-top: 1px solid #ddd; border-top: 1px solid #ddd;
padding-top: .4rem; padding-top: .4rem;
} }
.avatar{
.avatar {
width: 1rem; width: 1rem;
height: 1rem; height: 1rem;
border-radius: 1.33rem; border-radius: 1.33rem;
@@ -276,15 +305,18 @@ export default {
vertical-align: top; vertical-align: top;
} }
.manager-container{
.manager-container {
flex: 1; flex: 1;
margin-left: .4rem; margin-left: .4rem;
.name{
.name {
padding: .3rem .3rem .3rem 0; padding: .3rem .3rem .3rem 0;
font-size: .4rem; font-size: .4rem;
color: #666; color: #666;
} }
.content{
.content {
font-size: .35rem; font-size: .35rem;
line-height: 1.5; line-height: 1.5;
display: -webkit-box; display: -webkit-box;
@@ -301,19 +333,23 @@ export default {
} }
} }
.merit-rank-container{
.head{ .merit-rank-container {
.head {
padding: .53rem .4rem; padding: .53rem .4rem;
padding-bottom: .13rem; padding-bottom: .13rem;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
.title{
.title {
font-size: .43rem; font-size: .43rem;
color: #222222; color: #222222;
} }
.list{
.list {
display: flex; display: flex;
span{
span {
font-size: .37rem; font-size: .37rem;
color: #999999; color: #999999;
display: inline-block; display: inline-block;
@@ -321,32 +357,39 @@ export default {
border-bottom: .03rem solid transparent; border-bottom: .03rem solid transparent;
padding-bottom: .13rem; padding-bottom: .13rem;
} }
span.current{
span.current {
color: #222; color: #222;
border-bottom-color: rgb(168, 28, 28); border-bottom-color: rgb(168, 28, 28);
} }
} }
} }
} }
.grid-nav{
.grid-nav {
margin-bottom: .8rem; margin-bottom: .8rem;
.nav-icon{
.nav-icon {
width: 1.07rem; width: 1.07rem;
height: 1.07rem; height: 1.07rem;
} }
.van-swipe__indicators{
.van-swipe__indicators {
bottom: 0; bottom: 0;
.van-swipe__indicator{
.van-swipe__indicator {
width: 20px; width: 20px;
height: 2px; height: 2px;
border-radius: 10px; border-radius: 10px;
} }
.van-swipe__indicator--active{
.van-swipe__indicator--active {
background: $primary-color; background: $primary-color;
} }
} }
} }
.certed-temple{
.certed-temple {
display: flex; display: flex;
border: 1px solid $primary-color; border: 1px solid $primary-color;
border-radius: 4px; border-radius: 4px;
@@ -355,82 +398,98 @@ export default {
font-size: .37rem; font-size: .37rem;
padding: .3rem; padding: .3rem;
margin-bottom: .2rem; margin-bottom: .2rem;
.cert-icon{
.cert-icon {
width: .3rem; width: .3rem;
margin-right: .1rem; margin-right: .1rem;
} }
.text{
.text {
flex: 1; flex: 1;
font-size: .3rem; font-size: .3rem;
color: #888; color: #888;
padding-top: 2px; padding-top: 2px;
} }
.btn{
.btn {
color: $primary-color; color: $primary-color;
} }
} }
.process-more{
.process-more {
line-height: 1.5rem; line-height: 1.5rem;
text-align: center; text-align: center;
font-size: .4rem; font-size: .4rem;
.iconfont{
.iconfont {
vertical-align: middle; vertical-align: middle;
} }
} }
.container{
.container {
padding: .4rem; padding: .4rem;
padding-bottom: .33rem; padding-bottom: .33rem;
.my-swipe .van-swipe-item { .my-swipe .van-swipe-item {
color: #fff; color: #fff;
font-size: 20px; font-size: 20px;
height: 3.57rem; height: 3.57rem;
text-align: center; text-align: center;
img{
img {
width: 100%; width: 100%;
height: 100%; height: 100%;
border-radius: .16rem; border-radius: .16rem;
} }
} }
.swiper{
.swiper {
margin-bottom: .4rem; margin-bottom: .4rem;
} }
.van-notice-bar{
.van-notice-bar {
border: 1px solid #E6B759; border: 1px solid #E6B759;
border-radius: .16rem; border-radius: .16rem;
} }
} }
.panel{ .panel {
.panel-head{ .panel-head {
padding: .53rem .4rem; padding: .53rem .4rem;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.title{
.title {
font-size: .43rem; font-size: .43rem;
color: #222222; color: #222222;
} }
} }
.panel-body{
.panel-body {
padding: 0 .4rem; padding: 0 .4rem;
overflow-x: scroll; overflow-x: scroll;
.merit-group{
.merit-group {
display: flex; display: flex;
width: 11.36rem; width: 11.36rem;
margin-bottom: .91rem; margin-bottom: .91rem;
} }
} }
} }
.temple-home-activity{
.process{ .temple-home-activity {
.process {
padding: .4rem 0; padding: .4rem 0;
.bar{
.bar {
padding-bottom: 0; padding-bottom: 0;
} }
} }
} }
.merit{
.merit {
width: 3.39rem; width: 3.39rem;
height: 3.39rem; height: 3.39rem;
display: inline-block; display: inline-block;
@@ -438,20 +497,23 @@ export default {
border-radius: .16rem; border-radius: .16rem;
vertical-align: top; vertical-align: top;
overflow: hidden; overflow: hidden;
& ~ .merit{
& ~ .merit {
margin-left: .4rem; margin-left: .4rem;
} }
img{
img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.title{
.title {
position: absolute; position: absolute;
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
height: .91rem; height: .91rem;
background: rgba(0,0,0,0.7); background: rgba(0, 0, 0, 0.7);
color: white; color: white;
line-height: .91rem; line-height: .91rem;
overflow: hidden; overflow: hidden;
@@ -461,21 +523,25 @@ export default {
padding: 0 .11rem; padding: 0 .11rem;
} }
} }
.temple-home-page{
.temple-home{ .temple-home-page {
.temple-home {
display: flex; display: flex;
font-size: .37rem; font-size: .37rem;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
padding: .4rem .3rem; padding: .4rem .3rem;
.temple-name{
.temple-name {
font-size: .45rem; font-size: .45rem;
color: #666; color: #666;
} }
.visitor{
.visitor {
color: #999; color: #999;
font-size: .3rem; font-size: .3rem;
span{
span {
padding-left: 10px; padding-left: 10px;
} }
} }
+5
View File
@@ -55,6 +55,7 @@ import { getLocation } from '@/common/wechat-web';
export default { export default {
data(){ data(){
return { return {
query: this.$route.query,
containerHeight: 0, containerHeight: 0,
keyword: '', keyword: '',
mode: 'list', mode: 'list',
@@ -77,6 +78,10 @@ export default {
this.containerHeight = window.innerHeight - this.$refs.topbar.offsetHeight - offsetHeight - 20; this.containerHeight = window.innerHeight - this.$refs.topbar.offsetHeight - offsetHeight - 20;
}) })
if(this.query.search){
this.keyword = this.query.search;
}
this.getTempleList(); this.getTempleList();
}, },
methods: { methods: {
+379 -51
View File
File diff suppressed because one or more lines are too long