This commit is contained in:
lr 2025-02-19 16:36:12 +08:00
parent b1b68d68ef
commit 307b25d08d
6 changed files with 652 additions and 531 deletions

View File

@ -1,23 +1,25 @@
<script setup>
import {
import {
onLaunch,
} from '@dcloudio/uni-app'
//
import util from '@/common/js/util';
//
import api from '@/api/index.js'
// vuex
import store from '@/store/index.js'
} from '@dcloudio/uni-app'
//
import util from '@/common/js/util';
//
import api from '@/api/index.js'
// vuex
import store from '@/store/index.js'
onLaunch(() => {
onLaunch(() => {
//
getUserinfo()
//
getConfig()
})
//
getNoReadNum()
})
//
function getUserinfo() {
//
function getUserinfo() {
//
const token = uni.getStorageSync('token')
//
@ -37,10 +39,10 @@
util.loginTencent(userinfo)
})
}
}
}
//
function getConfig() {
//
function getConfig() {
api.getConfig().then(rs => {
if (rs.code == 200) {
store.commit('setState', {
@ -50,10 +52,45 @@
return
}
})
}
}
//
async function getNoReadNum() {
// uni.removeTabBarBadge({
// index: 2,
// text: "",
// });
// api.getNoReadNum().then(rs => {
// if (rs.code == 200) {
// uni.setTabBarBadge({
// index: 0,
// text: "11",
// });
// }
// })
// uni.setTabBarBadge({
// index: 2,
// text: "11",
// });
// const res = await uni.request({ url: 'API_URL' });
// const count = res.data.unread;
// setTimeout(() => {
// uni.setTabBarBadge({
// index: 1,
// text: '10',
// success: function () {
// console.log(11111);
// },
// })
// }, 1000)
}
</script>
<style lang="scss">
/*每个页面公共css */
@import "./common/css/style.scss";
/*每个页面公共css */
@import "./common/css/style.scss";
</style>

View File

@ -85,6 +85,17 @@ const api = {
method: 'GET',
})
},
/**
* 获取未读消息数量
* @param {Object} param
*/
getNoReadNum() {
return util.request({
url: '/shopify/region/all',
method: 'GET',
})
},
}
export default api

View File

@ -6,8 +6,8 @@ const config = {
// host: 'h5api',
// #endif
// #ifndef H5
host: 'http://91f.xyz:8080',
// host: 'https://b433d23.r24.cpolar.top/',
// host: 'http://91f.xyz:8080',
host: 'https://b433d23.r24.cpolar.top/',
// host: 'http://hvw2rn.natappfree.cc',
// #endif
// 支付方式配置

View File

@ -1,12 +1,12 @@
<script setup>
/**
/**
* 底部导航的规则
* 视频端显示
* 视频 商城 消息 我的(视频我的)
* 商城端显示
* 视频 商城 消息 个人中心(商城我的)
*/
import {
import {
ref,
computed,
onMounted,
@ -14,14 +14,14 @@
getCurrentInstance,
reactive,
watch,
} from 'vue'
//
import util from '@/common/js/util';
const {
} from 'vue'
//
import util from '@/common/js/util';
const {
proxy
} = getCurrentInstance()
//
const props = defineProps({
} = getCurrentInstance()
//
const props = defineProps({
page: {
type: String,
},
@ -30,16 +30,16 @@
type: String,
default: 'light',
},
})
//
const userinfo = computed(() => {
})
//
const userinfo = computed(() => {
let resuilt = uni.$store.state.userinfo
return resuilt
})
// shop default
const mode = computed(() => uni.$store.state.tabbarMode)
//
const menu = computed(() => {
})
// shop default
const mode = computed(() => uni.$store.state.tabbarMode)
//
const menu = computed(() => {
let arr = [{
page: 'index',
type: 'option',
@ -93,12 +93,12 @@
break;
}
return arr
})
//
let safeHeight = ref(0)
})
//
let safeHeight = ref(0)
//
const showMenu = computed(() => {
//
const showMenu = computed(() => {
let result = []
//
@ -130,10 +130,13 @@
// name: '',
// })
return result
})
})
//
onMounted(() => {
//
const noReadNum = ref(0)
//
onMounted(() => {
//
addListener()
// tabbar
@ -145,15 +148,18 @@
//
// proxy.$refs.alert.open()
})
//
onUnmounted(() => {
//
getNoReadNum()
})
//
onUnmounted(() => {
uni.$off('changeMine')
})
})
//
function addListener() {
//
function addListener() {
//
uni.$on('changeMine', (value) => {
uni.$store.commit('setState', {
@ -161,13 +167,13 @@
value,
})
})
}
}
/**
/**
* 点击菜单
* @param {Object} item 当前点击的菜单项
*/
function handleMenu(item) {
function handleMenu(item) {
if (item.type != 'middle') {
//
if (item.page) uni.switchTab({
@ -180,13 +186,13 @@
}
//
proxy.$refs.alert.open()
}
}
/**
/**
* 内容
* @param {Object} ev
*/
function handleAlert(ev) {
function handleAlert(ev) {
const index = ev.detail.index
const item = showMenu.value[index]
//
@ -202,19 +208,37 @@
})
//
proxy.$refs.alert.close()
}
//
function getNoReadNum() {
// sdk
let isReady = uni.$chat.isReady();
if (!isReady) {
setTimeout(function () {
getNoReadNum();
}, 800);
return
}
const unreadCount = uni.$chat.getTotalUnreadMessageCount();
noReadNum.value = +unreadCount > 99 ? '99+' : unreadCount;
}
</script>
<template>
<!-- 幽灵盒子 -->
<view class="ghost" :style="{paddingBottom: safeHeight}"></view>
<view class="ghost" :style="{ paddingBottom: safeHeight }"></view>
<!-- 底部导航 -->
<view class="menuBox" :class="subject">
<view class="menu">
<view class="item" v-for="(item,index) in menu" :key="index" @click="handleMenu(item)">
<view class="item" v-for="(item, index) in menu" :key="index" @click="handleMenu(item)">
<view class="option" :class="{active: item.page === page}" v-if="item.type == 'option'">
<text class="text">{{item.name}}</text>
<view class="option" :class="{ active: item.page === page }" v-if="item.type == 'option'">
<text class="text">{{ item.name }}</text>
<span class="pot" v-if="item.page == 'news' && noReadNum != 0">{{ noReadNum }}</span>
</view>
<view class="middle" v-else-if="item.type === 'middle'">
@ -224,7 +248,7 @@
</view>
</view>
</view>
<view class="safeArea" :style="{height: safeHeight}"></view>
<view class="safeArea" :style="{ height: safeHeight }"></view>
</view>
<!-- 底部菜单 -->
@ -237,7 +261,7 @@
<!-- <uni-icons type="image" :size="30" color="#777" /> -->
<image class="wh80" :src="item.img" mode="aspectFill" />
<view class="mt5">
<text class="text f28 c333">{{item.name}}</text>
<text class="text f28 c333">{{ item.name }}</text>
</view>
</view>
</uni-grid-item>
@ -252,15 +276,15 @@
</template>
<style lang="scss">
$boderSize: 2rpx;
$boderSize: 2rpx;
//
.ghost {
//
.ghost {
height: 120rpx;
}
}
//
.menuBox {
//
.menuBox {
position: fixed;
left: 0;
right: 0;
@ -319,6 +343,25 @@
.text {
color: #999;
}
.option {
position: relative;
.pot {
position: absolute;
top: -16rpx;
right: -30rpx;
height: 24rpx;
min-width: 24rpx;
line-height: 24rpx;
border-radius: 24rpx;
background: #FF6B17;
color: #fff;
font-size: 20rpx;
padding: 4rpx;
text-align: center;
}
}
}
.middle {
@ -327,10 +370,10 @@
height: 80rpx;
}
}
}
}
//
.alert {
//
.alert {
margin-bottom: 120rpx;
background-color: #f8f8f8;
border-radius: 30rpx;
@ -344,5 +387,5 @@
.itemBox {
// padding: 30rpx;
}
}
}
</style>

View File

@ -54,17 +54,32 @@ const systemRightOption = [{
backgroundColor: '#00ADEE'
},
},]
//
const props = defineProps({
//
type: {
type: Number,
default: 0,
},
})
//
const list = reactive([])
onMounted(() => {
if (props.type == 0) {
getList()
} else if(props.type == 1) {
//
} else if (props.type == 2) {
//
}
addListener()
})
onUnmounted(() => {
removeListener()
// removeListener()
})
//
@ -81,7 +96,7 @@ function removeListener() {
uni.$chat.on(TencentCloudChat.EVENT.CONVERSATION_LIST_UPDATED);
}
//
//
function getList() {
api.news.getMessageList({
query: {
@ -97,6 +112,17 @@ function getList() {
showCancel: false,
})
})
// // sdk
// let isReady = uni.$chat.isReady();
// if (!isReady) {
// setTimeout(function () {
// getList();
// }, 1000);
// return
// }
// uni.$chat.getMessageList({})
}
/**
@ -144,7 +170,7 @@ function getGroupNoReadNum(groupId) {
if (!isReady) {
setTimeout(function () {
getGroupNoReadNum(groupId);
}, 200);
}, 800);
return
}
@ -187,7 +213,8 @@ function handleChat(item) {
param.msgId = `${item.groupId}`
param.num = `${item.groupChatDTO.memberCount}`
}
//
setRead(item)
util.toChat(param)
}
@ -209,7 +236,7 @@ function delMsg(item) {
if (!isReady) {
setTimeout(function () {
delMsg(item);
}, 200);
}, 800);
return
}
@ -227,7 +254,7 @@ function setRead(item) {
if (!isReady) {
setTimeout(function () {
setRead(item);
}, 200);
}, 800);
return
}
@ -297,7 +324,7 @@ function setRead(item) {
<uni-swipe-action-item :right-options="rightOption" v-for="(item, index) in list.data" :key="index"
@click="handleMenu($event, item)">
<view class="item rows ptb20 plr30" @click="handleChat(item)">
<view class="item rows ptb20 plr30" @click.stop="handleChat(item)">
<view class="image wh90 pr">
<template v-if="item.groupId == null">
<image class="cir wh90" :src="item.callbackJson.from_url" mode="aspectFill" />

View File

@ -1,46 +1,46 @@
<script setup>
//
//
import {
import {
ref,
reactive,
computed,
} from 'vue'
import {
} from 'vue'
import {
useStore,
} from 'vuex'
import {
} from 'vuex'
import {
onLoad,
onUnload,
} from '@dcloudio/uni-app'
//
import TencentCloudChat from '@tencentcloud/chat';
} from '@dcloudio/uni-app'
//
import TencentCloudChat from '@tencentcloud/chat';
//
import apex from '@/components/header/apex'
//
import noLogin from '@/components/login/noLogin.vue'
//
import book from '@/components/news/book'
//
import groupList from '@/components/news/groupList'
//
import msgList from '@/components/news/msgList'
//
import footerMneu from '@/components/footerMenu/footerMenu'
//
import util from '@/common/js/util.js'
// vuex
const store = useStore()
//
const menuList = reactive([{
key: 'friend',
name: '通讯录',
load: false,
},
//
import apex from '@/components/header/apex'
//
import noLogin from '@/components/login/noLogin.vue'
//
import book from '@/components/news/book'
//
import groupList from '@/components/news/groupList'
//
import msgList from '@/components/news/msgList'
//
import footerMneu from '@/components/footerMenu/footerMenu'
//
import util from '@/common/js/util.js'
// vuex
const store = useStore()
//
const menuList = reactive([
{
key: 'group',
name: '即时消息',
load: true,
}, {
key: 'friend',
name: '通讯录',
load: false,
},
{
@ -48,67 +48,70 @@
name: '视讯消息',
load: false,
},
// {
// key: 'video',
// name: '',
// load: false,
// },
])
//
const menuIndex = ref('')
//
const showSearch = ref(false)
// im
const imLoad = ref(false)
//
const userinfo = computed(() => {
{
key: 'store',
name: '商城消息',
load: false,
},
])
//
const menuIndex = ref('')
//
const showSearch = ref(false)
// im
const imLoad = ref(false)
//
const userinfo = computed(() => {
return store.state.userinfo
})
//
const menuCurrent = computed(() => {
})
//
const menuCurrent = computed(() => {
return menuList[menuIndex.value]
})
})
onLoad(() => {
onLoad(() => {
//
handleMenuIndex(0)
//
addListener()
})
})
onUnload(() => {
onUnload(() => {
//
removeListener()
})
})
//
function addListener() {
//
function addListener() {
uni.$chat.on(TencentCloudChat.EVENT.SDK_READY, imLoading);
}
}
// im
function imLoading() {
// im
function imLoading() {
imLoad.value = true
}
}
//
function removeListener() {
//
function removeListener() {
uni.$chat.off(TencentCloudChat.EVENT.SDK_READY);
}
}
/**
/**
* 切换下标
* @param {Number} index
*/
function handleMenuIndex(index) {
function handleMenuIndex(index) {
if (menuIndex.value === index) return
menuList.forEach(item => {
item.load = false;
});
menuList[index].load = true;
menuIndex.value = index
if (!menuList[index].load) menuList[index].load = true
}
}
//
function showActionSheet() {
//
function showActionSheet() {
uni.showActionSheet({
itemList: ['扫一扫', '添加好友', '发起群聊', '我的二维码'],
success: rs => {
@ -137,9 +140,9 @@
}
}
})
}
}
function getUserInfos(userRecommend) {
function getUserInfos(userRecommend) {
videoApi.getUserInfo({
query: {
userRecommend: userRecommend,
@ -153,7 +156,7 @@
});
}
})
}
}
</script>
<template>
@ -194,27 +197,27 @@
<!-- 轮播图 -->
<swiper class="swiper" :current="menuIndex" disable-touch="true">
<!-- 通讯录 -->
<!-- 群组 -->
<swiper-item>
<book v-if="menuList[0].load" />
<msgList v-if="menuList[0].load" :type="menuIndex" />
<view class="loading" v-else>正在加载</view>
</swiper-item>
<!-- 群组 -->
<!-- 通讯录 -->
<swiper-item>
<msgList v-if="menuList[1].load" />
<book v-if="menuList[1].load" />
<view class="loading" v-else>正在加载</view>
</swiper-item>
<!-- 视频消息 -->
<swiper-item>
<msgList v-if="menuList[2].load" />
<msgList v-if="menuList[2].load" :type="menuIndex" />
<view class="loading" v-else>正在加载</view>
</swiper-item>
<!-- 商城消息 -->
<swiper-item>
<msgList />
<msgList v-if="menuList[3].load" :type="menuIndex" />
</swiper-item>
</swiper>
</view>
@ -224,8 +227,8 @@
</template>
<style lang="scss" scoped>
//
.headMenu {
//
.headMenu {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 25rpx;
@ -264,10 +267,10 @@
height: 175rpx;
transform: rotate(-5deg);
}
}
}
//
.searchBox {
//
.searchBox {
overflow: hidden;
height: 0;
transition: .3s;
@ -275,19 +278,19 @@
&.active {
height: 80rpx;
}
}
}
//
.swiper {
//
.swiper {
flex: 1;
width: 100%;
}
}
//
.loading {
//
.loading {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
}
}
</style>