feat: 统一分页组件并添加批量删除功能

为多个页面组件添加统一的分页统计显示和批量删除功能
在日志管理页面添加批量删除接口和前端实现
优化表格分页配置,统一显示总条目数和分页选项
This commit is contained in:
2025-09-25 23:52:01 +08:00
parent a71bbb0961
commit 214605d912
14 changed files with 303 additions and 48 deletions

View File

@ -1,13 +1,47 @@
use axum::{Router, routing::get, extract::{State, Query}, Json};
use crate::{db::Db, response::ApiResponse, services::flow_run_log_service};
//! 流程运行日志路由模块
//!
//! 提供流程运行日志的分页查询接口与批量删除接口。
use axum::{
extract::{Query, State},
routing::{get, delete},
Json, Router,
};
use axum::extract::Path;
use crate::db::Db;
use crate::error::AppError;
use crate::response::ApiResponse;
use crate::services::flow_run_log_service;
/// 路由定义:流程运行日志相关接口
pub fn router() -> Router<Db> {
Router::new().route("/flow_run_logs", get(list))
Router::new()
.route("/flow_run_logs", get(list))
.route("/flow_run_logs/{ids}", delete(delete_many))
}
async fn list(State(db): State<Db>, Query(p): Query<flow_run_log_service::ListParams>) -> Json<ApiResponse<flow_run_log_service::PageResp<flow_run_log_service::RunLogItem>>> {
match flow_run_log_service::list(&db, p).await {
Ok(res) => Json(ApiResponse::ok(res)),
Err(e) => Json(ApiResponse::err(500, format!("{}", e))),
}
/// 流程运行日志列表
async fn list(
State(db): State<Db>,
Query(p): Query<flow_run_log_service::ListParams>,
) -> Result<Json<ApiResponse<flow_run_log_service::PageResp<flow_run_log_service::RunLogItem>>>, AppError> {
let res = flow_run_log_service::list(&db, p).await?;
Ok(Json(ApiResponse::ok(res)))
}
/// 批量删除流程运行日志
///
/// 路径参数 ids 采用逗号分隔的 ID 列表,例如:/flow_run_logs/1001,1002
/// 返回:{ deleted: <u64> }deleted 表示实际删除条数
async fn delete_many(
State(db): State<Db>,
Path(ids): Path<String>,
) -> Result<Json<ApiResponse<serde_json::Value>>, AppError> {
let id_list: Vec<i64> = ids
.split(',')
.filter_map(|s| s.trim().parse::<i64>().ok())
.collect();
let deleted = flow_run_log_service::delete_many(&db, id_list).await?;
Ok(Json(ApiResponse::ok(serde_json::json!({ "deleted": deleted }))))
}

View File

@ -1,9 +1,47 @@
use axum::{Router, routing::get, extract::{Query, State}, Json};
use crate::{db::Db, response::ApiResponse, services::log_service, error::AppError};
//! 请求日志查询路由模块
//!
//! 提供系统请求日志的分页查询接口与批量删除接口。
pub fn router() -> Router<Db> { Router::new().route("/logs", get(list)) }
use axum::{
extract::{Query, State},
routing::{get, delete},
Json, Router,
};
use axum::extract::Path;
async fn list(State(db): State<Db>, Query(p): Query<log_service::ListParams>) -> Result<Json<ApiResponse<log_service::PageResp<log_service::LogInfo>>>, AppError> {
let res = log_service::list(&db, p).await.map_err(|e| AppError::Anyhow(anyhow::anyhow!(e)))?;
use crate::db::Db;
use crate::error::AppError;
use crate::response::ApiResponse;
use crate::services::log_service;
/// 路由定义:日志相关接口
pub fn router() -> Router<Db> {
Router::new()
.route("/logs", get(list))
.route("/logs/{ids}", delete(delete_many))
}
/// 日志列表
async fn list(
State(db): State<Db>,
Query(p): Query<log_service::ListParams>,
) -> Result<Json<ApiResponse<log_service::PageResp<log_service::LogInfo>>>, AppError> {
let res = log_service::list(&db, p).await?;
Ok(Json(ApiResponse::ok(res)))
}
/// 批量删除系统请求日志
///
/// 路径参数 ids 采用逗号分隔的 ID 列表,例如:/logs/1,2,3
/// 返回:{ deleted: <u64> }deleted 表示实际删除条数
async fn delete_many(
State(db): State<Db>,
Path(ids): Path<String>,
) -> Result<Json<ApiResponse<serde_json::Value>>, AppError> {
let id_list: Vec<i64> = ids
.split(',')
.filter_map(|s| s.trim().parse::<i64>().ok())
.collect();
let deleted = log_service::delete_many(&db, id_list).await?;
Ok(Json(ApiResponse::ok(serde_json::json!({ "deleted": deleted }))))
}

View File

@ -62,7 +62,6 @@ pub async fn create(db: &Db, input: CreateRunLogInput) -> anyhow::Result<i64> {
Ok(m.id)
}
/// 分页查询流程运行日志
///
/// # 参数
@ -129,4 +128,14 @@ pub async fn list(db: &Db, p: ListParams) -> anyhow::Result<PageResp<RunLogItem>
page,
page_size,
})
}
// 新增:批量删除流程运行日志
pub async fn delete_many(db: &Db, ids: Vec<i64>) -> anyhow::Result<u64> {
if ids.is_empty() { return Ok(0); }
let res = flow_run_log::Entity::delete_many()
.filter(flow_run_log::Column::Id.is_in(ids))
.exec(db)
.await?;
Ok(res.rows_affected as u64)
}

View File

@ -68,4 +68,14 @@ pub async fn list(db: &Db, p: ListParams) -> anyhow::Result<PageResp<LogInfo>> {
let total = paginator.num_items().await? as u64;
let models = paginator.fetch_page(if page>0 { page-1 } else { 0 }).await?;
Ok(PageResp { items: models.into_iter().map(Into::into).collect(), total, page, page_size })
}
// 新增:批量删除系统请求日志
pub async fn delete_many(db: &Db, ids: Vec<i64>) -> anyhow::Result<u64> {
if ids.is_empty() { return Ok(0); }
let res = request_log::Entity::delete_many()
.filter(request_log::Column::Id.is_in(ids))
.exec(db)
.await?;
Ok(res.rows_affected as u64)
}