shop_app/pages/message/index.vue

278 lines
6.8 KiB
Vue
Raw Normal View History

2025-05-08 09:16:37 +08:00
<template>
<div class="whole">
<div class="guanzhu" v-if="!is_subscribe && showTips">
<div :style="{color: Color}">订阅关注公众号查看及时消息</div>
<div class="anniu">
<text @click="followSubscribe()">订阅</text>&nbsp;
<up-icon name="close" size="14" @click="showTips = false" />
</div>
</div>
<view class="row" v-for="(item, index) in messageList" :key="index" @click="viewMsg(item.type)">
<view class="icon">
<view class="img">
<text v-if="item.type == 1" class="iconfont icon-notice"></text>
<text v-else-if="item.type == 2" class="iconfont icon-set"></text>
<text v-else-if="item.type == 3" class="iconfont icon-gongdan"></text>
<text v-else-if="item.type == 4" class="iconfont icon-warn"></text>
<text v-else-if="item.type == 5" class="iconfont icon-gongzuotai"></text>
<text v-else-if="item.type == 6" class="iconfont icon-gonggaolan"></text>
<text v-else class="iconfont icon-notice"></text>
</view>
<view class="num" v-if="item.un_read_count">{{item.un_read_count > 99 ? '99+' : item.un_read_count}}</view>
</view>
<view class="box">
<view class="title">
<view class="tit">{{titObj[item.type]}}</view>
<view class="time">{{item.last_message && item.last_message.created_at && item.last_message.created_at.slice(0, 16)}}</view>
</view>
<view class="txt">{{item.last_message && item.last_message.content && item.last_message.content.title}}</view>
</view>
</view>
<view class="row" @click="toJump('/pages/mine/other/grass')">
<view class="icon flex"><text class="iconfont icon-zhongcao3"></text></view>
<view class="box">
<view class="title">
<view class="tit">种草</view>
</view>
<view class="txt">好物分享</view>
</view>
</view>
<view class="row" @click="toComplaint" v-if="role == 0">
<view class="icon flex"><up-icon name="info-circle" color="#333" :size="26" /></view>
<view class="box">
<view class="title">
<view class="tit">投诉与反馈</view>
</view>
</view>
</view>
<view class="noMsg" v-if="!messageList.length && role !== 0">
<up-empty mode="message" icon="https://ct-upimg.yx090.com/g.ii090/images/sprite/empty/message.png" text="暂无消息"></up-empty>
</view>
<view v-if="messageList.length || role == 0" style="margin-top: 30rpx;">
<cf-cloud></cf-cloud>
</view>
</div>
<tabbar :chooseIndex="2" :num="cartNum" :msgNum="msgNum" />
</template>
<script>
import { get } from '@/api/request.js'
import { ref, reactive, toRefs } from 'vue'
import { userBind } from '@/components/common.js'
import tabbar from '@/components/tabbar/index.vue'
import { sp2 } from '@/components/img.js'
import { Style } from '@/utils/list.js'
import cfCloud from '@/components/cfCloud/index.vue'
export default {
components: {
tabbar,
cfCloud
},
setup() {
const data = reactive({
sp2: sp2,
cartNum: 0,
messageList: [],
msgNum: 0,
titObj: {
'1': '系统通知',
'2': '订单通知',
'3': '工单通知',
'4': '投诉通知',
'5': '平台通知',
'6': '公告栏'
},
is_subscribe: 0,
showTips: true,
Color: uni.getStorageSync('theme_color'),
bgColor: Style[uni.getStorageSync('theme_index') * 1].bgColor,
tagColor: Style[uni.getStorageSync('theme_index') * 1].tagColor,
qr_img: '',
role: uni.getStorageSync('role')
})
// 消息类型 1-系统通知 2-订单通知 3-工单通知 4-投诉通知
function getMsgNum() {
get('/api/v1/messages/count').then((res) => {
data.messageList = res.data.types || []
data.msgNum = res.data.total
uni.setStorageSync('msgNum', data.msgNum)
})
}
function viewMsg(type) {
let tit = data.titObj[type]
uni.navigateTo({
url: '/pages/mine/msg/list?tit=' + tit + '&type=' + type
})
}
const followSubscribe = () => {
uni.navigateTo({
url: '/pages/article/index'
})
}
function getUserInfo() {
get('/api/v1/shopScore/user').then((res) => {
data.is_subscribe = res.data.user && res.data.user.is_subscribe
uni.setStorageSync('subscribe', data.is_subscribe)
})
}
async function getQrCodeImg() {
await get('/api/v1/user/qrCode').then((res) => {
data.qr_img = res.data.qr_code
})
}
function toComplaint() {
uni.navigateTo({
url: '/pages/mine/msg/select'
})
}
function toJump(url) {
uni.navigateTo({
url: url
})
}
return {
...toRefs(data),
getMsgNum,
viewMsg,
followSubscribe,
getUserInfo,
getQrCodeImg,
toComplaint,
toJump
}
},
async onLoad() {
// await this.$onLaunched
},
onShow() {
this.cartNum = Number(uni.getStorageSync('cartNum')) || 0
this.getMsgNum()
this.getUserInfo()
if(this.role === 0) {
this.getQrCodeImg()
}
}
}
</script>
<style lang="scss" scoped>
.whole {
overflow: auto;
min-height: 100vh;
padding-bottom: 110rpx;
.row{
display: flex;
padding: 30rpx;
border-bottom: 1px solid #F2F2F2;
background-color: #fff;
justify-content: space-between;
.icon{
width: 48.5px;
height: 48.5px;
position: relative;
&.flex{
display: flex;
align-items: center;
justify-content: center;
background-color: #F2F2F2;
border-radius: 8rpx;
}
.img{
width: 100%;
height: 100%;
background-color: #F1F1F1;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10rpx;
.iconfont{
font-size: 24px;
color: #373536;
}
}
.num{
border-radius: 20rpx 20rpx 20rpx 0;
border: 1px solid #fff;
background-color: v-bind('tagColor');
font-size: 22rpx;
color: #fff;
padding: 6rpx 10rpx;
position: absolute;
top: -26rpx;
left: 100%;
margin-left: -18rpx;
line-height: 1;
}
.iconfont{
font-size: 24px;
color: #373536;
}
}
.box{
width: calc(100% - 130rpx);
.title{
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16rpx;
.tit{
font-size: 32rpx;
color: #333;
width: calc(100% - 260rpx);
}
.time{
font-size: 24rpx;
color: #9D9D9D;
}
}
.txt{
font-size: 28rpx;
color: #9D9D9D;
}
}
}
.noMsg{
width: 100%;
height: calc(100vh - 64rpx);
padding-top: 20%;
box-sizing: border-box;
}
.guanzhu {
font-size: 26rpx;
display: flex;
justify-content: space-between;
align-items: center;
background: v-bind('bgColor');
padding: 15rpx 30rpx;
.anniu {
display: flex;
text{
background: v-bind('Color');
border-radius: 8rpx;
color: #fff;
font-size: 24rpx;
padding: 5rpx 25rpx;
}
}
}
}
</style>