vue用户管理、角色管理和部门管理展示

1、用户和角色一对多,用户和部门多对多

2、用户管理

编辑用户时部门层级展示

角色-下拉框展示

<template>
  <div class="s">
    <!-- 操作按钮 -->
    <div class="shang">
      <el-input v-model="searchText" placeholder="请输入姓名搜索关键词" style="width: 200px;"></el-input>
      <el-input v-model="userEmailSearchText" placeholder="请输入邮箱号搜索关键词" style="width: 200px;"></el-input>
      <el-select v-model="selectedRoleId" placeholder="请选择角色">
        <el-option v-for="role in roles" :key="role.id" :label="role.role_name" :value="role.id"></el-option>
      </el-select>
      <el-button type="primary" @click="search">搜索</el-button>
      <el-button @click="resetForm">重置</el-button>
    </div>
    <br>
    <el-button type="primary" @click="showAddDialog">新增用户</el-button>
    <el-table :data="filteredTableData" style="width: 100%">
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="user_email" label="邮箱号"></el-table-column>
      <el-table-column label="角色">
        <template slot-scope="scope">
          {{ scope.row.role_name }}
        </template>
      </el-table-column>

      <el-table-column label="部门">
        <template slot-scope="scope">
          <span v-for="(department, index) in scope.row.department_id" :key="department">
            {{ department.split(' ----- ').pop() }}
          </span>
        </template>
      </el-table-column>

      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button size="mini" @click="showEditDialog(scope.row)">编辑</el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.row.user_id)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>

    <!-- 新增/编辑对话框 -->
    <el-dialog :title="dialogTitle" :visible.sync="isDialogVisible">
      <el-form :model="form">
        <el-form-item label="姓名">
          <el-input v-model="form.name"></el-input>
        </el-form-item>

        <el-form-item label="邮箱号">
          <el-input v-model="form.user_email"></el-input>
        </el-form-item>
        <el-form-item label="角色">
          <br>
          <el-select v-model="form.role" style="width:200px">
            <el-option v-for="role in roles" :key="role.id" :label="role.role_name" :value="role.id"></el-option>
          </el-select>
        </el-form-item>

        <el-form-item label="归属部门">
          <treeselect v-model="form.department_ids" :options="deptOptions" :show-count="true" placeholder="请选择归属部门"
            :normalizer="normalizer" multiple />
        </el-form-item>

      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="isDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">确定</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import axios from 'axios';
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";

export default {
  components: { Treeselect },
  data() {
    return {
      searchText: '',
      userEmailSearchText: '', 
      selectedRoleId: null, 
      selectedDepartment: [], 
      deptOptions: [],
      tableData: [],
      roles: [],
      isDialogVisible: false,
      dialogTitle: '新增用户',
      form: {
        id: '',
        name: '',
        user_email: '',
        role: '',
        department_ids: []
      },
      setRoleDialogVisible: false,
      setDepDialogVisible: false,
      userInfo: []
    };
  },
  mounted() {
    this.handleSearch();
    this.setRole();
    this.setDep();
    this.loadDepartmentOptions(); 
    console.log("deptOptions", this.deptOptions); 
  },
 // 计算属性
computed: {
  filteredTableData() {
    let filteredData = this.tableData;
    if (this.searchText) {
      filteredData = filteredData.filter(user => user.name.includes(this.searchText));
    }
    if (this.userEmailSearchText) {
      filteredData = filteredData.filter(user => user.user_email.includes(this.userEmailSearchText));
    }
    if (this.selectedRoleId) {
      filteredData = filteredData.filter(user => user.role_id === this.selectedRoleId);
    }

    // 为每个用户获取角色和部门名称
    filteredData.forEach(user => {
      user.role_name = this.getRoleName(user.role_id);
      if (user.department_id && Array.isArray(user.department_id)) {
        user.department_names = user.department_id.map(departmentId => {
          const department = this.deptOptions.find(dep => dep.id === departmentId);
          return department? department.name : '';
        });
      } else {
        user.department_names = [];  // 确保没有部门 ID 时,department_names 是一个空数组
      }
    });

    return filteredData;
  }
},
  methods: {
    getRoleName(roleId) {
      const role = this.roles.find(role => role.id === roleId);
      return role? role.role_name : '';
    },
    resetForm() {
      this.searchText = '';
      this.userEmailSearchText = ''; 
      this.selectedRoleId = null; 
      this.selectedDepartment = []; 
      this.handleSearch();
    },
    async search() {
      try {
        const params = {};
        if (this.searchText) {
          params.name = this.searchText;
        }
        if (this.userEmailSearchText) {
          params.user_email = this.userEmailSearchText;
        }
        if (this.selectedRoleId) {
          params.role_id = this.selectedRoleId;
        }
        if (this.selectedDepartment.length > 0) {
          params.departments = this.selectedDepartment.map(department => department.name).join(','); 
        }
        console.log('发送的请求参数params:', params); 
        const usersResponse = await axios.get('http://127.0.0.1:8000/users/search_user_by_params/', {
          params: params
        });
        this.tableData = usersResponse.data;
      } catch (error) {
        console.error('搜索时出错:', error);
      }
    },
    async handleSearch() {
      try {
        const usersResponse = await axios.get('http://127.0.0.1:8000/users/get_user_details_extended/');
        this.tableData = usersResponse.data;
        // 同时获取部门信息
        const deptResponse = await axios.get('http://127.0.0.1:8000/departments/');
        this.deptOptions = deptResponse.data;
        console.log("this.deptOptions部门1", this.deptOptions);
      } catch (error) {
        console.error('Error fetching users:', error);
      }
    },
    async loadDepartmentOptions() { // 加载部门选项的方法
      try {
        const response = await axios.get('http://127.0.0.1:8000/departments/');
        this.departmentOptions = response.data.map(department => ({
          id: department.id, 
          label: department.name, 
          children: department.children 
        }));
      } catch (error) {
        console.error('Error fetching department options:', error);
      }
    },
    async setRole() {
      try {
        const response = await axios.get('http://127.0.0.1:8000/roles/');
        this.roles = response.data;
        this.setRoleDialogVisible = true;
      } catch (error) {
        console.error('Error fetching roles:', error);
      }
    },
    normalizer(node) {
      console.log("node", node);
      console.log("node.children", node.children);
      if (node.children) {
        return {
          id: node.id,
          label: node.name, 
          children: node.children 
        };
      }
      return {
        id: node.id,
        label: node.name,
        children: node.children
      };
    },
    showAddDialog() {
      this.dialogTitle = '新增用户11111';
      this.form = {
        id: '',
        name: '',
        user_email: '',
        role_id: '',
        department_ids: []
      };
      this.isDialogVisible = true;
    },
    async setDep() {
      try {
        const response = await axios.get('http://127.0.0.1:8000/departments/');
        this.deptOptions = response.data.map(department => ({
          id: department.id, 
          name: department.name
        }));
        this.setDepDialogVisible = false;
        console.log("this.deptOptions部门", this.deptOptions);
      } catch (error) {
        console.error('Error fetching departments:', error);
      }
    },
    showEditDialog(row) {
      this.dialogTitle = '编辑用户1111';
      this.form = {
        id: row.user_id,
        name: row.name,
        user_email: row.user_email,
        role: row.role_id
      };
      // 处理部门信息
      // 根据部门名称找到对应的 ID
      if (row.department_id && Array.isArray(row.department_id)) {
        console.log("Row department IDs:", row.department_id);
        console.log("Department Options:", this.deptOptions);
        this.form.department_ids = row.department_id.map(departmentName => {
          const findDepartment = (options) => {
            for (const option of options) {
              if (option.name === departmentName) {
                return option.id;
              }
              if (option.children) {
                const found = findDepartment(option.children);
                if (found) {
                  return found;
                }
              }
            }
            return null;
          };
          return findDepartment(this.deptOptions);
        }).filter(id => id!== null);
      } else {
        this.form.department_ids = [];
      }
      this.isDialogVisible = true;
    },
    async handleSubmit() {
      const payload = {
        id: this.form.id,
        name: this.form.name,
        user_email: this.form.user_email,
        role_id: this.form.role,
        department_ids: this.form.department_ids  
      };
      console.log("用户编辑部分111111111111111111111111", this.form.id);
      if (this.form.id!== "") {
        try {
          await axios.put(`http://127.0.0.1:8000/search/update_user/${this.form.id}`, payload);
          this.$message.success('用户编辑成功');
          this.handleSearch();
        } catch (error) {
          console.error('Error updating user:', error);
        }
      } else {
        try {
          await axios.post('http://127.0.0.1:8000/search/create_user/', payload);
          this.$message.success('新增用户成功');
          this.handleSearch();
        } catch (error) {
          console.error('Error adding user:', error);
        }
      }
      this.isDialogVisible = false;
    },

    async handleDelete(id) {
      try {
        await axios.delete(`http://127.0.0.1:8000/users/${id}/`);
        this.$message.success('用户删除成功');
        this.handleSearch();
      } catch (error) {
        console.error('Error deleting user:', error);
      }
    }
  }
};
</script>

<style>
/* 样式可以按需添加 */
.s {
  margin-left: 20px;
  margin-top: 20px;
}

.shang {
  margin-top: 20px;
}
</style>

3、角色管理

<template>
  <div class="s">
    <!-- 操作按钮 -->

    <div class="shang">

      <el-input v-model="searchText" placeholder="请输入搜索关键词" style="width: 500px;"></el-input>
      <el-button type="primary" @click="search">搜索</el-button>
      <el-button @click="resetForm">重置</el-button>
    </div>
    <br>
    <el-button type="primary" @click="showAddDialog">新增角色</el-button>
    <el-table :data="tableData" style="width: 100%;">

      <el-table-column prop="role_name" label="角色" >
        <template slot-scope="scope">
          <div class="centered-content">{{ scope.row.role_name }}</div>
        </template>
      </el-table-column>
    
      <el-table-column prop="status" label="状态" >
        <template slot-scope="scope">
          <div class="centered-content">
            <el-tag :type="scope.row.status === true? 'success' : 'danger'">
              {{ scope.row.status === true? '激活' : '禁用' }}
            </el-tag>
          </div>
        </template>
      </el-table-column>
      <!-- can_view_files: false, // 添加文件查看权限属性
      can_upload_files: false // 添 -->
      <el-table-column prop="can_upload_files" label="上传文件状态" >
        <template slot-scope="scope">
          <div class="centered-content">
            <el-tag :type="scope.row.can_upload_files === true? 'success' : 'danger'">
              {{ scope.row.can_upload_files === true? '激活' : '禁用' }}
            </el-tag>
          </div>
        </template>
      </el-table-column>
      
      <el-table-column prop="can_view_files" label="查看文件状态" >
        <template slot-scope="scope">
          <div class="centered-content">
            <el-tag :type="scope.row.can_view_files === true? 'success' : 'danger'">
              {{ scope.row.can_view_files === true? '激活' : '禁用' }}
            </el-tag>
          </div>
        </template>
      </el-table-column>
    
      <el-table-column prop="created_at" label="创建时间" >
        <template slot-scope="scope">
          <div class="centered-content">{{ scope.row.created_at | formatDate }}</div>
        </template>
      </el-table-column>
    
      <el-table-column label="操作" >
        <template slot-scope="scope">
          <div class="centered-content">
            <el-button size="mini" type="text" icon="el-icon-edit" @click="showEditDialog(scope.row)">修改</el-button>
            <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row.id)">删除</el-button>
          </div>
        </template>
      </el-table-column>
    
    </el-table>
    
    


    <!-- 分配用户对话框 -->
    <!-- 分配用户到角色的弹框 -->

    <el-dialog :title="dialogTitle1" :visible.sync="isDialogVisible1">
      <el-table :data="tableData1" style="width: 100%" @selection-change="handleSelectionChange">
        <!-- 复选框列 -->
        <el-table-column type="selection" width="55"></el-table-column>

        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="nickname" label="昵称"></el-table-column>

        <el-table-column prop="phone_number" label="电话"></el-table-column>

      </el-table>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isDialogVisible1 = false">取消</el-button>
        <el-button type="primary" @click="asingnuser">确定</el-button>
        <!-- @click="handleConfirm" -->
      </span>
    </el-dialog>
    <!-- 新增/编辑对话框 -->
    <el-dialog :title="dialogTitle" :visible.sync="isDialogVisible">
      <el-form :model="form">
        <el-form-item label="角色">
          <el-input v-model="form.role_name"></el-input>
        </el-form-item>
    
        <div class="role-permissions">
          <div style="display: flex; align-items: center;">
            <span>状态</span>
            <el-form-item style="margin-left: 20px; flex: 1;">
              <el-switch v-model="form.status" style="float: right;"></el-switch>
            </el-form-item>
          </div>
    
          <div style="display: flex; align-items: center;">
            <span>文件上传权限</span>
            <el-form-item style="margin-left: 20px; flex: 1;">
              <el-switch v-model="form.can_upload_files" style="float: right;"></el-switch>
            </el-form-item>
          </div>
    
          <div style="display: flex; align-items: center;">
            <span>文件查看权限</span>
            <el-form-item style="margin-left: 20px; flex: 1;">
              <el-switch v-model="form.can_view_files" style="float: right;"></el-switch>
            </el-form-item>
          </div>
        </div>
      </el-form>
    
      <div slot="footer" class="dialog-footer">
        <el-button @click="isDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">确定</el-button>
      </div>
    </el-dialog>

  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      searchText: '', // 搜索关键词
      tableData: [
        { created_at: '2024-06-21T05:41:57.131606Z' },
      ], // 存储从后端获取的数据
      tableData1: [],
      isDialogVisible: false, // 控制对话框的显示
      dialogTitle: '新增角色', // 对话框标题
      form: { // 表单数据
        id: '',
        role_id: null,
        role_name: '',
        status: true,
        created_at: '',
        can_view_files: false, // 添加文件查看权限属性
        can_upload_files: false // 添加文件上传权限属性
      },
      isDialogVisible1: false, // 控制对话框的显示
      dialogTitle1: '分配用户', // 对话框标题
      form1: { // 表单数据
        id: '',
        role_id: null,
        role_name: '',
        status: true,
        created_at: ''
      },
      showAssignUsers: false,
      selectedUsers: [], // 存储选择的用户数据
      selectedRoles: [], // 存储选择的角色


    };
  },
  mounted() {
    this.handleSearch();
    this.handleSearch1();
  },
  methods: {
    asingnuser() {
      console.log("用户分配成功!!!")
    },
    resetForm() {
      // 重置表单
      this.searchText = '';
      // 重新加载数据或执行其他操作
      // 例如异步获取数据
      this.handleSearch();
    },
    async search() {
      try {
        // 发起搜索请求
        const response = await axios.get('http://127.0.0.1:8000/search/roles/', {
          params: {
            query: this.searchText
          }
        });
        console.log(this.searchText);
        // 更新表格数据
        this.tableData = response.data;
        console.log(this.tableData);
      } catch (error) {
        console.error('搜索时出错:', error);
      }
    },
    handleSelectionChange(selection) {
      this.selectedUsers = selection;
    },

    async handleSearch() {
      try {
        const response = await axios.get('http://127.0.0.1:8000/roles/');
        this.tableData = response.data; // 将返回的用户数据存储在tableData中
      } catch (error) {
        console.error('Error fetching users:', error);
      }
    },
    async handleSearch1() {  // 接收角色 id 作为参数
      try {
        const response = await axios.get(`http://127.0.0.1:8000/users/`);
        this.tableData1 = response.data;
      } catch (error) {
        console.error('Error fetching users:', error);
      }
    },
    showAddDialog() {
      this.dialogTitle = '新增角色';
      this.form = {
        id: '',
        role_id: null,
        role_name: '',
        status: true,
        created_at: ''
      };
      this.isDialogVisible = true;
    },
    showEditDialog(row) {
      this.dialogTitle = '编辑用户';
      this.form = { ...row }; // 将选中的行数据填充到表单中
      this.isDialogVisible = true;
    },
    assignUser(row) {
      this.isDialogVisible1 = true;
      this.dialogTitle1 = '分配用户';
      // 调用获取对应角色用户数据的方法,并传递角色 id
      const role = this.handleSearch1(row.role_id);
      console.log("role角色", role);
    },


    async handleSubmit() {
      if (this.form.id) {
        // 编辑用户
        try {
          await axios.put(`http://127.0.0.1:8000/roles/${this.form.id}/`, this.form);
          this.$message.success('用户更新成功');
          this.handleSearch();
        } catch (error) {
          console.error('Error updating user:', error);

        }
      } else {
        // 新增用户
        try {
          await axios.post('http://127.0.0.1:8000/roles/', this.form);
          this.$message.success('用户新增成功');
          this.handleSearch();
        } catch (error) {
          console.error('Error adding user:', error);
        }
      }
      this.isDialogVisible = false;
    },


    async handleDelete(id) {
      try {
        const confirm = await this.$confirm('确认删除该用户吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        });
        if (confirm) {
          await axios.delete(`http://127.0.0.1:8000/roles/${id}/`);
          this.$message.success('用户删除成功');
          this.handleSearch();
        }
      } catch (error) {
        console.error('Error deleting user:', error);
      }
    },


    /** 分配用户操作 */
    handleAuthUser(row) {
      console.log("rowsaaaaaaaaaaaaaaaaaaaaaaa", row);
      const roleID = row.id;
      console.log("sssssssssssssss", roleID);
      // this.$router.push("/role/authUser/"+roleID);
      // 使用 $router.push 导航到对应的角色授权页面
      this.$router.push({ name: 'authUser', params: { roleID: this.roleID } });
    },



    // // 更多操作触发
    handleCommand(command, row) {
      switch (command) {
        case "handleDataScope":
          this.handleDataScope(row);
          break;
        case "handleAuthUser":
          this.handleAuthUser(row);
          break;
        default:
          break;
      }
    },




  }
};
</script>

<style>
/* 样式可以按需添加 */
.s {

  margin-left: 20px;
  margin-top: 20px;
}
.role-permissions{
  margin-top: 20px;
  display: flex;
  flex-direction:row;
}
.el-switch__core{
  margin-top: 23px;
  margin-right: 60px;

}

</style>

4、部门管理

<template>
  <div class="as">
    <div class="xinzeng">
      <el-row :gutter="10" class="mb8">
        <el-col :span="1.5">
          <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="showAddDialog">新增</el-button>
        </el-col>
        <!-- <el-col :span="1.5">
          <el-button type="info" plain icon="el-icon-sort" size="mini" @click="toggleExpandCollapse">展开/折叠</el-button>
        </el-col> -->
        <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="fetchData"></right-toolbar> -->
      </el-row>
    </div>
    <div class="tab">
      <el-table v-loading="loading" :data="processedData" row-key="id" :default-expand-all="isExpandAll"
        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
        <el-table-column prop="name" label="部门名称" width="260"></el-table-column>
<!-- 
        <el-table-column prop="id" label="id222222222" width="260"></el-table-column>

        <el-table-column prop="parent" label="部门名称1111111111" width="260"></el-table-column>
      -->
        <el-table-column prop="order" label="排序" width="250"></el-table-column>

        <el-table-column prop="status" label="状态" width="260">
          <template slot-scope="scope">
            <el-tag :type="scope.row.status ? 'success' : 'danger'">{{ scope.row.status ? '正常' : '停用' }}</el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="created_at" label="创建时间" width="280">
          <template slot-scope="scope">
            {{ scope.row.created_at | formatDate }}
          </template>
        </el-table-column>
        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
          <template slot-scope="scope">
            <el-button size="mini" type="text" icon="el-icon-edit" @click="showEditDialog(scope.row)"
         >修改</el-button>
            <!-- <el-button size="mini" type="text" icon="el-icon-plus" @click="showAddDialog">新增</el-button> -->
            <el-button v-if="scope.row.parentId != 0" size="mini" type="text" icon="el-icon-delete"
              @click="handleDelete(scope.row.id)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>

      <!-- 新增/编辑对话框 -->
      <el-dialog :title="dialogTitle" :visible.sync="isDialogVisible">
        <el-form :model="form">

          <el-row>
            <el-col :span="24" v-if="form.parent !== 0">
              <el-form-item label="上级部门" prop="parent">
                <treeselect v-model="form.parent" :options="deptOptions" :normalizer="normalizer" placeholder="选择上级部门" />
              </el-form-item>
            </el-col>
          </el-row>
     
          <el-form-item label="部门名称">
            <el-input v-model="form.name"></el-input>
          </el-form-item>

          <el-form-item label="排序">
            <el-input v-model="form.order"></el-input>
          </el-form-item>

          <el-form-item label="状态">
            <el-switch v-model="form.status"></el-switch>
          </el-form-item>
        </el-form>
        <div slot="footer" class="dialog-footer">
          <el-button @click="isDialogVisible = false">取消</el-button>
          <el-button type="primary" @click="handleSubmit">确定</el-button>
        </div>
      </el-dialog>



    </div>
  </div>
</template>

<script>
import axios from "axios";
import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css";

export default {
  components: { Treeselect },
  data() {
    return {

      // {
      //     id: "",
      //   name: "",
      //   parent: null,
      //   children: [
      //       {
      //           id: "",
      //           name: "",
      //           parent: "",
      //           children: [
      //             {
      //               name: "",
      //             }
      //           ],
      //           order: "",
      //           status: "",
      //           created_at: ""
      //       }
      //   ],
      //   order: "",
      //   status: "",
      //   created_at: ""
      //   }
      // 部门树选项
      deptOptions: [
       
      ],
      isDialogVisible: false, // 控制对话框的显示
      dialogTitle: '新增部门', // 对话框标题
      form: { // 表单数据a
        id: '',
        name: "",
        parent: "",
        children: [],
        order: 0,
        status: "",
        created_at: ""
      },
      processedData: [],
      loading: false,  // 数据加载状态

      defaultProps: {
        children: "children",
        label: "name"
      },
      dialogVisible: false,  // 对话框的可见性
      currentItem: {  // 当前操作的部门项目
        id: null,
        name: "",
        parent: null
      },
      rules: {
        name: [
          { required: true, message: "请输入名称", trigger: "blur" }
        ],
        parent: [
          { required: true, message: "请选择父级", trigger: "blur" }
        ]
      },
      // 是否展开,默认全部展开
      isExpandAll: true,
      // 重新渲染表格状态
      refreshTable: true,
    };
  },
  created() {
    this.fetchData();
  },
  methods: {/** 转换部门数据结构 */
    normalizer(node) {
      if (node.children && !node.children.length) {
        delete node.children;
      }
      return {
        id: node.id,
        label: node.name,
        children: node.children
      };
    },

    // 获取部门数据
    async fetchData() {
      this.loading = true;  // 开始加载数据时设置加载状态为真
      try {
        const response = await axios.get("http://127.0.0.1:8000/departments/");
        this.processedData = response.data;
        this.deptOptions = response.data;
        console.log(this.processedData)
      } catch (error) {
        console.error("Error fetching data:", error);
      } finally {
        this.loading = false;  // 无论成功与否,结束加载时设置加载状态为假
      }
    },
    // 切换展开/折叠状态
    toggleExpandCollapse() {

      this.isExpandAll = !this.isExpandAll;
    },
    // 显示添加对话框
    showAddDialog() {
      this.dialogTitle = '新增部门';
      this.form = {
        id: '',
        name: "",
        order: '',
        status: true,
        created_at: '',
        parent: null
      };
      this.isDialogVisible = true;
    },
    showEditDialog(row) {
      this.dialogTitle = '编辑部门';
      this.form = { ...row }; // 将选中的行数据填充到表单中
      this.isDialogVisible = true;
    },
    // 表单重置
    reset() {
      this.form = {
        id: undefined,
        parent: undefined,
        name: undefined,
        order: undefined,
        created_at: undefined,

      };
      this.resetForm("form");
    },
    /** 新增按钮操作 */
    async handleAdd(row) {
      this.reset();
      if (row != undefined) {
        this.form.parent = row.id;
      }
      this.isDialogVisible = true;
      this.dialogTitle = "添加部门";
      try {
        await axios.post('http://127.0.0.1:8000/departments/', this.form);
        this.$message.success('用户新增成功');
        this.fetchData();

      } catch (error) {
        console.error('Error adding user:', error);
      }
    },
// // 部门弹框展示数据
//     showEditDialog(row) {
//       this.dialogTitle = '编辑用户';
//       this.form = { ...row }; // 将选中的行数据填充到表单中
//       this.isDialogVisible = true;
//     },
    async handleSubmit() {

      if (this.form.id !== "") {
        // 编辑部门
        try {
          await axios.put(`http://127.0.0.1:8000/departments/${this.form.id}/`, this.form);
          this.$message.success('用户更新成功');
          this.fetchData();
        } catch (error) {
          console.error('Error updating user:', error);
        }
      } else {
        // 新增部门
        try {
          await axios.post('http://127.0.0.1:8000/departments/', this.form);
          this.$message.success('用户新增成功');
          this.fetchData();

        } catch (error) {
          console.error('Error adding user:', error);
        }
      }
      this.isDialogVisible = false;
    },
    // 删除部门节点
    async deleteNode(node) {
      try {
        await axios.delete(`http://127.0.0.1:8000/departments/${node.id}`);
        await this.fetchData();
      } catch (error) {
        console.error("Error deleting node:", error);
      }
    },
    // // 编辑部门节点
    // editNode(node) {
    //   this.currentItem = { ...node };
    //   this.dialogVisible = true;
    // },
    
    // 处理新增子部门
    handleAdd(row) {
      // 这里可以添加具体的新增子部门逻辑
      console.log("新增子部门操作", row);
    },
    /** 展开/折叠操作 */
    toggleExpandAll() {
      this.refreshTable = false;
      this.isExpandAll = !this.isExpandAll;
      this.$nextTick(() => {
        this.refreshTable = true;
      });
    },
    async handleDelete(id) {
      try {
        await axios.delete(`http://127.0.0.1:8000/departments/${id}/`);
        this.$message.success('用户删除成功');
        this.fetchData();
      } catch (error) {
        console.error('Error deleting user:', error);
      }
    },
     
  }
};
</script>

<style scoped>
.xinzeng {
  padding-top: 30px;
  padding-left: 35px;
}


.tab {
  margin-top: 20px;
  margin-left: 20px;
}
</style>
相关推荐
逆旅行天涯4 分钟前
【Threejs】从零开始(六)--GUI调试开发3D效果
前端·javascript·3d
长风清留扬1 小时前
小程序毕业设计-音乐播放器+源码(可播放)下载即用
javascript·小程序·毕业设计·课程设计·毕设·音乐播放器
m0_748247801 小时前
Flutter Intl包使用指南:实现国际化和本地化
前端·javascript·flutter
ZJ_.1 小时前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
GIS开发特训营2 小时前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood2 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
joan_852 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
还是大剑师兰特2 小时前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用
Watermelo6173 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
一个处女座的程序猿O(∩_∩)O5 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js