Files
rxthinkcmf-wiki/RXThinkCMF_Laravel13_NaiveVue/zh/modules/position.md
T
2026-10-08 17:50:29 +08:00

113 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 6.6 岗位管理
:::tip 概述
岗位管理维护用户的岗位属性数据。`PositionService` 继承 `BaseTenantService` 实现租户隔离,全部能力由属性配置自动装配,仅保留删除前的业务校验钩子——是"极简 CRUD"的典型模块。
:::
## 模块特点
| 特性 | 说明 |
|------|------|
| 基类 | `BaseTenantService`(租户隔离) |
| 唯一校验 | `name` 按租户分组唯一(`['name','tenant_id']`) |
| 枚举映射 | `status` → position_status 字典(1=在用 2=停用) |
| 删除保护 | `beforeDelete` 业务校验(如岗位被用户引用时阻止) |
| 自定义方法 | 无(分页/详情/增删改全部由 Trait 自动装配) |
## 数据库表结构
```sql
CREATE TABLE `laravel_position` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` varchar(255) NOT NULL COMMENT '岗位名称',
`status` int DEFAULT 0 COMMENT '岗位状态:1-在用 2-停用',
`sort` int DEFAULT 0 COMMENT '岗位排序',
`create_user` varchar(50) DEFAULT NULL COMMENT '创建人',
`create_time` datetime DEFAULT (now()) COMMENT '创建时间',
`update_user` varchar(50) DEFAULT NULL COMMENT '更新人',
`update_time` datetime DEFAULT (now()) COMMENT '更新时间',
`is_delete` int DEFAULT 0 COMMENT '删除标识:0-正常 1-已删除',
PRIMARY KEY (`id`)
) COMMENT = '岗位表';
```
## API 接口
| 方法 | 路径 | 权限码 | 说明 |
|------|------|--------|------|
| GET | `/api/position/page` | sys:position:page | 分页列表 |
| GET | `/api/position/list` | sys:position:list | 全量列表 |
| GET | `/api/position/detail/{id}` | sys:position:detail | 详情 |
| POST | `/api/position/add` | sys:position:add | 新增 |
| PUT | `/api/position/update` | sys:position:update | 修改 |
| DELETE | `/api/position/delete/{id}` | sys:position:delete | 删除 |
| DELETE | `/api/position/batchDelete` | sys:position:batchDelete | 批量删除 |
## Service 配置(来自项目实际代码)
```php
class PositionService extends BaseTenantService
{
use HasCrudOperations, HasQueryScopes, HasSerializeMaps, HasUniqueCheck;
protected string $modelClass = Position::class;
protected array $pageLikeFields = ['name'];
protected array $pageEqFields = ['status'];
protected array $pageOrderBy = ['field' => 'sort', 'type' => 'asc'];
// name 在同一租户内唯一
protected array $uniqueFields = [['name', 'tenant_id']];
// 字典翻译
protected array $serializeMaps = [
'status' => 'position_status',
];
// 删除前业务校验(如岗位被用户引用时抛 BizException 阻止删除)
protected function beforeDelete(int $id): void
{
// ... 业务约束检查 ...
}
}
```
## Controller 代码(标准形态)
```php
// app/Http/Controllers/Api/PositionController.php(形态示例)
#[OperationLog('岗位管理-查询分页', OperationLog::TYPE_QUERY)]
#[Permission('sys:position:page', '岗位分页')]
public function page(): JsonResponse
{
return $this->_page($this->positionService);
}
#[OperationLog('岗位管理-新增', OperationLog::TYPE_ADD, '新增岗位:{name}')]
#[Permission('sys:position:add', '添加岗位')]
public function add(PositionRequest $request): JsonResponse
{
return $this->_add($this->positionService, $request->validated());
}
#[OperationLog('岗位管理-删除', OperationLog::TYPE_DELETE, '删除岗位ID:{id}')]
#[Permission('sys:position:delete', '删除岗位')]
public function delete(int $id): JsonResponse
{
return $this->_delete($this->positionService, $id);
}
```
:::tip 极简 CRUD
岗位模块几乎"零手写业务代码"——Service 只声明属性配置与删除校验钩子,Controller 调用基类通用方法,即可获得完整的增删改查、分页、唯一性校验、字典翻译能力。新模块建议从复制本模块结构开始。
:::
## 与其他模块的关系
| 关系 | 说明 |
|------|------|
| 用户 → 岗位 | `laravel_user.position_id` 外键,用户表单级联选择 |
| 详情回显 | 用户 `afterDetail` 中补全 `positionName` |
| 导出映射 | 用户导出列「岗位」由岗位名称映射生成 |