diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php
index 4356b459..db5b9033 100755
--- a/app/Http/Controllers/Api/DialogController.php
+++ b/app/Http/Controllers/Api/DialogController.php
@@ -111,6 +111,17 @@ class DialogController extends AbstractController
return Base::retSuccess('success', $data);
}
+ /**
+ * 未读消息
+ */
+ public function msg__unread()
+ {
+ $unread = WebSocketDialogMsgRead::whereUserid(User::token2userid())->whereReadAt(null)->count();
+ return Base::retSuccess('success', [
+ 'unread' => $unread,
+ ]);
+ }
+
/**
* 发送消息
*
diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php
index 899acf5e..02f0a547 100644
--- a/app/Models/WebSocketDialogMsg.php
+++ b/app/Models/WebSocketDialogMsg.php
@@ -119,6 +119,7 @@ class WebSocketDialogMsg extends AbstractModel
'userid' => $this->userid,
'msg' => [
'type' => 'dialog',
+ 'mode' => 'up',
'data' => $this->toArray(),
]
]);
diff --git a/app/Tasks/WebSocketDialogMsgTask.php b/app/Tasks/WebSocketDialogMsgTask.php
index 1483bc72..f3d97b82 100644
--- a/app/Tasks/WebSocketDialogMsgTask.php
+++ b/app/Tasks/WebSocketDialogMsgTask.php
@@ -64,6 +64,7 @@ class WebSocketDialogMsgTask extends AbstractTask
'userid' => $pushIds,
'msg' => [
'type' => 'dialog',
+ 'mode' => 'add',
'data' => $this->dialogMsgArray,
]
]);
diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue
index af1cab5b..f6b4dc80 100644
--- a/resources/assets/js/pages/manage.vue
+++ b/resources/assets/js/pages/manage.vue
@@ -17,6 +17,7 @@
+
@@ -141,10 +142,15 @@
margin-top: -1px;
}
.menu-title {
+ flex: 1;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
+ .menu-badge {
+ margin-left: 12px;
+ transform: scale(0.9);
+ }
&.menu-project {
display: flex;
flex-direction: column;
@@ -251,20 +257,39 @@ export default {
columns: [],
}
},
+
mounted() {
this.$store.commit('getUserInfo');
},
+
deactivated() {
this.addShow = false;
},
+
computed: {
- ...mapState(['projectList']),
+ ...mapState(['wsMsg', 'dialogShow', 'dialogMsgUnread', 'projectList']),
},
+
watch: {
'$route' (route) {
this.curPath = route.path;
- }
+ },
+
+ /**
+ * 收到新消息
+ * @param msg
+ */
+ wsMsg(msg) {
+ const {type, mode} = msg;
+ if (type === "dialog" && mode === "add") {
+ if (this.dialogShow) {
+ return;
+ }
+ this.$store.state.dialogMsgUnread++;
+ }
+ },
},
+
methods: {
initLanguage() {
this.columns = [{
diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue
index 23011084..de250eca 100644
--- a/resources/assets/js/pages/manage/components/DialogWrapper.vue
+++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue
@@ -65,6 +65,22 @@ export default {
}
},
+ mounted() {
+ this.$store.state.dialogShow = true;
+ },
+
+ destroyed() {
+ this.$store.state.dialogShow = false;
+ },
+
+ activated() {
+ this.$store.state.dialogShow = true;
+ },
+
+ deactivated() {
+ this.$store.state.dialogShow = false;
+ },
+
computed: {
...mapState(['userId', 'dialogId', 'dialogDetail', 'dialogMsgLoad', 'dialogMsgList']),
diff --git a/resources/assets/js/pages/manage/components/ProjectDialog.vue b/resources/assets/js/pages/manage/components/ProjectDialog.vue
index 10f216b3..f528f2d4 100644
--- a/resources/assets/js/pages/manage/components/ProjectDialog.vue
+++ b/resources/assets/js/pages/manage/components/ProjectDialog.vue
@@ -108,7 +108,7 @@ export default {
methods: {
getMsg() {
if (this.projectChatShow && this.projectDetail.dialog_id) {
- this.$store.commit('getDialogMsg', this.projectDetail.dialog_id);
+ this.$store.commit('getDialogMsgList', this.projectDetail.dialog_id);
}
}
}
diff --git a/resources/assets/js/pages/manage/messenger.vue b/resources/assets/js/pages/manage/messenger.vue
index a60d9501..9d06aa19 100644
--- a/resources/assets/js/pages/manage/messenger.vue
+++ b/resources/assets/js/pages/manage/messenger.vue
@@ -74,7 +74,7 @@ export default {
},
computed: {
- ...mapState(['dialogId', 'wsMsg']),
+ ...mapState(['dialogId', 'dialogShow', 'wsMsg']),
dialogLists() {
const {dialogKey} = this;
@@ -99,9 +99,9 @@ export default {
* @param msg
*/
wsMsg(msg) {
- const {type, data} = msg;
- if (type === "dialog") {
- if (this.dialogId == data.dialog_id) {
+ const {type, mode, data} = msg;
+ if (type === "dialog" && mode === "add") {
+ if (this.dialogShow && this.dialogId == data.dialog_id) {
return;
}
let dialog = this.dialogList.find(({id}) => id == data.dialog_id);
@@ -120,7 +120,8 @@ export default {
*/
dialogId(dialog_id) {
let dialog = this.dialogList.find(({id}) => id == dialog_id);
- if (dialog) {
+ if (dialog && dialog.unread > 0) {
+ this.$store.state.dialogMsgUnread-= dialog.unread;
this.$set(dialog, 'unread', 0);
}
}
@@ -128,7 +129,7 @@ export default {
methods: {
openDialog(dialog) {
- this.$store.commit('getDialogMsg', dialog.id);
+ this.$store.commit('getDialogMsgList', dialog.id);
},
getDialogLists() {
diff --git a/resources/assets/js/pages/manage/project.vue b/resources/assets/js/pages/manage/project.vue
index 2230e373..bb5c3a02 100644
--- a/resources/assets/js/pages/manage/project.vue
+++ b/resources/assets/js/pages/manage/project.vue
@@ -2,7 +2,7 @@
diff --git a/resources/assets/js/store/mutations.js b/resources/assets/js/store/mutations.js
index 60b38c68..a7833118 100644
--- a/resources/assets/js/store/mutations.js
+++ b/resources/assets/js/store/mutations.js
@@ -64,6 +64,7 @@ export default {
state.userToken = userInfo.token;
state.userIsAdmin = state.method.inArray('admin', userInfo.identity);
state.method.setStorage('userInfo', state.userInfo);
+ this.commit('getDialogMsgUnread');
this.commit('getProjectList');
this.commit('wsConnection');
},
@@ -215,7 +216,7 @@ export default {
* @param state
* @param dialog_id
*/
- getDialogMsg(state, dialog_id) {
+ getDialogMsgList(state, dialog_id) {
if (state.method.runNum(dialog_id) === 0) {
return;
}
@@ -273,6 +274,28 @@ export default {
});
},
+ /**
+ * 获取未读信息
+ * @param state
+ */
+ getDialogMsgUnread(state) {
+ const unread = state.dialogMsgUnread;
+ $A.apiAjax({
+ url: 'dialog/msg/unread',
+ success: ({ret, data, msg}) => {
+ if (ret === 1) {
+ if (unread === state.dialogMsgUnread) {
+ state.dialogMsgUnread = data.unread;
+ } else {
+ setTimeout(() => {
+ this.commit('getDialogMsgUnread');
+ }, 200);
+ }
+ }
+ }
+ });
+ },
+
/**
* 根据消息ID 删除 或 替换 对话数据
* @param state
diff --git a/resources/assets/js/store/state.js b/resources/assets/js/store/state.js
index 8f6d5a58..6be5eeb4 100644
--- a/resources/assets/js/store/state.js
+++ b/resources/assets/js/store/state.js
@@ -144,9 +144,7 @@ const method = {
};
// 方法类
-const state = {
- method
-};
+const state = { method };
// Boolean变量
[
@@ -188,9 +186,11 @@ state.projectMsgUnread = 0;
// 会话消息
state.dialogId = 0;
+state.dialogShow = false;
state.dialogDetail = {};
state.dialogMsgLoad = 0;
state.dialogMsgList = [];
+state.dialogMsgUnread = 0;
// 任务优先级
state.taskPriority = [];
diff --git a/resources/assets/sass/main.scss b/resources/assets/sass/main.scss
index fd82731f..14325589 100755
--- a/resources/assets/sass/main.scss
+++ b/resources/assets/sass/main.scss
@@ -1122,12 +1122,7 @@ body {
top: 10px;
left: 42px;
font-size: 12px;
- .ivu-badge-count {
- height: 18px;
- min-width: 18px;
- line-height: 16px;
- padding: 0 4px;
- }
+ transform: scale(0.8);
}
}
}