一次简单的Vue项目

6 用户管理

一个系统当然要有用户管理部分,实际上常用的用户管理主要包括了增删改查部分。查代表了搜索和展示用户,增代表了添加新用户,删即是删除用户,改就是修改用户信息。

本例中还是采用表格来进行基本的用户展示,至于后端的查询逻辑先忽略。

我们先创建一个User.vue组件,同时修改导航三的名字为用户管理,并且绑定路由(只展示了修改的部分):

<el-menu-item index="/User">
  <i class="el-icon-document"></i>
  <span slot="title">用户管理</span>
</el-menu-item>
{
  path: User,
  name: '用户管理',
  // 懒加载
  component: () => import('@/components/User.vue'),
  meta: { title: '3' }
}

然后就是关键的代码部分(有点长= =。):

<template>
  <div align="center">
    <div align="left" ref="closepopover">
      <el-button type="success" icon="el-icon-plus" @click="addDialog=true">添加用户</el-button>
      <el-dialog
        title="新增用户"
        :visible.sync="addDialog"
        :append-to-body="true"
        width="400px"
        @close="close('addForm')"
      >
        <el-form
          :model="addForm"
          :label-position="labelPosition"
          status-icon
          ref="addForm"
          :rules="rules"
        >
          <el-form-item label="用户名" :label-width="formLabelWidth" prop="user">
            <el-input v-model="addForm.user" autocomplete="off" clearable></el-input>
          </el-form-item>
          <el-form-item label="输入密码" :label-width="formLabelWidth" prop="password">
            <el-input v-model="addForm.password" autocomplete="off" clearable show-password></el-input>
          </el-form-item>
          <el-form-item label="确认密码" :label-width="formLabelWidth" prop="firm_password">
            <el-input v-model="addForm.firm_password" autocomplete="off" clearable show-password></el-input>
          </el-form-item>
          <el-form-item label="添加备注" :label-width="formLabelWidth" prop="description">
            <el-input v-model="addForm.description" autocomplete="off" clearable></el-input>
          </el-form-item>
        </el-form>
        <div slot="footer" class="dialog-footer">
          <el-button @click="addDialog=false" size="small">取消</el-button>
          <el-button type="primary" @click="submitForm('addForm')" size="small">确定</el-button>
        </div>
      </el-dialog>
    </div>
    <br />
    <br />
    <el-table v-loading="loading" :data="tableData" stripe style="width: 80%">
      <el-table-column align="center" prop="user" label="用户名" width="auto">
        <template slot-scope="scope">{{ scope.row.user }}</template>
      </el-table-column>
      <el-table-column align="center" prop="level" label="用户等级" width="auto">
        <template slot-scope="scope">{{ scope.row.level }}</template>
      </el-table-column>
      <el-table-column align="center" prop="description" label="备注" width="auto">
        <template slot-scope="scope">{{ scope.row.description }}</template>
      </el-table-column>
      <el-table-column fixed="right" align="center" prop="operation" label="操作" width="auto">
        <template slot-scope="scope">
          <el-button
            type="primary"
            icon="el-icon-edit"
            @click="dialogFormVisible = true, handleClick(scope.row, scope.$index)"
            size="small"
            round
          >编辑</el-button>
          <el-dialog
            title="编辑用户信息"
            :visible.sync="dialogFormVisible"
            :append-to-body="true"
            width="400px"
            @close="close('form')"
          >
            <el-form
              :model="form"
              :label-position="labelPosition"
              status-icon
              ref="form"
              :rules="rules"
            >
              <el-form-item label="新密码" :label-width="formLabelWidth" prop="password">
                <el-input v-model="form.password" autocomplete="off" clearable show-password></el-input>
              </el-form-item>
              <el-form-item label="确认密码" :label-width="formLabelWidth" prop="firm_password">
                <el-input v-model="form.firm_password" autocomplete="off" clearable show-password></el-input>
              </el-form-item>
              <el-form-item label="修改备注" :label-width="formLabelWidth" prop="description">
                <el-input v-model="form.description" autocomplete="off" clearable></el-input>
              </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
              <el-button @click="resetForm('form')" size="small">取消</el-button>
              <el-button
                type="primary"
                @click="submitForm('form', scope.$index, scope.row)"
                size="small"
              >确定</el-button>
            </div>
          </el-dialog>
          <el-popover placement="top" width="160" trigger="click" :ref="`popover-${scope.$index}`">
            <center>
              <p>确定删除此用户吗?</p>
            </center>
            <div style="text-align: right; margin: 0">
              <el-button
                size="mini"
                type="text"
                @click="updateVisible()"
              >取消</el-button>
              <el-button type="primary" size="mini" @click="deleteUser(scope.row, scope)">确定</el-button>
            </div>
            <el-button icon="el-icon-delete" slot="reference" size="small" type="danger" round>删除</el-button>
          </el-popover>
        </template>
      </el-table-column>
    </el-table>
    <br />
    <br />
    <el-pagination
      background
      layout="prev, pager, next"
      :total="total_page"
      :page-size="pageSize"
      :current-page.sync="currentPage"
      @current-change="pageChange"
    ></el-pagination>
  </div>
</template>

<script>
import qs from "qs";
export default {
  created() {
    this.getData();
  },
  methods: {
    handleClick(index, row) {
      this.tableIndex = index;
    },
    updateVisible() {
      this.$refs.closepopover.click();
    },
    resetForm(formName) {
      this.dialogFormVisible = false;
      this.$refs[formName].resetFields();
    },
    close(formName) {
      this.$nextTick(() => {
        this.$refs[formName].resetFields();
      });
    },
    getData() {
      let url = "/api/user?page_number=" + this.currentPage;
      this.$http
        .get(url)
        .then(response => {
          this.tableData = response.data["inform"];
          this.total_page = response.data["total_number"];
          this.loading = false;
        })
        .catch(err => {
          console.log(error);
        });
    },
    pageChange() {
      this.getData();
    },
    submitForm(formName, row, index) {
      let _index = this.tableIndex;
      this.$refs[formName].validate(vaild => {
        if (vaild) {
          this.addDialog = false;
          this.dialogFormVisible = false;
          let url = "/api/admin/user_manage/";
          if (formName == "form") {
            this.$http
              .post(
                url + "update",
                qs.stringify({
                  id: _index.id,
                  password: this.form.password,
                  description: this.form.description
                })
              )
              .then(response => {
                this.$message({
                  message: "修改成功!",
                  type: "success",
                  center: true
                });
                this.getData();
              })
              .catch(err => {
                this.$message({
                  message: "修改失败!",
                  type: "error",
                  center: true
                });
              });
          }
          if (formName == "addForm") {
            this.$http
              .post(
                url + "add",
                qs.stringify({
                  user: this.addForm.user,
                  password: this.addForm.password,
                  description: this.addForm.description
                })
              )
              .then(response => {
                this.$message({
                  message: "添加成功!",
                  type: "success",
                  center: true
                });
                this.getData();
              })
              .catch(err => {
                this.$message({
                  message: "添加失败!",
                  type: "error",
                  center: true
                });
              });
          }
        } else {
          this.$message({
            message: "提交失败!",
            type: "error",
            center: true
          });
        }
      });
    },
    deleteUser(row, scope) {
      let url = "/api/admin/user_manage/delete";
      console.log(row.id);
      if (row.id == "1") {
        scope._self.$refs[`popover-${scope.$index}`].doClose();
      }
      if (row.level == "超级管理员") {
        this.$refs.closepopover.click();
        this.$message.error("无法删除超级管理员!");
        return 111;
      }
      this.$http
        .post(url, qs.stringify({ user_id: row.id }))
        .then(response => {
          scope._self.$refs[`popover-${scope.$index}`].doClose();
          this.$message({
            message: "用户删除成功!",
            type: "success",
            center: true
          });
          this.getData();
        })
        .catch(err => {
          this.$message({
            message: "用户删除失败!",
            type: "error",
            center: true
          });
        });
    }
  },

  data() {
    var validateUser = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请输入用户名!"));
      } else {
        callback();
      }
    };
    var validatePass = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请输入密码!"));
      } else {
        if (this.form.firm_password !== "") {
          this.$refs.form.validateField("firm_password");
        }
        callback();
      }
    };
    var validatePass2 = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请再次输入密码!"));
      } else if (1 == 1) {
        if (this.addDialog == true) {
          if (value !== this.addForm.password) {
            callback(new Error("两次输入密码不一致!"));
          } else {
            callback();
          }
        } else {
          if (value !== this.form.password) {
            callback(new Error("两次输入密码不一致!"));
          } else {
            callback();
          }
        }
      } else {
        callback();
      }
    };
    var validateDesc = (rule, value, callback) => {
      if (value === "") {
        callback(new Error("请输入备注!"));
      } else {
        callback();
      }
    };
    return {
      tableData: [
        {
          id: 1,
          user: "admin",
          level: "超级管理员",
          description: "混元霹雳手"
        }
      ],
      dialogFormVisible: false,
      addDialog: false,
      labelPosition: "left",
      form: {
        password: "",
        firm_password: "",
        description: ""
      },
      addForm: {
        user: "",
        password: "",
        firm_password: "",
        description: ""
      },
      rules: {
        user: [{ validator: validateUser, trigger: "blur" }],
        password: [{ validator: validatePass, trigger: "blur" }],
        firm_password: [{ validator: validatePass2, trigger: "blur" }],
        description: [{ validator: validateDesc, trigger: "blur" }]
      },
      formLabelWidth: "80px",
      loading: false,
      currentPage: 1,
      pageSize: 10,
      total_page: 1,
      visible: false
    };
  }
};
</script>

<style scoped>
</style>

用户管理是我之前踩坑最多的一个模块,由于坑实在是太多了,我会专门在下一篇文章中挨个进行详述。还是来看一下整体效果吧:

image

样式也不算很好看,不过基本的框架算是搭起来啦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 4 表格使用 表格是前端经常使用到的一个工具,尤其是在管理系统中,因为存在着数据的展示和操作(增删改查)。 我们将...
    Prejudice_ccca阅读 466评论 0 0
  • 3 路由实现 在摸爬滚打一段时间后,决定进行路由相关的处理。 利用导航栏进行路由 本文采用的是element ui...
    Prejudice_ccca阅读 547评论 0 1
  • 2 搭建一个简单的后台管理布局 文件创建 在准备好相关环境后,我们开始创建自己的项目。整个项目的目录结构如下图所示...
    Prejudice_ccca阅读 783评论 0 0
  • 5 登录验证及权限设置 既然要做一个系统,肯定就少不了登录验证,我们先实现一个简单的登录页面。首先在compone...
    Prejudice_ccca阅读 3,018评论 2 1
  • 1 环境准备 最近由于项目需要且人员不足(其实是不想求别人。。。),又希望多学点知识,于是动手自己搭建一个后台管理...
    Prejudice_ccca阅读 911评论 0 1