123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- <script setup lang="ts">
- import {
- getRolePage,
- updateRole,
- addRole,
- deleteRoles,
- getRoleMenuIds,
- updateRoleMenus,
- } from "@/api/system/role";
- import { getMenuOptions } from "@/api/system/menu";
- defineOptions({
- name: "Role",
- inheritAttrs: false,
- });
- const queryFormRef = ref(ElForm);
- const roleFormRef = ref(ElForm);
- const menuRef = ref(ElTree);
- const loading = ref(false);
- const ids = ref<number[]>([]);
- const total = ref(0);
- const queryParams = reactive({
- pageNo: 1,
- pageSize: 10,
- });
- const roleList = ref<[]>();
- const dialog = reactive({
- title: "",
- visible: false,
- });
- const formData = ref({
- id: "",
- sort: 0,
- scope: 0,
- status: 0,
- state: 0,
- roleCode: "",
- roleName: "",
- });
- const rules = reactive({
- roleName: [{ required: true, message: "请输入角色名称", trigger: "blur" }],
- scope: [{ required: true, message: "请选择数据权限", trigger: "blur" }],
- state: [{ required: true, message: "请选择状态", trigger: "blur" }],
- });
- const menuDialogVisible = ref(false);
- const menuList = ref([]);
- interface CheckedRole {
- id?: number;
- name?: string;
- }
- let checkedRole: CheckedRole = reactive({});
- /** 查询 */
- function handleQuery() {
- loading.value = true;
- getRolePage(queryParams)
- .then(({ data }) => {
- roleList.value = data.records;
- total.value = data.totalCount;
- })
- .finally(() => {
- loading.value = false;
- });
- }
- /** 重置查询 */
- function resetQuery() {
- queryFormRef.value.resetFields();
- queryParams.pageNo = 1;
- handleQuery();
- }
- /** 行checkbox 选中事件 */
- function handleSelectionChange(selection: any) {
- ids.value = selection.map((item: any) => item.id);
- }
- /** 打开角色表单弹窗 */
- function openDialog(row?: any) {
- dialog.visible = true;
- if (row) {
- dialog.title = "修改角色";
- Object.assign(formData.value, row);
- } else {
- dialog.title = "新增角色";
- formData.value.id = undefined;
- formData.value.scope = 0;
- formData.value.state = 0;
- formData.value.roleCode = "";
- formData.value.roleName = "";
- }
- }
- /** 角色保存提交 */
- function handleSubmit() {
- roleFormRef.value.validate((valid: any) => {
- if (valid) {
- loading.value = true;
- const roleId = formData.value.id;
- if (roleId) {
- updateRole(formData.value)
- .then(() => {
- ElMessage.success("修改成功");
- closeDialog();
- resetQuery();
- })
- .finally(() => (loading.value = false));
- } else {
- addRole(formData.value)
- .then(() => {
- ElMessage.success("新增成功");
- closeDialog();
- resetQuery();
- })
- .finally(() => (loading.value = false));
- }
- }
- });
- }
- /** 关闭表单弹窗 */
- function closeDialog() {
- dialog.visible = false;
- resetForm();
- }
- /** 重置表单 */
- function resetForm() {
- roleFormRef.value.resetFields();
- roleFormRef.value.clearValidate();
- formData.id = undefined;
- formData.sort = 1;
- formData.status = 1;
- }
- /** 删除角色 */
- function handleDelete(roleId?: number) {
- const roleIds = [roleId || ids.value].join(",");
- if (!roleIds) {
- ElMessage.warning("请勾选删除项");
- return;
- }
- ElMessageBox.confirm("确认删除已选中的数据项?", "警告", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- }).then(() => {
- loading.value = true;
- deleteRoles(ids.value)
- .then(() => {
- ElMessage.success("删除成功");
- resetQuery();
- })
- .finally(() => (loading.value = false));
- });
- }
- /** 打开分配菜单弹窗 */
- function openMenuDialog(row: any) {
- const roleId = row.id;
- if (roleId) {
- checkedRole = {
- id: roleId,
- name: row.roleName,
- };
- menuDialogVisible.value = true;
- loading.value = true;
- // 获取所有的菜单
- getMenuOptions().then((response) => {
- menuList.value = response.data;
- // 回显角色已拥有的菜单
- getRoleMenuIds(roleId)
- .then(({ data }) => {
- const checkedMenuIds = data;
- checkedMenuIds.forEach((menuId) =>
- menuRef.value.setChecked(menuId, true, false)
- );
- })
- .finally(() => {
- loading.value = false;
- });
- });
- }
- }
- /** 角色分配菜单保存提交 */
- function handleRoleMenuSubmit() {
- const roleId = checkedRole.id;
- if (roleId) {
- const checkedMenuIds: number[] = menuRef.value
- .getCheckedNodes(false, true)
- .map((node: any) => {
- return node.id;
- });
- loading.value = true;
- updateRoleMenus(roleId, checkedMenuIds)
- .then(() => {
- ElMessage.success("分配权限成功");
- menuDialogVisible.value = false;
- resetQuery();
- })
- .finally(() => {
- loading.value = false;
- });
- }
- }
- onMounted?.(() => {
- handleQuery();
- });
- </script>
- <template>
- <div class="app-container">
- <div class="search-container">
- <el-form ref="queryFormRef" :model="queryParams" :inline="true">
- <el-form-item prop="keywords" label="关键字">
- <el-input
- v-model="queryParams.keywords"
- placeholder="编码/名称"
- clearable
- @keyup.enter="handleQuery"
- />
- </el-form-item>
- <el-form-item>
- <el-button type="primary" @click="handleQuery"
- ><i-ep-search />搜索</el-button
- >
- <el-button @click="resetQuery"><i-ep-refresh />重置</el-button>
- </el-form-item>
- </el-form>
- </div>
- <el-card shadow="never" class="table-container">
- <template #header>
- <el-button
- type="primary"
- v-hasPerm="['sys:role:add']"
- @click="openDialog()"
- ><i-ep-plus />新增</el-button
- >
- <el-button
- type="danger"
- v-hasPerm="['sys:role:del']"
- :disabled="ids.length === 0"
- @click="handleDelete()"
- ><i-ep-delete />删除</el-button
- >
- </template>
- <el-table
- ref="dataTableRef"
- v-loading="loading"
- :data="roleList"
- highlight-current-row
- border
- @selection-change="handleSelectionChange"
- >
- <el-table-column type="selection" width="55" align="center" />
- <el-table-column label="角色编码" prop="roleCode" />
- <el-table-column label="角色名称" prop="roleName" />
- <el-table-column label="状态" align="center" width="100">
- <template #default="scope">
- <el-tag v-if="scope.row.state === 0" type="success">正常</el-tag>
- <el-tag v-else type="info">禁用</el-tag>
- </template>
- </el-table-column>
- <el-table-column label="创建时间" align="center" prop="created" />
- <el-table-column label="创建人" align="center" prop="creator" />
- <el-table-column fixed="right" label="操作" width="220">
- <template #default="scope">
- <el-button
- type="primary"
- size="small"
- link
- v-hasPerm="['sys:role:dis']"
- @click="openMenuDialog(scope.row)"
- >
- <i-ep-position />分配权限
- </el-button>
- <el-button
- type="primary"
- size="small"
- link
- v-hasPerm="['sys:role:edit']"
- @click="openDialog(scope.row)"
- >
- <i-ep-edit />编辑
- </el-button>
- <!-- <el-button
- type="primary"
- size="small"
- link
- @click="handleDelete(scope.row.id)"
- >
- <i-ep-delete />删除
- </el-button>-->
- </template>
- </el-table-column>
- </el-table>
- <pagination
- v-if="total > 0"
- v-model:total="total"
- v-model:page="queryParams.pageNo"
- v-model:limit="queryParams.pageSize"
- @pagination="handleQuery"
- />
- </el-card>
- <!-- 角色表单弹窗 -->
- <el-dialog
- v-model="dialog.visible"
- :title="dialog.title"
- width="500px"
- @close="closeDialog"
- >
- <el-form
- ref="roleFormRef"
- :model="formData"
- :rules="rules"
- label-width="100px"
- >
- <el-form-item label="角色名称" prop="roleName">
- <el-input v-model="formData.roleName" placeholder="请输入角色名称" />
- </el-form-item>
- <!-- <el-form-item label="角色编码" prop="roleCode">
- <el-input v-model="formData.roleCode" placeholder="请输入角色编码" />
- </el-form-item>-->
- <el-form-item label="数据权限" prop="scope">
- <el-select v-model="formData.scope">
- <el-option :key="0" label="全部数据" :value="0" />
- <el-option :key="1" label="部门及子部门数据" :value="1" />
- <el-option :key="2" label="本部门数据" :value="2" />
- <el-option :key="3" label="本人数据" :value="3" />
- </el-select>
- </el-form-item>
- <el-form-item label="状态" prop="state">
- <el-radio-group v-model="formData.state">
- <el-radio :value="0">正常</el-radio>
- <el-radio :value="1">停用</el-radio>
- </el-radio-group>
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleSubmit">确 定</el-button>
- <el-button @click="closeDialog">取 消</el-button>
- </div>
- </template>
- </el-dialog>
- <!-- 分配菜单弹窗 -->
- <el-dialog
- v-model="menuDialogVisible"
- :title="'【' + checkedRole.name + '】权限分配'"
- width="550px"
- >
- <el-scrollbar v-loading="loading" max-height="600px">
- <el-tree
- ref="menuRef"
- node-key="id"
- show-checkbox
- :check-strictly="true"
- :props="{
- children: 'childs',
- label: 'menuName',
- value: 'id',
- disabled: '',
- }"
- :data="menuList"
- :default-expand-all="false"
- >
- <template #default="{ data }">
- {{ data.menuName }}
- </template>
- </el-tree>
- </el-scrollbar>
- <template #footer>
- <div class="dialog-footer">
- <el-button type="primary" @click="handleRoleMenuSubmit"
- >确 定</el-button
- >
- <el-button @click="menuDialogVisible = false">取 消</el-button>
- </div>
- </template>
- </el-dialog>
- </div>
- </template>
|