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

相关推荐
用户3074596982072 小时前
反射(Reflection)—— PHP 的“元编程之眼”
后端·php
PFinal社区_南丞2 小时前
单文件代码部署工具
后端
间彧2 小时前
DDD与传统三层架构、MVC对比
后端
间彧2 小时前
SpringBoot项目,DDD与传统的三层架构详细目录结构
后端
bcbnb3 小时前
iOS 文件管理全攻略,多工具协同实现高效调试、数据导出与应用分析
后端
tung tung tung sahur3 小时前
领略 Rust 抽象之美:自定义迭代器实现全解析
开发语言·后端·rust
用户3074596982073 小时前
容器(Container)—— 对象的“智能工厂+调度官”
后端·thinkphp
微小冷3 小时前
Rust图形界面egui初步教程
rust·编程语言·egui·用户图形界面·示例项目
ftpeak3 小时前
《Rust MP4视频技术开发》第八章:生成MP4
开发语言·rust·音视频·mp4