田源
2024-07-05 5700aa436cf4e058cef10560c324e2ee762eebcc
角色管理 表格查询分页 增删改 分配成员 统计 导入角色
已修改7个文件
已添加2个文件
454 ■■■■■ 文件已修改
Source/plt-web/plt-web-ui/src/App.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/api/system/role/api.js 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/api/system/user/api.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/role/index.vue 325 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/role/option.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/user/index.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/views/system/user/option.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/plt-web/plt-web-ui/src/App.vue
@@ -32,7 +32,7 @@
  margin: 50px auto;
}
.avue-dialog .el-dialog{
  top:50%;
  top:47%;
  max-height: calc(100% - 100px);
  -webkit-transform: translate(-50%, 0);
  transform: translate(-50%, -50%);
Source/plt-web/plt-web-ui/src/api/system/role/api.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
import request from '@/router/axios';
// åˆ—表查询
export function gridRoles(page,limit,params) {
  return request({
    url: "/api/roleQueryController/gridRoles",
    method: "get",
    params:{
      page,
      limit,
      ...params
    }
  });
}
//  æ·»åŠ 
export function addRole(row) {
  return request({
    url: "/api/roleQueryController/addRole",
    method: "post",
    data:row
  });
}
//  ä¿®æ”¹
export function updateRole(row) {
  return request({
    url: "/api/roleQueryController/updateRole",
    method: "put",
    data:row
  });
}
// åˆ é™¤
export function deleteRole(params) {
  return request({
    url: "/api/roleQueryController/deleteRole",
    method: "delete",
    params
  });
}
// åˆ†é…ç•Œé¢-角色内成员查询 æˆ–者 ç»Ÿè®¡é¡µé¢æŸ¥è¯¢
export function listUserByRoleOid(params) {
  return request({
    url: "/api/userQueryController/listUserByRoleOid",
    method: "get",
    params
  });
}
// åˆ†é…ç•Œé¢-角色外成员查询
export function listUserUnInRoleOid(params) {
  return request({
    url: "/api/userQueryController/listUserUnInRoleOid",
    method: "get",
    params
  });
}
// åˆ†é…ç•Œé¢-保存
export function saveRight(params) {
  let formData = new FormData;
  for (let key in params){
    formData.append(key,params[key])
  }
  return request({
    url: "/api/roleQueryController/saveRight",
    method: "post",
    data:formData
  });
}
Source/plt-web/plt-web-ui/src/api/system/user/api.js
@@ -63,11 +63,11 @@
}
// ä¿®æ”¹æˆå‘˜
export function updateUser(data) {
export function updateUser(row) {
  return request({
    url: "/api/userQueryController/updateUser",
    method: "put",
    data:data
    data:row
  });
}
Source/plt-web/plt-web-ui/src/components/PLT-basic-component/transfer.vue
@@ -53,10 +53,10 @@
        if (newval) {
          // æ¸…空data数组
          this.data = [];
          newval.forEach((city) => {
          newval.forEach((item) => {
            this.data.push({
              label: city.name,
              key: city.oid,
              label: item.name,
              key: item.oid,
            });
          });
          this.loading = false;
Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue
@@ -111,6 +111,7 @@
      if (resbonse.code === 200) {
        this.$message.success("导入成功!");
        this.visible = false;
        this.$emit('updata');
      } else {
        this.$message.error(resbonse.msg);
      }
Source/plt-web/plt-web-ui/src/views/system/role/index.vue
@@ -1,10 +1,333 @@
<template>
  <basic-container>
    <avue-crud
      ref="roleCrud"
      :data="tableData"
      :option="option"
      :page.sync="page"
      :table-loading="tableLoading"
      @on-load="getTableList"
      @refresh-change="handleRefresh"
      @size-change="sizeChange"
      @current-change="currentChange"
      @selection-change="selectChange"
      @row-click="rowClickHandler"
      @row-save="rowSaveHandler"
      @row-update="rowUpdateHandler"
      @row-del="rowDeleteHandler"
    >
      <template slot="menuLeft" slot-scope="scope">
        <el-button icon="el-icon-delete" plain size="small" type="danger" @click="allDelHandler">删除</el-button>
        <el-button icon="el-icon-school" plain size="small" type="primary" @click="assignMembersHandler">分配成员
        </el-button>
        <el-button icon="el-icon-user" plain size="small" type="primary" @click="statisticsHandler">统计</el-button>
        <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="upLoadRole">导入角色</el-button>
        <el-button icon="el-icon-download" plain size="small" type="primary">导出</el-button>
      </template>
      <template slot="roleClassifyText" slot-scope="{row}">
        <el-tag type="success">{{ row.roleClassifyText }}</el-tag>
      </template>
    </avue-crud>
    <!-- åˆ†é…è§’色穿梭框   -->
    <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData"
              :transferTitle="transferTitle" title="角色添加成员"
              @transferSend="roleSendHandler">
    </transfer>
    <!-- ç»Ÿè®¡å¯¹è¯æ¡†   -->
    <el-dialog
      v-dialogDrag
      v-loading="statisticsLoading"
      :destroy-on-close="true"
      :visible.sync="statisticsVisible"
      append-to-body="true"
      class="avue-dialog"
      title="人员信息"
      width="50%"
    >
      <avue-crud
        :data="countData"
        :option="countOption"
      >
      </avue-crud>
      <div slot="footer" class="dialog-footer" style="display: flex;gap: 20px;justify-content: center">
        <div>
          <el-tag>当前角色总人数: {{this.countData.length}}</el-tag>
        </div>
        <el-button size="small" @click="statisticsVisible = false" icon="el-icon-close" type="danger">关 é—­</el-button>
      </div>
    </el-dialog>
    <!-- å¯¼å…¥è§’色  -->
    <upload-file ref="upload" :fileType="upFileType" :fileUrl="fileUrl" @updata="getTableList" title="导入角色"></upload-file>
  </basic-container>
</template>
<script>
import {
  gridRoles,
  addRole,
  updateRole,
  deleteRole,
  listUserUnInRoleOid,
  listUserByRoleOid,
  saveRight
} from '@/api/system/role/api'
import basicOption from "@/util/basic-option";
import {column} from "@/views/system/role/option";
export default {
name: "index"
  name: "index",
  data() {
    return {
      tableData: [],
      option: {
        ...basicOption,
        dialogTop: 0,
        dialogWidth: '30%',
        calcHeight: -60,
        column: column
      },
      page: {
        currentPage: 1,
        pageSize: 10,
        total: 0,
        pageSizes: [10, 30, 50, 100],
      },
      onLoadParams: {},
      tableLoading: false,
      selectList: [],
      leftRoleData: [],  // åˆ†é…æˆå‘˜ç©¿æ¢­æ¡†å·¦ä¾§åˆå§‹æ•°æ®
      rightRoleData: [], // åˆ†é…æˆå‘˜ç©¿æ¢­æ¡†å³ä¾§åˆå§‹æ•°æ®
      transferTitle: ['角色外成员', '角色内成员'],
      statisticsLoading: false,
      statisticsVisible: false,
      countData: [],
      countOption: {
        ...basicOption,
        selection:false,
        refreshBtn: false,
        addBtn:false,
        menu:false,
        column: [
          {
            label: '部门',
            prop: 'pkDepartmentName',
            sortable: true,
          },
          {
            label: '用户名',
            prop: 'id',
            sortable: true,
          },
          {
            label: '真实姓名',
            prop: 'name',
            sortable: true,
          },
          {
            label: '角色',
            prop: 'pkPersonName',
            sortable: true,
          },
        ]
      },
      upFileType: ['xls', 'xlsx'],
      fileUrl: 'api/roleQueryController/importRole',
    }
  },
  methods: {
    // è¡¨æ ¼åˆå§‹åŒ–请求
    getTableList() {
      this.tableLoading = true;
      gridRoles(this.page.currentPage, this.page.pageSize, this.onLoadParams).then(res => {
        const data = res.data.data;
        this.tableData = data;
        this.page.total = res.data.total;
        this.tableLoading = false;
      })
    },
    // åˆ—头刷新
    handleRefresh() {
      this.getTableList()
    },
    //  æ¡æ•°
    sizeChange(val) {
      this.page.pageSize = val;
    },
    // é¡µç 
    currentChange(val) {
      this.page.currentPage = val;
    },
    // ä¸‹æ‹‰
    selectChange(row) {
      this.selectList = row;
    },
    // è¡Œå•选
    rowClickHandler(row) {
      this.$refs.roleCrud.toggleRowSelection(row);
    },
    // æ·»åŠ 
    rowSaveHandler(row, done) {
      delete row.roleClassifyText;
      addRole(row).then(res => {
        console.log(res)
        if (res.data.code === 200) {
          this.$message.success(res.data.obj);
          this.getTableList();
        }
      })
      done();
    },
    // ç¼–辑
    rowUpdateHandler(row, index, done) {
      delete row.roleClassifyText;
      updateRole(row).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.obj);
          this.getTableList();
        }
      }).catch(err => {
        console.log(err);
      });
      done()
    },
    // åˆ é™¤
    rowDeleteHandler(row) {
      let params = {
        ids: row.oid
      }
      deleteRole(params).then(res => {
        if (res.data.code === 200) {
          this.$message.success(res.data.obj);
          this.getTableList();
        }
      }).catch(err => {
        console.log(err);
      })
    },
    // å¤šé€‰åˆ é™¤
    allDelHandler() {
      let params = {
        ids: this.selectList.map(item => item.oid).join(',')
      }
      if (this.selectList.length <= 0) {
        this.$message.warning('请至少选择一条数据进行删除!')
        return;
      }
      this.$confirm('您确定要删除所选择的角色吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteRole(params).then(res => {
          if (res.data.code === 200) {
            this.$message.success(res.data.obj);
            this.getTableList();
          }
        });
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });
    },
    // åˆ†é…æˆå‘˜
    assignMembersHandler() {
      if (this.selectList.length <= 0) {
        this.$message.warning('请选择角色进行成员分配!');
        return;
      }
      if (this.selectList.length > 1) {
        this.$message.warning('一次只能对一个角色进行分配成员操作!');
        return;
      }
      Promise.all([
        listUserUnInRoleOid({pkRole: this.selectList[0].oid}),
        listUserByRoleOid({pkRole: this.selectList[0].oid})
      ]).then(([unInRoleRes, byRoleRes]) => {
        if (unInRoleRes.data.code === 200 && byRoleRes.data.code === 200) {
          const leftData = [...unInRoleRes.data.data, ...byRoleRes.data.data];
          // ç»„装好穿梭框可用数据
          this.leftRoleData = leftData.map(item => {
            return {
              name: item.name + `(${item.id})`,
              oid: item.oid
            }
          })
          this.rightRoleData = byRoleRes.data.data.map(item => item.oid);
          this.$refs.transfer.visible = true;
        }
      }).catch(err => {
        console.error(err);
      });
    },
    // åˆ†é…æˆå‘˜ç©¿æ¢­æ¡†å›žå¡«
    roleSendHandler(row) {
      let params = {
        userOids: row.join(','),
        roleId: this.selectList[0].oid
      }
      saveRight(params).then(res => {
        this.$message.success(res.data.obj);
        this.getTableList();
      }).catch(err => {
        this.$message.error(err)
      })
    },
    // ç»Ÿè®¡
    statisticsHandler() {
      if (this.selectList.length <= 0) {
        this.$message.warning('请选择角色!');
        return;
      }
      if (this.selectList.length > 1) {
        this.$message.warning('最多只能选择一个角色进行统计!');
        return;
      }
      listUserByRoleOid({pkRole: this.selectList[0].oid}).then(res => {
        console.log(res)
        if (res.data.code === 200) {
          const data = res.data.data;
          this.countData = data.map(item => {
            return {
              pkDepartmentName: item.pkDepartmentName,
              name:item.name,
              id:item.id,
              pkPersonName:this.selectList[0].name
            }
          });
          this.statisticsVisible = true;
        }
      }).catch(err => {
        console.log(err)
      })
    },
    // å¯¼å…¥è§’色
    upLoadRole(){
      this.$refs.upload.visible = true;
    }
  }
}
</script>
Source/plt-web/plt-web-ui/src/views/system/role/option.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
export const column = [
  {
    label: '名称',
    prop: 'name',
    sortable: true,
    row:true,
    span:22,
    icon: 'el-icon-edit-outline',
    rules: [
      {
        required: true,
        message: '请输入姓名',
        trigger: 'blur'
      }
    ]
  },
  {
    label: '角色类型',
    prop: 'roleClassifyText',
    sortable: true,
    display:false
  },
  {
    label: '描述',
    prop: 'description',
    type:'textarea',
    span:22,
    minRows:8,
    row:true,
    sortable: true,
  },
]
Source/plt-web/plt-web-ui/src/views/system/user/index.vue
@@ -62,7 +62,7 @@
        <el-button icon="el-icon-user" plain size="small" type="primary" @click="roleHandler">分配角色</el-button>
        <el-button icon="el-icon-school" plain size="small" type="primary" @click="departmentHandler">分配部门</el-button>
        <el-button icon="el-icon-key" plain size="small" type="success" @click="setPwsHandler">设置密码策略</el-button>
        <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="uploadRole">导入人员</el-button>
        <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="uploadUser">导入人员</el-button>
        <el-button icon="el-icon-download" plain size="small" type="primary" @click="downloadHandler">下载导入模板</el-button>
      </template>
    </avue-crud>
@@ -100,7 +100,7 @@
    </el-dialog>
    <!-- å¯¼å…¥äººå‘˜   -->
    <upload-file ref="upload" :fileType="upFileType" :fileUrl="fileUrl" title="导入人员"></upload-file>
    <upload-file ref="upload" :fileType="upFileType" :fileUrl="fileUrl" title="导入人员" @updata="getTableList"></upload-file>
    <!-- åˆ†é…éƒ¨é—¨å¯¹è¯æ¡†    -->
    <el-dialog
@@ -489,7 +489,7 @@
    },
    // å¯¼å…¥äººå‘˜
    uploadRole() {
    uploadUser() {
      this.$refs.upload.visible = true;
    },
Source/plt-web/plt-web-ui/src/views/system/user/option.js
@@ -1,4 +1,4 @@
export let column = [
export const column = [
  {
    label: '账号',
    prop: 'id',
@@ -61,7 +61,6 @@
    prop: 'status',
    display:false,
    sortable:true,
    slot: true,
  },
  {
    label: '密码策略',
@@ -81,8 +80,6 @@
    align:'center',
    search:true,
    sortable:true,
    searchslot:true,
    formslot:true,
  },
  {
    label: '专业',