bus_user.vue 12.3 KB
<template>
  <div class="sys-container">
    <form ref="form" label-width="80px">
      <el-row :gutter="10">
        <el-col :span="3.5">
          <div class="sys-form-item bg-purple">
            <div class="sys-form-item-text">用户编码:</div>
            <div class="sys-form-item-input">
              <el-input v-model="paramsQuery.queryConfig.UserCode" placeholder="请输入用户编码" />
            </div>
          </div>
        </el-col>
        <el-col :span="3.5">
          <div class="sys-form-item bg-purple">
            <div class="sys-form-item-text">用户名称:</div>
            <div class="sys-form-item-input">
              <el-input v-model="paramsQuery.queryConfig.UserName" placeholder="请输入用户名称" />
            </div>
          </div>
        </el-col>

        <el-col :span="4">
          <div class="sys-form-item bg-purple">
            <el-button icon="el-icon-search" @click="btnAction(1)" type="primary">查询</el-button>
            <el-button icon="el-icon-refresh-right" @click="btnAction(0)">重置</el-button>
          </div>
        </el-col>
      </el-row>
      <div class="sys-pb-5">
        <el-button type="primary" size="small" icon="el-icon-plus" @click="userEditOrAddOpen(null, 'add')">
          新增
        </el-button>
      </div>
    </form>

    <!-- table -->
    <div class="sys-table-border">
      <el-table :data="tableData" ref="multipleTable" highlight-current-row style="width: 100%" height="520">
        <el-table-column label="序号" width="60" type="index"
          :index="(index) => (paramsQuery.PageNumber - 1) * paramsQuery.PerPageCount + index + 1" />
        <el-table-column prop="id" label="id" v-if="false"></el-table-column>
        <el-table-column prop="userCode" label="用户编码"> </el-table-column>
        <el-table-column prop="userName" label="用户名称"> </el-table-column>
        <el-table-column prop="department" label="部门"> </el-table-column>
        <el-table-column prop="address" label="地址"> </el-table-column>
        <el-table-column prop="phone" label="电话"> </el-table-column>
        <el-table-column prop="remark" label="备注"> </el-table-column>

        <el-table-column prop="created" label="创建时间" width="180"> </el-table-column>
        <el-table-column prop="createdBy" label="创建人"> </el-table-column>
        <el-table-column label="操作" width="120">
          <template slot-scope="scope">
            <el-button type="text" @click="userEditOrAddOpen(scope.row, 'edit')">编辑</el-button>
            <el-button style="color: red;" type="text" @click="userDelete(scope.row, 'edit')">删除</el-button>
          </template>
        </el-table-column>
      </el-table>

      <div class="sys-pagination-container">
        <el-pagination @current-change="handleCurrentChange" @size-change="handleSizeChange"
          :current-page="paramsQuery.PageNumber" :page-size="paramsQuery.PerPageCount" :page-sizes="[20, 50, 100]"
          layout="total, sizes, prev, pager, next, jumper" :total="paramsQuery.PageTotal" />
      </div>
    </div>

    <!-- dialog 用户新增和编辑 -->
    <el-dialog :title="userDialog.title" :close-on-click-modal="false" :visible.sync="userDialog.visible" width="60%">
      <el-form :model="userDialog.form" label-width="80px">
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="编码">
              <el-input v-model="userDialog.form.userCode" ref="userCode" maxlength="20" show-word-limit
                autocomplete="off"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="名称">
              <el-input v-model="userDialog.form.userName" ref="userName" maxlength="20" show-word-limit
                autocomplete="off"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <!-- 第二行:密码 + 部门 -->
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="密码">
              <el-input v-model="userDialog.form.password" type="password" maxlength="20" ref="password"
                autocomplete="off"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="部门">
              <el-input v-model="userDialog.form.department" maxlength="20" show-word-limit
                autocomplete="off"></el-input>
            </el-form-item>
          </el-col>
        </el-row>
        <!-- 第三行:电话 + 地址 -->
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="电话">
              <el-input v-model="userDialog.form.phone" maxlength="20" show-word-limit autocomplete="off"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="地址">
              <el-input v-model="userDialog.form.address" maxlength="40" show-word-limit autocomplete="off"></el-input>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="权限">
              <el-select v-model="roleSelectOpt.selectVal" multiple placeholder="请选择权限">
                <el-option v-for="item in roleSelectOpt.data" :key="item.value" :label="item.label" :value="item.value">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="禁用">
              <el-switch v-model="userDialog.form.disable" active-color="#13ce66" inactive-color="#ff4949">
              </el-switch>
            </el-form-item>
          </el-col>
        </el-row>

        <!-- 单列:备注 -->
        <el-row>
          <el-col :span="24">
            <el-form-item label="备注">
              <el-input v-model="userDialog.form.remark" type="textarea" :rows="2" autocomplete="off">
              </el-input>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="userAddOrEditSave">确 定</el-button>
        <el-button @click="userDialog.visible = false">取 消</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import * as userApi from "@/api/systemPermission/userPermission";
export default {
  data() {
    const defaultData = {
      PageNumber: 1,
      PerPageCount: 20,
      queryConfig: {
        UserCode: "",
        UserName: "",
      },
      PageTotal: 0,
    };
    const userData = {
      userCode: "",
      userName: "",
      password: "",
      department: null,
      phone: null,
      remark: null,
      address: "",
      disable: false,

      //权限数据
      Roles: [],

      Created: null,
      CreatedBy: null,
      Updated: null,
      UpdatedBy: null,
      Id: 0
    };
    return {
      tableData: [],
      paramsQuery: { ...defaultData },
      defaultData: JSON.parse(JSON.stringify(defaultData)),

      userDialog: {
        visible: false,
        flag: "add",
        title: "新增",
        form: { ...userData },
        formDefaultData: JSON.parse(JSON.stringify(userData)),
      },
      //临时存储的数据
      roleSelectOpt: {
        data: [],       // 处理后的数据(展示用)
        originData: [], // 原始数据
        selectVal: null,
      }
    };
  },
  methods: {
    /**
     * 查询或者搜索
     */
    btnAction(flag) {
      if (flag == 0) {
        this.paramsQuery = JSON.parse(JSON.stringify(this.defaultData));
      }
      this.getData();
    },

    getData() {
      userApi.getUserData(this.paramsQuery).then(response => {
        this.paramsQuery.PageTotal = response.data.totalCount;
        this.tableData = response.data.data;
      });
    },

    /**
     * 获取用户权限数据
     */
    getUserRoleList() {
      userApi.getUserRole().then(res => {
        if (res.code !== 'Success') return;
        this.roleSelectOpt.data = this.getUserRoleDataHandle(res.data);
        this.roleSelectOpt.originData = res.data;
      })
    },
    /**
     * 用户选项数据转换给组件格式数据
     */
    getUserRoleDataHandle(data) {
      var roleOptions = [];
      data.forEach(element => {
        roleOptions.push({
          value: element.id,
          label: element.roleName
        })
      });
      return roleOptions
    },

    /**
     * 新增或者编辑弹出框
     */
    async userEditOrAddOpen(row, flag) {
      debugger
      if (this.roleSelectOpt.data.length == 0) {
        this.$message.error("权限数据加载中...请稍后在操作,反复出现请联系管理员!");
        return;
      }
      this.roleSelectOpt.selectVal = [];
      this.userDialog.flag = flag;
      if (flag == "add") {
        this.userDialog.form = JSON.parse(JSON.stringify(this.userDialog.formDefaultData));
        this.userDialog.title = "新增"
      } else {
        this.userDialog.title = `编辑,用户名【${row.userName}】`
        var result = await userApi.getUserWithRoles({ UserCode: row.userCode })
        const keys = result.data.roles.map(x => x.id);
        this.roleSelectOpt.selectVal = keys;
        this.userDialog.form = row;
      }
      this.userDialog.visible = true;
    },


    /**
     * 用户新增或者编辑 保存操作
     */
    userAddOrEditSave() {
      debugger
      if (this.userDialog.form.userCode == "" || this.userDialog.form.userCode == null) {
        this.$message.error("用户编码不能为!");
        this.$refs.userCode.focus();
        return;
      }
      if (this.userDialog.form.userName == "" || this.userDialog.form.userName == null) {
        this.$message.error("用户名称不能为!");
        this.$refs.userName.focus();
        return;
      }
      if (this.userDialog.form.password == "" || this.userDialog.form.password == null) {
        this.$message.error("用户密码不能为!");
        this.$refs.password.focus();
        return;
      }
      var roleData = this.getSelectRoleVal();
      if (roleData.length == 0) return;
      this.userDialog.form.Roles = roleData;
      if (this.userDialog.flag == "edit") {
        userApi.editUser(this.userDialog.form).then(res => {
          userApi.ajaxSuccessBefore(res, (res) => {
            this.userDialog.visible = false;
            this.getData();
          }, this)
        });
        return
      }
      userApi.addUser(this.userDialog.form).then(res => {
        userApi.ajaxSuccessBefore(res, (res) => {
          this.userDialog.visible = false;
          this.getData();
        }, this)
      });
    },

    //用户删除
    userDelete(row) {
      var title = `此操作将永久删除该数据,用户名【${row.userName}】,是否继续?`;
      this.$confirm(title, '提示', { type: 'warning', })
        .then(() => {
          userApi.deleteUser(row).then(res => {
            userApi.ajaxSuccessBefore(res, (res) => {
              this.userDialog.visible = false;
              this.getData();
            }, this)
          });
        }).catch()
    },

    setCurrent(row) {
      this.$refs.multipleTable.setCurrentRow(row);
    },

    //获取选中的权限,处理好符合后台提交数据格式
    getSelectRoleVal() {
      if (this.roleSelectOpt.selectVal.length == 0) {
        this.$message.error("请选择权限数据!");
        return [];
      }
      var result = [];
      this.roleSelectOpt.selectVal.forEach(x => {
        var tempVal = this.roleSelectOpt.originData.find(y => y.id == x);
        result.push(tempVal)
      });
      return result;
    },
    //下一页
    handleCurrentChange(page) {
      debugger
      this.paramsQuery.PageNumber = page;
      this.getData();
    },
    handleSizeChange(val) {
      this.paramsQuery.PerPageCount = val;
      this.paramsQuery.PageNumber = 1;
      this.getData();
    },
  },
  mounted() {
    this.getUserRoleList();
    this.getData();
  },
};
</script>
<style scoped lang="scss">
.sys-container {
  width: 100%;
}

.sys-pb-5 {
  padding-bottom: 5px !important;
}

.sys-form-item {
  display: flex;
  border-radius: 4px;
  min-height: 46px;
  margin-bottom: 10px;
  align-items: center;
}

.sys-table-border {
  border: 1px solid #e5e9f2;
}


.sys-pagination-container {
  text-align: center;
}

.current-row {
  background-color: #ecf5ff;
}
</style>