rust16-职位管理模块
1、职位管理模块表的创建
🍎创建职位表jobs
javascript
CREATE TABLE `jobs` (
`job_id` int NOT NULL AUTO_INCREMENT COMMENT '职位ID',
`job_title` varchar(100) NOT NULL COMMENT '职位名称',
`department` varchar(50) NOT NULL COMMENT '部门',
`location` varchar(100) NOT NULL COMMENT '工作地点',
`job_type` enum('full-time','part-time','contract','internship') NOT NULL DEFAULT 'full-time' COMMENT '职位类型',
`salary_range` varchar(50) NOT NULL COMMENT '薪资范围',
`job_status` enum('active','closed','draft') NOT NULL DEFAULT 'draft' COMMENT '职位状态',
`job_requirements` text COMMENT '职位要求',
`job_responsibilities` text COMMENT '工作职责',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`created_by` int DEFAULT NULL COMMENT '创建人ID',
`updated_by` int DEFAULT NULL COMMENT '更新人ID',
PRIMARY KEY (`job_id`),
KEY `idx_department` (`department`),
KEY `idx_job_status` (`job_status`),
KEY `idx_job_type` (`job_type`),
KEY `idx_create_time` (`create_time`),
CONSTRAINT `fk_jobs_created_by` FOREIGN KEY (`created_by`) REFERENCES `sys_user` (`user_id`),
CONSTRAINT `fk_jobs_updated_by` FOREIGN KEY (`updated_by`) REFERENCES `sys_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='职位管理表';
2、接口开发
👉路由入口引入申明
接下来我们完成职位模块,在完成功能之前我们需要先添加模块入口,这样rust才能认识到是哪个模块
🍎src\main.rs
先在入口引入我们的模块
javascript
.service(
web::scope("/api") // 这里加上 /api 前缀
.configure(modules::job::routes::config)
)
🍎模块申明
全局文件之中职位模块申明
我们的文件结构如下所示,mod.rs作为入口文件进行申明文件暴露
javascript
// src\modules\mod.rs
pub mod job;
建立文件结构如下图所示:
javascript
// src\modules\job
📦job
┣ 📜handlers.rs
┣ 📜mod.rs
┗ 📜routes.rs
基础模块申明
src\modules\job下面搭建模块
mod.rs模块
javascript
// mod.rs
pub mod handlers;
pub mod routes;
routes.rs模块
javascript
//routes.rs
use actix_web::web;
pub fn config(cfg: &mut web::ServiceConfig) {
cfg.route("/system/jobs", web::get().to(crate::modules::role::handlers::get_list));
cfg.route("/system/jobs", web::post().to(crate::modules::role::handlers::post_add));
cfg.route("/system/jobs/{id}", web::get().to(crate::modules::role::handlers::get_detail));
cfg.route("/system/jobs", web::put().to(crate::modules::role::handlers::put_update));
cfg.route("/system/jobs/{id}", web::delete().to(crate::modules::role::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
// 新增
pub async fn post_add(
pool: web::Data<MySqlPool>,
form: web::Json<AddRoleRequest>,
) -> HttpResponse {
let mut data = std::collections::HashMap::new();
data.insert("role_name".to_string(), form.roleName.clone());
data.insert("role_key".to_string(), form.roleKey.clone());
data.insert("role_sort".to_string(), form.jobsort.to_string());
data.insert("status".to_string(), form.status.clone());
data.insert("remark".to_string(), form.remark.clone());
// 处理布尔值字段
data.insert("menu_check_strictly".to_string(), if form.menuCheckStrictly { "1" } else { "0" }.to_string());
data.insert("dept_check_strictly".to_string(), if form.deptCheckStrictly { "1" } else { "0" }.to_string());
crate::common::apimethods::create_api(
pool.get_ref(),
"sys_role",
&data,
&[
"role_name".to_string(),
"role_key".to_string()
],
).await
}
测试接口
javascript
{
"department": "产品部",
"location": "职位名称",
"jobTitle": "职位名称",
"jobType": "internship",
"salaryRange": "职位名称",
"jobRequirements": "职位名称",
"jobResponsibilities": "职位名称",
"jobStatus": "active"
}
返回信息
javascript
{
"code": 200,
"msg": "新增成功"
}
测试功能ok
🍎查询功能
这里查询我们直接引我们之前的查询部分的参数和方法
javascript
// 通过方法
#[allow(unused_imports)]
use crate::common::apimethods::list_api_page; // 引入公共分页查询方法
// 通用查询
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![
"role_name".to_string(),
];
// 调用 list_api_page 传入查询条件
list_api_page(pool, query, filter, "sys_role", exactquery, likequery).await
}
测试功能ok
🍎详情功能
javascript
// 通用详情
pub async fn get_detail(
pool: web::Data<MySqlPool>,
path: web::Path<i32>,
) -> HttpResponse {
crate::common::apimethods::detail_api::<Role>(pool, "sys_role", "role_id", path.into_inner()).await
}
🍎删除功能
javascript
// 通用真删除
pub async fn del_delete(
pool: web::Data<MySqlPool>,
id: web::Path<i32>
) -> HttpResponse {
crate::common::apimethods::delete_api(
pool.get_ref(),
"sys_role",
"role_id",
*id,
false, // 软删除,isDeleted=1
).await
}
测试功能ok,到这里我们的功能就ok了,然后我们继续做导出和导出模块,并且进一步进行优化和完善