RoleDrawer.vue 6.05 KB
<template>
    <BasicDrawer
      v-bind="$attrs"
      @register="registerDrawer"
      :title="'角色岗位管理'"
      width="550px"
      :showFooter="false"
    >
      <!-- 新增角色区域 -->
      <div class="mb-4 flex">
        <a-input v-model:value="roleName" placeholder="请输入角色名称" class="mr-2" style="width: 40%" />
        <!-- <a-input v-model:value="roleCode" placeholder="请输入角色编码" class="mr-2" style="width: 40%" /> -->
        <a-button type="primary" @click="handleCreate">新增角色岗位</a-button>
      </div>
      
      <!-- 编辑角色区域 -->
      <div v-if="editingRecord" class="mb-4 p-4 border border-blue-300 rounded bg-blue-50">
        <div class="flex items-center justify-between mb-2">
          <h4 class="text-blue-600 font-medium">编辑角色岗位</h4>
          <a-button size="small" @click="cancelEdit">取消</a-button>
        </div>
        <div class="flex">
          <a-input v-model:value="editForm.name" placeholder="请输入角色名称" class="mr-2" style="width: 40%" />
          <!-- <a-input v-model:value="editForm.code" placeholder="请输入角色编码" class="mr-2" style="width: 40%" /> -->
          <a-button type="primary" @click="handleEditSubmit">保存</a-button>
        </div>
      </div>
      
      <BasicTable @register="registerTable">
        <template #bodyCell="{ column, record }">
          <template v-if="column.key === 'action'">
            <TableAction
              :actions="[
                {
                  icon: 'clarity:note-edit-line',
                  tooltip: '编辑角色岗位',
                  onClick: handleEdit.bind(null, record),
                },
                {
                  icon: 'ant-design:delete-outlined',
                  color: 'error',
                  tooltip: '删除角色岗位',
                  popConfirm: {
                    title: '是否确认删除',
                    placement: 'left',
                    confirm: handleDelete.bind(null, record),
                  },
                },
              ]"
            />
          </template>
        </template>
      </BasicTable>
    </BasicDrawer>
  </template>
  <script lang="ts">
    import { defineComponent, ref } from 'vue';
    import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
    import { BasicTable, useTable, TableAction } from '/@/components/Table';
    import { getRoleList, addRole, editRole, deleteRole } from '/@/api/project/account';
    import { useMessage } from '/@/hooks/web/useMessage';
  
    const columns = [
      {
        title: '角色名称',
        dataIndex: 'name',
        width: 150,
      },
      // {
      //   title: '角色编码',
      //   dataIndex: 'code',
      //   width: 150,
      // },
    ];
  
    export default defineComponent({
      name: 'RoleDrawer',
      components: { BasicDrawer, BasicTable, TableAction },
      setup() {
        const { createMessage } = useMessage();
        const roleName = ref('');
        // const roleCode = ref('');
        const editingRecord = ref(null);
        const editForm = ref({
          id: '',
          name: '',
          // code: '',
        });
  
        // 获取所有角色列表
        const [registerTable, { reload }] = useTable({
          api: getRoleList,
          columns,
          pagination: false,
          striped: false,
          useSearchForm: false,
          showTableSetting: false,
          bordered: true,
          showIndexColumn: false,
          canResize: false,
          actionColumn: {
            width: 120,
            title: '操作',
            dataIndex: 'action',
          },
          rowKey: 'id',
        });
  
        const [registerDrawer] = useDrawerInner(async () => {
          reload();
          // 重置编辑状态
          editingRecord.value = null;
          // editForm.value = { id: '', name: '', code: '' };
          editForm.value = { id: '', name: '' };
        });
  
        function handleEdit(record: Recordable) {
          editingRecord.value = record;
          editForm.value = {
            id: record.id,
            name: record.name,
            // code: record.code || '',
          };
        }
  
        function cancelEdit() {
          editingRecord.value = null;
          // editForm.value = { id: '', name: '', code: '' };
          editForm.value = { id: '', name: ''};
        }
  
        async function handleEditSubmit() {
          if (!editForm.value.name) {
            createMessage.warning('角色名称不能为空');
            return;
          }
          
          // if (!editForm.value.code) {
          //   createMessage.warning('角色编码不能为空');
          //   return;
          // }
          
          await editRole({
            id: editForm.value.id,
            name: editForm.value.name,
            // code: editForm.value.code,
          });
          
          createMessage.success('编辑成功');
          cancelEdit();
          reload();
        }
  
        async function handleDelete(record: Recordable) {
          await deleteRole({ id: record.id });
          createMessage.success('删除成功');
          reload();
        }
  
        async function handleCreate() {
          if (!roleName.value) {
            createMessage.warning('角色名称不能为空');
            return;
          }
          
          // if (!roleCode.value) {
          //   createMessage.warning('角色编码不能为空');
          //   return;
          // }
          
          // 添加角色
          await addRole({ 
            name: roleName.value,
            // code: roleCode.value,
          });
          
          createMessage.success('添加成功');
          roleName.value = '';
          // roleCode.value = '';
          reload();
        }
  
        return {
          registerDrawer,
          registerTable,
          roleName,
          // roleCode,
          editingRecord,
          editForm,
          handleCreate,
          handleEdit,
          handleDelete,
          handleEditSubmit,
          cancelEdit,
        };
      },
    });
  </script>