Signalr推送

This commit is contained in:
赵正易 2025-05-05 12:22:33 +08:00
parent 36b729a026
commit 5239e90611
6 changed files with 271 additions and 137 deletions

11
App.vue
View File

@ -7,6 +7,13 @@ export default {
onLaunch: function () {
this.initApp();
},
onUnload() {
},
data() {
return {
};
},
methods: {
//
initApp() {
@ -16,9 +23,8 @@ export default {
//#ifdef H5
this.checkLogin();
//#endif
//
},
initConfig() {
this.globalData.config = config;
},
@ -31,6 +37,7 @@ export default {
};
</script>
<style lang="scss">
@import '@/static/scss/index.scss';
.border {

View File

@ -1,105 +1,109 @@
{
"name" : "DOAN总装车间PDA",
"appid" : "__UNI__EFA389B",
"description" : "DOAN总装车间PDA",
"versionName" : "1.5.0",
"versionCode" : 150,
"transformPx" : false,
"app-plus" : {
"usingComponents" : true,
"nvueCompiler" : "uni-app",
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
"modules" : {},
"distribute" : {
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
"ios" : {
"dSYMs" : false
},
"sdkConfigs" : {
"ad" : {}
},
"icons" : {
"android" : {
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png",
"xxxhdpi" : "unpackage/res/icons/192x192.png"
},
"ios" : {
"appstore" : "unpackage/res/icons/1024x1024.png",
"ipad" : {
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"notification" : "unpackage/res/icons/20x20.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"iphone" : {
"app@2x" : "unpackage/res/icons/120x120.png",
"app@3x" : "unpackage/res/icons/180x180.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification@3x" : "unpackage/res/icons/60x60.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"settings@3x" : "unpackage/res/icons/87x87.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png"
}
}
}
}
},
"quickapp" : {},
"mp-weixin" : {
"appid" : "wxccd7e2a0911b3397",
"setting" : {
"urlCheck" : false,
"es6" : false,
"minified" : true,
"postcss" : true
},
"optimization" : {
"subPackages" : true
},
"usingComponents" : true
},
"vueVersion" : "2",
"h5" : {
"template" : "static/index.html",
"devServer" : {
"port" : 9090,
"https" : false
},
"title" : "RuoYi-App",
"router" : {
"mode" : "hash",
"base" : "./"
}
}
"name": "DOAN总装车间PDA",
"appid": "__UNI__EFA389B",
"description": "DOAN总装车间PDA",
"versionName": "1.5.0",
"versionCode": 150,
"transformPx": false,
"app-plus": {
"networkTimeout": {
"request": 60000
},
"usesCleartextTraffic": true,
"usingComponents": true,
"nvueCompiler": "uni-app",
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
"modules": {},
"distribute": {
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
"ios": {
"dSYMs": false
},
"sdkConfigs": {
"ad": {}
},
"icons": {
"android": {
"hdpi": "unpackage/res/icons/72x72.png",
"xhdpi": "unpackage/res/icons/96x96.png",
"xxhdpi": "unpackage/res/icons/144x144.png",
"xxxhdpi": "unpackage/res/icons/192x192.png"
},
"ios": {
"appstore": "unpackage/res/icons/1024x1024.png",
"ipad": {
"app": "unpackage/res/icons/76x76.png",
"app@2x": "unpackage/res/icons/152x152.png",
"notification": "unpackage/res/icons/20x20.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"proapp@2x": "unpackage/res/icons/167x167.png",
"settings": "unpackage/res/icons/29x29.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"spotlight": "unpackage/res/icons/40x40.png",
"spotlight@2x": "unpackage/res/icons/80x80.png"
},
"iphone": {
"app@2x": "unpackage/res/icons/120x120.png",
"app@3x": "unpackage/res/icons/180x180.png",
"notification@2x": "unpackage/res/icons/40x40.png",
"notification@3x": "unpackage/res/icons/60x60.png",
"settings@2x": "unpackage/res/icons/58x58.png",
"settings@3x": "unpackage/res/icons/87x87.png",
"spotlight@2x": "unpackage/res/icons/80x80.png",
"spotlight@3x": "unpackage/res/icons/120x120.png"
}
}
}
}
},
"quickapp": {},
"mp-weixin": {
"appid": "wxccd7e2a0911b3397",
"setting": {
"urlCheck": false,
"es6": false,
"minified": true,
"postcss": true
},
"optimization": {
"subPackages": true
},
"usingComponents": true
},
"vueVersion": "2",
"h5": {
"template": "static/index.html",
"devServer": {
"port": 9090,
"https": false
},
"title": "RuoYi-App",
"router": {
"mode": "hash",
"base": "./"
}
}
}

View File

@ -1,5 +1,6 @@
{
"dependencies": {
"@microsoft/signalr": "^8.0.7",
"dayjs": "^1.11.13"
}
}

View File

@ -34,17 +34,19 @@
</uni-grid-item>
</uni-grid>
</view>
<view ref="socketRef"></view>
</view>
</template>
<script>
import { fail } from 'assert';
import { getBaseUrl } from '@/utils/baseUrl';
export default {
onShow() {
uni.hideLoading();
},
data() {
return {
socketRef:null,
current: 0,
swiperDotIndex: 0,
bannerList: [
@ -79,7 +81,7 @@ export default {
name: '安灯报警',
icon: 'notification-filled',
url: '/pages/produceManagement/andon/alarm'
},
}
],
//
materialOptions: [
@ -87,7 +89,7 @@ export default {
name: '产线备料',
icon: 'upload-filled',
url: '/pages/materialManagement/preparationByPlan/index'
},
}
// {
// name: '',
// icon: 'upload-filled',
@ -122,11 +124,108 @@ export default {
this.$modal.showToast('模块建设中~');
}
});
},
// renderjs
handleGetStorage() {
const value = getBaseUrl();
console.log('handleGetStorage', this.$refs.socketRef);
this.$refs.socketRef.receiveStorageValue(value);
}
}
};
</script>
<!-- SignalR的使用 -->
<script module="socketRef" lang="renderjs">
import SignalRUtil from '@/utils/signalrUtil';
export default {
data() {
return {
baseUrl:"",
signalRUtil: null,
isSignalRConnected: false
}
},
methods: {
initSignalR() {
this.requestStorageValue();
let baseUrl = this.baseUrl;
let url = `http://${baseUrl}/pdaHub`;
//let url = "http://192.168.50.163/pdaHub";
this.signalRUtil = new SignalRUtil(url);
this.signalRUtil
.startConnection()
.then(() => {
this.isSignalRConnected = true;
//
this.signalRUtil.on('Call', (message) => {
this.showSystemAlertAndVibrate(message)
});
})
.catch((error) => {
console.error('SignalR 连接失败:', error);
});
},
stopSignalRConnection() {
if (this.isSignalRConnected && this.signalRUtil) {
this.signalRUtil
.stopConnection()
.then(() => {
this.isSignalRConnected = false;
console.log('SignalR 连接已停止');
})
.catch((error) => {
console.error('停止 SignalR 连接失败:', error);
});
}
},
//
showSystemAlertAndVibrate(obj) {
//
this.sendNativeNotification(obj);
},
//
sendNativeNotification(obj) {
const {lineCode,askPerson,faultDict,faultContext} = obj;
// #ifdef APP-PLUS
let content = `线别:${lineCode} 报警人:${askPerson}\n报警类别:${faultDict}\n报警内容:${faultContext}`;
let options = {
cover: false,
when: new Date(),
title: '产线Andon报警'
};
let body = {
id: 'id',
key: 'key'
};
let payload = JSON.stringify(body);
plus.push.createMessage(content, payload, options);
if (plus && plus.vibration) {
plus.vibration.vibrate(3000);
} else {
console.error('震动功能不可用');
}
// #endif
},
//
requestStorageValue() {
this.$ownerInstance.callMethod('handleGetStorage');
},
//
receiveStorageValue(value) {
console.log('从存储中获取的值:', value);
this.baseUrl = value;
//
}
},
async mounted() {
this.initSignalR()
},
}
</script>
<style lang="scss">
/* #ifndef APP-NVUE */
page {
@ -186,7 +285,7 @@ view {
height: 300rpx;
line-height: 300rpx;
}
.card-box{
.card-box {
padding-bottom: 60px;
margin-bottom: 60px;
}

View File

@ -150,33 +150,7 @@ export default {
})
.catch((err) => {});
},
//
sendNativeNotification() {
// #ifdef APP-PLUS
let content = '您有一条新的消息~';
let options = {
cover: false,
when: new Date(),
title: '通知消息'
};
let body = {
id: 'id',
key: 'key'
};
let payload = JSON.stringify(body);
plus.push.createMessage(content, payload, options);
if (plus && plus.vibration) {
plus.vibration.vibrate(3000);
} else {
console.error('震动功能不可用');
}
// #endif
},
//
showSystemAlertAndVibrate() {
//
this.sendNativeNotification();
}
}
};
</script>

49
utils/signalrUtil.js Normal file
View File

@ -0,0 +1,49 @@
import * as signalR from '@microsoft/signalr';
import { getToken } from '@/utils/auth'
class SignalRUtil {
constructor(url) {
console.log('SignalR 连接:',url);
this.hubConnection = new signalR.HubConnectionBuilder()
.withUrl(url)
.withAutomaticReconnect()
.configureLogging(signalR.LogLevel.Warning)
.build();
this.hubConnection.onclose(() => {
console.log('SignalR 连接已关闭');
});
}
async startConnection() {
try {
await this.hubConnection.start();
console.log('SignalR 连接已建立');
} catch (error) {
console.error('SignalR 连接失败:', error);
}
}
on(methodName, callback) {
this.hubConnection.on(methodName, callback);
}
async invoke(methodName, ...args) {
try {
return await this.hubConnection.invoke(methodName, ...args);
} catch (error) {
console.error('调用 SignalR 方法失败:', error);
}
}
async stopConnection() {
try {
await this.hubConnection.stop();
console.log('SignalR 连接已停止');
} catch (error) {
console.error('停止 SignalR 连接失败:', error);
}
}
}
export default SignalRUtil;