merchapp/java-mall-app-shop-admin/App.vue

300 lines
8.6 KiB
Vue
Raw Permalink 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.

<script>
// #ifdef APP-PLUS
import APPUpdate, { getCurrentNo } from "@/config/appUpdate";
// #endif
import { mapState, mapActions } from "vuex";
import { webSocketManager } from "@/utils/socket.js";
import { GetShopBaseInfo } from "@/api/shop.js";
export default {
data() {
return {
version: "",
lastPlayTime: 0, // 记录最后一次播放语音的时间戳
playInterval: 20000 // 20秒的间隔限制
};
},
onLaunch: function () {
uni.setStorageSync("isImSound", true);
this.globalData.isAppActive = true;
// #ifdef APP-PLUS
getCurrentNo((res) => {
this.version = res.version;
});
const hasAgreed = uni.getStorageSync("isNeedAgreementDialog");
if (hasAgreed) {
this.onAPPUpdate();
}
this.initAppOrderPush();
// #endif
},
computed: {
...mapState("user", ["uid", "userInfo"]),
},
onShow: function () {
this.globalData.isAppActive = true;
const globalConnName = 'globalSocket';
if (this.userInfo && Object.keys(this.userInfo).length > 0) {
// 检查指定的全局连接是否已连接,未连接则重建
if (!webSocketManager.isConnected(globalConnName)) {
this.connectSocket(this.userInfo); // 这里的connectSocket应该会创建名为globalConnName的连接
}
} else {
// 用户未登录时关闭所有全局连接
webSocketManager.closeAllGlobalConnections();
}
// 重新注册推送监听
this.initPushListener();
},
onHide: function () {
this.globalData.isAppActive = false;
// webSocketManager.closeAllGlobalConnections();
},
globalData: {
isAppActive: false,
},
onBackPress: function () {},
methods: {
...mapActions("user", ["connectSocket"]),
onAPPUpdate() {
APPUpdate(this.version);
},
getCidAsync() {
return new Promise(function (resolve, reject) {
// 获取客户端推送信息
plus.push.getClientInfoAsync(
function (clientInfo) {
// 获取CID
var cid = clientInfo.clientid;
// 调用resolve方法返回CID
resolve(cid);
},
function (error) {
// 获取CID失败调用reject方法返回错误信息
reject(error);
}
);
});
},
// 新增推送监听初始化方法
initPushListener() {
const _self = this;
// 先移除旧监听再添加新监听,避免重复注册
uni.offPushMessage();
uni.onPushMessage(async (res) => {
console.log("收到推送消息:", res);
// 检查用户登录状态,未登录直接返回
if (!_self.userInfo || Object.keys(_self.userInfo).length === 0) {
console.log("用户未登录,忽略推送");
return;
}
if (res.data) {
if (!_self.globalData.isAppActive) {
if (res.type == "click") {
_self.handlePushClick(res.data.payload);
} else {
let shopRes = await GetShopBaseInfo();
if (shopRes.data.ringtone_is_enable === 1) {
_self.handlePushSound(res.data);
uni.setStorageSync("pendingPushData", res.data);
uni.createPushMessage(res.data);
}
}
} else {
console.log("应用已打开,直接处理消息");
_self.$store.dispatch("push/setPush", res.data);
}
}
});
},
async initAppOrderPush() {
uni.getPushClientId({
success: (res) => {
var push_clientid = res.cid;
console.log("客户端推送标识cid:", push_clientid);
},
fail(err) {
console.log(err);
},
});
uni.onPushMessage(async (res) => {
console.log("收到推送消息:", res); //监听推送消息
if (res.data) {
const app = getApp();
if (!app.globalData.isAppActive) {
//监听系统通知栏消息点击事件
if (res.type == "click") {
this.handlePushClick(res.data.payload);
} else {
let res = await GetShopBaseInfo();
if (res.data.ringtone_is_enable === 1) {
this.handlePushSound(res.data);
uni.setStorageSync("pendingPushData", res.data);
// 创建通知
uni.createPushMessage(res.data);
}
}
} else {
console.log("应用已打开,直接处理消息");
// 可以在这里直接更新 UI
this.$store.dispatch("push/setPush", res.data);
}
}
});
const _self = this;
},
// 新增方法 - 处理通知栏点击
handlePushClick(payload) {
console.log("处理通知栏点击:", payload);
console.log(payload.category);
// 根据payload内容跳转页面
switch (payload.category) {
case "mchOnLineOrderList":
uni.setStorageSync("currentTab2", 0);
uni.switchTab({
url: "/pages/order/order",
});
break;
case "mchAbnormalOrderList":
uni.setStorageSync("currentTab2", 1);
uni.switchTab({
url: "/pages/order/order",
});
break;
case "mchRetrunOrderList":
uni.setStorageSync("currentTab2", 2);
uni.switchTab({
url: "/pages/order/order",
});
break;
default:
uni.switchTab({
url: "/pages/order/order",
});
}
// 清除存储的推送数据
uni.removeStorageSync("pendingPushData");
},
// 新增方法 - 处理推送声音
// 修改handlePushSound方法
async handlePushSound(pushData) {
console.log(pushData.payload);
try {
const currentTime = Date.now();
// 检查是否在10秒内已经播放过语音
if (currentTime - this.lastPlayTime < this.playInterval) {
console.log("10秒内已播放过语音本次不播放");
return; // 10秒内不重复播放
}
// 获取category决定使用哪种声音
const category = pushData.payload.category;
var AUDIO = uni.createInnerAudioContext();
// 设置音频源
let soundFile = "";
switch (category) {
case "mchOnLineOrderList":
AUDIO.src = "/static/mp3/jinxingzhong.MP3";
AUDIO.play();
break;
case "mchAbnormalOrderList":
AUDIO.src = "/static/mp3/yichang.MP3";
AUDIO.play();
break;
case "mchRetrunOrderList":
AUDIO.src = "/static/mp3/tuihuo.MP3";
AUDIO.play();
break;
}
this.lastPlayTime = currentTime; // 更新最后播放时间戳
// 处理播放错误
AUDIO.onError((res) => {
console.error("播放声音失败:", res);
});
// 多次会调用播放新的文件时,提前销毁实例,可避免-99错误
// 处理播放完成
AUDIO.onEnded(() => {
AUDIO.pause();
AUDIO.destroy();
AUDIO = null;
});
// Android平台原生播放备选方案
// #ifdef APP-PLUS && ANDROID
if (plus.os.name === "Android") {
this.playNativeAndroidSound(soundFile);
}
// #endif
} catch (e) {
console.error("播放推送声音失败:", e);
}
},
// Android原生播放方法
playNativeAndroidSound(soundFile) {
try {
const main = plus.android.runtimeMainActivity();
const MediaPlayer = plus.android.importClass(
"android.media.MediaPlayer"
);
// 移除路径中的'/static'前缀因为Android assets中不需要
const androidAssetPath = soundFile.replace(/^\/static\//, "");
const mediaPlayer = new MediaPlayer();
const assetFileDescriptor = main
.getAssets()
.openFd("www/" + androidAssetPath);
mediaPlayer.setDataSource(
assetFileDescriptor.getFileDescriptor(),
assetFileDescriptor.getStartOffset(),
assetFileDescriptor.getLength()
);
mediaPlayer.prepare();
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(
new plus.android.Proxy(function () {
mediaPlayer.release();
})
);
} catch (e) {
console.error("Android原生播放失败:", e);
}
},
},
};
</script>
<style lang="scss">
// @import "./uni_modules/uview-ui/index.scss";
// @import "./uni_modules/uview-ui/theme.scss";
/*每个页面公共css */
@import "@/static/reset.css";
@import "@/styles/myui.scss";
@import "@/static/font/iconfont.css";
::v-deep.uni-tabbar-bottom {
display: none;
}
::v-deep.uni-navbar {
min-height: 110rpx;
}
</style>