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

View File

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

View File

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

View File

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