index.ts 3.2 KB
import request from '@/utils/request'
import { ADMIN_API_PREFIX } from '@/config'
import type { PageParam, PageResult } from '@/types'

/**
 * 系统管理 - 角色
 *
 * 契约说明(新契约,与后端 parking-module-system 对齐):
 *  - 前缀 /admin-api,回归 CommonResult{code=0}
 *  - 标准 CRUD URL 命名:/create /update /delete /delete-list /get /list /page /export-excel
 *  - 权限标识:system:role:create / update / delete / query / export
 *
 * ⚠️ `createTime` 是毫秒时间戳数字(后端 LocalDateTime),渲染走 `formatDateTime()`。
 *
 * ⚠️ `/get` 会额外返回 `menuIds`(该角色已授权的菜单),是给编辑弹窗的
 *    「菜单权限」树做回显用的;`/page` 返回的列表**不含** menuIds(避免 N+1)。
 */
const BASE = `${ADMIN_API_PREFIX}/system/role`

export interface RoleVO {
  id: number
  name: string
  code: string
  sort?: number
  /** 状态:0 启用,1 停用(字典 system_common_status) */
  status?: number
  /** 数据范围:1 全部,2 自定义,3 本组织,4 本组织及以下,5 仅本人(字典 system_data_scope) */
  dataScope?: number
  remark?: string
  /** 创建时间(毫秒时间戳) */
  createTime?: number
  /** 已授权的菜单编号,仅 /get 返回 */
  menuIds?: number[]
}

export interface RolePageReqVO extends PageParam {
  name?: string
  code?: string
  status?: number
}

export interface RoleSaveReqVO {
  id?: number
  name: string
  code: string
  sort?: number
  status?: number
  /** 不传时后端默认「仅本人」(5),保证最小权限 */
  dataScope?: number
  remark?: string
  /** 菜单编号集合(全量覆盖该角色的菜单授权) */
  menuIds?: number[]
}

/**
 * ⚠️ 菜单授权提交时 `menuIds` 必须**同时包含半选的父节点**
 *    (勾选框的父节点在子节点只选了一部分时是「半选」状态,
 *    `el-tree.getCheckedKeys()` **不返回**半选节点)。
 *    后端 `getMenuListByUserId` 只按「授权表里存的 id」取菜单、不会自动补父节点,
 *    漏掉父目录会导致该角色的菜单在侧边栏里挂不上树而整棵丢失。
 */
export interface RoleUpdateStatusReqVO {
  id: number
  status: number
}

export const RoleApi = {
  getRolePage: (params: RolePageReqVO) => request.get<PageResult<RoleVO>>(`${BASE}/page`, { params }),
  getRoleList: (params?: Partial<RolePageReqVO>) => request.get<RoleVO[]>(`${BASE}/list`, { params }),
  getRole: (id: number) => request.get<RoleVO>(`${BASE}/get`, { params: { id } }),
  createRole: (data: RoleSaveReqVO) => request.post<number>(`${BASE}/create`, data),
  updateRole: (data: RoleSaveReqVO) => request.put<boolean>(`${BASE}/update`, data),
  /** 只改状态;后端会把 state 变更与「内置角色保护」一起校验 */
  updateRoleStatus: (data: RoleUpdateStatusReqVO) => request.put<boolean>(`${BASE}/update-status`, data),
  deleteRole: (id: number) => request.delete<boolean>(`${BASE}/delete`, { params: { id } }),
  deleteRoleList: (ids: number[]) =>
    request.delete<boolean>(`${BASE}/delete-list`, { params: { ids: ids.join(',') } }),
  exportRole: (params: RolePageReqVO) => request.download(`${BASE}/export-excel`, params, '角色列表.xlsx')
}