Skip to content

Commit 626b518

Browse files
author
puhui999
committed
websocket 重新封装
1 parent dce4fdd commit 626b518

File tree

3 files changed

+122
-29
lines changed

3 files changed

+122
-29
lines changed

src/api/system/notice.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,11 @@ export function delNotice(noticeId) {
4242
method: 'delete'
4343
})
4444
}
45+
46+
// 推送公告
47+
export function pushNotice(noticeId) {
48+
return request({
49+
url: '/system/notice/push?id=' + noticeId,
50+
method: 'post'
51+
})
52+
}

src/views/infra/webSocket/index.vue

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,19 @@
1616
</el-form-item>
1717
</el-col>
1818
</el-row>
19+
<el-form-item label="发给谁" size="small">
20+
<el-select v-model="sendUserId" placeholder="请选择">
21+
<el-option label="所有人" :value="null"/>
22+
<el-option
23+
v-for="item in userList"
24+
:key="item.id"
25+
:label="item.nickname"
26+
:value="item.id">
27+
</el-option>
28+
</el-select>
29+
</el-form-item>
1930
<el-form-item label="发送内容" size="small">
20-
<el-input type="textarea" v-model="message" :rows="5"/>
31+
<el-input type="textarea" v-model="sendText" :rows="5"/>
2132
</el-form-item>
2233
<el-form-item label="" size="small">
2334
<el-button type="success" @click="send">发送消息</el-button>
@@ -33,35 +44,73 @@
3344
</template>
3445

3546
<script>
36-
import store from "@/store";
3747
import {getNowDateTime} from "@/utils/ruoyi";
48+
import {getAccessToken} from "@/utils/auth";
49+
import {listSimpleUsers} from "@/api/system/user";
3850
3951
export default {
4052
data() {
4153
return {
42-
url: process.env.VUE_APP_BASE_API + "/websocket/message",
43-
message: "",
54+
url: "",
55+
sendText: "",
4456
content: "",
4557
ws: null,
58+
userList: [], // 用户列表
59+
sendUserId: null // 发给谁,默认所有人
4660
};
4761
},
4862
created() {
49-
this.url = this.url.replace("http", "ws")
63+
const wsUrl = process.env.VUE_APP_BASE_API + "/infra/ws" + '?token=' + getAccessToken();
64+
this.url = wsUrl.replace("http", "ws");
65+
// 获取用户精简信息列表
66+
const self = this;
67+
listSimpleUsers().then(res => {
68+
self.userList = res.data;
69+
});
5070
},
5171
methods: {
5272
connect() {
5373
if (!'WebSocket' in window) {
5474
this.$modal.msgError("您的浏览器不支持WebSocket");
5575
return;
5676
}
57-
const userId = store.getters.userId;
58-
this.ws = new WebSocket(this.url + "?userId=" + userId);
77+
this.ws = new WebSocket(this.url);
5978
const self = this;
6079
this.ws.onopen = function (event) {
6180
self.content = self.content + "\n**********************连接开始**********************\n";
6281
};
6382
this.ws.onmessage = function (event) {
64-
self.content = self.content + "接收时间:" + getNowDateTime() + "\n" + event.data + "\n";
83+
try {
84+
const data = event.data
85+
// 1. 收到心跳
86+
if (data === 'pong') {
87+
return
88+
}
89+
// 2.1 解析 type 消息类型
90+
const jsonMessage = JSON.parse(data)
91+
const type = jsonMessage.type
92+
const content = JSON.parse(jsonMessage.content)
93+
if (!type) {
94+
self.$modal.msgError('未知的消息类型:' + data)
95+
return
96+
}
97+
// 2.2 消息类型:demo-message-receive
98+
if (type === 'demo-message-receive') {
99+
const single = content.single
100+
self.content = self.content + "接收时间:" + getNowDateTime() + "\n" +
101+
`${single ? '单发' : '群发'}】用户编号(${content.fromUserId}):${content.text}` + "\n";
102+
return
103+
}
104+
// 2.3 消息类型:notice-push
105+
if (type === 'notice-push') {
106+
self.content = self.content + "接收时间:" + getNowDateTime() + "\n" + `【系统通知】:${content.title}` + "\n";
107+
return
108+
}
109+
self.$modal.msgError('未处理消息:' + data)
110+
} catch (error) {
111+
self.$modal.msgError('处理消息发生异常:' + event.data)
112+
console.error(error)
113+
}
65114
};
66115
this.ws.onclose = function (event) {
67116
self.content = self.content + "**********************连接关闭**********************\n";
@@ -81,11 +130,24 @@ export default {
81130
this.$modal.msgError("未连接到服务器");
82131
return;
83132
}
84-
if (!this.message) {
133+
if (!this.sendText) {
85134
this.$modal.msgError("请输入发送内容");
86135
return;
87136
}
88-
this.ws.send(this.message);
137+
138+
// 1.1 先 JSON 化 message 消息内容
139+
const messageContent = JSON.stringify({
140+
text: this.sendText,
141+
toUserId: this.sendUserId
142+
})
143+
// 1.2 再 JSON 化整个消息
144+
const jsonMessage = JSON.stringify({
145+
type: 'demo-message-send',
146+
content: messageContent
147+
})
148+
// 2. 最后发送消息
149+
this.ws.send(jsonMessage)
150+
this.sendText = ''
89151
}
90152
},
91153
};

src/views/system/notice/index.vue

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
</el-form-item>
77
<el-form-item label="公告状态" prop="status">
88
<el-select v-model="queryParams.status" placeholder="公告状态" clearable>
9-
<el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
9+
<el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label"
10+
:value="parseInt(dict.value)"/>
1011
</el-select>
1112
</el-form-item>
1213
<el-form-item>
@@ -18,13 +19,14 @@
1819
<el-row :gutter="10" class="mb8">
1920
<el-col :span="1.5">
2021
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
21-
v-hasPermi="['system:notice:create']"s>新增</el-button>
22+
v-hasPermi="['system:notice:create']" s>新增
23+
</el-button>
2224
</el-col>
2325
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
2426
</el-row>
2527

2628
<el-table v-loading="loading" :data="noticeList">
27-
<el-table-column label="序号" align="center" prop="id" width="100" />
29+
<el-table-column label="序号" align="center" prop="id" width="100"/>
2830
<el-table-column label="公告标题" align="center" prop="title" :show-overflow-tooltip="true"/>
2931
<el-table-column label="公告类型" align="center" prop="type" width="100">
3032
<template v-slot="scope">
@@ -36,7 +38,7 @@
3638
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
3739
</template>
3840
</el-table-column>
39-
<el-table-column label="创建者" align="center" prop="createBy" width="100" />
41+
<el-table-column label="创建者" align="center" prop="createBy" width="100"/>
4042
<el-table-column label="创建时间" align="center" prop="createTime" width="100">
4143
<template v-slot="scope">
4244
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
@@ -45,9 +47,14 @@
4547
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
4648
<template v-slot="scope">
4749
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
48-
v-hasPermi="['system:notice:update']">修改</el-button>
50+
v-hasPermi="['system:notice:update']">修改
51+
</el-button>
4952
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
50-
v-hasPermi="['system:notice:delete']">删除</el-button>
53+
v-hasPermi="['system:notice:delete']">删除
54+
</el-button>
55+
<el-button size="mini" type="text" @click="handlePush(scope.row.id)"
56+
v-hasPermi="['system:notice:update']">推送
57+
</el-button>
5158
</template>
5259
</el-table-column>
5360
</el-table>
@@ -61,7 +68,7 @@
6168
<el-row>
6269
<el-col :span="12">
6370
<el-form-item label="公告标题" prop="title">
64-
<el-input v-model="form.title" placeholder="请输入公告标题" />
71+
<el-input v-model="form.title" placeholder="请输入公告标题"/>
6572
</el-form-item>
6673
</el-col>
6774
<el-col :span="12">
@@ -83,7 +90,8 @@
8390
v-for="dict in statusDictDatas"
8491
:key="parseInt(dict.value)"
8592
:label="parseInt(dict.value)"
86-
>{{dict.label}}</el-radio>
93+
>{{ dict.label }}
94+
</el-radio>
8795
</el-radio-group>
8896
</el-form-item>
8997
</el-col>
@@ -103,11 +111,11 @@
103111
</template>
104112

105113
<script>
106-
import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice";
114+
import {addNotice, delNotice, getNotice, listNotice, pushNotice, updateNotice} from "@/api/system/notice";
107115
import Editor from '@/components/Editor';
108116
109117
import {CommonStatusEnum} from '@/utils/constants'
110-
import { getDictDatas, DICT_TYPE } from '@/utils/dict'
118+
import {DICT_TYPE, getDictDatas} from '@/utils/dict'
111119
112120
export default {
113121
name: "SystemNotice",
@@ -140,10 +148,10 @@ export default {
140148
// 表单校验
141149
rules: {
142150
title: [
143-
{ required: true, message: "公告标题不能为空", trigger: "blur" }
151+
{required: true, message: "公告标题不能为空", trigger: "blur"}
144152
],
145153
type: [
146-
{ required: true, message: "公告类型不能为空", trigger: "change" }
154+
{required: true, message: "公告类型不能为空", trigger: "change"}
147155
]
148156
},
149157
@@ -210,7 +218,7 @@ export default {
210218
});
211219
},
212220
/** 提交按钮 */
213-
submitForm: function() {
221+
submitForm: function () {
214222
this.$refs["form"].validate(valid => {
215223
if (valid) {
216224
if (this.form.id !== undefined) {
@@ -232,12 +240,27 @@ export default {
232240
/** 删除按钮操作 */
233241
handleDelete(row) {
234242
const ids = row.id || this.ids
235-
this.$modal.confirm('是否确认删除公告编号为"' + ids + '"的数据项?').then(function() {
236-
return delNotice(ids);
237-
}).then(() => {
238-
this.getList();
239-
this.$modal.msgSuccess("删除成功");
240-
}).catch(() => {});
243+
this.$modal.confirm('是否确认删除公告编号为"' + ids + '"的数据项?').then(function () {
244+
return delNotice(ids);
245+
}).then(() => {
246+
this.getList();
247+
this.$modal.msgSuccess("删除成功");
248+
}).catch(() => {
249+
});
250+
},
251+
/** 推送按钮操作 */
252+
handlePush(id) {
253+
try {
254+
const self = this;
255+
// 推送的二次确认
256+
this.$modal.confirm('是否推送所选中通知?').then(() => {
257+
// 发起推送
258+
pushNotice(id).then(() => {
259+
self.$modal.success('推送成功');
260+
})
261+
})
262+
} catch {
263+
}
241264
}
242265
}
243266
};

0 commit comments

Comments
 (0)