仿今日头条后台管理系统(二)

仿今日头条后台管理系统(二)

###03-登录模块-分析表单组件

<!-- el-form 表单容器 -->
<!-- ref="form" 获取dom使用-->
<!-- :model="form" model属性绑定了动态数据form  
将来提交后台的数据对象收集了所有的表单元素的值-->
<!-- label-width="80px"  统一设置文字说明宽度 -->
<el-form ref="form" :model="form" label-width="80px">
  <!-- el-form-item 表单项  --> 
  <!-- label="活动名称" 表单元素的说明文字  --> 
  <el-form-item label="活动名称">
    <!-- el-input 表单元素  -->   
    <el-input v-model="form.name"></el-input>
  </el-form-item>
</el-form>
<script>
  export default {
    data() {
      return {
        form: {
          name: '',
        }
      }
    }
  }
</script>

总结组件使用的套路:

  • 根据需求找组件
  • 参考示例,是否有符合要求的例子,参考代码
  • 分析代码的结构与功能
  • 看不懂
    • 试一试
    • 参考说明文档:
      • 组件属性
      • 组件函数
      • 组件事件
  • 分析完毕,就是使用。

###04-登录模块-绘制表单

 <!-- 表单 -->
      <el-form :model="loginForm">
        <el-form-item>
          <el-input v-model="loginForm.mobile" placeholder="请输入手机号"></el-input>
        </el-form-item>
        <el-form-item>
          <el-input v-model="loginForm.code" placeholder="请输入验证码" style="width:236px;margin-right:10px;"></el-input>
          <el-button>发送验证码</el-button>
        </el-form-item>
        <el-form-item>
          <el-checkbox :value="true">我已阅读并同意用户协议和隐私条款</el-checkbox>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" style="width:100%">登 录</el-button>
        </el-form-item>
      </el-form>

依赖数据

data () {
    return {
      loginForm: {
        mobile: '',
        code: ''
      }
    }
  }
  //这里双向绑定 先:model绑定下属性名字,在data里定义,绑定属性名字的键值。

05-登录模块-添加校验

  • Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可
  • 得到:
    • el-form 加属性 rules 绑定数据 传入约定的验证规则
    • el-form-item 指定一个属性 prop 值是 字段的名称
<el-form :model="loginForm" :rules="loginRules">
      // 表单校验规则数据
      loginRules: {
        mobile: [
          { required: true, message: '请输入手机号', trigger: 'blur' }
        ],
        code: [
          { required: true, message: '请输入验证码', trigger: 'blur' },
          { len: 6, message: '长度是6位', trigger: 'blur' }
        ]
      }
<el-form-item prop="mobile">
<el-form-item prop="code"> 

自定义校验规则:

  • validator: validatePass 指定校验函数
  • 在return之前 定义函数
  • 函数约定: fn(rule,value,callback)
    • rule 使用当前字段的校验对象 不会使用
    • value 字段的值
    • callback
      • 校验成功 callback()
      • 校验失败 callback( new Error(‘将来提示内容’) )
// 申明校验函数  在return之前
    const checkMobile = (rule, value, callback) => {
      // 校验手机号  1开头 第二位3-9  9位数字
      if (!/^1[3-9]\d{9}$/.test(value)) return callback(new Error('手机号格式不对'))
      callback()
    }
mobile: [
          { required: true, message: '请输入手机号', trigger: 'blur' },
+          { validator: checkMobile, trigger: 'blur' }
        ],

06-登录模块-整体校验

  • 绑定登录按钮的点击事件
  • 对整个表单进行校验
    • 校验成功,发登录请求
    • 校验失败,提示即可
  • 方案:调用form组件提供的方法 validate
    • 使用组件的dom对象调用数组提供的函数
<el-button type="primary" style="width:100%" @click="login()">登 录</el-button>
 <el-form ref="loginForm" 
methods: {
    login () {
      // 对整个表单进行校验
      this.$refs.loginForm.validate((valid) => {
        if (valid) {
          console.log('校验success')
        }
      })
    }
  }

07-登录模块-进行登录

  • main.js 文件
import axios from 'axios'
Vue.prototype.$http = axios
  • 在任何组件发请求
  • 参考接口文档:api.md 文件
    • 请求方式
    • 请求地址
    • 后台参数
      • url?后传参 key=value&k=v
      • body请求体传参
      • 路径传参 /user/100
      • 请求头传参
    • 返回数据 含义
login () {
      // 对整个表单进行校验
      this.$refs.loginForm.validate(valid => {
        if (valid) {
          // 请求登录接口
          this.$http
            .post(
              'http://ttapi.research.itcast.cn/mp/v1_0/authorizations',
              this.loginForm
            )
            .then(res => {
              // res 响应对象   包含响应主体
              console.log(res.data)
              // 跳转去首页
              this.$router.push('/')
            })
            .catch(() => {
              // 错误提示提示
              this.$message.error('手机号或验证码错误')
            })
        }
      })
    }

补充:

  • 测试帐号
    • 手机号 13911111111 验证码 246810
    • 不建议大家使用,上课期间
  • 注册帐号
    • 安卓 黑马头条的app 浏览器搜索
    • 使用自己的手机号 加 万能验证码 进行登录,其实就是注册
    • 然后 在PC管理系统登录

08-首页模块-路由与组件

  • views/home/index.vue
<template>
  <div class='container'>Home</div>
</template>

<script>
export default {}
</script>

<style scoped lang='less'></style>

  • router/index.js
routes: [
    { path: '/login', name: 'login', component: Login },
+    { path: '/', name: 'home', component: Home }
  ]

09-首页模块-基础布局

布局的架子:

<template>
  <el-container class="wrapper">
    <el-aside width="200px">Aside</el-aside>
    <el-container>
      <el-header>Header</el-header>
      <el-main>Main</el-main>
    </el-container>
  </el-container>
</template>

<script>
export default {}
</script>

<style scoped lang='less'>
// 标签的名称其实就是解析后标签的类名
.wrapper{
  width: 100%;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
  .el-aside{
    background: #002033;
  }
  .el-header{
    border-bottom: 1px solid #ddd;
  }
}
</style>

头部内容:

<el-header>
        <span class="el-icon-s-fold"></span>
        <span class="text">江苏传智播客科技教育有限公司</span>
        <el-dropdown class='my-dropdown' >
          <span class="el-dropdown-link">
            <img src="../../assets/images/avatar.jpg" alt="">
            用户名称
            <i class="el-icon-arrow-down el-icon--right"></i>
          </span>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item>个人设置</el-dropdown-item>
            <el-dropdown-item>退出登录</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </el-header>

依赖样式:

 .el-header {
    border-bottom: 1px solid #ddd;
    line-height: 60px;
    .el-icon-s-fold {
      font-size: 24px;
      vertical-align: middle;
    }
    .text {
      vertical-align: middle;
      padding-left: 10px;
    }
    .my-dropdown {
      float: right;
      img {
        width: 30px;
        height: 30px;
        vertical-align: middle;
      }
      .el-dropdown-link {
        font-weight: bold;
      }
    }
  }

10-首页模块-分析导航菜单组件

<!-- 导航菜单容器 -->
<!-- default-active 默认激活的菜单项  值是菜单项的index属性值 -->
<!-- background-color 背景颜色 -->
<!-- text-color 文字颜色 -->
<!-- active-text-color 激活时候文字颜色 -->
<el-menu
      default-active="2"
      background-color="#545c64"
      text-color="#fff"
      active-text-color="#ffd04b">
     <!-- el-submenu   有子菜单的菜单项-->
     <!-- el-menu-item  没有子菜单的菜单项 -->
      <el-menu-item index="2">
        <i class="el-icon-menu"></i>
        <span slot="title">导航二</span>
      </el-menu-item>
    </el-menu>

###12-首页模块-绘制导航菜单

<el-aside width="200px">
      <div class="logo"></div>
      <!-- 导航菜单 -->
      <el-menu
        default-active="1"
        background-color="#002033"
        text-color="#fff"
        active-text-color="#ffd04b"
      >
        <el-menu-item index="1">
          <i class="el-icon-s-home"></i>
          <span slot="title">首页</span>
        </el-menu-item>
        <el-menu-item index="2">
          <i class="el-icon-document"></i>
          <span slot="title">内容管理</span>
        </el-menu-item>
        <el-menu-item index="3">
          <i class="el-icon-picture"></i>
          <span slot="title">素材管理</span>
        </el-menu-item>
        <el-menu-item index="4">
          <i class="el-icon-s-promotion"></i>
          <span slot="title">发布文章</span>
        </el-menu-item>
        <el-menu-item index="5">
          <i class="el-icon-chat-dot-round"></i>
          <span slot="title">评论管理</span>
        </el-menu-item>
        <el-menu-item index="6">
          <i class="el-icon-present"></i>
          <span slot="title">粉丝管理</span>
        </el-menu-item>
        <el-menu-item index="7">
          <i class="el-icon-setting"></i>
          <span slot="title">个人设置</span>
        </el-menu-item>
      </el-menu>
    </el-aside>

依赖样式:

.logo {
  width: 100%;
  height: 60px;
  background: #002244 url(../../assets/images/logo_admin.png) no-repeat center /
    140px auto;
}
.el-menu{
  border-right: none;
}

###13-首页模块-导航菜单折叠效果

  • 点击头部图标按钮
    • 收起
    • 展开
  • 收起:
    • 侧边栏宽度 64px
    • logo切换图片 小图
    • 导航菜单收起
  • 展开:
    • 侧边栏宽度 200px
    • logo切换图片 大图
    • 导航菜单展开
// el-menu 加属性
// isCollapse true 折叠 false 展开
:collapse="isCollapse" 

代码步骤:

  data () {
    return {
      // 控制展开收起  
      isCollapse: false
    }
  },
<span class="el-icon-s-fold" @click="toggleMenu()"></span>
 methods: {
    toggleMenu () {
      // 切换侧边栏展开与收起  默认是展开
      this.isCollapse = !this.isCollapse
    }
  }

切换代码:

<el-aside :width="isCollapse?'64px':'200px'">
<div class="logo" :class="{miniLogo:isCollapse}"></div>

样式:

.miniLogo {
  background-image: url(../../assets/images/logo_admin_01.png);
  background-size: 36px auto;
}
 <el-menu
        :collapse="isCollapse"
        :collapse-transition="false"

14-首页模块-欢迎页面

  • 创建一个组件
  • 配置路由 二级路由

router/index.js

   {
      path: '/',
      component: Home,
      children: [
        { path: '/', name: 'welcome', component: Welcome }
      ]
    }

views/welcome/index.vue

<template>
  <div class='container' style="text-align:center" >
    <img src="../../assets/images/welcome.jpg" alt="">
  </div>
</template>

<script>
export default {}
</script>

<style scoped lang='less'></style>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值