Rust14-字典数据

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了,然后我们继续做导出和导出模块,并且进一步进行优化和完善

相关推荐
国思RDIF框架3 小时前
国思RDIF低代码快速开发框架 v6.2.2版本发布
前端·vue.js·后端
Java水解3 小时前
Java基础------真实大厂面试题汇总(含答案)
java·后端·面试
L.EscaRC3 小时前
面向 Spring Boot 的 JVM 深度解析
jvm·spring boot·后端
阿银3 小时前
如何为 macOS 创建 Rust 通用二进制文件 (x86_64 & aarch64)
rust·electron
Undoom3 小时前
构建高可靠 OpenEuler 运维体系:从虚拟化部署到 Systemd 自动化核心实践
后端
澪贰3 小时前
云原生基石的试金石:基于 openEuler 部署 Docker 与 Nginx 的全景实录
后端
oak隔壁找我3 小时前
SpringBoot Starter 进阶教程
java·后端·架构
sp423 小时前
Java 统一文件上传业务组件
后端
10x104 小时前
# Docker 使用笔记:重新理解镜像、容器与数据持久化
后端