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