rust13-字典类型

Rust-字典类型

1、字典数据模块表的创建

🍎创建字典类型表dict_type

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_type;

建立文件结构如下图所示:

javascript 复制代码
// src\modules\dict_type

📦dict
 ┣ 📜handlers.rs
 ┣ 📜mod.rs
 ┗ 📜routes.rs
🍎基础模块申明

src\modules\dict_type下面搭建模块

mod.rs模块

javascript 复制代码
// mod.rs
pub mod handlers;
pub mod dict_type;
🍎dict_type.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_type));
  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::AddDictTypeRequest; // 添加数据格式
#[allow(unused_imports)]
use crate::common::response::DictType; // 基础数据格式
#[allow(unused_imports)]
use crate::common::response::UpdateDictTypeRequest; // 更新数据格式

3、功能实现

🍎新增功能

接下来我们实现字典数据模块的新增部分

javascript 复制代码
pub async fn post_add(
    pool: web::Data<MySqlPool>,
    form: web::Json<AddDictTypeRequest>,
) -> HttpResponse {
    let mut data = std::collections::HashMap::new();

    // 插入基础字段
    data.insert("dict_name".to_string(), form.dict_name.clone().unwrap_or_default());
    data.insert("dict_type".to_string(), form.dict_type.clone().unwrap_or_default());
    data.insert("status".to_string(), form.status.clone().unwrap_or_default());
    data.insert("remark".to_string(), form.remark.clone().unwrap_or_default());

    // 调用API创建方法
    crate::common::apimethods::create_api(
        pool.get_ref(),
        "sys_dict_type",
        &data,
        &[
            "dict_name".to_string(),
            "dict_type".to_string(),
        ],
    )
    .await
}

测试接口

javascript 复制代码
{
    "dictName": "测试dict_demo",
    "dictType": "dict_demo",
    "status": "0",
    "remark": "dict_demo"
}

返回信息

javascript 复制代码
{
    "code": 200,
    "msg": "新增成功"
}

新增测试功能ok

🍎查询功能

这里查询我们直接引我们之前的查询部分的参数和方法

javascript 复制代码
//通用查询
pub async fn get_list(
    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_type".to_string()];

    // 模糊查询字段(like query)
    let likequery = vec!["dict_name".to_string()];
    // 调用 list_api_page 传入查询条件
    list_api_page(pool, query, filter, "sys_dict_type", exactquery, likequery).await
}

测试功能ok

🍎详情功能

javascript 复制代码
// 通用详情
pub async fn get_detail(
    pool: web::Data<MySqlPool>, 
    path: web::Path<i32>
) -> HttpResponse {
    crate::common::apimethods::detail_api::<DictType>(
        pool,
        "sys_dict_type",
        "dict_id",
        path.into_inner(),
    )
    .await
}

测试功能ok

🍎更新功能

javascript 复制代码
// 通用更新
pub async fn put_update(
    pool: web::Data<MySqlPool>,
    form: web::Json<UpdateDictTypeRequest>,
) -> HttpResponse {
    let mut data = HashMap::new();
    // 只更新需要的字段
    // 插入基础字段
    data.insert("dict_name".to_string(), form.dict_name.clone().unwrap_or_default());
    data.insert("dict_type".to_string(), form.dict_type.clone().unwrap_or_default());
    data.insert("status".to_string(), form.status.clone().unwrap_or_default());
    data.insert("remark".to_string(), form.remark.clone().unwrap_or_default());
    crate::common::apimethods::update_api(
        pool.get_ref(),
        "sys_dict_type",
        "dict_id",
        form.dict_id,
        &data,
    )
    .await
}

测试功能ok

🍎删除功能

javascript 复制代码
// 删除
pub async fn del_delete(
    pool: web::Data<MySqlPool>, 
    id: web::Path<i32>
) -> HttpResponse {
    crate::common::apimethods::delete_api(
        pool.get_ref(),
        "sys_dict_type",
        "dict_id",
        *id,
        false, // 软删除,isDeleted=1
    )
    .await
}

测试功能ok,到这里我们的功能就ok了,然后我们继续做导出和导出模块,并且进一步进行优化和完善

相关推荐
小强19887 分钟前
SQL Server 慢查询怎么定位?一套从“卡”到“快”的完整排查流程
后端
水深火乐9 分钟前
interface和any
后端
步行cgn10 分钟前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
神奇小汤圆13 分钟前
Spring Boot + LangChain4j实现RAG——从零搭建企业级知识库问答系统
后端
H_Peak17 分钟前
Python运算符与流程控制:if条件判断
后端
H_Peak19 分钟前
Python字符串操作:从基础到正则入门
后端
自进化Agent智能体20 分钟前
Hermes 子代理委派 —— 并行工作的艺术
后端
步行cgn22 分钟前
MyBatis 动态 SQL 中的 <foreach> 标签完全解析
后端
SomeB1oody1 小时前
【RustyML入门】5.0. 模型评估
开发语言·后端·机器学习·rust·教程
唐青枫2 小时前
别只把 enum 当常量列表:Zig 枚举、状态机与 Tagged Union 实战
后端