mirror of
https://github.com/kuaifan/dootask.git
synced 2026-03-03 16:02:08 +00:00
perf: 优化更新对话列表机制
This commit is contained in:
parent
d0d6b8ce97
commit
6a2f1f80f5
@ -31,6 +31,7 @@ class DialogController extends AbstractController
|
||||
* @apiGroup dialog
|
||||
* @apiName lists
|
||||
*
|
||||
* @apiParam {String} [at_after] 只读取在这个时间之后更新的对话
|
||||
* @apiParam {Number} [page] 当前页,默认:1
|
||||
* @apiParam {Number} [pagesize] 每页显示数量,默认:100,最大:200
|
||||
*
|
||||
@ -42,9 +43,13 @@ class DialogController extends AbstractController
|
||||
{
|
||||
$user = User::auth();
|
||||
//
|
||||
$list = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread'])
|
||||
$builder = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread'])
|
||||
->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id')
|
||||
->where('u.userid', $user->userid)
|
||||
->where('u.userid', $user->userid);
|
||||
if (Request::exists('at_after')) {
|
||||
$builder->where('web_socket_dialogs.last_at', '>', Carbon::parse(Request::input('at_after')));
|
||||
}
|
||||
$list = $builder
|
||||
->orderByDesc('u.top_at')
|
||||
->orderByDesc('web_socket_dialogs.last_at')
|
||||
->paginate(Base::getPaginate(200, 100));
|
||||
|
||||
@ -159,6 +159,10 @@ export default {
|
||||
}
|
||||
},
|
||||
|
||||
activated() {
|
||||
this.updateDialogs();
|
||||
},
|
||||
|
||||
computed: {
|
||||
...mapState(['userId', 'cacheDialogs']),
|
||||
|
||||
@ -254,11 +258,6 @@ export default {
|
||||
},
|
||||
|
||||
watch: {
|
||||
tabActive(val) {
|
||||
if (val && this.contactsData === null) {
|
||||
this.getContactsList(1);
|
||||
}
|
||||
},
|
||||
contactsKey(val) {
|
||||
setTimeout(() => {
|
||||
if (this.contactsKey == val) {
|
||||
@ -267,6 +266,16 @@ export default {
|
||||
}
|
||||
}, 600);
|
||||
},
|
||||
tabActive: {
|
||||
handler(val) {
|
||||
if (val == 'contacts') {
|
||||
this.contactsData === null && this.getContactsList(1);
|
||||
} else {
|
||||
this.updateDialogs();
|
||||
}
|
||||
},
|
||||
immediate: true
|
||||
},
|
||||
dialogId: {
|
||||
handler(id) {
|
||||
if (id > 0) {
|
||||
@ -512,7 +521,14 @@ export default {
|
||||
}).catch(({msg}) => {
|
||||
$A.modalError(msg);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
updateDialogs() {
|
||||
this.__updateDialogs && clearTimeout(this.__updateDialogs)
|
||||
this.__updateDialogs = setTimeout(_ => {
|
||||
this.$store.dispatch("getDialogs", true).catch(() => {});
|
||||
}, 2000)
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
14
resources/assets/js/store/actions.js
vendored
14
resources/assets/js/store/actions.js
vendored
@ -1905,17 +1905,29 @@ export default {
|
||||
* 获取会话列表
|
||||
* @param state
|
||||
* @param dispatch
|
||||
* @param atAfter
|
||||
* @returns {Promise<unknown>}
|
||||
*/
|
||||
getDialogs({state, dispatch}) {
|
||||
getDialogs({state, dispatch}, atAfter) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
if (state.userId === 0) {
|
||||
state.cacheDialogs = [];
|
||||
reject({msg: 'Parameter error'});
|
||||
return;
|
||||
}
|
||||
let data = {};
|
||||
if (atAfter === true && state.cacheDialogs.length > 0) {
|
||||
const tmpList = state.cacheDialogs.sort((a, b) => {
|
||||
if (a.top_at || b.top_at) {
|
||||
return $A.Date(b.top_at) - $A.Date(a.top_at);
|
||||
}
|
||||
return $A.Date(b.last_at) - $A.Date(a.last_at);
|
||||
})
|
||||
data.at_after = tmpList[0].last_at;
|
||||
}
|
||||
dispatch("call", {
|
||||
url: 'dialog/lists',
|
||||
data,
|
||||
}).then(result => {
|
||||
dispatch("saveDialog", result.data.data);
|
||||
resolve(result)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user