no message

This commit is contained in:
kuaifan 2021-06-18 22:30:57 +08:00
parent 6a0bc37645
commit 14a645472d
7 changed files with 115 additions and 42 deletions

View File

@ -139,7 +139,7 @@ class ProjectController extends AbstractController
'desc' => $desc, 'desc' => $desc,
'userid' => $user->userid, 'userid' => $user->userid,
]); ]);
return AbstractModel::transaction(function() use ($insertColumns, $project) { AbstractModel::transaction(function() use ($insertColumns, $project) {
$project->save(); $project->save();
ProjectUser::createInstance([ ProjectUser::createInstance([
'project_id' => $project->id, 'project_id' => $project->id,
@ -150,11 +150,12 @@ class ProjectController extends AbstractController
$column['project_id'] = $project->id; $column['project_id'] = $project->id;
ProjectColumn::createInstance($column)->save(); ProjectColumn::createInstance($column)->save();
} }
});
//
$data = $project->find($project->id); $data = $project->find($project->id);
$data->addLog("创建项目"); $data->addLog("创建项目");
$data->pushMsg('add', $data->toArray()); $data->pushMsg('add', $data->toArray());
return Base::retSuccess('添加成功', $data); return Base::retSuccess('添加成功', $data);
});
} }
/** /**

View File

@ -78,10 +78,6 @@ export default {
} }
}, },
mounted() {
this.msgRead()
},
computed: { computed: {
...mapState(['userId']), ...mapState(['userId']),
@ -94,11 +90,16 @@ export default {
} }
}, },
methods: { watch: {
msgRead() { msgData: {
this.$store.dispatch("dialogMsgRead", this.msgData); handler(data) {
this.$store.dispatch("dialogMsgRead", data);
},
immediate: true,
}
}, },
methods: {
popperShow() { popperShow() {
this.$store.dispatch("call", { this.$store.dispatch("call", {
url: 'dialog/msg/readlist', url: 'dialog/msg/readlist',

View File

@ -28,7 +28,8 @@
static> static>
<div ref="manageList" class="dialog-list"> <div ref="manageList" class="dialog-list">
<ul> <ul>
<li v-if="dialogMsgLoad > 0 && dialogMsgList.length === 0" class="loading"><Loading/></li> <li v-if="dialogMsgHasMorePages" class="history" @click="$store.dispatch('getDialogMsgListNextPage')">{{$L('加载历史消息')}}</li>
<li v-else-if="dialogMsgLoad > 0 && dialogMsgList.length === 0" class="loading"><Loading/></li>
<li v-else-if="dialogMsgList.length === 0" class="nothing">{{$L('暂无消息')}}</li> <li v-else-if="dialogMsgList.length === 0" class="nothing">{{$L('暂无消息')}}</li>
<li v-for="(item, key) in dialogMsgList" :key="key" :class="{self:item.userid == userId}"> <li v-for="(item, key) in dialogMsgList" :key="key" :class="{self:item.userid == userId}">
<div class="dialog-avatar"> <div class="dialog-avatar">
@ -101,7 +102,14 @@ export default {
}, },
computed: { computed: {
...mapState(['userId', 'dialogId', 'dialogDetail', 'dialogMsgLoad', 'dialogMsgList']), ...mapState([
'userId',
'dialogId',
'dialogDetail',
'dialogMsgLoad',
'dialogMsgList',
'dialogMsgHasMorePages',
]),
peopleNum() { peopleNum() {
return this.dialogDetail.type === 'group' ? $A.runNum(this.dialogDetail.people) : 0; return this.dialogDetail.type === 'group' ? $A.runNum(this.dialogDetail.people) : 0;

View File

@ -842,9 +842,10 @@ export default {
* 获取会话消息 * 获取会话消息
* @param state * @param state
* @param dispatch * @param dispatch
* @param commit
* @param dialog_id * @param dialog_id
*/ */
getDialogMsgList({state, dispatch}, dialog_id) { getDialogMsgList({state, dispatch, commit}, dialog_id) {
if (state.method.runNum(dialog_id) === 0) { if (state.method.runNum(dialog_id) === 0) {
return; return;
} }
@ -853,6 +854,8 @@ export default {
} }
// //
state.dialogMsgList = []; state.dialogMsgList = [];
state.dialogMsgCurrentPage = 1;
state.dialogMsgHasMorePages = false;
if (state.method.isJson(state.cacheDialogMsg[dialog_id])) { if (state.method.isJson(state.cacheDialogMsg[dialog_id])) {
let length = state.cacheDialogMsg[dialog_id].data.length; let length = state.cacheDialogMsg[dialog_id].data.length;
if (length > 50) { if (length > 50) {
@ -873,38 +876,56 @@ export default {
url: 'dialog/msg/lists', url: 'dialog/msg/lists',
data: { data: {
dialog_id: dialog_id, dialog_id: dialog_id,
page: state.dialogMsgCurrentPage
}, },
}).then(result => { }).then(result => {
state.dialogMsgLoad--; state.dialogMsgLoad--;
state.cacheDialogMsg[dialog_id + "::load"] = false; state.cacheDialogMsg[dialog_id + "::load"] = false;
const dialog = result.data.dialog; const data = result.data;
const reverse = result.data.data.reverse();
// 更新缓存 // 更新缓存
state.cacheDialogMsg[dialog_id] = { state.cacheDialogMsg[dialog_id] = {
dialog, dialog: data.dialog,
data: reverse, data: data.data.reverse(),
}; };
state.method.setStorage("cacheDialogMsg", state.cacheDialogMsg); state.method.setStorage("cacheDialogMsg", state.cacheDialogMsg);
// 更新当前会话消息 // 更新当前会话消息
if (state.dialogId == dialog_id) { commit("dialogMsgListSuccess", data);
state.dialogDetail = dialog;
reverse.forEach((item) => {
let index = state.dialogMsgList.findIndex(({id}) => id == item.id);
if (index === -1) {
state.dialogMsgList.push(item);
} else {
state.dialogMsgList.splice(index, 1, item);
}
})
}
// 更新会话数据
dispatch("saveDialog", dialog);
}).catch(() => { }).catch(() => {
state.dialogMsgLoad--; state.dialogMsgLoad--;
state.cacheDialogMsg[dialog_id + "::load"] = false; state.cacheDialogMsg[dialog_id + "::load"] = false;
}); });
}, },
/**
* 获取下一页会话消息
* @param state
* @param dispatch
* @param commit
*/
getDialogMsgListNextPage({state, dispatch, commit}) {
if (!state.dialogMsgHasMorePages) {
return;
}
state.dialogMsgHasMorePages = false;
state.dialogMsgCurrentPage++;
//
const dialog_id = state.dialogId;
//
state.dialogMsgLoad++;
dispatch("call", {
url: 'dialog/msg/lists',
data: {
dialog_id: dialog_id,
page: state.dialogMsgCurrentPage
},
}).then(result => {
state.dialogMsgLoad--;
commit("dialogMsgListSuccess", result.data);
}).catch(() => {
state.dialogMsgLoad--;
});
},
/** /**
* 获取未读信息 * 获取未读信息
* @param state * @param state
@ -974,14 +995,15 @@ export default {
if (!state.method.isJson(msgData.r)) msgData.r = {}; if (!state.method.isJson(msgData.r)) msgData.r = {};
// //
const {id, dialog_id, r} = msgData; const {id, dialog_id, r} = msgData;
if (!r.read_at) { if (r.read_at) {
return;
}
r.read_at = state.method.formatDate('Y-m-d H:i:s'); r.read_at = state.method.formatDate('Y-m-d H:i:s');
let dialog = state.dialogList.find(({id}) => id == dialog_id); let dialog = state.dialogList.find(({id}) => id == dialog_id);
if (dialog && dialog.unread > 0) { if (dialog && dialog.unread > 0) {
dialog.unread-- dialog.unread--
state.dialogMsgUnread--; state.dialogMsgUnread--;
} }
}
// //
state.wsReadWaitList.push(id); state.wsReadWaitList.push(id);
clearTimeout(state.wsReadTimeout); clearTimeout(state.wsReadTimeout);

View File

@ -177,5 +177,32 @@ export default {
state.calendarTask.splice(index, 1) state.calendarTask.splice(index, 1)
} }
this.dispatch("getProjectBasic", {id: data.project_id}); this.dispatch("getProjectBasic", {id: data.project_id});
},
/**
* 会话消息列表
* @param state
* @param data
*/
dialogMsgListSuccess(state, data) {
const dialog = data.dialog;
const list = data.data;
// 更新当前会话消息
if (state.dialogId == dialog.id) {
state.dialogDetail = dialog;
list.forEach((item) => {
let index = state.dialogMsgList.findIndex(({id}) => id == item.id);
if (index === -1) {
state.dialogMsgList.unshift(item);
} else {
state.dialogMsgList.splice(index, 1, item);
} }
})
}
// 页数数据
state.dialogMsgCurrentPage = data.current_page;
state.dialogMsgHasMorePages = data.current_page < data.last_page;
// 更新会话数据
this.dispatch("saveDialog", dialog);
},
} }

View File

@ -281,9 +281,11 @@ state.calendarTask = [];
state.dialogId = 0; state.dialogId = 0;
state.dialogList = []; state.dialogList = [];
state.dialogDetail = {}; state.dialogDetail = {};
state.dialogMsgUnread = 0;
state.dialogMsgLoad = 0; state.dialogMsgLoad = 0;
state.dialogMsgList = []; state.dialogMsgList = [];
state.dialogMsgUnread = 0; state.dialogMsgCurrentPage = 1;
state.dialogMsgHasMorePages = false;
// 任务优先级 // 任务优先级
state.taskPriority = []; state.taskPriority = [];

View File

@ -175,6 +175,18 @@
} }
} }
} }
&.history {
cursor: pointer;
justify-content: center;
font-size: 13px;
padding: 3px 0;
margin: 12px 0;
opacity: 0.6;
transition: opacity 0.2s;
&:hover {
opacity: 1;
}
}
&.loading { &.loading {
padding: 12px 0; padding: 12px 0;
justify-content: center; justify-content: center;