perf: 优化会话列表数据加载

This commit is contained in:
kuaifan 2023-02-25 15:01:05 +08:00
parent b9163af11a
commit fe8450d48a
4 changed files with 53 additions and 52 deletions

View File

@ -34,8 +34,8 @@ class DialogController extends AbstractController
* @apiGroup dialog
* @apiName lists
*
* @apiParam {String} [at_after] 只读取在这个时间之后更新的对话
* @apiParam {String} [deleted_at] 读取在这个时间之后删除的对话ID返回数据: deleted_data
* @apiParam {String} [updated_at] 只读取在这个时间之后更新的对话
* @apiParam {String} [deleted_at] 读取在这个时间之后删除的对话ID返回数据: deleted_data此参数仅第1页有效
* @apiParam {Number} [page] 当前页,默认:1
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
*
@ -50,8 +50,8 @@ class DialogController extends AbstractController
$builder = WebSocketDialog::select(['web_socket_dialogs.*', 'u.top_at', 'u.mark_unread', 'u.silence', 'u.updated_at as user_at'])
->join('web_socket_dialog_users as u', 'web_socket_dialogs.id', '=', 'u.dialog_id')
->where('u.userid', $user->userid);
if (Request::exists('at_after')) {
$builder->where('u.updated_at', '>', Carbon::parse(Request::input('at_after')));
if (Request::input('updated_at') || Request::input('at_after')) {
$builder->where('u.updated_at', '>', Carbon::parse(Request::input('updated_at') ?: Request::input('at_after')));
}
$list = $builder
->orderByDesc('u.top_at')
@ -60,9 +60,9 @@ class DialogController extends AbstractController
$list->transform(function (WebSocketDialog $item) use ($user) {
return $item->formatData($user->userid);
});
//
$data = $list->toArray();
if (Request::exists('deleted_at')) {
//
if ($list->currentPage() === 1 && Request::input('deleted_at')) {
$data['deleted_at'] = date("Y-m-d H:i:s");
$data['deleted_data'] = WebSocketDialog::select(['web_socket_dialogs.id'])
->withTrashed()

View File

@ -58,7 +58,7 @@ class ProjectController extends AbstractController
* - yes取列表
* @apiParam {Object} [keys] 搜索条件
* - keys.name: 项目名称
* @apiParam {String} [deleted_at] 读取在这个时间之后删除的项目ID返回数据: deleted_data
* @apiParam {String} [deleted_at] 读取在这个时间之后删除的项目ID返回数据: deleted_data此参数仅第1页有效
*
* @apiParam {Number} [page] 当前页,默认:1
* @apiParam {Number} [pagesize] 每页显示数量,默认:50,最大:100
@ -131,7 +131,7 @@ class ProjectController extends AbstractController
//
$keys = Request::input('keys');
if (is_array($keys)) {
$buildClone = $builder->clone();
$totalAll = $builder->clone()->count();
if ($keys['name']) {
$builder->where("projects.name", "like", "%{$keys['name']}%");
}
@ -143,13 +143,9 @@ class ProjectController extends AbstractController
});
//
$data = $list->toArray();
if (isset($buildClone)) {
$data['total_all'] = $buildClone->count();
} else {
$data['total_all'] = $data['total'];
}
$data['total_all'] = $totalAll ?? $data['total'];
//
if (Request::exists('deleted_at')) {
if ($list->currentPage() === 1 && Request::input('deleted_at')) {
$data['deleted_at'] = date("Y-m-d H:i:s");
$data['deleted_data'] = Project::authData()
->withTrashed()

View File

@ -852,41 +852,44 @@ export default {
* @param state
* @param dispatch
* @param getters
* @param callData
* @param requestData
* @returns {Promise<unknown>}
*/
getProjects({state, dispatch, getters}, callData) {
getProjects({state, dispatch, getters}, requestData) {
return new Promise(function (resolve, reject) {
if (state.userId === 0) {
state.cacheProjects = [];
reject({msg: 'Parameter error'});
return;
}
if ($A.isJson(callData)) {
typeof callData.deleted_at !== "undefined" && delete callData.deleted_at
} else {
callData = {deleted_at: state.projectDeletedAt || getters.getProjectLastAt}
if (!$A.isJson(requestData)) {
requestData = {}
}
if (typeof requestData.deleted_at === "undefined") {
requestData.deleted_at = state.projectDeletedAt || getters.getProjectLastAt
}
//
!callData.hideLoad && state.loadProjects++;
!requestData.hideLoad && state.loadProjects++;
dispatch("call", {
url: 'project/lists',
data: callData
data: requestData
}).then(({data}) => {
state.projectTotal = data.total_all;
dispatch("saveProject", data.data);
//
data.deleted_at && $A.IDBSet("projectDeletedAt", data.deleted_at).then(_ => {
state.projectDeletedAt = data.deleted_at
data.deleted_data.some(id => dispatch("forgetProject", id))
});
if (data.current_page === 1) {
data.deleted_at && $A.IDBSet("projectDeletedAt", data.deleted_at).then(_ => {
state.projectDeletedAt = data.deleted_at
data.deleted_data.some(id => dispatch("forgetProject", id))
});
}
//
resolve(data)
}).catch(e => {
console.warn(e);
reject(e)
}).finally(_ => {
!callData.hideLoad && state.loadProjects--;
!requestData.hideLoad && state.loadProjects--;
});
});
},
@ -2128,49 +2131,50 @@ export default {
* @param state
* @param dispatch
* @param getters
* @param callData
* @param requestData
* @returns {Promise<unknown>}
*/
getDialogs({state, dispatch, getters}, callData) {
getDialogs({state, dispatch, getters}, requestData) {
return new Promise(function (resolve, reject) {
if (state.userId === 0) {
state.cacheDialogs = [];
reject({msg: 'Parameter error'});
return;
}
if ($A.isJson(callData)) {
typeof callData.deleted_at !== "undefined" && delete callData.deleted_at
} else {
callData = {deleted_at: state.dialogDeletedAt || getters.getDialogLastAt}
if (!$A.isJson(requestData)) {
requestData = {}
}
if (typeof callData.pagesize === "undefined") {
callData.pagesize = 20
if (typeof requestData.page === "undefined") {
requestData.page = 1
}
if (typeof callData.page === "undefined") {
callData.page = 1
if (state.cacheDialogs.length > 0) {
const tmpList = state.cacheDialogs.sort((a, b) => {
return $A.Date(b.user_at) - $A.Date(a.user_at);
})
callData.at_after = tmpList[0].user_at;
}
if (typeof requestData.pagesize === "undefined") {
requestData.pagesize = 20
}
if (typeof requestData.updated_at === "undefined") {
requestData.updated_at = state.dialogUpdatedAt
}
if (typeof requestData.deleted_at === "undefined") {
requestData.deleted_at = state.dialogDeletedAt || getters.getDialogLastAt
}
//
!callData.hideLoad && state.loadDialogs++;
!requestData.hideLoad && state.loadDialogs++;
dispatch("call", {
url: 'dialog/lists',
data: callData,
data: requestData,
}).then(({data}) => {
dispatch("saveDialog", data.data);
//
data.deleted_at && $A.IDBSet("dialogDeletedAt", data.deleted_at).then(_ => {
state.dialogDeletedAt = data.deleted_at
data.deleted_data.some(id => dispatch("forgetDialog", id))
});
if (data.current_page === 1) {
data.deleted_at && $A.IDBSet("dialogDeletedAt", data.deleted_at).then(_ => {
state.dialogDeletedAt = data.deleted_at
data.deleted_data.some(id => dispatch("forgetDialog", id))
});
state.dialogUpdatedAt = $A.formatDate()
}
//
if (data.next_page_url && data.current_page < 5) {
callData.page++
dispatch("getDialogs", callData).then(resolve).catch(reject)
requestData.page++
dispatch("getDialogs", requestData).then(resolve).catch(reject)
} else {
resolve()
}
@ -2178,7 +2182,7 @@ export default {
console.warn(e);
reject(e)
}).finally(_ => {
!callData.hideLoad && state.loadDialogs--;
!requestData.hideLoad && state.loadDialogs--;
});
});
},

View File

@ -82,6 +82,7 @@ export default {
dialogHistory: [],
dialogInputCache: [],
dialogMsgTransfer: {time: 0},
dialogUpdatedAt: null,
dialogDeletedAt: null,
// 文件