3e9b34e0fd
- 新增 BasicForm 配置驱动表单组件,支持多种控件、字典自动加载、校验、插槽扩展 - 新增 BasicTable 公共表格组件,集成搜索栏+工具栏+表格+分页,基于 columns/searchColumns 配置驱动 - 替换 18 个业务页面 el-table 为 BasicTable(post/user/role/dict/config/notice/job/log/logininfor/operlog/online/gen 等) - 全局注册 BasicForm、BasicTable 组件 - 项目标题由若依管理系统改为 BMS
152 lines
4.7 KiB
Vue
152 lines
4.7 KiB
Vue
<template>
|
||
<div class="app-container">
|
||
<h4 class="form-header h4">基本信息</h4>
|
||
<el-form :model="form" label-width="80px">
|
||
<el-row>
|
||
<el-col :span="8" :offset="2">
|
||
<el-form-item label="用户昵称" prop="nickName">
|
||
<el-input v-model="form.nickName" disabled />
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="8" :offset="2">
|
||
<el-form-item label="登录账号" prop="userName">
|
||
<el-input v-model="form.userName" disabled />
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</el-form>
|
||
|
||
<h4 class="form-header h4">角色信息</h4>
|
||
<basic-table
|
||
ref="tableRef"
|
||
:columns="columns"
|
||
:query="queryList"
|
||
:extra-params="extraParams"
|
||
row-key="roleId"
|
||
:show-index="true"
|
||
:show-toolbar="false"
|
||
@row-click="clickRow"
|
||
@selection-change="handleSelectionChange"
|
||
/>
|
||
|
||
<el-form label-width="100px">
|
||
<div style="text-align: center;margin-left:-120px;margin-top:30px;">
|
||
<el-button type="primary" @click="submitForm()">提交</el-button>
|
||
<el-button @click="close()">返回</el-button>
|
||
</div>
|
||
</el-form>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup name="AuthRole">
|
||
import { getAuthRole, updateAuthRole } from "@/api/system/user"
|
||
|
||
const route = useRoute()
|
||
const { proxy } = getCurrentInstance()
|
||
|
||
const tableRef = ref()
|
||
const form = ref({
|
||
nickName: undefined,
|
||
userName: undefined,
|
||
userId: undefined
|
||
})
|
||
const allRoles = ref([])
|
||
const currentPageRows = ref([])
|
||
const selectedRoleIds = ref(new Set())
|
||
|
||
// 固定参数:用户 ID(每次请求合并传入)
|
||
const extraParams = reactive({ userId: route.params.userId })
|
||
|
||
// 表格列配置
|
||
const columns = [
|
||
{ label: "角色编号", prop: "roleId", align: "center" },
|
||
{ label: "角色名称", prop: "roleName", align: "center" },
|
||
{ label: "权限字符", prop: "roleKey", align: "center" },
|
||
{ label: "创建时间", prop: "createTime", align: "center", width: 180, parseTime: true }
|
||
]
|
||
|
||
/**
|
||
* 查询函数:本页数据由 getAuthRole 一次性返回(user + roles),
|
||
* BasicTable 走服务端分页机制,这里改为缓存全部角色后按页切片(客户端分页)。
|
||
* 跨页选择通过 selectedRoleIds 集合维护(BasicTable 内置 selection 列不支持 reserve-selection)。
|
||
*/
|
||
function queryList(params) {
|
||
const pageNum = params.pageNum || 1
|
||
const pageSize = params.pageSize || 10
|
||
if (!params.userId) {
|
||
return Promise.resolve({ rows: [], total: 0 })
|
||
}
|
||
if (!allRoles.value.length) {
|
||
return getAuthRole(params.userId).then(res => {
|
||
form.value = res.user
|
||
allRoles.value = res.roles || []
|
||
// 初始化已选中集合:原 flag 为 true 的角色
|
||
selectedRoleIds.value = new Set(
|
||
allRoles.value.filter(r => r.flag).map(r => r.roleId)
|
||
)
|
||
const total = allRoles.value.length
|
||
const rows = allRoles.value.slice((pageNum - 1) * pageSize, pageNum * pageSize)
|
||
currentPageRows.value = rows
|
||
nextTick(() => applySelection())
|
||
return { rows, total }
|
||
})
|
||
} else {
|
||
const total = allRoles.value.length
|
||
const rows = allRoles.value.slice((pageNum - 1) * pageSize, pageNum * pageSize)
|
||
currentPageRows.value = rows
|
||
nextTick(() => applySelection())
|
||
return Promise.resolve({ rows, total })
|
||
}
|
||
}
|
||
|
||
/** 按当前页回显选中状态(仅当前页可见行可被 toggleRowSelection) */
|
||
function applySelection() {
|
||
const tableEl = tableRef.value?.getTableRef()
|
||
currentPageRows.value.forEach(row => {
|
||
if (selectedRoleIds.value.has(row.roleId)) {
|
||
tableEl?.toggleRowSelection(row, true)
|
||
}
|
||
})
|
||
}
|
||
|
||
/** 角色状态可选:仅正常(status==="0")角色可勾选 */
|
||
function checkSelectable(row) {
|
||
return row.status === "0"
|
||
}
|
||
|
||
/** 单击选中行数据 */
|
||
function clickRow(row) {
|
||
if (checkSelectable(row)) {
|
||
tableRef.value?.getTableRef()?.toggleRowSelection(row)
|
||
}
|
||
}
|
||
|
||
/** 多选框选中数据:按当前页回填/移除,维护跨页选中集合 */
|
||
function handleSelectionChange(selection) {
|
||
const pageSelected = new Set(selection.map(r => r.roleId))
|
||
currentPageRows.value.forEach(row => {
|
||
if (pageSelected.has(row.roleId)) {
|
||
selectedRoleIds.value.add(row.roleId)
|
||
} else {
|
||
selectedRoleIds.value.delete(row.roleId)
|
||
}
|
||
})
|
||
}
|
||
|
||
/** 关闭按钮 */
|
||
function close() {
|
||
const obj = { path: "/system/user" }
|
||
proxy.$tab.closeOpenPage(obj)
|
||
}
|
||
|
||
/** 提交按钮 */
|
||
function submitForm() {
|
||
const userId = form.value.userId
|
||
const rIds = [...selectedRoleIds.value].join(",")
|
||
updateAuthRole({ userId: userId, roleIds: rIds }).then(() => {
|
||
proxy.$modal.msgSuccess("授权成功")
|
||
close()
|
||
})
|
||
}
|
||
</script>
|