mirror of
https://github.com/kuaifan/dootask.git
synced 2026-06-08 00:18:45 +00:00
perf: 优化会话列表数据加载
This commit is contained in:
parent
b9163af11a
commit
fe8450d48a
@ -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()
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
80
resources/assets/js/store/actions.js
vendored
80
resources/assets/js/store/actions.js
vendored
@ -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--;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
1
resources/assets/js/store/state.js
vendored
1
resources/assets/js/store/state.js
vendored
@ -82,6 +82,7 @@ export default {
|
|||||||
dialogHistory: [],
|
dialogHistory: [],
|
||||||
dialogInputCache: [],
|
dialogInputCache: [],
|
||||||
dialogMsgTransfer: {time: 0},
|
dialogMsgTransfer: {time: 0},
|
||||||
|
dialogUpdatedAt: null,
|
||||||
dialogDeletedAt: null,
|
dialogDeletedAt: null,
|
||||||
|
|
||||||
// 文件
|
// 文件
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user