基础的vue项目

登录功能

  1. 创建分支 git checkout -b login(login是新建分支名)
  2. git branch 是查看所有的分支 带*号的是你目前所在的分支名
  3. element-ui实现登录页面
  4. 开发依赖中安装less-loader和less,注意重新启动项目才会生效
  5. src/assets/css下面添加全局css样式配置
  6. main.js把全局css样式文件导入

2.1 Login实现基本布局

  • src/components/Login.vue代码如下:
<!-- 登录页面 -->
<template>
  <div class="login">
    <div class="login_box">
       <h3>登录页面</h3>
    </div> 
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },

  components: {}
};
</script>
<style lang='less' scoped>
.login {
  width: 100%;
  height: 100%;
  background-color: #1bd1a5;
  .login_box {
    width: 768px;
    height: 484px;
    background-color: #fff;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }
}
</style>
  • 依赖中安装开发依赖less和less-loader

注意

如果我们安装好less和less-laoder以后启动项目报这个错误

TypeError: this.getOptions is not a function

是因为我们的less-loader安装版本过高,我们用

npm uninstall less-laoder 卸载默认安装的10.0的版本

npm install less-loader@6.0.0
  • src/assets/css/global.css

新建上面的css文件,样式代码如下:

* {
  margin: 0;
  padding: 0;
}
html,
body,
#app {
  width: 100%;
  height: 100%;
}

src/main.js导入样式文件并刷新,样式才会生效

// 导入全局样式文件
import "./assets/css/global.css";
  • src/router/index.js代码如下:

  • src/App.vue中添加路由占位符

<router-view></router-view>

此时页面显示效果如下:

2.2表单处理

把element-ui中提供的form组件粘贴过来,注意我们初识化项目的时候是按需导入,所以我们得plugins/element.js导入并注册你需要的element-ui中的组件。

import {Button, Form, FormItem, Input } from "element-ui";
Vue.use(Button);
Vue.use(Form);
Vue.use(FormItem);
Vue.use(Input);

结构如下:

<el-form ref="form" class="login_form" label-width="80px">
    <el-form-item label="用户名">
        <el-input></el-input>
    </el-form-item>
    <el-form-item label="密码">
        <el-input></el-input>   
    </el-form-item>
     <el-form-item class="login_btn">
        <el-button type="primary">登录</el-button>
        <el-button type="success">重置</el-button>
    </el-form-item>
</el-form>  

样式代码如下:

.login_form {
      width: 80%;
      margin: 80px auto;
      .login_btn {
        text-align: center;
        margin-top: 80px;
      }
    }

2.3字体图标

我们一般是把element-ui中提供的icon实现效果。

需要注意的是如果是input的icon在前面,添加如下类名

<el-input  prefix-icon="el-icon-search"></el-input>

如果input的icon在后面,添加如下类名:

<el-input suffix-icon="el-icon-date"></el-input>   

但是如果满足不了需求,可以从第三方库阿里巴巴的iconfont图标库中去获取图标。

  • iconfont官网选择需要的图标,下载压缩包
  • 把解压的文件夹重命名为fonts文件夹放在vue项目的assets文件夹中。
  • main.js引入iconfont.css
// 导入字体图标样式
import "./assets/fonts/iconfont.css";
  • vue页面使用字体图标,格式为
 prefix-icon='iconfont xx'
 或者
 suffix-icon="iconfont xx"
 

此时页面显示如下:

2.4表单数据绑定

  • form添加:model="loginForm"
  • 每个el-input添加
<el-input v-model="loginForm.username" prefix-icon="iconfont icon-mima"></el-input>

<el-input  v-model="loginForm.password" prefix-icon="iconfont icon-yonghuming"></el-input>  
  • data模型中初始化用户名和密码
data() {
    return {
      loginForm: {
        username: "11",
        password: "11"
      }
    };

2.5表单数据验证

  • data定义验证规则对象
 export default {
  data() {
    return {
      loginForm: {
        username: "",
        password: ""
      },
      loginRules: {
        username: [
          { required: true, message: "请输入用户名", trigger: "blur" },
          { min: 3, max: 8, message: "长度在 3 到 8个字符", trigger: "blur" }
        ],
        password: [
          { required: true, message: "输入密码", trigger: "blur" },
          { min: 3, max: 8, message: "长度在 3 到 8 个字符", trigger: "blur" }
        ]
      }
    };
  },
  • 表单绑定验证规则对象
 <el-form ref="form" :model="loginForm" :rules="loginRules" class="login_form" label-width="80px">
 
  • el-form-item绑定验证属性
 <el-form-item label="用户名" prop="username">
       ....
 </el-form-item>
 
 <el-form-item label="密码" prop="password">
       ....   
  </el-form-item>

2.6表单重置

  • el-form添加ref属性
 <el-form ref="loginForm">
    ....
 </el-form>
  • 重置按钮绑定事件
 <el-button type="success" @click="resetInfo">重置</el-button>
  • 事件处理逻辑
methods: {
    resetInfo: function() {
      this.$refs.loginForm.resetFields();
    }
  },

我们点击重置按钮的时候可以把用户输入的内容重置清空

  • 我们的密码这时还是可见的,添加show-password属性
<el-input  show-password v-model="loginForm.password" prefix-icon="iconfont icon-yonghuming"></el-input>  

2.7请求登录接口

  • main.js引入配置axios(前提确保自己安装了这个包)
// 导入并配置axios
import axios from "axios"; //导入axios
axios.defaults.baseURL = "http://127.0.0.1:8888/api/private/v1/"; //配置请求的根地址
Vue.prototype.$http = axios; //把axios通过$http属性挂载到Vue原型上,每一个vue实例都可以使用
  • 登录按钮绑定事件,验证数据合法性
<el-button type="primary" @click="loginHandle">登录</el-button>

loginHandle中方法如下:


loginHandle: function() {
      this.$refs.loginForm.validate(async valid => {
        // 如果验证数据不合法,就不用请求后端接口了
        if (!valid) {
          return false;
        }
        const res = await this.$http.post("login", this.loginForm);
        let { data, meta: { msg, status } } = res.data;
        if (status != 200) {
          return alert("登录失败");
        }
        alert("登录成功");
      });
    }

备注
登录成功的账号是admin,密码是123456

2.8弹窗组件

我们不管是登录成功还是登录失败都需要有消息提示弹窗,我们可以选择element-ui中的message组件。

  • plugin/element.js引入并挂载Message组件
import { Message } from "element-ui";
// 把message挂载到vue原型对象上面
Vue.prototype.$msg = Message;
  • 登录功能中使用弹窗
loginHandle: function() {
      this.$refs.loginForm.validate(async valid => {
        // 如果验证数据不合法,就不用请求后端接口了
        if (!valid) {
          return false;
        }
        const res = await this.$http.post("login", this.loginForm);
        let { data, meta: { msg, status } } = res.data;
        if (status != 200) {
          return this.$msg({
            message: "登录失败",
            showClose: true,
            type: "error"
          });
        }
        this.$msg({
          message: "登录成功",
          showClose: true,
          type: "success"
        });
      });
    }

2.9 登录成功保存token

  • 保存token

我们打印成功以后后台返回的内容:

token就是node服务后台给我们返回的token值,所以我们登录成功以后把它保存到sessionStorage中,方便下次验证。

// 保存token
sessionStorage.setItem("token", res.data.data.token);
  • 新建首页Home.vue

src/components下面新建Home.vue,代码如下:

<!-- 首页内容 -->
<template>
  <div>
      <h3>我是首页内容</h3>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  }
};
</script>
<style lang='less' scoped>
</style>

router/index.js中导入home并注册

  • 编程路由跳转至首页

Login.vue登录成功的逻辑中添加页面跳转

 // 跳转到首页
 this.$router.push("home");

3.0导航守卫

我们希望用户登录成功以后再能访问home页面,如果他没有登录成功是不允许直接访问home页面的,此时我们需要用路由导航守卫来实现。

。。。。
const router = new VueRouter({
  routes
});

// 设置路由导航守卫
router.beforeEach((to, from, next) => {
  if (to.path === "/login") {
    next(); //如果用户访问的是login页面,让用户正常访问。
  } else {
    // 如果用户访问的不是登录页,先去获取token,看看是否登录过
    let token = sessionStorage.getItem("token");
    if (!token) {
      return next("/login"); //如果没有token,代表未登录,强制跳转到登录页让用户登录
    } else {
      next(); //如果有token,代表登录过,正常放行即可
    }
  }
});
export default router;

备注
我们测试的时候直接访问home页面(确保application中没有token值),此时会自动跳转到登录页。直接访问登录页面没有问题。

3.1退出功能

Home.vue中代码如下:

<!-- 首页内容 -->
<template>
  <div>
      <h3>我是首页内容</h3>
      <el-button @click="logout">退出</el-button>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  methods: {
    logout: function() {
      sessionStorage.clear(); //清空sessionStorage中的token信息
      this.$router.push("/login"); //路由跳转到登录页面
    }
  }
};
</script>
<style lang='less' scoped>
</style>

3.2代码提交到远程仓库

  1. git status 查看代码状态(这个不是必须操作的,是为了方便查看你代码的状态)
  2. git add . (把刚才写的登录的所有代码提交到暂存区)
  3. git commit -m 'xxx' (把暂存区代码提交到本地仓库)
  4. git branch (查看你在哪个分支上,这个不是必须的,是为了方便查看你现在所处的分支)
  5. git checkout master (切换到主分支)
  6. git merge login (在主分支上合并了login的代码)
  7. git push 把本地主分支代码推送到远程的主分支上(我们上次用 git push -u origin master是为了在远程仓库也创建主分支master)
  8. git checkout login (本地还切换回来login分支)
  9. git push -u origin login(把本地login分支上的代码推送到远程login分支上,这样远程的login分支上也就有代码了)

三、首页内容

3.1首页布局

我们参照element-ui中的container布局容器实现下面的内容

  • 复制element-ui中container组件结构
    home.vue中结构如下:
<!-- 首页内容 -->
<template>
    <el-container class="home_container">
        <el-header>Header<el-button @click="logout">退出</el-button></el-header>
        <el-container>
          <el-aside width="200px">Aside</el-aside>
          <el-main>Main</el-main>
        </el-container>
    </el-container>
</template>

<script>
export default {
  data() {
    return {};
  },
  methods: {
    logout: function() {
      sessionStorage.clear(); //清空sessionStorage中的token信息
      this.$router.push("/login"); //路由跳转到登录页面
    }
  }
};
</script>
<style lang='less' scoped>
.home_container {
  width: 100%;
  height: 100%;
  background-color: red;
  .el-header {
    background-color: #36c5d3;
  }
  .el-aside {
    background-color: #304254;
  }
  .el-main {
    background-color: #eff2f5;
  }
}
</style>
  • plugin/element.js导入所需的组件
import {
  Container,
  Header,
  Aside,
  Main
} from "element-ui";

Vue.use(Container);
Vue.use(Header);
Vue.use(Aside);
Vue.use(Main);

此时页面显示效果如下:

3.2首页头部布局

el-header中添加内容和样式如下:

<el-header>
    <img src="../assets/logo2.png" alt="" class="logo">
    <span>河软零食小铺</span>
    <el-button @click="logout">退出</el-button>
</el-header>
        
        
.el-header {
    background-color: #36c5d3;
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-weight: 900;
    .logo {
      width: 50px;
      height: 50px;
      border-radius: 50%;
    }
  }        

显示效果如下:

3.3左侧菜单区域

3.3.1布局实现

我们参照element-ui中的这个组件进行改造

  • 根据element-ui复制模板
 <el-aside width="200px">
    <!-- 左侧菜单的内容开始 -->
    <el-menu
       background-color="#545c64"
        text-color="#fff"
        active-text-color="#ffd04b">
        <!-- 一级菜单的内容 -->
        <el-submenu index="1">
            <template slot="title">
                  <i class="el-icon-location"></i>
                  <span>导航一</span>
            </template>
            <!-- 二级菜单的内容 -->
            <el-menu-item index="1-4-1">选项1</el-menu-item>
        </el-submenu>
    /el-menu>
    <!-- 左侧菜单的内容结束 -->
 </el-aside>
  • plugin/element.js中导入使用的组件标签

3.3.2 axios添加请求拦截器

因为我们的页面除了login页面可以直接登录,其他页面都需要保证登录以后有了token权限才可以直接访问,我们与其一个个的设置,可以直接在axios绑定token的请求头,这样就设置好了访问权限。

我们在main.js添加

// 导入并配置axios
import axios from "axios";
axios.defaults.baseURL = "http://127.0.0.1:8888/api/private/v1/"; 

// 配置请求头  这是这次配置的
axios.interceptors.request.use(config => {
  config.headers.Authorization = sessionStorage.getItem("token");
  return config;
});

Vue.prototype.$http = axios; 

以后我们每次发起请求的时候,发下自动帮我们添加了token

3.3.3 请求后台渲染菜单

备注:

  1. 请求地址:menu
  2. 请求方式:get

我们定义一个方法

获取后端的数据内容如下:

所有Home.vue代码如下:

<!-- 首页内容 -->
<template>
    <el-container class="home_container">
        <el-header>
          <img src="../assets/logo2.png" alt="" class="logo">
          <span>河软零食小铺</span>
          <el-button @click="logout">退出</el-button>
        </el-header>
        <el-container>
          <el-aside width="200px">
            <!-- 左侧菜单的内容开始 -->
            <el-menu
              background-color="#545c64"
              text-color="#fff"
              active-text-color="#ffd04b">
              <!-- 一级菜单的内容 -->
              <el-submenu :index="item.id+''" v-for="(item,index) in menuList" :key="item.id">
                <template slot="title">
                  <i class="el-icon-location"></i>
                  <span>{{item.authName}}</span>
                </template>
                <!-- 二级菜单的内容 -->
                  <el-menu-item :index="subItem.id+''" v-for="(subItem,index) in item.children" :key="subItem.id">
                    {{subItem.authName}}
                  </el-menu-item>
              </el-submenu>
          </el-menu>
          <!-- 左侧菜单的内容结束 -->
          </el-aside>
          <el-main>Main</el-main>
        </el-container>
    </el-container>
</template>

<script>
export default {
  data() {
    return {
      menuList: []
    };
  },
  methods: {
    logout: function() {
      sessionStorage.clear(); //清空sessionStorage中的token信息
      this.$router.push("/login"); //路由跳转到登录页面
    },
    getMenuList: async function() {
      const res = await this.$http.get("menus"); //请求后端接口获取所有的菜单信息
      const { data, meta: { msg, status } } = res.data;
      if (status != 200) {
        return this.$msg({
          message: "获取菜单信息失败",
          showClose: true,
          type: "error"
        });
      }
      this.menuList = data;
      console.log(status, data);
    }
  },
  created: function() {
    this.getMenuList(); //调用获取菜单列表信息方法
  }
};
</script>
<style lang='less' scoped>
.home_container {
  width: 100%;
  height: 100%;
  background-color: red;
  .el-header {
    background-color: #36c5d3;
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-weight: 900;
    .logo {
      width: 50px;
      height: 50px;
      border-radius: 50%;
    }
  }
  .el-aside {
    background-color: #304254;
    // 设置左侧导航颜色
    .el-menu-item.is-active {
      background: #36c5d3 !important;
      color: #fff !important;
    }
    .el-submenu__title.is-active {
      background: #36c5d3 !important;
      color: #fff !important;
    }
  }
  .el-main {
    background-color: #eff2f5;
  }
}
</style>

此时左侧菜单显示效果如下:

3.3.4解决小问题

  • 每次菜单点击只展开一项
    el-menu标签添加unique-opened属性
<el-menu unique-opened> </el-menu>
  • 菜单右侧有突出
    去掉el-memu的右侧边框
.el-aside {
    background-color: #304254;
    .el-menu {
      去除右侧的边框
      border-right: 0;
      。。。
    }
  }

3.4 右侧主体内容

思路:
我们应该是点击左侧的菜单导航跳转到右侧对应的页面内容中,我们把右侧的内容当成一个子组件嵌套在每一个路由中。
比如home首页右侧新建一个子组件welcome页面,然后这个页面在首页进行展示和渲染即可。

3.4.1 左侧导航路由跳转

  • 我们给el-menu添加路由模式
 <el-menu router></el-menu>
 
  • 修改el-menu-item的index为请求地址
 <el-menu-item :index="'/'+subItem.path" v-for="(subItem,index) in item.children" :key="subItem.id">
    {{subItem.authName}}
 </el-menu-item>

此时点击左侧导航菜单,地址栏会显示对应的路由地址

  • src/components下面新建Welcome欢迎界面
<!-- 欢迎页面 -->
<template>
  <div>
      欢迎页面内容
  </div>
</template>

<script>
export default {
  data() {
    return {};
  }
};
</script>
<style lang='less' scoped>
</style>
  • router/index.js中把欢迎页面当成子路由注册
  • home页面添加路由占位符
  <el-main>
    <router-view></router-view>
  </el-main>

此时访问home页面,显示效果如下:

3.5用户内容

3.5.1用户内容布局

  • 1、新建User.vue

src/components下面新建user文件夹,里面新建User.vue,随意希写入一些测试内容

  • 2、配置路由
    router/index.js导入User.vue并注册
import User from "../components/user/User.vue";

....
 {
    path: "/home",
    name: "Home",
    component: Home,
    redirect: "/welcome",
    children: [
      { path: "/welcome", component: Welcome },
      { path: "/users", component: User }
    ]
  }

备注:上面的path必须定义成/users,因为我们点击左侧导航菜单的时候,它设定的路由跳转链接地址就是/users

  • 3、完善用户列表内容

首先使用element-ui中的面包屑组件

<el-breadcrumb separator="/">
        <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
        <el-breadcrumb-item><a href="/">用户管理</a></el-breadcrumb-item>
        <el-breadcrumb-item>用户列表</el-breadcrumb-item>
</el-breadcrumb>

注意在plugins/element.js中把依赖的组件标签导入并注册

import { Breadcrumb,BreadcrumbItem } from "element-ui";

Vue.use(Breadcrumb);
Vue.use(BreadcrumbItem);

  • 4、实现右侧卡片布局

此部分用到了卡片组件、layout布局等,别忘了导入相应的组件并注册

layout
layout布局是把横向的一行分成24份,:gutter设置的是每个子板块之间的间距,:span是每个子内容占据的宽度。

  <!-- 底部内容区域 -->
      <el-card class="box-card">
          <el-row :gutter="20">
            <el-col :span="8">
                <el-input placeholder="请输入内容" class="input-with-select">
                <el-button slot="append" icon="el-icon-search"></el-button>
            </el-input>
            </el-col>
            <el-col :span="16">
                 <el-button type="primary">添加</el-button>
            </el-col>
          </el-row>
      </el-card>

显示效果如下:

  • 5 请求后台获取用户列表

后端接口信息如下:

后端响应的结果如下:

我们把获取的数据在上面遍历生成表格

<el-table
                :data="userList"
                border
                style="width: 100%">
                <el-table-column
                prop="username"
                label="姓名"
                width="180">
                </el-table-column>
                <el-table-column
                prop="email"
                label="邮箱"
                width="180">
                </el-table-column>
                <el-table-column
                prop="mobile"
                label="电话">
                </el-table-column>
                <el-table-column
                prop="role_name"
                label="角色">
                </el-table-column>
                <el-table-column
                label="状态">
                   <template slot-scope="scope">
                       <el-switch
                            v-model="scope.row.mg_state"
                            active-color="#13ce66"
                            inactive-color="#ff4949">
                        </el-switch>
                   </template>
                </el-table-column>
                <el-table-column
                label="操作">
                    <template slot-scope="scope">
                       <el-button type="primary">编辑</el-button>
                       <el-button type="danger">删除</el-button>
                   </template>
                </el-table-column>
            </el-table>
<script>
export default {
  data() {
    return {
      userList: [],
       queryInfo: {
        // 请求的其他信息内容
        query: "",
        // 请求第几页数据
        pagenum: 1,
        // 每页显示多少条数据
        pagesize: 5
      },
      //   后端返回的总页数默认是0
      total: 0
    };
  },
  methods: {
    getUserList: async function() {
      // get请求原来讲过有三种请求方式,我们选择的其中一种
      const res = await this.$http.get("users", {
        params: this.queryInfo
      });
      const {
        data: { total, pagenum, users },
        meta: { msg, status }
      } = res.data;
      if (status != 200) {
        //   代表没有获取用户信息成功,报错提示
        this.$msg({
          showClose: true,
          message: "获取用户信息失败",
          type: "error"
        });
      } else {
        //   获取后端内容成功,把users数组的内容赋值给data中的userList数组
        this.userList = users;
        // 把用户请求的总页数也绑定到data中的total中
        this.total = total;
      }
    }
  },
  created() {
    //   调用获取用户信息列表方法
    this.getUserList();
  }
};
</script>

显示效果如下:

需要注意的是

  1. 上面用到的组件都需要按需导入和注册
  2. template标签中嵌套标签,slot-scope="scope",是把一行的信息保存到scope对象中,scope.row.xx属性名可以获取固定的内容
  • 6、实现分页效果
    根据element-ui中的分页组件实现用户列表的分页显示效果

第一步:element/index.js导入pagination组件
第二步:修改结构标签

 <!-- 分页显示效果 -->
            <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                :current-page="queryInfo.pagenum"
                :page-sizes="[1, 5, 10, 15]"
                :page-size="queryInfo.pagesize"
                layout="total, sizes, prev, pager, next, jumper"
                :total="total">
            </el-pagination>

第四步:js中数据变化

<script>
export default {
  data() {
    return {
      userList: [],
      queryInfo: {
        // 请求的其他信息内容
        query: "",
        // 请求第几页数据
        pagenum: 1,
        // 每页显示多少条数据
        pagesize: 5
      },
      //   后端返回的总页数默认是0
      total: 0
    };
  },
  methods: {
    getUserList: async function() {
     。。。。
    },
    handleSizeChange(val) {
      console.log(`每页 ${val} 条`);
      this.queryInfo.pagesize = val;
      //   页码发生变化了 重新请求后端数据
      this.getUserList();
    },
    handleCurrentChange(val) {
      console.log(`当前页: ${val}`);
      this.queryInfo.pagenum = val;
      //   页码发生变化了 重新请求后端数据
      this.getUserList();
    }
  },
  created() {
    //   调用获取用户信息列表方法
    this.getUserList();
  }
};

此时页面效果如下:

3.5.2用户状态修改

用户在点击switch开关进行切换的时候可以更换用户的状态,后台请求接口描述如下:

注意这个开关更换状态触发的change时间,可以参考官网描述。

  • 模板添加change事件
<el-switch
  @change="changeState(scope.row)"
  v-model="scope.row.mg_state"
  active-color="#13ce66"
  inactive-color="#ff4949">
</el-switch>

  • js中事件代码如下:
 // 更换用户状态的方法
    changeState: async function(userInfo) {
      // userInfo代表上面传递的scope.row的一行的信息  put方法执行完毕就直接更新了
      const res = await this.$http.put(
        `users/${userInfo.id}/state/${userInfo.mg_state}`
      );

      const { data, meta: { msg, status } } = res.data;
      if (status != 200) {
        // 如果更改失败,页面上面的开关状态还得给人家恢复原位
        userInfo.mg_state = !userInfo.mg_state;
        //  代表设置状态失败
        this.$msg({
          showClose: true,
          message: "更改状态失败",
          type: "error"
        });
      } else {
        //  代表设置状态失败
        this.$msg({
          showClose: true,
          message: "更改状态成功",
          type: "success"
        });
      }
    }

请求成功的返回结果如下:

3.5.3实现搜索功能

说明

  <el-row :gutter="20">
            <el-col :span="8">
                 <el-input placeholder="请输入内容" v-model="queryInfo.query"
                 class="input-with-select">
                    <el-button slot="append" icon="el-icon-search" @click="getUserList"></el-button>
                </el-input>
            </el-col>
            <el-col :span="6">
                <el-button type="primary">添加用户</el-button>
            </el-col>
        </el-row>

js中queryInfo数据为:

data() {
    return {
      userList: [],
      queryInfo: {
        query: "",
        // 请求第几页数据
        pagenum: 1,
        // 每页显示多少条数据
        pagesize: 5
      },
      //   //   后端返回的总页数默认是0
      total: 0
    };
  },

此时点击小搜索图标可以实现搜索功能,点击关闭按钮就会显示全部的信息内容。

3.5.4实现添加功能

页面结构如下:

<el-row>
        <el-col :span="12">
            <el-form ref="form" :model="userForm" label-width="80px">
              <el-form-item label="用户名">
                <el-input v-model="userForm.username"></el-input>
              </el-form-item>
              <el-form-item label="密码">
                <el-input v-model="userForm.password"></el-input>
              </el-form-item>
              <el-form-item label="手机号">
                <el-input v-model="userForm.mobile"></el-input>
              </el-form-item>
              <el-form-item label="邮箱">
                <el-input v-model="userForm.email"></el-input>
              </el-form-item>
              <el-form-item>
                <el-button type="primary" @click="addUser">添加用户</el-button>
              </el-form-item>   
            </el-form>
        </el-col>
      </el-row>

添加逻辑如下:

export default {
  data() {
    return {
      。。。。
      // 添加用户的表单绑定内容
      userForm: {
        username: "",
        password: "",
        mobile: "",
        email: ""
      },
    };
  },
  methods: {
    getUserList: async function() {
      。。。
    },
    handleSizeChange(val) {
      。。。。
    },
    handleCurrentChange(val) {
     。。。。
    },
    // 添加用户的逻辑
    addUser: async function() {
      const res = await this.$http.post("users", this.userForm);
      console.log(res.data.meta.status);
      if (res.data.meta.status != 201) {
        return this.$message("添加用户失败");
      } else {
        this.$message("添加用户成功");
      }
    }
  },

3.5.5实现待编辑功能

我们点击编辑按钮的时候还可以像我们实现图书管理一样,把编辑的内容显示在上面的输入框中,我们也可以使用element-ui中的dialog对话框。

(1)根据id查询编辑的用户的信息

后端接口如下:

  • 添加编辑页面对话框
 <!-- 待编辑页面的对话框 -->
    <el-dialog
      title="要编辑的内容"
      :visible.sync="dialogVisible"
      width="30%">
      <el-form ref="form" :model="editeForm" label-width="80px">
        <el-form-item label="用户名">
          <el-input v-model="editeForm.username"></el-input>
        </el-form-item>
        <el-form-item label="邮箱">
          <el-input v-model="editeForm.email"></el-input>
        </el-form-item>
        <el-form-item label="手机号">
          <el-input v-model="editeForm.mobile"></el-input>
        </el-form-item>
      </el-form>  
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
      </span>
    </el-dialog>
  • data中添加模型数据、
data() {
    return {
      。。。
      // 是否显示编辑对话框的变量
      dialogVisible: false,
      // 编辑用户的表单内容
      editeForm: {
        username: "",
        email: "",
        mobile: ""
      }
    };
  },
  • 编辑按钮绑定事件
<el-table-column label="操作">
    <template slot-scope="scope">
       <el-button type="primary" @click="showDialog(scope.row.id)">编辑</el-button>
        <el-button type="danger" @click="scope.row.id">删除</el-button>
    </template>
</el-table-column>
  • 实现待编辑逻辑
 // 显示待编辑对话框
    showDialog: async function(id) {
      this.dialogVisible = true;
      // 请求后端接口实现查询待编辑的用户的信息
      const res = await this.$http.get("users/" + id);
      const { data, meta: { msg, status } } = res.data;
      if (status != 200) {
        return this.$message({
          message: "获取编辑用户信息成功",
          showClose: true,
          type: "error"
        });
      } else {
        this.editeForm = data;
      }
      console.log(res);
    }
  },

3.5.6实待编辑功能

我们点击对话框的确定按钮实现对话框的消失,同时实现编辑功能。
后端接口如下:

  • 给确定按钮绑定事件
 <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="editeUser">确 定</el-button>
      </span>
  • 实现事件逻辑
// 实现编辑功能
    editeUser: async function() {
      this.dialogVisible = false; //点击确定按钮的时候实现对话框的消失
      // 获取用户编辑的id可以从this.editeForm中获取 因为获取待编辑的内容的时候给它赋值了
      const res = await this.$http.put("users/" + this.editeForm.id, {
        email: this.editeForm.email,
        mobile: this.editeForm.mobile
      });
      const { data, meta: { msg, status } } = res.data;
      if (status != 200) {
        return this.$msg("更新失败");
      } else {
        this.$msg("更新成功");
      }
    }
  • 给用户名输入框添加禁用属性
 <el-form-item label="用户名">
          <el-input v-model="editeForm.username" disabled></el-input>
        </el-form-item>

3.5.6实现删除功能

我们实现删除之前先加个确认删除语句
confirm('你确定要删除信息吗?')

删除用户的后端接口如下:

  • 给删除按钮绑定事件
<el-table-column
          label="操作">
    <template slot-scope="scope">
        <el-button type="primary">编辑</el-button>
        <el-button type="success" @click="delUser(scope.row.id)">删除</el-button>
    </template>
</el-table-column>

  • 事件逻辑代码如下:
// 删除当前用户信息
    delUser: async function(id) {
      const result = confirm("你确定姚删除用户信息吗?");
      if (result) {
        const res = await this.$http.delete(`users/${id}`);
        if (res.data.meta.status == 200) {
          this.$message("删除成功了");
          this.getUserList();
        } else {
          this.$message("删除失败");
        }
      }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值