RuoYi-Vue 1.0
This commit is contained in:
		
							
								
								
									
										515
									
								
								ruoyi-ui/src/views/system/user/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										515
									
								
								ruoyi-ui/src/views/system/user/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,515 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="app-container">
 | 
			
		||||
    <el-row :gutter="20">
 | 
			
		||||
      <!--部门数据-->
 | 
			
		||||
      <el-col :span="4" :xs="24">
 | 
			
		||||
        <div class="head-container">
 | 
			
		||||
          <el-input
 | 
			
		||||
            v-model="deptName"
 | 
			
		||||
            placeholder="请输入部门名称"
 | 
			
		||||
            clearable
 | 
			
		||||
            size="small"
 | 
			
		||||
            prefix-icon="el-icon-search"
 | 
			
		||||
            style="margin-bottom: 20px"
 | 
			
		||||
          />
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="head-container">
 | 
			
		||||
          <el-tree
 | 
			
		||||
            :data="deptOptions"
 | 
			
		||||
            :props="defaultProps"
 | 
			
		||||
            :expand-on-click-node="false"
 | 
			
		||||
            :filter-node-method="filterNode"
 | 
			
		||||
            ref="tree"
 | 
			
		||||
            default-expand-all
 | 
			
		||||
            @node-click="handleNodeClick"
 | 
			
		||||
          />
 | 
			
		||||
        </div>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <!--用户数据-->
 | 
			
		||||
      <el-col :span="20" :xs="24">
 | 
			
		||||
        <el-form :inline="true" label-width="68px">
 | 
			
		||||
          <el-form-item label="用户名称">
 | 
			
		||||
            <el-input
 | 
			
		||||
              v-model="queryParams.userName"
 | 
			
		||||
              placeholder="请输入用户名称"
 | 
			
		||||
              clearable
 | 
			
		||||
              size="small"
 | 
			
		||||
              style="width: 240px"
 | 
			
		||||
              @keyup.enter.native="handleQuery"
 | 
			
		||||
            />
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
          <el-form-item label="手机号码">
 | 
			
		||||
            <el-input
 | 
			
		||||
              v-model="queryParams.phonenumber"
 | 
			
		||||
              placeholder="请输入手机号码"
 | 
			
		||||
              clearable
 | 
			
		||||
              size="small"
 | 
			
		||||
              style="width: 240px"
 | 
			
		||||
              @keyup.enter.native="handleQuery"
 | 
			
		||||
            />
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
          <el-form-item label="状态">
 | 
			
		||||
            <el-select
 | 
			
		||||
              v-model="queryParams.status"
 | 
			
		||||
              placeholder="用户状态"
 | 
			
		||||
              clearable
 | 
			
		||||
              size="small"
 | 
			
		||||
              style="width: 240px"
 | 
			
		||||
            >
 | 
			
		||||
              <el-option
 | 
			
		||||
                v-for="dict in statusOptions"
 | 
			
		||||
                :key="dict.dictValue"
 | 
			
		||||
                :label="dict.dictLabel"
 | 
			
		||||
                :value="dict.dictValue"
 | 
			
		||||
              />
 | 
			
		||||
            </el-select>
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
          <el-form-item label="创建时间">
 | 
			
		||||
            <el-date-picker
 | 
			
		||||
              v-model="dateRange"
 | 
			
		||||
              size="small"
 | 
			
		||||
              style="width: 240px"
 | 
			
		||||
              value-format="yyyy-MM-dd"
 | 
			
		||||
              type="daterange"
 | 
			
		||||
              range-separator="-"
 | 
			
		||||
              start-placeholder="开始日期"
 | 
			
		||||
              end-placeholder="结束日期"
 | 
			
		||||
            ></el-date-picker>
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
          <el-form-item>
 | 
			
		||||
            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
 | 
			
		||||
            <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:user:add']">新增</el-button>
 | 
			
		||||
          </el-form-item>
 | 
			
		||||
        </el-form>
 | 
			
		||||
 | 
			
		||||
        <el-table v-loading="loading" :data="userList">
 | 
			
		||||
          <el-table-column label="用户编号" align="center" prop="userId" />
 | 
			
		||||
          <el-table-column label="用户名称" align="center" prop="userName" />
 | 
			
		||||
          <el-table-column label="用户昵称" align="center" prop="nickName" />
 | 
			
		||||
          <el-table-column label="部门" align="center" prop="dept.deptName" />
 | 
			
		||||
          <el-table-column label="手机号码" align="center" prop="phonenumber" width="120" />
 | 
			
		||||
          <el-table-column label="状态" align="center">
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <el-switch
 | 
			
		||||
                v-model="scope.row.status"
 | 
			
		||||
                active-value="0"
 | 
			
		||||
                inactive-value="1"
 | 
			
		||||
                @change="handleStatusChange(scope.row)"
 | 
			
		||||
              ></el-switch>
 | 
			
		||||
            </template>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
          <el-table-column label="创建时间" align="center" prop="createTime" width="160">
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <span>{{ dateFormat(scope.row.createTime) }}</span>
 | 
			
		||||
            </template>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
          <el-table-column
 | 
			
		||||
            label="操作"
 | 
			
		||||
            align="center"
 | 
			
		||||
            width="180"
 | 
			
		||||
            class-name="small-padding fixed-width"
 | 
			
		||||
          >
 | 
			
		||||
            <template slot-scope="scope">
 | 
			
		||||
              <el-button
 | 
			
		||||
                size="mini"
 | 
			
		||||
                type="text"
 | 
			
		||||
                icon="el-icon-edit"
 | 
			
		||||
                @click="handleUpdate(scope.row)"
 | 
			
		||||
                v-hasPermi="['system:user:edit']"
 | 
			
		||||
              >修改</el-button>
 | 
			
		||||
              <el-button
 | 
			
		||||
                v-if="scope.row.userId !== 1"
 | 
			
		||||
                size="mini"
 | 
			
		||||
                type="text"
 | 
			
		||||
                icon="el-icon-delete"
 | 
			
		||||
                @click="handleDelete(scope.row)"
 | 
			
		||||
                v-hasPermi="['system:user:remove']"
 | 
			
		||||
              >删除</el-button>
 | 
			
		||||
              <el-button
 | 
			
		||||
                size="mini"
 | 
			
		||||
                type="text"
 | 
			
		||||
                icon="el-icon-key"
 | 
			
		||||
                @click="handleResetPwd(scope.row)"
 | 
			
		||||
                v-hasPermi="['system:user:resetPwd']"
 | 
			
		||||
              >重置</el-button>
 | 
			
		||||
            </template>
 | 
			
		||||
          </el-table-column>
 | 
			
		||||
        </el-table>
 | 
			
		||||
 | 
			
		||||
        <pagination
 | 
			
		||||
          v-show="total>0"
 | 
			
		||||
          :total="total"
 | 
			
		||||
          :page.sync="queryParams.pageNum"
 | 
			
		||||
          :limit.sync="queryParams.pageSize"
 | 
			
		||||
          @pagination="getList"
 | 
			
		||||
        />
 | 
			
		||||
      </el-col>
 | 
			
		||||
    </el-row>
 | 
			
		||||
 | 
			
		||||
    <!-- 添加或修改参数配置对话框 -->
 | 
			
		||||
    <el-dialog :title="title" :visible.sync="open" width="600px">
 | 
			
		||||
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
 | 
			
		||||
        <el-row>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="用户昵称" prop="nickName">
 | 
			
		||||
              <el-input v-model="form.nickName" placeholder="请输入用户昵称" />
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="归属部门" prop="deptId">
 | 
			
		||||
              <treeselect v-model="form.deptId" :options="deptOptions" placeholder="请选择归属部门" />
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="手机号码" prop="phonenumber">
 | 
			
		||||
              <el-input v-model="form.phonenumber" placeholder="请输入手机号码" maxlength="11" />
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="邮箱" prop="email">
 | 
			
		||||
              <el-input v-model="form.email" placeholder="请输入邮箱" maxlength="50" />
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="用户名称" prop="userName">
 | 
			
		||||
              <el-input v-model="form.userName" placeholder="请输入用户名称" />
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item v-if="form.userId == undefined" label="用户密码" prop="password">
 | 
			
		||||
              <el-input v-model="form.password" placeholder="请输入用户密码" type="password" />
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="用户性别">
 | 
			
		||||
              <el-select v-model="form.sex" placeholder="请选择">
 | 
			
		||||
                <el-option
 | 
			
		||||
                  v-for="dict in sexOptions"
 | 
			
		||||
                  :key="dict.dictValue"
 | 
			
		||||
                  :label="dict.dictLabel"
 | 
			
		||||
                  :value="dict.dictValue"
 | 
			
		||||
                ></el-option>
 | 
			
		||||
              </el-select>
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="状态">
 | 
			
		||||
              <el-radio-group v-model="form.status">
 | 
			
		||||
                <el-radio
 | 
			
		||||
                  v-for="dict in statusOptions"
 | 
			
		||||
                  :key="dict.dictValue"
 | 
			
		||||
                  :label="dict.dictValue"
 | 
			
		||||
                >{{dict.dictLabel}}</el-radio>
 | 
			
		||||
              </el-radio-group>
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="岗位">
 | 
			
		||||
              <el-select v-model="form.postIds" multiple placeholder="请选择">
 | 
			
		||||
                <el-option
 | 
			
		||||
                  v-for="item in postOptions"
 | 
			
		||||
                  :key="item.postId"
 | 
			
		||||
                  :label="item.postName"
 | 
			
		||||
                  :value="item.postId"
 | 
			
		||||
                  :disabled="item.status == 1"
 | 
			
		||||
                ></el-option>
 | 
			
		||||
              </el-select>
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="12">
 | 
			
		||||
            <el-form-item label="角色">
 | 
			
		||||
              <el-select v-model="form.roleIds" multiple placeholder="请选择">
 | 
			
		||||
                <el-option
 | 
			
		||||
                  v-for="item in roleOptions"
 | 
			
		||||
                  :key="item.roleId"
 | 
			
		||||
                  :label="item.roleName"
 | 
			
		||||
                  :value="item.roleId"
 | 
			
		||||
                  :disabled="item.status == 1"
 | 
			
		||||
                ></el-option>
 | 
			
		||||
              </el-select>
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
          <el-col :span="24">
 | 
			
		||||
            <el-form-item label="备注">
 | 
			
		||||
              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
 | 
			
		||||
            </el-form-item>
 | 
			
		||||
          </el-col>
 | 
			
		||||
        </el-row>
 | 
			
		||||
      </el-form>
 | 
			
		||||
      <div slot="footer" class="dialog-footer">
 | 
			
		||||
        <el-button type="primary" @click="submitForm">确 定</el-button>
 | 
			
		||||
        <el-button @click="cancel">取 消</el-button>
 | 
			
		||||
      </div>
 | 
			
		||||
    </el-dialog>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus } from "@/api/system/user";
 | 
			
		||||
import { treeselect } from "@/api/system/dept";
 | 
			
		||||
import { listPost } from "@/api/system/post";
 | 
			
		||||
import { listRole } from "@/api/system/role";
 | 
			
		||||
import Treeselect from "@riophae/vue-treeselect";
 | 
			
		||||
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  components: { Treeselect },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      // 遮罩层
 | 
			
		||||
      loading: true,
 | 
			
		||||
      // 总条数
 | 
			
		||||
      total: 0,
 | 
			
		||||
      // 用户表格数据
 | 
			
		||||
      userList: null,
 | 
			
		||||
      // 弹出层标题
 | 
			
		||||
      title: "",
 | 
			
		||||
      // 部门树选项
 | 
			
		||||
      deptOptions: undefined,
 | 
			
		||||
      // 是否显示弹出层
 | 
			
		||||
      open: false,
 | 
			
		||||
      // 部门名称
 | 
			
		||||
      deptName: undefined,
 | 
			
		||||
      // 默认密码
 | 
			
		||||
      initPassword: undefined,
 | 
			
		||||
      // 日期范围
 | 
			
		||||
      dateRange: [],
 | 
			
		||||
      // 状态数据字典
 | 
			
		||||
      statusOptions: [],
 | 
			
		||||
      // 性别状态字典
 | 
			
		||||
      sexOptions: [],
 | 
			
		||||
      // 岗位选项
 | 
			
		||||
      postOptions: [],
 | 
			
		||||
      // 角色选项
 | 
			
		||||
      roleOptions: [],
 | 
			
		||||
      // 表单参数
 | 
			
		||||
      form: {},
 | 
			
		||||
      defaultProps: {
 | 
			
		||||
        children: "children",
 | 
			
		||||
        label: "label"
 | 
			
		||||
      },
 | 
			
		||||
      // 查询参数
 | 
			
		||||
      queryParams: {
 | 
			
		||||
        pageNum: 1,
 | 
			
		||||
        pageSize: 10,
 | 
			
		||||
        userName: undefined,
 | 
			
		||||
        phonenumber: undefined,
 | 
			
		||||
        status: undefined,
 | 
			
		||||
        deptId: undefined
 | 
			
		||||
      },
 | 
			
		||||
      // 表单校验
 | 
			
		||||
      rules: {
 | 
			
		||||
        userName: [
 | 
			
		||||
          { required: true, message: "用户名称不能为空", trigger: "blur" }
 | 
			
		||||
        ],
 | 
			
		||||
        nickName: [
 | 
			
		||||
          { required: true, message: "用户昵称不能为空", trigger: "blur" }
 | 
			
		||||
        ],
 | 
			
		||||
        deptId: [
 | 
			
		||||
          { required: true, message: "归属部门不能为空", trigger: "blur" }
 | 
			
		||||
        ],
 | 
			
		||||
        password: [
 | 
			
		||||
          { required: true, message: "用户密码不能为空", trigger: "blur" }
 | 
			
		||||
        ],
 | 
			
		||||
        email: [
 | 
			
		||||
          {
 | 
			
		||||
            type: "email",
 | 
			
		||||
            message: "'请输入正确的邮箱地址",
 | 
			
		||||
            trigger: ["blur", "change"]
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        phonenumber: [
 | 
			
		||||
          {
 | 
			
		||||
            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
 | 
			
		||||
            message: "请输入正确的手机号码",
 | 
			
		||||
            trigger: "blur"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    // 根据名称筛选部门树
 | 
			
		||||
    deptName(val) {
 | 
			
		||||
      this.$refs.tree.filter(val);
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  created() {
 | 
			
		||||
    this.getList();
 | 
			
		||||
    this.getTreeselect();
 | 
			
		||||
    this.getDicts("sys_normal_disable").then(response => {
 | 
			
		||||
      this.statusOptions = response.data;
 | 
			
		||||
    });
 | 
			
		||||
    this.getDicts("sys_user_sex").then(response => {
 | 
			
		||||
      this.sexOptions = response.data;
 | 
			
		||||
    });
 | 
			
		||||
    this.getConfigKey("sys.user.initPassword").then(response => {
 | 
			
		||||
      this.initPassword = response.data;
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    /** 查询用户列表 */
 | 
			
		||||
    getList() {
 | 
			
		||||
      this.loading = true;
 | 
			
		||||
      listUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
 | 
			
		||||
          this.userList = response.rows;
 | 
			
		||||
          this.total = response.total;
 | 
			
		||||
          this.loading = false;
 | 
			
		||||
        }
 | 
			
		||||
      );
 | 
			
		||||
    },
 | 
			
		||||
    /** 查询部门下拉树结构 */
 | 
			
		||||
    getTreeselect() {
 | 
			
		||||
      treeselect().then(response => {
 | 
			
		||||
        this.deptOptions = response.data;
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    // 筛选节点
 | 
			
		||||
    filterNode(value, data) {
 | 
			
		||||
      if (!value) return true;
 | 
			
		||||
      return data.label.indexOf(value) !== -1;
 | 
			
		||||
    },
 | 
			
		||||
    // 节点单击事件
 | 
			
		||||
    handleNodeClick(data) {
 | 
			
		||||
      this.queryParams.deptId = data.id;
 | 
			
		||||
      this.getList();
 | 
			
		||||
    },
 | 
			
		||||
    /** 查询岗位列表 */
 | 
			
		||||
    getPosts() {
 | 
			
		||||
      listPost().then(response => {
 | 
			
		||||
        this.postOptions = response.rows;
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    /** 查询角色列表 */
 | 
			
		||||
    getRoles() {
 | 
			
		||||
      listRole().then(response => {
 | 
			
		||||
        this.roleOptions = response.rows;
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    // 用户状态修改
 | 
			
		||||
    handleStatusChange(row) {
 | 
			
		||||
      let text = row.status === "0" ? "启用" : "停用";
 | 
			
		||||
      this.$confirm('确认要"' + text + '""' + row.userName + '"用户吗?', "警告", {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
          return changeUserStatus(row.userId, row.status);
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.msgSuccess(text + "成功");
 | 
			
		||||
        }).catch(function() {
 | 
			
		||||
          row.status = row.status === "0" ? "1" : "0";
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
    // 取消按钮
 | 
			
		||||
    cancel() {
 | 
			
		||||
      this.open = false;
 | 
			
		||||
      this.reset();
 | 
			
		||||
    },
 | 
			
		||||
    // 表单重置
 | 
			
		||||
    reset() {
 | 
			
		||||
      this.form = {
 | 
			
		||||
        userId: undefined,
 | 
			
		||||
        deptId: 100,
 | 
			
		||||
        userName: undefined,
 | 
			
		||||
        nickName: undefined,
 | 
			
		||||
        phonenumber: undefined,
 | 
			
		||||
        email: undefined,
 | 
			
		||||
        sex: undefined,
 | 
			
		||||
        status: "0",
 | 
			
		||||
        remark: undefined,
 | 
			
		||||
        postIds: [],
 | 
			
		||||
        roleIds: []
 | 
			
		||||
      };
 | 
			
		||||
      this.resetForm("form");
 | 
			
		||||
    },
 | 
			
		||||
    /** 搜索按钮操作 */
 | 
			
		||||
    handleQuery() {
 | 
			
		||||
      this.queryParams.page = 1;
 | 
			
		||||
      this.getList();
 | 
			
		||||
    },
 | 
			
		||||
    /** 新增按钮操作 */
 | 
			
		||||
    handleAdd() {
 | 
			
		||||
      this.reset();
 | 
			
		||||
      this.getTreeselect();
 | 
			
		||||
      this.getPosts();
 | 
			
		||||
      this.getRoles();
 | 
			
		||||
      this.open = true;
 | 
			
		||||
      this.title = "添加用户";
 | 
			
		||||
      this.form.password = this.initPassword;
 | 
			
		||||
    },
 | 
			
		||||
    /** 修改按钮操作 */
 | 
			
		||||
    handleUpdate(row) {
 | 
			
		||||
      this.reset();
 | 
			
		||||
      this.getTreeselect();
 | 
			
		||||
      this.getPosts();
 | 
			
		||||
      this.getRoles();
 | 
			
		||||
      getUser(row.userId).then(response => {
 | 
			
		||||
        this.form = response.data;
 | 
			
		||||
        this.form.postIds = response.postIds;
 | 
			
		||||
        this.form.roleIds = response.roleIds;
 | 
			
		||||
        this.open = true;
 | 
			
		||||
        this.title = "修改用户";
 | 
			
		||||
        this.form.password = "";
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    /** 重置密码按钮操作 */
 | 
			
		||||
    handleResetPwd(row) {
 | 
			
		||||
      this.$prompt('请输入"' + row.userName + '"的新密码', "提示", {
 | 
			
		||||
        confirmButtonText: "确定",
 | 
			
		||||
        cancelButtonText: "取消"
 | 
			
		||||
      }).then(({ value }) => {
 | 
			
		||||
          resetUserPwd(row.userId, value).then(response => {
 | 
			
		||||
            if (response.code === 200) {
 | 
			
		||||
              this.msgSuccess("修改成功,新密码是:" + value);
 | 
			
		||||
            } else {
 | 
			
		||||
              this.msgError(response.msg);
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
        }).catch(() => {});
 | 
			
		||||
    },
 | 
			
		||||
    /** 提交按钮 */
 | 
			
		||||
    submitForm: function() {
 | 
			
		||||
      this.$refs["form"].validate(valid => {
 | 
			
		||||
        if (valid) {
 | 
			
		||||
          if (this.form.userId != undefined) {
 | 
			
		||||
            updateUser(this.form).then(response => {
 | 
			
		||||
              if (response.code === 200) {
 | 
			
		||||
                this.msgSuccess("修改成功");
 | 
			
		||||
                this.open = false;
 | 
			
		||||
                this.getList();
 | 
			
		||||
              } else {
 | 
			
		||||
                this.msgError(response.msg);
 | 
			
		||||
              }
 | 
			
		||||
            });
 | 
			
		||||
          } else {
 | 
			
		||||
            addUser(this.form).then(response => {
 | 
			
		||||
              if (response.code === 200) {
 | 
			
		||||
                this.msgSuccess("新增成功");
 | 
			
		||||
                this.open = false;
 | 
			
		||||
                this.getList();
 | 
			
		||||
              } else {
 | 
			
		||||
                this.msgError(response.msg);
 | 
			
		||||
              }
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    /** 删除按钮操作 */
 | 
			
		||||
    handleDelete(row) {
 | 
			
		||||
      this.$confirm('是否确认删除名称为"' + row.userName + '"的数据项?', "警告", {
 | 
			
		||||
          confirmButtonText: "确定",
 | 
			
		||||
          cancelButtonText: "取消",
 | 
			
		||||
          type: "warning"
 | 
			
		||||
        }).then(function() {
 | 
			
		||||
          return delUser(row.userId);
 | 
			
		||||
        }).then(() => {
 | 
			
		||||
          this.getList();
 | 
			
		||||
          this.msgSuccess("删除成功");
 | 
			
		||||
        }).catch(function() {});
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										101
									
								
								ruoyi-ui/src/views/system/user/profile/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								ruoyi-ui/src/views/system/user/profile/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="app-container">
 | 
			
		||||
    <el-row :gutter="20">
 | 
			
		||||
      <el-col :span="6" :xs="24">
 | 
			
		||||
        <el-card class="box-card">
 | 
			
		||||
          <div slot="header" class="clearfix">
 | 
			
		||||
            <span>个人信息</span>
 | 
			
		||||
          </div>
 | 
			
		||||
          <div>
 | 
			
		||||
            <div class="text-center">
 | 
			
		||||
              <userAvatar :user="user" />
 | 
			
		||||
            </div>
 | 
			
		||||
            <ul class="list-group list-group-striped">
 | 
			
		||||
              <li class="list-group-item">
 | 
			
		||||
                <svg-icon icon-class="user" />用户名称
 | 
			
		||||
                <div class="pull-right">{{ user.userName }}</div>
 | 
			
		||||
              </li>
 | 
			
		||||
              <li class="list-group-item">
 | 
			
		||||
                <svg-icon icon-class="phone" />手机号码
 | 
			
		||||
                <div class="pull-right">{{ user.phonenumber }}</div>
 | 
			
		||||
              </li>
 | 
			
		||||
              <li class="list-group-item">
 | 
			
		||||
                <svg-icon icon-class="email" />用户邮箱
 | 
			
		||||
                <div class="pull-right">{{ user.email }}</div>
 | 
			
		||||
              </li>
 | 
			
		||||
              <li class="list-group-item">
 | 
			
		||||
                <svg-icon icon-class="tree" />所属部门
 | 
			
		||||
                <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
 | 
			
		||||
              </li>
 | 
			
		||||
              <li class="list-group-item">
 | 
			
		||||
                <svg-icon icon-class="peoples" />所属角色
 | 
			
		||||
                <div class="pull-right">{{ roleGroup }}</div>
 | 
			
		||||
              </li>
 | 
			
		||||
              <li class="list-group-item">
 | 
			
		||||
                <svg-icon icon-class="date" />创建日期
 | 
			
		||||
                <div class="pull-right">2018-08-23 09:11:56</div>
 | 
			
		||||
              </li>
 | 
			
		||||
            </ul>
 | 
			
		||||
          </div>
 | 
			
		||||
        </el-card>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <el-col :span="18" :xs="24">
 | 
			
		||||
        <el-card>
 | 
			
		||||
          <div slot="header" class="clearfix">
 | 
			
		||||
            <span>基本资料</span>
 | 
			
		||||
          </div>
 | 
			
		||||
          <el-tabs v-model="activeTab">
 | 
			
		||||
            <el-tab-pane label="基本资料" name="userinfo">
 | 
			
		||||
              <userInfo :user="user" />
 | 
			
		||||
            </el-tab-pane>
 | 
			
		||||
            <el-tab-pane label="修改密码" name="resetPwd">
 | 
			
		||||
              <resetPwd :user="user" />
 | 
			
		||||
            </el-tab-pane>
 | 
			
		||||
          </el-tabs>
 | 
			
		||||
        </el-card>
 | 
			
		||||
      </el-col>
 | 
			
		||||
    </el-row>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import userAvatar from "./userAvatar";
 | 
			
		||||
import userInfo from "./userInfo";
 | 
			
		||||
import resetPwd from "./resetPwd";
 | 
			
		||||
import { getUserProfile } from "@/api/system/user";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "Profile",
 | 
			
		||||
  components: { userAvatar, userInfo, resetPwd },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      user: {},
 | 
			
		||||
      roleGroup: {},
 | 
			
		||||
      postGroup: {},
 | 
			
		||||
      activeTab: "userinfo"
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  created() {
 | 
			
		||||
    this.getUser();
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    getUser() {
 | 
			
		||||
      getUserProfile().then(response => {
 | 
			
		||||
        this.user = response.data;
 | 
			
		||||
        this.roleGroup = response.roleGroup;
 | 
			
		||||
        this.postGroup = response.postGroup;
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style rel="stylesheet/scss" lang="scss">
 | 
			
		||||
.avatar-uploader-icon {
 | 
			
		||||
  font-size: 28px;
 | 
			
		||||
  width: 120px;
 | 
			
		||||
  height: 120px;
 | 
			
		||||
  line-height: 120px;
 | 
			
		||||
  text-align: center;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										76
									
								
								ruoyi-ui/src/views/system/user/profile/resetPwd.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								ruoyi-ui/src/views/system/user/profile/resetPwd.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <el-form ref="form" :model="user" :rules="rules" label-width="80px">
 | 
			
		||||
    <el-form-item label="旧密码" prop="oldPassword">
 | 
			
		||||
      <el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" />
 | 
			
		||||
    </el-form-item>
 | 
			
		||||
    <el-form-item label="新密码" prop="newPassword">
 | 
			
		||||
      <el-input v-model="user.newPassword" placeholder="请输入新密码" type="password" />
 | 
			
		||||
    </el-form-item>
 | 
			
		||||
    <el-form-item label="确认密码" prop="confirmPassword">
 | 
			
		||||
      <el-input v-model="user.confirmPassword" placeholder="请确认密码" type="password" />
 | 
			
		||||
    </el-form-item>
 | 
			
		||||
    <el-form-item>
 | 
			
		||||
      <el-button type="primary" size="mini" @click="submit">保存</el-button>
 | 
			
		||||
      <el-button type="danger" size="mini" @click="close">关闭</el-button>
 | 
			
		||||
    </el-form-item>
 | 
			
		||||
  </el-form>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { updateUserPwd } from "@/api/system/user";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  data() {
 | 
			
		||||
    const equalToPassword = (rule, value, callback) => {
 | 
			
		||||
      if (this.user.newPassword !== value) {
 | 
			
		||||
        callback(new Error("两次输入的密码不一致"));
 | 
			
		||||
      } else {
 | 
			
		||||
        callback();
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    return {
 | 
			
		||||
      test: "1test",
 | 
			
		||||
      user: {
 | 
			
		||||
        oldPassword: undefined,
 | 
			
		||||
        newPassword: undefined,
 | 
			
		||||
        confirmPassword: undefined
 | 
			
		||||
      },
 | 
			
		||||
      // 表单校验
 | 
			
		||||
      rules: {
 | 
			
		||||
        oldPassword: [
 | 
			
		||||
          { required: true, message: "旧密码不能为空", trigger: "blur" }
 | 
			
		||||
        ],
 | 
			
		||||
        newPassword: [
 | 
			
		||||
          { required: true, message: "新密码不能为空", trigger: "blur" },
 | 
			
		||||
          { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
 | 
			
		||||
        ],
 | 
			
		||||
        confirmPassword: [
 | 
			
		||||
          { required: true, message: "确认密码不能为空", trigger: "blur" },
 | 
			
		||||
          { required: true, validator: equalToPassword, trigger: "blur" }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    submit() {
 | 
			
		||||
      this.$refs["form"].validate(valid => {
 | 
			
		||||
        if (valid) {
 | 
			
		||||
          updateUserPwd(this.user.oldPassword, this.user.newPassword).then(
 | 
			
		||||
            response => {
 | 
			
		||||
              if (response.code === 200) {
 | 
			
		||||
                this.msgSuccess("修改成功");
 | 
			
		||||
              } else {
 | 
			
		||||
                this.msgError(response.msg);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          );
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    close() {
 | 
			
		||||
      this.$store.dispatch("tagsView/delView", this.$route);
 | 
			
		||||
      this.$router.push({ path: "/index" });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										135
									
								
								ruoyi-ui/src/views/system/user/profile/userAvatar.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								ruoyi-ui/src/views/system/user/profile/userAvatar.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,135 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div>
 | 
			
		||||
    <img v-bind:src="options.img" @click="editCropper()" title="点击上传头像" class="img-circle img-lg" />
 | 
			
		||||
    <el-dialog :title="title" :visible.sync="open" width="800px">
 | 
			
		||||
      <el-row>
 | 
			
		||||
        <el-col :xs="24" :md="12" :style="{height: '350px'}">
 | 
			
		||||
          <vue-cropper
 | 
			
		||||
            ref="cropper"
 | 
			
		||||
            :img="options.img"
 | 
			
		||||
            :info="true"
 | 
			
		||||
            :autoCrop="options.autoCrop"
 | 
			
		||||
            :autoCropWidth="options.autoCropWidth"
 | 
			
		||||
            :autoCropHeight="options.autoCropHeight"
 | 
			
		||||
            :fixedBox="options.fixedBox"
 | 
			
		||||
            @realTime="realTime"
 | 
			
		||||
          />
 | 
			
		||||
        </el-col>
 | 
			
		||||
        <el-col :xs="24" :md="12" :style="{height: '350px'}">
 | 
			
		||||
          <div class="avatar-upload-preview">
 | 
			
		||||
            <img :src="previews.url" :style="previews.img" />
 | 
			
		||||
          </div>
 | 
			
		||||
        </el-col>
 | 
			
		||||
      </el-row>
 | 
			
		||||
      <br />
 | 
			
		||||
      <el-row>
 | 
			
		||||
        <el-col :lg="2" :md="2">
 | 
			
		||||
          <el-upload :show-file-list="false" :before-upload="beforeUpload">
 | 
			
		||||
            <el-button size="small">
 | 
			
		||||
              上传
 | 
			
		||||
              <i class="el-icon-upload el-icon--right"></i>
 | 
			
		||||
            </el-button>
 | 
			
		||||
          </el-upload>
 | 
			
		||||
        </el-col>
 | 
			
		||||
        <el-col :lg="{span: 1, offset: 2}" :md="2">
 | 
			
		||||
          <el-button icon="el-icon-plus" size="small" @click="changeScale(1)"></el-button>
 | 
			
		||||
        </el-col>
 | 
			
		||||
        <el-col :lg="{span: 1, offset: 1}" :md="2">
 | 
			
		||||
          <el-button icon="el-icon-minus" size="small" @click="changeScale(-1)"></el-button>
 | 
			
		||||
        </el-col>
 | 
			
		||||
        <el-col :lg="{span: 1, offset: 1}" :md="2">
 | 
			
		||||
          <el-button icon="el-icon-refresh-left" size="small" @click="rotateLeft()"></el-button>
 | 
			
		||||
        </el-col>
 | 
			
		||||
        <el-col :lg="{span: 1, offset: 1}" :md="2">
 | 
			
		||||
          <el-button icon="el-icon-refresh-right" size="small" @click="rotateRight()"></el-button>
 | 
			
		||||
        </el-col>
 | 
			
		||||
        <el-col :lg="{span: 2, offset: 6}" :md="2">
 | 
			
		||||
          <el-button type="primary" size="small" @click="uploadImg()">上 传</el-button>
 | 
			
		||||
        </el-col>
 | 
			
		||||
      </el-row>
 | 
			
		||||
    </el-dialog>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import store from "@/store";
 | 
			
		||||
import { VueCropper } from "vue-cropper";
 | 
			
		||||
import { uploadAvatar } from "@/api/system/user";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  components: { VueCropper },
 | 
			
		||||
  props: {
 | 
			
		||||
    user: {
 | 
			
		||||
      type: Object
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      // 是否显示弹出层
 | 
			
		||||
      open: false,
 | 
			
		||||
      // 弹出层标题
 | 
			
		||||
      title: "修改头像",
 | 
			
		||||
      options: {
 | 
			
		||||
        img: store.getters.avatar, //裁剪图片的地址
 | 
			
		||||
        autoCrop: true, // 是否默认生成截图框
 | 
			
		||||
        autoCropWidth: 200, // 默认生成截图框宽度
 | 
			
		||||
        autoCropHeight: 200, // 默认生成截图框高度
 | 
			
		||||
        fixedBox: true // 固定截图框大小 不允许改变
 | 
			
		||||
      },
 | 
			
		||||
      previews: {}
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    // 编辑头像
 | 
			
		||||
    editCropper() {
 | 
			
		||||
      this.open = true;
 | 
			
		||||
    },
 | 
			
		||||
    // 向左旋转
 | 
			
		||||
    rotateLeft() {
 | 
			
		||||
      this.$refs.cropper.rotateLeft();
 | 
			
		||||
    },
 | 
			
		||||
    // 向右旋转
 | 
			
		||||
    rotateRight() {
 | 
			
		||||
      this.$refs.cropper.rotateRight();
 | 
			
		||||
    },
 | 
			
		||||
    // 图片缩放
 | 
			
		||||
    changeScale(num) {
 | 
			
		||||
      num = num || 1;
 | 
			
		||||
      this.$refs.cropper.changeScale(num);
 | 
			
		||||
    },
 | 
			
		||||
    // 上传预处理
 | 
			
		||||
    beforeUpload(file) {
 | 
			
		||||
      if (file.type.indexOf("image/") == -1) {
 | 
			
		||||
        this.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
 | 
			
		||||
      } else {
 | 
			
		||||
        const reader = new FileReader();
 | 
			
		||||
        reader.readAsDataURL(file);
 | 
			
		||||
        reader.onload = () => {
 | 
			
		||||
          this.options.img = reader.result;
 | 
			
		||||
        };
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    // 上传图片
 | 
			
		||||
    uploadImg() {
 | 
			
		||||
      this.$refs.cropper.getCropBlob(data => {
 | 
			
		||||
        let formData = new FormData();
 | 
			
		||||
        formData.append("avatarfile", data);
 | 
			
		||||
        uploadAvatar(formData).then(response => {
 | 
			
		||||
          if (response.code === 200) {
 | 
			
		||||
            this.open = false;
 | 
			
		||||
            this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl;
 | 
			
		||||
            this.msgSuccess("修改成功");
 | 
			
		||||
          } else {
 | 
			
		||||
            this.msgError(response.msg);
 | 
			
		||||
          }
 | 
			
		||||
          this.$refs.cropper.clearCrop();
 | 
			
		||||
        });
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    // 实时预览
 | 
			
		||||
    realTime(data) {
 | 
			
		||||
      this.previews = data;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										80
									
								
								ruoyi-ui/src/views/system/user/profile/userInfo.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								ruoyi-ui/src/views/system/user/profile/userInfo.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,80 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <el-form ref="form" :model="user" :rules="rules" label-width="80px">
 | 
			
		||||
    <el-form-item label="用户昵称" prop="nickName">
 | 
			
		||||
      <el-input v-model="user.nickName" />
 | 
			
		||||
    </el-form-item> 
 | 
			
		||||
    <el-form-item label="手机号码" prop="phonenumber">
 | 
			
		||||
      <el-input v-model="user.phonenumber" maxlength="11" />
 | 
			
		||||
    </el-form-item>
 | 
			
		||||
    <el-form-item label="邮箱" prop="email">
 | 
			
		||||
      <el-input v-model="user.email" maxlength="50" />
 | 
			
		||||
    </el-form-item>
 | 
			
		||||
    <el-form-item label="性别">
 | 
			
		||||
      <el-radio-group v-model="user.sex">
 | 
			
		||||
        <el-radio label="0">男</el-radio>
 | 
			
		||||
        <el-radio label="1">女</el-radio>
 | 
			
		||||
      </el-radio-group>
 | 
			
		||||
    </el-form-item>
 | 
			
		||||
    <el-form-item>
 | 
			
		||||
      <el-button type="primary" size="mini" @click="submit">保存</el-button>
 | 
			
		||||
      <el-button type="danger" size="mini" @click="close">关闭</el-button>
 | 
			
		||||
    </el-form-item>
 | 
			
		||||
  </el-form>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { updateUserProfile } from "@/api/system/user";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  props: {
 | 
			
		||||
    user: {
 | 
			
		||||
      type: Object
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      // 表单校验
 | 
			
		||||
      rules: {
 | 
			
		||||
        nickName: [
 | 
			
		||||
          { required: true, message: "用户昵称不能为空", trigger: "blur" }
 | 
			
		||||
        ],
 | 
			
		||||
        email: [
 | 
			
		||||
          { required: true, message: "邮箱地址不能为空", trigger: "blur" },
 | 
			
		||||
          {
 | 
			
		||||
            type: "email",
 | 
			
		||||
            message: "'请输入正确的邮箱地址",
 | 
			
		||||
            trigger: ["blur", "change"]
 | 
			
		||||
          }
 | 
			
		||||
        ],
 | 
			
		||||
        phonenumber: [
 | 
			
		||||
          { required: true, message: "手机号码不能为空", trigger: "blur" },
 | 
			
		||||
          {
 | 
			
		||||
            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
 | 
			
		||||
            message: "请输入正确的手机号码",
 | 
			
		||||
            trigger: "blur"
 | 
			
		||||
          }
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    submit() {
 | 
			
		||||
      this.$refs["form"].validate(valid => {
 | 
			
		||||
        if (valid) {
 | 
			
		||||
          updateUserProfile(this.user).then(response => {
 | 
			
		||||
            if (response.code === 200) {
 | 
			
		||||
              this.msgSuccess("修改成功");
 | 
			
		||||
            } else {
 | 
			
		||||
              this.msgError(response.msg);
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    },
 | 
			
		||||
    close() {
 | 
			
		||||
      this.$store.dispatch("tagsView/delView", this.$route);
 | 
			
		||||
      this.$router.push({ path: "/index" });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
		Reference in New Issue
	
	Block a user