mall_client/zyhs_app_java/zyhs3_uniapp/pages/interaction/index.vue

511 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<view style="position: sticky; top: 0;">
<view class="positionShow" :style="{paddingTop: statusBarHeight + 'px'}" v-if="!isOpenPosition" @click="goSet">
<view class="positionShow-item">
<icon type="info" class="positionShow-icon"></icon>
<text class="positionShow-txt">您未开启位置服务,距离计算不准确,请点击前往开启位置服务</text>
</view>
</view>
<view class="top" :style="{paddingTop: ((isOpenPosition ? statusBarHeight : 0) + 'px')}">
<!-- #ifdef MP-WEIXIN -->
<view :style="{height: wxBtnHeight + 'px'}"></view>
<!-- #endif -->
<view class="header">
<scroll-view scroll-x class="nav-area">
<view class="flex">
<view class="nav-area-item" v-for="(item, index) in navList" :key="index" @tap="tapNav(index)">
<text class="nav-area-item-name" :class="{ 'nav-area-item-active': index === current }">{{ item }}</text>
</view>
</view>
</scroll-view>
<view class="search" v-if="isSearch && (current === 1 || current === 2)">
<input type="text" v-model="wordKey" class="search-input" :maxlength="15" placeholder="用户昵称" @input="searchInput">
<text class="search-btn" @click="onSearch(current)">搜索</text>
</view>
<view class="nav-right">
<image :src="staticUrl + 'video/search.png'" class="nav-right-icon" @click="showSearch"></image>
<view class="nav-right-message" @tap="jumpTo('/pages/interaction/message')">
<image :src="staticUrl + 'video/message.png'" class="nav-right-icon"></image>
<text class="nav-right-message-dian" :style="{top: statusBarHeight + 5 + 'px'}" v-if="unReadTotal">{{unReadTotal>99?'99+':unReadTotal}}</text>
</view>
</view>
</view>
</view>
</view>
<swiper class="swiper" :style="{height: swiperHeight + 'px'}" :current="current" @change="swiperChange">
<swiper-item>
<dynamic ref="dynamic" :myAddressData="myAddressData" :swiperHeight="swiperHeight"></dynamic>
</swiper-item>
<swiper-item>
<nearby ref="nearby" :myAddressData="myAddressData" :swiperHeight="swiperHeight" :wordKey="nearbyWordKey"></nearby>
</swiper-item>
<!-- <swiper-item>
<angel ref="angel" :myAddressData="myAddressData" :swiperHeight="swiperHeight" :wordKey="angelWordKey"></angel>
</swiper-item> -->
<swiper-item>
<publish ref="publish"></publish>
</swiper-item>
<swiper-item>
<my ref="my"></my>
</swiper-item>
<swiper-item>
<comment ref="comment" :swiperHeight="swiperHeight"></comment>
</swiper-item>
</swiper>
<!-- 弹框 -->
<modal v-if="advertDataOne.showModal && current===0">
<image :src="advertDataOne.ossUrl" mode="widthFix" @click="imgJump('advertDataOne')"></image>
<view class="img-wrap" @click="advertDataOne.showModal = false">
<image :src="staticUrl + 'video/video_close.png'" class="img-wrap-icon"></image>
</view>
</modal>
<modal v-if="advertDataTwo.showModal && current===1">
<image :src="advertDataTwo.ossUrl" mode="widthFix" @click="imgJump('advertDataTwo')"></image>
<view class="img-wrap" @click="advertDataTwo.showModal = false">
<image :src="staticUrl + 'video/video_close.png'" class="img-wrap-icon"></image>
</view>
</modal>
<modal v-if="advertDataThree.showModal && current===2">
<image :src="advertDataThree.ossUrl" mode="widthFix" @click="imgJump('advertDataThree')"></image>
<view class="img-wrap" @click="advertDataThree.showModal = false">
<image :src="staticUrl + 'video/video_close.png'" class="img-wrap-icon"></image>
</view>
</modal>
<!-- 福利红包 -->
<red-envelopes v-for="(item, i) in redList" :key="i" :data="item" :type="2" :bottom="i === 0 ? 100 : i*80+100"></red-envelopes>
<!-- <tabbar></tabbar> -->
</div>
</template>
<script>
import { mapState, mapMutations } from "vuex"
import { sendRequest } from "@/common/http/api.js"
import { checkOpenGPSService } from "@/common/utils/index.js"
import url from "@/common/http/url.js"
import publics from "@/common/utils/public.js"
import dynamic from "./modules/dynamic.vue"
import nearby from "./modules/nearby.vue"
import angel from "./modules/angel.vue"
import publish from "./modules/publish.vue"
import my from "./modules/my.vue"
import comment from "./modules/comment.vue"
import modal from "@/components/modal.vue"
import redEnvelopes from "@/components/red-envelopes.vue"
import tabbar from "@/components/tabbar.vue"
// import redEnvelopes from "@/components/red-envelopes-n.nvue"
export default {
components: {
dynamic, nearby, angel, publish, my, comment, modal, redEnvelopes, tabbar
},
data(){
return {
staticUrl: this.$staticUrl,
swiperHeight: 0,
statusBarHeight: uni.getSystemInfoSync().statusBarHeight,
navList: ["动态", "附近", "发布", "我的", "评论"],
current: 0,
isSearch: false,
wordKey: "",
nearbyWordKey: "", // 附近的人检索key
angelWordKey: "", // 配送员检索key
unReadTotal: 0, // 未读消息数量
myAddressData: {longitude:0,latitude:0},
redList: [],
advertDataOne: {},
advertDataTwo: {},
advertDataThree: {},
isOpenPosition: true,
// #ifdef MP-WEIXIN
wxBtnHeight: 0,
// #endif
}
},
computed: {
...mapState(["unReadNum"])
},
watch:{
unReadNum(val){
if (val){
this.setBadge(true, val)
}
}
},
mounted() {
// #ifdef MP-WEIXIN
this.wxBtnHeight = wx.getMenuButtonBoundingClientRect().height
// #endif
this.swiperHeight = uni.getSystemInfoSync().screenHeight - 94
this.getLocation()
let _this = this
let interactionCurrent = uni.getStorageSync("interactionCurrent")
if (interactionCurrent) {
this.current = interactionCurrent
this.switchIndex = interactionCurrent
uni.removeStorageSync("interactionCurrent")
}
// #ifdef APP-PLUS
//是否开启位置权限
if (!uni.getStorageSync('refuse')) {
checkOpenGPSService(result=>{
console.log("checkOpenGPSService,,", result)
_this.isOpenPosition = result
if (result) {
_this.swiperHeight = uni.getSystemInfoSync().screenHeight - 144
}
if (result) {
uni.getLocation({
type: 'wgs84',
geocode: true,
success: function (res) {
_this.myAddressData = res
publics.setMyaddressLngLat(JSON.stringify(res));
}
});
}
})
}
// #endif
this.setBadge(false)
this.getRedBagList()
this.getAdvert('advertDataOne', 5)
this.getAdvert('advertDataTwo', 6)
this.getAdvert('advertDataThree', 7)
},
onShow() {
},
methods:{
backPress(){
//隐藏到后台不退出app
let main = plus.android.runtimeMainActivity();
main.moveTaskToBack(false);
return true;
},
// 设置消息未读数量
async setBadge(type, val){
let unReadTotal = 0
if (type) {
unReadTotal = val
} else {
unReadTotal = publics.getCUnReadTotal()
}
this.unReadTotal = unReadTotal
this.$forceUpdate()
if (unReadTotal > 0) {
uni.setTabBarBadge({
index: 2,
text: unReadTotal + ""
})
} else {
uni.removeTabBarBadge({
index: 2
})
}
// #ifdef APP-PLUS
plus.runtime.setBadgeNumber(unReadTotal)
// #endif
getApp().localUnReadNum = unReadTotal
},
// 红包福利
getRedBagList(){
sendRequest("GET", url.cms.redEnvelopesList).then(res =>{
if (res.data && res.data.length > 0) {
let data = res.data
data.map(v =>{
v.show = true
})
this.redList = data
}
})
},
// 获取公告
async getAdvert(name, position){
let res = await sendRequest("GET", url.cms.advertisingMap, {position: position})
if (res.data && res.data.length > 0) {
this[name] = res.data[0]
if (this[name].popupMode === 2) {
if (!publics.advertShowToStorage(this[name].id)) {
this[name].showModal = true
}
} else {
this[name].showModal = true
}
}
},
getLocation(){
let _this = this;
let addrRes = publics.getMyaddressLngLat()
if (addrRes) {
addrRes = JSON.parse(addrRes)
this.setAddress(addrRes)
} else {
this.openMap()
}
},
openMap(){
let _this = this;
/* H5浏览器不执行所以H5的时候直接加载数据 */
uni.getLocation({
type: 'wgs84',
geocode: true,
success: async function(res) {
//设置地址
publics.setMyaddressLngLat(JSON.stringify(res));
_this.setAddress(res)
},
fail: function(err) {
console.log(".....这是是互动的获取位置失败....", err)
_this.$refs.dynamic.loadData()
}
});
// #ifdef H5
setTimeout(()=>{
// 请求附近动态数据
_this.$refs.dynamic.loadData()
}, 300)
// #endif
},
setAddress(res){
let _this = this
this.myAddressData = res;
setTimeout(()=>{
// 请求附近动态数据
_this.$refs.dynamic.loadData()
}, 300)
},
showSearch(){
if (this.current !== 1 && this.current !== 2) {
return this.showToast("搜索仅限附近和配送员~")
}
this.isSearch = !this.isSearch
this.wordKey = ""
},
searchInput(e){
if (this.current === 1) {
this.nearbyWordKey = e.detail.value
} else if(this.current === 2) {
this.angelWordKey = e.detail.value
}
},
onSearch(current){
uni.hideKeyboard()
if (current === 1) { // 附近的人
this.nearbyWordKey = this.wordKey
this.$refs.nearby.penpleNearbyList = []
setTimeout(()=>{
this.$refs.nearby.loadData()
}, 200)
} else if (current === 2) { // 附近的配送员
this.angelWordKey = this.wordKey
this.$refs.angel.proxyList = []
setTimeout(()=>{
this.$refs.angel.loadData()
}, 200)
}
},
tapNav(index) {
uni.hideKeyboard()
this.current = index
},
swiperChange(e){
this.current = e.detail.current
this.wordKey = ""
this.nearbyWordKey = ""
this.angelWordKey = ""
this.isSearch = false
if (this.current === 0) {
this.$refs.dynamic.loadData()
} else if (this.current === 1) {
this.$refs.nearby.loadData()
}
// else if (this.current === 2) {
// this.$refs.angel.loadData()
// }
else if (this.current === 4) {
this.$refs.my.getInfo()
} else if (this.current === 5) {
this.$refs.comment.loadData()
}
},
jumpTo(path){
uni.navigateTo({
url: path
})
},
showToast(msg){
uni.showToast({
title: msg,
icon: "none"
})
},
imgJump(name){
this[name].showModal = false
sendRequest("POST", url.cms.clickAdvertisingMap, {id: this[name].id})
publics.advertOption(this[name].operationCode, this[name].operationValue)
},
goSet(){
let system = uni.getSystemInfoSync();// 获取系统信息
if (system.platform === 'android') { // 判断平台
var Intent = plus.android.importClass('android.content.Intent');
var Settings = plus.android.importClass('android.provider.Settings');
var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
main.startActivity(intent); // 打开系统设置GPS服务页面
} else if (system.platform === 'ios') {
var UIApplication = plus.ios.importClass("UIApplication");
var application2 = UIApplication.sharedApplication();
var NSURL2 = plus.ios.importClass("NSURL");
var setting2 = NSURL2.URLWithString("app-settings:"); // 打开应用权限
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
}
}
}
}
</script>
<style scoped>
.positionShow{
height: 100rpx;
/* padding-bottom: 10rpx; */
width: 750rpx;
background-color: #fceeed;
display: flex;
flex-direction: row;
align-items: center;
}
.positionShow-item{
flex-direction: row;
align-items: center;
padding: 0 30rpx;
}
.positionShow-txt{
font-size: 28rpx;
color: #666666;
width: 640rpx;
}
.positionShow-icon{
color: #f55556;
font-size: 40rpx;
margin-right: 20rpx;
}
.top{
width: 100%;
background-color: rgb(248, 210, 71);
}
.header{
width: 750rpx;
padding: 0 20rpx;
display: flex;
flex-direction: row;
align-items: center;
}
.nav-area{
height: 100rpx;
width: 600rpx;
display: flex;
flex-direction: row;
}
.nav-area-item{
height: 90rpx;
display: flex;
align-items: center;
justify-content: center;
}
.nav-area-item-name{
width: 100rpx;
text-align: center;
color: #fff;
font-size: 32rpx;
}
.nav-area-item-active{
color: #000;
font-size: 40rpx;
}
.search{
background-color: #F0F0F0;
width: 600rpx;
height: 80rpx;
border-radius: 50rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
position: absolute;
left: 10rpx;
}
.search-input{
width: 420rpx;
flex-grow: 1;
font-size: 32rpx;
margin-left: 20rpx;
}
.search-btn{
display: inline-block;
height: 70rpx;
line-height: 70rpx;
font-size: 30rpx;
color: white;
margin: 0 10rpx;
border-radius: 50rpx;
width: 120rpx;
text-align: center;
background-image: linear-gradient(to bottom, #F8D247, #865afd);
}
.nav-right{
display: flex;
flex-direction: row;
align-items: center;
margin-bottom: 10rpx;
}
.nav-right-icon{
width: 50rpx;
height: 50rpx;
}
.nav-right-message{
/* position: relative; */
/* z-index: 1; */
margin-left: 20rpx;
}
.nav-right-message-dian{
position: fixed;
z-index: 999;
right: 0rpx;
font-size: 24rpx;
border-radius: 30rpx;
padding: 0rpx 14rpx 0 14rpx;
background-color: #ff0833;
color: white;
}
.swiper{
width: 750rpx;
background-color: #F8F8F8;
}
.img-wrap{
margin-top: 30rpx;
width: 50rpx;
height: 50rpx;
border-color: #fff;
border-width: 4rpx;
border-radius: 50rpx;
align-items: center;
justify-content: center;
}
.img-wrap-icon{
width: 26rpx;
height: 26rpx;
}
</style>