rust18-通知管理模块

rust18-通知管理模块

1、通知管理模块表的创建

通知管理这部分跟我们的文章部分有些像

javascript 复制代码
DROP TABLE IF EXISTS `sys_notice`;
CREATE TABLE `sys_notice`  (
  `notice_id` int(0) NOT NULL AUTO_INCREMENT COMMENT '公告ID',
  `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告标题',
  `notice_type` enum('success','data','chatmsg','info','danger','warn') CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '| log | 日志信息 1级\r\n| success | 系统连接成功提示 2级\r\n| info    | 通知信息  \r\n| chatmsg | 客户消息 -- 聊天信息公示\r\n| warn    | 警告类型消息 -- 求助\r\n| danger  | 危险类型 -- 最高级别警告信息',
  `notice_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL 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(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`notice_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 96 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::notice::routes::config)
  )

🍎模块申明

全局文件之中通知模块申明

我们的文件结构如下所示,mod.rs作为入口文件进行申明文件暴露

javascript 复制代码
// src\modules\mod.rs
pub mod notice;

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

javascript 复制代码
// src\modules\notice
📦notice
 ┣ 📜handlers.rs
 ┣ 📜mod.rs
 ┗ 📜routes.rs

基础模块申明

src\modules\notice下面搭建模块

mod.rs模块

javascript 复制代码
// mod.rs
pub mod handlers;
pub mod routes;

routes.rs模块

javascript 复制代码
use actix_web::web;
pub fn config(cfg: &mut web::ServiceConfig) {
  cfg.route("/system/notices", web::get().to(crate::modules::notice::handlers::get_list));
  cfg.route("/system/notices", web::post().to(crate::modules::notice::handlers::post_add));
  cfg.route("/system/notices/{id}", web::get().to(crate::modules::notice::handlers::get_detail));
  cfg.route("/system/notices", web::put().to(crate::modules::notice::handlers::put_update));
  cfg.route("/system/notices/{id}", web::delete().to(crate::modules::notice::handlers::del_delete));
}

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::<()>,
    })
}

3、功能实现

🍎新增功能

接下来我们实现通知模块的新增部分

新增的数据类型我们先写一下

javascript 复制代码
// 通知结构体
#[derive(Debug, Deserialize)]
pub struct Addnotice {
    #[serde(rename = "parentId")]
    pub parent_id:String,// 父通知ID

    #[serde(rename = "noticeName")]
    pub notice_name: String,      // 通知名称

    #[serde(rename = "orderNum")]
    pub order_num: i32,         // 显示顺序

    #[serde(rename = "leader")]
    pub leader: String,         // 负责人

    #[serde(rename = "phone")]
    pub phone: String,          // 联系电话

    #[serde(rename = "email")]
    pub email: String,          // 邮箱

    #[serde(rename = "status")]
    pub status: String,         // 通知状态(0正常 1停用)
}

主文件引入使用

javascript 复制代码
// 当前模块部分
// 结构体
#[allow(unused_imports)]
use crate::common::response::Addnotice; 

// 新增
pub async fn post_add(pool: web::Data<MySqlPool>, form: web::Json<Addnotice>) -> HttpResponse {
    let mut data = std::collections::HashMap::new();
    // 插入基础字段
    data.insert("parent_id".to_string(), form.parent_id.to_string());
    data.insert("notice_name".to_string(), form.notice_name.clone());
    data.insert("order_num".to_string(), form.order_num.to_string());
    data.insert("leader".to_string(), form.leader.clone());
    data.insert("phone".to_string(), form.phone.clone());
    data.insert("email".to_string(), form.email.clone());
    data.insert("status".to_string(), form.status.clone());
    // 调用API创建方法
    crate::common::apimethods::create_api(
        pool.get_ref(),
        "sys_notice",
        &data,
        &[
            "notice_name".to_string(),
        ],
    )
    .await
}

测试接口

javascript 复制代码
{
    "parentId": "103",
    "noticeName": "测试A",
    "orderNum": 2,
    "leader": "测试A",
    "phone": "18735797977",
    "email": "21545@qq.com",
    "status": "0"
}

返回信息

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!["status".to_string()];
    // 模糊查询字段(like query) "role_name".to_string()
    let likequery = vec!["notice_title".to_string()];
    // 调用 list_api_page 传入查询条件
    list_api_page(pool, query, filter, "sys_notice", exactquery, likequery).await
}

测试功能ok

🍎详情功能

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

测试详情功能ok

🍎更新功能

这里需要考虑的更新功能就是注意在数据表之中我们notice_id存储字段的类型

javascript 复制代码
// 通用更新
pub async fn put_update(pool: web::Data<MySqlPool>, form: web::Json<Notice>) -> HttpResponse {
    let mut data = HashMap::new();
    // 插入字段

    // 插入基础字段
    data.insert("notice_title".to_string(), form.notice_title.clone());
    data.insert("notice_type".to_string(), form.notice_type.clone());
    data.insert("notice_content".to_string(), form.notice_content.clone());
    data.insert("status".to_string(), form.status.clone());

    crate::common::apimethods::update_api(
        pool.get_ref(),
        "sys_notice",
        "notice_id",
        form.notice_id.unwrap(),
        &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_notice",
        "notice_id",
        *id,
        false, // 软删除,isDeleted=1
    )
    .await
}

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

相关推荐
一 乐2 小时前
医疗管理|医院医疗管理系统|基于springboot+vue医疗管理系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·医疗管理系统
华仔啊3 小时前
SpringBoot 2.x 和 3.x 的核心区别,这些变化你必须知道
java·spring boot·后端
程序员爱钓鱼3 小时前
Python编程实战——Python实用工具与库:Matplotlib数据可视化
前端·后端·python
程序员爱钓鱼3 小时前
Python编程实战 - Python实用工具与库 - requests 与 BeautifulSoup
前端·后端·python
熊小猿3 小时前
Redis 缓存怎么更新?—— 四种模型与一次“迟到的删除”
java·后端·spring
星释3 小时前
Rust 练习册 :掌握文本处理与词频统计
开发语言·后端·rust
方圆想当图灵3 小时前
Cursor 无法跨项目读取源码怎么办?MCP Easy Code Reader 帮你解决!
后端·cursor·mcp