mall_client/zyhs3_uniapp/pages/interaction/index.vue

511 lines
14 KiB
Vue
Raw Permalink Normal View History

2026-03-13 07:50:35 +00:00
<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>