#rocket #diesel #data-tables #rustdatatables #rdt

rdatatables

在 rust-lang 上的 datatables 后端 API (ssp) 的小型实现。(未完成)。

10 个版本

0.1.0 2021 年 1 月 25 日
0.0.9 2020 年 8 月 5 日
0.0.1 2020 年 7 月 31 日

数据库接口 中排名 #1853

MIT/Apache

18KB
261

rdatatables

这是在 rust-lang 上对 datatables AJAX API 的 "后端" 实现。

按照以下说明使用

  • 在您的 crate 中添加 rdatatables = "0.0.1";
  • 使用 rdatatables::*; (您无论如何都需要所有内容);
  • 首先,您需要一个用于您的 "ajax"-POST 的监听函数。例如
/* Your datat structers */
use crate::models::rdatatables::{
    ClerksViewListing, ClerksViewListingClerkInfo, ClerksViewListingStatusClerk,
};

#[post("/list", data = "<query>")]
pub fn list(
    _adminitrative: AdminUser,
    query: LenientForm<DataTableQuery>,
) -> Json<
    OutcomeData<(
        ClerksViewListing,
        ClerksViewListingStatusClerk,
        ClerksViewListingClerkInfo,
    )>,
> {
    Json(datatables_query::<(
        ClerksViewListing,
        ClerksViewListingStatusClerk,
        ClerksViewListingClerkInfo,
    )>(
        Tables {
            origin: ("sysuser", "user_id"), /* From */
            fields: vec![
                "clerk_info.clerk_image",
                "sysuser.user_name",
                "sysuser.user_uni",
                "sysuser.user_balance",
                "status_clerk.is_available",
                "sysuser.user_status",
                "sysuser.user_id",
            ], /* Fields to seek for */
            join_targets: Some(vec![ /* If you desire to not do a Join at all, just give a None here */
                /* (join_type, (target, target_key), (origin, origin_key) */
                ("inner", ("clerk_info", "user_id"), ("sysuser", "user_id")),
                (
                    "inner",
                    ("status_clerk", "clerk_id"),
                    ("sysuser", "user_id"),
                ),
            ]),
            datatables_post_query: query.into_inner(), /* Incoming Query parses to the desired struct. */
            query: None,                               /* Our builded query holder */
        },
        crate::establish_connection(),
    ))
}
  • 然后您的结构体(必须是 QuerybleByName 且也必须是 Identifiable),如下所示

/* ClerksViewListing (Implements joins) */
#[derive(Debug, QueryableByName, Serialize, Clone)]
#[table_name = "sysuser"]
pub struct ClerksViewListing {
    pub user_name: String,
    pub user_uni: Option<String>,
    pub user_balance: f64,
    pub user_id: i32,
}

#[derive(Debug, QueryableByName, Serialize, Clone)]
#[table_name = "status_clerk"]
pub struct ClerksViewListingStatusClerk {
    pub is_available: Option<i32>,
}


#[derive(Debug, QueryableByName, Serialize, Clone)]
#[table_name = "clerk_info"]
pub struct ClerksViewListingClerkInfo {
    pub clerk_image: Option<String>,
}


  • 您的前端与 datatable 的关联应如下所示,不要忘记 "post" 和 "columns",
$('#clientsTable').DataTable({
			"serverSide": true,
			"ordering": true,
			"info": true,
			"ajax":
			{
				url: "/admin/clerk/list",
				type: "POST"
			},
			"columns": [
				{ "data": "1.clerk_image" },
				{ "data": "0.user_name" }, 
				{ "data": "0.user_uni" },
				{ "data": "0.user_balance" },
				{ "data": "2.is_available" },
				{ "data": "0.user_status" },
				{ "data": "0.user_id" }, /* Stands for user_id */
			]
});

祝您玩得开心。在推特上关注我:@luisvonmuller

我开放接受机会 ;) [email protected]

此 crate 可能会通过前端 datatables 的 "搜索" 字段受到 SQL 注入的影响。这将会尽快修复。 - 如果您能为我们修复它,请,做吧!

缺少什么?

  • 正则表达式搜索
  • 组合列搜索
  • 修复迭代列解析器中的性能问题(目前库通过详尽的顺序 IF 语句解析列。必须修复。)

依赖

~13MB
~255K SLoC