Rust14-字典数据
1、字典数据模块表的创建
🍎创建字典数据表dict_data
javascript
DROP TABLE IF EXISTS `sys_dict_type`;
CREATE TABLE `sys_dict_type` (
`dict_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '字典主键',
`dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典名称',
`dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型',
`status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`dict_id`) USING BTREE,
UNIQUE INDEX `dict_type`(`dict_type`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 123 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic;
2、接口引入申明规范
👉入口引入
接下来我们完成字典数据模块,在完成功能之前我们需要先添加模块入口,这样rust才能认识到是哪个模块
🍎src\main.rs
先在入口引入我们的模块
javascript
.service(
web::scope("/api") // 这里加上 /api 前缀
.configure(modules::menu::dict::config)
)
🍎模块申明
全局文件之中字典数据模块申明
我们的文件结构如下所示,mod.rs作为入口文件进行申明文件暴露
javascript
// src\modules\mod.rs
pub mod dict;
建立文件结构如下图所示:
javascript
// src\modules\dict_data
📦dict
┣ 📜handlers.rs
┣ 📜mod.rs
┗ 📜routes.rs
🍎基础模块申明
src\modules\dict下面搭建模块
mod.rs模块
javascript
// mod.rs
pub mod handlers;
pub mod dict;
🍎dict.rs模块编写
javascript
use actix_web::web;
pub fn config(cfg: &mut web::ServiceConfig) {
// 字典类型
cfg.route("/system/dictType", web::get().to(crate::modules::dict::handlers::get_list));
cfg.route("/system/dictType", web::post().to(crate::modules::dict::handlers::post_add));
cfg.route("/system/dictType", web::put().to(crate::modules::dict::handlers::put_update));
cfg.route("/system/dictType/optionselect", web::get().to(crate::modules::dict::handlers::get_all_dict_type));
cfg.route("/system/dictType/{id}", web::get().to(crate::modules::dict::handlers::get_detail));
cfg.route("/system/dictType/{id}", web::delete().to(crate::modules::dict::handlers::del_delete));
// 字典数据
cfg.route("/system/dictData", web::get().to(crate::modules::dict::handlers::get_list_data));
cfg.route("/system/dictData", web::post().to(crate::modules::dict::handlers::post_add_data));
cfg.route("/system/dictData", web::put().to(crate::modules::dict::handlers::put_update_data));
cfg.route("/system/dictData/optionselect", web::get().to(crate::modules::dict::handlers::get_all_dict_data));
cfg.route("/system/dictData/{id}", web::get().to(crate::modules::dict::handlers::get_detail_data));
cfg.route("/system/dictData/{id}", web::delete().to(crate::modules::dict::handlers::del_delete_data));
}
🍎handlers.rs方法逻辑初步
javascript
// handlers.rs方法逻辑
use actix_web::{HttpResponse};
use crate::common::response::ApiResponse; // 导入 ApiResponse 模型
// 通用查询
pub async fn get_list() -> HttpResponse {
HttpResponse::Ok().json(ApiResponse {
code: 200,
msg: "接口信息",
data: None::<()>,
})
}
// 通用新增
pub async fn post_add() -> HttpResponse {
HttpResponse::Ok().json(ApiResponse {
code: 200,
msg: "接口信息",
data: None::<()>,
})
}
// 通用详情
pub async fn get_detail() -> HttpResponse {
HttpResponse::Ok().json(ApiResponse {
code: 200,
msg: "接口信息",
data: None::<()>,
})
}
// 通用更新
pub async fn put_update() -> HttpResponse {
HttpResponse::Ok().json(ApiResponse {
code: 200,
msg: "接口信息",
data: None::<()>,
})
}
// 通用更新
pub async fn del_delete() -> HttpResponse {
HttpResponse::Ok().json(ApiResponse {
code: 200,
msg: "接口信息",
data: None::<()>,
})
}
👉申明规范
🍎数据格式
定义数据规范和格式src\common\response.rs
javascript
// 字典数据模块
// 字典数据结构体
#[derive(Debug, Serialize, Deserialize, sqlx::FromRow)]
pub struct DictData {
#[serde(rename = "dictCode")]
pub dict_code: i64,
#[serde(rename = "dictSort")]
pub dict_sort: i32,
#[serde(rename = "dictLabel")]
pub dict_label: String,
#[serde(rename = "dictValue")]
pub dict_value: String,
#[serde(rename = "dictType")]
pub dict_type: String,
#[serde(rename = "cssClass")]
pub css_class: Option<String>,
#[serde(rename = "listClass")]
pub list_class: Option<String>,
#[serde(rename = "isDefault")]
pub is_default: String,
#[serde(rename = "status")]
pub status: String,
#[serde(rename = "createBy")]
pub create_by: Option<String>,
#[serde(rename = "createTime")]
pub create_time: Option<chrono::DateTime<chrono::Utc>>,
#[serde(rename = "updateBy")]
pub update_by: Option<String>,
#[serde(rename = "updateTime")]
pub update_time: Option<chrono::DateTime<chrono::Utc>>,
#[serde(rename = "remark")]
pub remark: Option<String>,
}
// 新增字典数据请求结构体
#[derive(Debug, Deserialize)]
pub struct AddDictDataRequest {
#[serde(rename = "dictSort")]
pub dict_sort: i32,
#[serde(rename = "dictLabel")]
pub dict_label: String,
#[serde(rename = "dictValue")]
pub dict_value: String,
#[serde(rename = "dictType")]
pub dict_type: String,
#[serde(rename = "cssClass")]
pub css_class: Option<String>,
#[serde(rename = "listClass")]
pub list_class: Option<String>,
#[serde(rename = "isDefault")]
pub is_default: String,
#[serde(rename = "status")]
pub status: String,
#[serde(rename = "remark")]
pub remark: Option<String>,
}
// 更新字典数据请求结构体
#[derive(Serialize, Debug, Deserialize)]
pub struct UpdateDictDataRequest {
#[serde(rename = "dictCode")]
pub dict_code: i64,
#[serde(rename = "dictSort")]
pub dict_sort: i32,
#[serde(rename = "dictLabel")]
pub dict_label: String,
#[serde(rename = "dictValue")]
pub dict_value: String,
#[serde(rename = "dictType")]
pub dict_type: String,
#[serde(rename = "cssClass")]
pub css_class: Option<String>,
#[serde(rename = "listClass")]
pub list_class: Option<String>,
#[serde(rename = "isDefault")]
pub is_default: String,
#[serde(rename = "status")]
pub status: String,
#[serde(rename = "remark")]
pub remark: Option<String>,
}
🍎导入数据格式使用
javascript
// 数据格式
#[allow(unused_imports)]
use crate::common::response::DictData; // 基础数据格式
#[allow(unused_imports)]
use crate::common::response::AddDictDataRequest; // 添加数据格式
#[allow(unused_imports)]
use crate::common::response::UpdateDictDataRequest; // 更新数据格式
3、功能实现
🍎新增功能
接下来我们实现字典数据模块的新增部分
javascript
// 新增
pub async fn post_add_data(
pool: web::Data<MySqlPool>,
form: web::Json<AddDictDataRequest>,
) -> HttpResponse {
let mut data = std::collections::HashMap::new();
// 添加相关字段
data.insert("dict_type".to_string(), form.dict_type.clone().unwrap_or_default());
data.insert("dict_label".to_string(), form.dict_label.clone().unwrap_or_default());
data.insert("dict_value".to_string(), form.dict_value.clone().unwrap_or_default());
data.insert("dict_sort".to_string(), form.dict_sort.map(|v| v.to_string()).unwrap_or_default());
data.insert("remark".to_string(), form.remark.clone().unwrap_or_default());
data.insert("status".to_string(), form.status.clone().unwrap_or_default());
// 调用API创建方法
crate::common::apimethods::create_api(
pool.get_ref(),
"sys_dict_data",
&data,
&[], //"menu_name".to_string()
)
.await
}
测试接口
javascript
{
"dictType": "DDD",
"dictLabel": "DDDD",
"dictValue": "DDDD",
"dictSort": 1,
"status": "0",
"remark": "DDD"
}
返回信息
javascript
{
"code": 200,
"msg": "新增成功"
}
新增测试功能ok
🍎查询功能
这里查询我们直接引我们之前的查询部分的参数和方法
javascript
//字典数据查询
pub async fn get_list_data(
pool: web::Data<MySqlPool>,
query: web::Query<QueryParams>,
filter: Option<web::Query<HashMap<String, String>>>,
) -> impl Responder {
// 调试:打印查询参数
if let Some(ref filter_params) = filter {
println!("查询参数: {:?}", filter_params);
}
// 精确查询字段(exact query)
let exactquery = vec!["dict_code".to_string()];
// 模糊查询字段(like query)
let likequery = vec!["dict_type".to_string()];
// 调用 list_api_page 传入查询条件
list_api_page(pool, query, filter, "sys_dict_data", exactquery, likequery).await
}
测试功能ok
🍎详情功能
javascript
pub async fn get_detail_data(pool: web::Data<MySqlPool>, path: web::Path<i32>) -> HttpResponse {
crate::common::apimethods::detail_api::<DictData>(
pool,
"sys_dict_data",
"dict_data_id",
path.into_inner(),
)
.await
}
测试功能ok
🍎更新功能
javascript
// 字典数据更新
pub async fn put_update_data(
pool: web::Data<MySqlPool>,
form: web::Json<UpdateDictDataRequest>,
) -> HttpResponse {
let mut data = HashMap::new();
// 只更新需要的字段
data.insert("dict_type".to_string(), form.dict_type.clone().unwrap_or_default());
data.insert("dict_label".to_string(), form.dict_label.clone().unwrap_or_default());
data.insert("dict_value".to_string(), form.dict_value.clone().unwrap_or_default());
data.insert("dict_sort".to_string(), form.dict_sort.map(|v| v.to_string()).unwrap_or_default());
data.insert("remark".to_string(), form.remark.clone().unwrap_or_default());
data.insert("status".to_string(), form.status.clone().unwrap_or_default());
crate::common::apimethods::update_api(
pool.get_ref(),
"sys_dict_data",
"dict_data_id",
form.dict_data_id,
&data,
)
.await
}
测试功能ok
🍎删除功能
javascript
// 字典数据删除
pub async fn del_delete_data(pool: web::Data<MySqlPool>, id: web::Path<i32>) -> HttpResponse {
crate::common::apimethods::delete_api(
pool.get_ref(),
"sys_dict_data",
"dict_data_id",
*id,
false, // 软删除,isDeleted=1
)
.await
}
测试功能ok,到这里我们的功能就ok了,然后我们继续做导出和导出模块,并且进一步进行优化和完善