移动app

This commit is contained in:
2023-09-24 17:55:19 +08:00
parent 736c5376e0
commit 59f7e39791
735 changed files with 80523 additions and 57 deletions

View File

@@ -0,0 +1,275 @@
<template>
<view class="notification-box">
<text class="tips" v-if="tips">{{tips}}</text>
<uni-list :border="false">
<template v-if="notificationDatas && notificationDatas.length">
<uni-list-chat v-for="(item,index) in notificationDatas" :key="item.id"
:avatarCircle="true" :clickable="true"
:badge-text="item.is_read?'':'dot'" badgePositon="left"
:title="item.payload.title||item.title"
:note="item.payload.content||item.content||'无'"
:avatar="item.payload.avatar_file&&item.payload.avatar_file.url ? item.payload.avatar_file.url : '/uni_modules/uni-im/static/noticeIcon/notification2.png'"
@click.native="clickHandle(index,item)" direction="column" :time="friendlyTime(item.create_time)"
>
<view class="handle-box">
<template v-if="item.payload.state">
<text class="handle done">
{{'已'+(item.payload.state == 'confirm'?item.payload.confirmText:item.payload.cancelText)}}
</text>
</template>
<template v-else>
<text class="handle"
@click.stop="doAction(index,0)"
v-if="item.payload.cancelText"
>{{item.payload.cancelText}}</text>
<text
class="handle"
@click.stop="doAction(index,1)"
v-if="item.payload.confirmText"
>{{item.payload.confirmText}}</text>
<uni-icons v-if="!item.payload.cancelText && !item.payload.confirmText && item.path"
type="right" color="#cccccc"></uni-icons>
</template>
</view>
</uni-list-chat>
</template>
<uni-list-item v-else class="load-more">
<template v-slot:body>
<uni-load-more class="tip" :status="hasMore?'loading':'noMore'"></uni-load-more>
</template>
</uni-list-item>
</uni-list>
</view>
</template>
<script>
import uniImUtils from '@/uni_modules/uni-im/common/utils.js';
import uniIm from '@/uni_modules/uni-im/lib/main.js';
import action from './action.js';
const db = uniCloud.database();
export default {
data() {
return {
filterNotice:{},
tips:"",
hasMore:true
// notificationDatas:[]
}
},
async onLoad({param}) {
// console.log(param,decodeURIComponent(param))
param = JSON.parse(decodeURIComponent(param))
// console.log(param)
this.setParam(param)
},
computed: {
//是否为pc宽屏width>960px
isWidescreen(){
return uniIm.isWidescreen
},
notificationDatas(){
let notificationDatas = uniIm.notification.get(this.filterNotice)
if(notificationDatas.length == 0){
setTimeout(()=> {
this.hasMore = false
}, 100);
}
return notificationDatas
}
},
mounted() {
this.hasMore = uniIm.notification.hasMore
},
methods: {
setParam({filterNotice,title}){
if(typeof filterNotice == 'string'){
filterNotice = JSON.parse(decodeURIComponent(filterNotice))
}
this.filterNotice = filterNotice
console.log('filterNotice',filterNotice)
uni.setNavigationBarTitle({
title
})
if(title == '新朋友' && !this.isWidescreen){
this.tips = '好友请求通知'
}
},
async setItem({_id},param){
const datas = uniIm.notification.get(this.filterNotice)
for (let i = 0; i < datas.length; i++) {
if(datas[i]._id == _id){
datas[i] = deepAssign(datas[i],param)
uniIm.notificationDatas = datas
console.log('uniIm.notificationDatas',uniIm.notificationDatas)
break;
}
}
let ares = await db.collection('uni-im-notification')
.where(`"_id" == "${_id}" && "user_id" == $cloudEnv_uid`)
.get()
// console.log(13231,ares);
let res = await db.collection('uni-im-notification')
.where(`"_id" == "${_id}" && "user_id" == $cloudEnv_uid`)
.update(param)
// console.log('res---66666',param,res.result.updated);
/**
*判断对象是否是一个纯粹的对象
*/
function isPlainObject(obj){
return typeof obj === 'object' && Object.prototype.toString.call(obj) === '[object Object]'
}
/**
*深度合并多个对象的方法
*/
function deepAssign( ){
let len = arguments.length, target = arguments[0]
if(!isPlainObject(target)){
target = {}
}
for (let i = 1; i < len; i++){
let source = arguments[i]
if( isPlainObject( source ) ){
for( let s in source ){
if ( s === '__proto__' || target === source[s] ) {
continue
}
if( isPlainObject( source[s] ) ){
target[s] = deepAssign(target[s], source[s])
}else{
target[s] = source[s]
}
}
}
}
return target
}
},
async clickHandle(index,item){
// console.log('index',index,item);
//如果未读,设置为已读
if(!item.is_read){
this.setItem(item,{is_read:true})
}
//存在链接就跳转
let path = item.path || item.payload.path
if(path){
uni.navigateTo({
url:path,
fail: (e) => {
console.error(e);
}
})
}
// let item = this.notificationDatas[index]
// item.data.is_read = true
// this.notificationDatas[index] = Object.assign({},item)
// console.log(this.notificationDatas);
},
doAction(index,type){
let item = this.notificationDatas[index]
let e = {
subType:item.payload.subType,
confirm:type===1,
cancel:type===0,
item
}
action(e,data=>{
console.log('doAction',data)
this.setItem(item,{
is_read:true,
payload:{
state : type===1?'confirm':'cancel'
}
})
})
// console.log(index);
},
friendlyTime(timestamp) {
return uniImUtils.toFriendlyTime(timestamp)
},
handleText(state){
switch (state){
case 0:
return '同意'
break;
case 100:
return '已同意'
break;
case -100:
return '已拒绝'
break;
default:
return '其他'
break;
}
}
}
}
</script>
<style lang="scss" scoped>
.notification-box{
/* #ifndef APP-NVUE */
height: 100vh;
// width: 750rpx;
/* #endif */
/* #ifdef APP-NVUE */
flex: 1;
/* #endif */
background-color: #f5f5f5;
}
.tips{
height: 40px;
line-height: 40px;
padding-left: 20rpx;
font-size: 26rpx;
color: #666;
}
.handle-box{
flex-direction: row;
height: 40px;
align-items: center;
}
.handle{
width: 50px;
text-align: center;
height: 25px;
line-height: 25px;
background-color: #efefef;
border-radius: 50px;
font-size: 12px;
margin:0 5px;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
}
.done{
width: 50px;
background-color: #FFF;
color: #aaa;
/* #ifdef H5 */
cursor: default;
/* #endif */
}
.load-more{
background-color: #f5f5f5!important;
justify-content: center;
}
.tip{
position: relative;
left: -15px;
width: 750rpx;
/* #ifndef APP-NVUE */
/* pc宽屏时需要使用100vw */
width: 100vw;
/* #endif */
}
/* #ifdef MP-WEIXIN */
.load-more ::v-deep .uni-list-item{
background-color: #f5f5f5!important;
}
/* #endif */
</style>