0. 资源地址

  1. 线上 DEMO 项目地址:http://www.escook.cn:8086/
  2. 项目的 API 接口地址: https://www.showdoc.cc/escook?page_id=3707158761215217

1. 项目前期的准备工作

1.1 初始化项目结构

  1. 素材 目录下的 assetshome 文件夹,拷贝到 code 目录下
  2. code 目录下新建 login.htmlindex.html 页面

1.2 使用GitHub管理大事件的项目

  1. code 目录中运行 git init 命令
  2. code 目录中运行 git add . 命令
  3. code 目录下运行 git commit -m "init project" 命令
  4. 新建 Github 仓库 web_bigevent
  5. 将本地仓库和Github仓库建立关联关系
  6. 将本地仓库的代码推送到Github仓库中
  7. 运行 git checkout -b login 命令,创建并切换到 login 分支

1.3 安装VSCode的Live Server插件辅助开发

  1. 在插件市场,搜索 Live Server 并安装
  2. 在页面上鼠标右键,选择 Open With Live Server 即可快速使用 http 协议访问页面

2. 登录注册

2.1 绘制login页面的基本结构

  1. 编写 HTML 结构:

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>大事件-登录/注册</title>
        <!-- 导入 LayUI 的样式 -->
        <link rel="stylesheet" href="/assets/lib/layui/css/layui.css" />
        <!-- 导入自己的样式表 -->
        <link rel="stylesheet" href="/assets/css/login.css" />
      </head>
      <body>
        <!-- 头部的 Logo 区域 -->
        <div class="layui-main">
          <img src="/assets/images/logo.png" alt="" />
        </div>
    
        <!-- 登录注册区域 -->
        <div class="loginAndRegBox">
          <div class="title-box"></div>
        </div>
      </body>
    </html>
    
  2. 美化样式:

    html,
    body {
      margin: 0;
      padding: 0;
      height: 100%;
      width: 100%;
      background: url('/assets/images/login_bg.jpg') no-repeat center;
      background-size: cover;
    }
    
    .loginAndRegBox {
      width: 400px;
      height: 310px;
      background-color: #fff;
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
    }
    
    .title-box {
      height: 60px;
      background: url('/assets/images/login_title.png') no-repeat center;
    }

2.2 实现登录和注册的按需切换

  1. 编写 HTML 结构:

    <!-- 登录注册区域 -->
    <div class="loginAndRegBox">
      <div class="title-box"></div>
      <!-- 登录的div -->
      <div class="login-box"></div>
      <!-- 注册的div -->
      <div class="reg-box"></div>
    </div>
  2. 编写样式:

    .reg-box {
      display: none;
    }
  3. 编写 JavaScript 代码:

    $(function() {
      // 点击“去注册账号”的链接
      $('#link_reg').on('click', function() {
        $('.login-box').hide()
        $('.reg-box').show()
      })
    
      // 点击“去登录”的链接
      $('#link_login').on('click', function() {
        $('.login-box').show()
        $('.reg-box').hide()
      })
    })

2.3 绘制登录表单的基本结构

  1. 编写 HTML 结构:

    <!-- 登录的div -->
    <div class="login-box">
      <!-- 登录的表单 -->
      <form class="layui-form" action="">
        <!-- 用户名 -->
        <div class="layui-form-item">
          <i class="layui-icon layui-icon-username"></i>
          <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input" />
        </div>
        <!-- 密码 -->
        <div class="layui-form-item">
          <i class="layui-icon layui-icon-password"></i>
          <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input" />
        </div>
        <!-- 登录按钮 -->
        <div class="layui-form-item">
          <!-- 注意:表单提交按钮和普通按钮的区别,就是 lay-submit 属性 -->
          <button class="layui-btn layui-btn-fluid layui-btn-normal" lay-submit>登录</button>
        </div>
        <div class="layui-form-item links">
          <a href="javascript:;" id="link_reg">去注册账号</a>
        </div>
      </form>
    </div>

2.4 美化登录表单的样式

  1. 编写样式:

    .layui-form {
      padding: 0 30px;
    }
    
    .links {
      display: flex;
      justify-content: flex-end;
    }
    
    .links a {
      font-size: 12px;
    }

2.5 绘制文本框前面的小图标

  1. 在用户名的文本框之前,添加如下的标签结构:

    <i class="layui-icon layui-icon-username"></i>
  2. 在密码框之前,添加如下的标签结构:

    <i class="layui-icon layui-icon-password"></i>
  3. 美化样式:

    .layui-form-item {
      position: relative;
    }
    
    .layui-icon {
      position: absolute;
      left: 10px;
      top: 10px;
    }
    
    .layui-input {
      padding-left: 32px;
    }

2.6 快速绘制注册的表单

  1. 将登录的表单复制一份,并修改为注册的表单即可:

    <!-- 注册的div -->
    <div class="reg-box">
      <!-- 注册的表单 -->
      <form class="layui-form" action="">
        <!-- 用户名 -->
        <div class="layui-form-item">
          <i class="layui-icon layui-icon-username"></i>
          <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input" />
        </div>
        <!-- 密码 -->
        <div class="layui-form-item">
          <i class="layui-icon layui-icon-password"></i>
          <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input" />
        </div>
        <!-- 密码确认框 -->
        <div class="layui-form-item">
          <i class="layui-icon layui-icon-password"></i>
          <input type="password" name="repassword" required lay-verify="required" placeholder="再次确认密码" autocomplete="off" class="layui-input" />
        </div>
        <!-- 注册按钮 -->
        <div class="layui-form-item">
          <!-- 注意:表单提交按钮和普通按钮的区别,就是 lay-submit 属性 -->
          <button class="layui-btn layui-btn-fluid layui-btn-normal" lay-submit>注册</button>
        </div>
        <div class="layui-form-item links">
          <a href="javascript:;" id="link_login">去登录</a>
        </div>
      </form>
    </div>

2.7 实现登录表单的验证

  1. 导入 layui 的 js 文件:

    <script src="/assets/lib/layui/layui.all.js"></script>
  2. 为需要验证的表单项添加 lay-verify 属性,同时指定具体的校验规则即可。

2.8 自定义校验规则

  1. 从 layui 中获取 form 对象:

    var form = layui.form
  2. 通过 form.verify() 函数自定义校验规则:

    form.verify({
      // 自定义了一个叫做 pwd 校验规则
      pwd: [/^[\S]{6,12}$/, '密码必须6到12位,且不能出现空格'],
      // 校验两次密码是否一致的规则
      repwd: function(value) {
        // 通过形参拿到的是确认密码框中的内容
        // 还需要拿到密码框中的内容
        // 然后进行一次等于的判断
        // 如果判断失败,则return一个提示消息即可
        var pwd = $('.reg-box [name=password]').val()
        if (pwd !== value) {
          return '两次密码不一致!'
        }
      }
    })
  3. 按需为表单项添加校验规则:

    <input type="password" name="repassword" required lay-verify="required|pwd|repwd" placeholder="再次确认密码" autocomplete="off" class="layui-input" />

2.9 发起注册用户的Ajax请求

  1. 为注册表单添加Id:

    <!-- 注册的表单 -->
    <form class="layui-form" id="form_reg"></form>
  2. 监听提交事件:

    // 监听注册表单的提交事件
      $('#form_reg').on('submit', function(e) {
        // 1. 阻止默认的提交行为
        e.preventDefault()
        // 2. 发起Ajax的POST请求
        var data = {
          username: $('#form_reg [name=username]').val(),
          password: $('#form_reg [name=password]').val()
        }
        $.post('http://ajax.frontend.itheima.net/api/reguser', data, function(res) {
          if (res.status !== 0) {
            return layer.msg(res.message)
          }
       layer.msg('注册成功,请登录!')
          // 模拟人的点击行为
          $('#link_login').click()
        })
      })

2.10 使用layer提示消息

  1. 导入 layer:

    var layer = layui.layer
  2. 调用 layer.msg() 提示消息:

    layer.msg('注册成功,请登录!')

2.11 发起登录的Ajax请求

  1. 为登录表单添加id:

    <form class="layui-form" id="form_login"></form>
  2. 监听提交事件:

    // 监听登录表单的提交事件
    $('#form_login').submit(function(e) {
      // 阻止默认提交行为
      e.preventDefault()
      $.ajax({
        url: '/api/login',
        method: 'POST',
        // 快速获取表单中的数据
        data: $(this).serialize(),
        success: function(res) {
          if (res.status !== 0) {
            return layer.msg('登录失败!')
          }
          layer.msg('登录成功!')
          // 将登录成功得到的 token 字符串,保存到 localStorage 中
          localStorage.setItem('token', res.token)
          // 跳转到后台主页
          location.href = '/index.html'
        }
      })
    })

2.12 在ajaxPrefilter中统一拼接请求的根路径

  1. /assets/js 目录中新建 baseAPI.js

  2. 编写如下代码:

    // 注意:每次调用 $.get() 或 $.post() 或 $.ajax() 的时候,
    // 会先调用 ajaxPrefilter 这个函数
    // 在这个函数中,可以拿到我们给Ajax提供的配置对象
    $.ajaxPrefilter(function(options) {
      // 在发起真正的 Ajax 请求之前,统一拼接请求的根路径
      options.url = 'http://ajax.frontend.itheima.net' + options.url
    })
    

2.13 提交login分支的代码到GitHub

  1. 运行 git add . 命令
  2. 运行 git commit -m "完成了登录和注册的功能" 命令
  3. 运行 git push -u origin login 命令
  4. 运行 git checkout master 命令
  5. 运行 git merge login 命令
  6. 运行 git push 命令
  7. 运行 git checkout -b index 命令

3. 后台主页

3.1 快速实现后台主页的布局效果

  1. 从 layUI 官方文档中粘贴布局的主要代码,并修改如下:

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>后台主页</title>
        <!-- 导入 layui 的样式表 -->
        <link rel="stylesheet" href="/assets/lib/layui/css/layui.css" />
      </head>
      <body class="layui-layout-body">
        <div class="layui-layout layui-layout-admin">
          <div class="layui-header">
            <div class="layui-logo">
              <img src="/assets/images/logo.png" alt="" />
            </div>
            <!-- 头部区域(可配合layui已有的水平导航) -->
            <ul class="layui-nav layui-layout-right">
              <li class="layui-nav-item">
                <a href="javascript:;">
                  <img src="http://t.cn/RCzsdCq" class="layui-nav-img" />
                  个人中心
                </a>
                <dl class="layui-nav-child">
                  <dd><a href="">基本资料</a></dd>
                  <dd><a href="">更换头像</a></dd>
                  <dd><a href="">重置密码</a></dd>
                </dl>
              </li>
              <li class="layui-nav-item"><a href="">退出</a></li>
            </ul>
          </div>
    
          <div class="layui-side layui-bg-black">
            <div class="layui-side-scroll">
              <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
              <ul class="layui-nav layui-nav-tree" lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                  <a class="" href="javascript:;">所有商品</a>
                  <dl class="layui-nav-child">
                    <dd><a href="javascript:;">列表一</a></dd>
                    <dd><a href="javascript:;">列表二</a></dd>
                    <dd><a href="javascript:;">列表三</a></dd>
                    <dd><a href="">超链接</a></dd>
                  </dl>
                </li>
                <li class="layui-nav-item">
                  <a href="javascript:;">解决方案</a>
                  <dl class="layui-nav-child">
                    <dd><a href="javascript:;">列表一</a></dd>
                    <dd><a href="javascript:;">列表二</a></dd>
                    <dd><a href="">超链接</a></dd>
                  </dl>
                </li>
                <li class="layui-nav-item"><a href="">云市场</a></li>
                <li class="layui-nav-item"><a href="">发布商品</a></li>
              </ul>
            </div>
          </div>
    
          <div class="layui-body">
            <!-- 内容主体区域 -->
            <div style="padding: 15px;">内容主体区域</div>
          </div>
    
          <div class="layui-footer">
            <!-- 底部固定区域 -->
            © layui.com - 底部固定区域
          </div>
        </div>
        <!-- 导入 layui 的JS文件 -->
        <script src="/assets/lib/layui/layui.all.js"></script>
      </body>
    </html>

3.2 修改侧边栏的结构

<div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
          <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
          <ul class="layui-nav layui-nav-tree">
            <li class="layui-nav-item">
              <a href="/">首页</a>
            </li>
            <li class="layui-nav-item">
              <a class="" href="javascript:;">文章管理</a>
              <dl class="layui-nav-child">
                <dd>
                  <a href="javascript:;">文章类别</a>
                </dd>
                <dd>
                  <a href="javascript:;">文章列表</a>
                </dd>
                <dd>
                  <a href="javascript:;">发布文章</a>
                </dd>
              </dl>
            </li>
            <li class="layui-nav-item">
              <a href="javascript:;">个人中心</a>
              <dl class="layui-nav-child">
                <dd>
                  <a href="javascript:;">基本资料</a>
                </dd>
                <dd>
                  <a href="javascript:;">更换头像</a>
                </dd>
                <dd>
                  <a href="javascript:;">重置密码</a>
                </dd>
              </dl>
            </li>
          </ul>
        </div>
      </div>

3.3 使用lay-shrink实现左侧菜单互斥效果

<div class="layui-side layui-bg-black">
  <div class="layui-side-scroll">
    <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
    <ul class="layui-nav layui-nav-tree" lay-shrink="all">
      <!-- 省略其他代码 -->
    </ul>
  </div>
</div>

3.4 为菜单项添加图标

  1. 导入第三方的图标库:

    <!-- 导入第三方图标库 -->
    <link rel="stylesheet" href="/assets/fonts/iconfont.css" />
  2. 修改左侧菜单的结构:

    <div class="layui-side layui-bg-black">
      <div class="layui-side-scroll">
        <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
        <ul class="layui-nav layui-nav-tree" lay-shrink="all">
          <li class="layui-nav-item">
            <a href=""><span class="iconfont icon-home"></span>首页</a>
          </li>
          <li class="layui-nav-item">
            <a class="" href="javascript:;"><span class="iconfont icon-16"></span>文章管理</a>
            <dl class="layui-nav-child">
              <dd>
                <a href="javascript:;"><i class="layui-icon layui-icon-app"></i>文章类别</a>
              </dd>
              <dd>
                <a href="javascript:;"><i class="layui-icon layui-icon-app"></i>文章列表</a>
              </dd>
              <dd>
                <a href="javascript:;"><i class="layui-icon layui-icon-app"></i>发布文章</a>
              </dd>
            </dl>
          </li>
          <li class="layui-nav-item">
            <a href="javascript:;"><span class="iconfont icon-user"></span>个人中心</a>
            <dl class="layui-nav-child">
              <dd>
                <a href="javascript:;"><i class="layui-icon layui-icon-app"></i>基本资料</a>
              </dd>
              <dd>
                <a href="javascript:;"><i class="layui-icon layui-icon-app"></i>更换头像</a>
              </dd>
              <dd>
                <a href="javascript:;"><i class="layui-icon layui-icon-app"></i>重置密码</a>
              </dd>
            </dl>
          </li>
        </ul>
      </div>
    </div>
  3. 修改头部“退出”按钮的结构:

    <li class="layui-nav-item">
    	<a href=""><span class="iconfont icon-tuichu"></span>退出</a>
    </li>
  4. 导入自己的样式表文件:

    <link rel="stylesheet" href="/assets/css/index.css" />
  5. 编写自己的样式:

    .layui-footer {
      text-align: center;
      font-size: 12px;
    }
    
    .iconfont {
      margin-right: 8px;
    }
    
    .layui-icon {
      margin-right: 8px;
      margin-left: 20px;
    }

3.5 使用iframe标签在内容主体区域显示网页内容

  1. 在页面主体的 div 中添加 iframe

    <div class="layui-body">
      <!-- 内容主体区域 -->
      <iframe name="fm" src="" frameborder="0"></iframe>
    </div>
  2. 首页链接添加hreftarget属性:

    <a href="/home/dashboard.html" target="fm"><span class="iconfont icon-home"></span>首页</a>
  3. 美化样式:

    iframe {
      width: 100%;
      height: 100%;
    }
    
    .layui-body {
      overflow: hidden;
    }

3.6 解决3个小问题

  1. iframe 指定默认页面:

    <iframe name="fm" src="/home/dashboard.html" frameborder="0"></iframe>
  2. 首页 对应的导航 Item 项添加 layui-this 属性:

    <li class="layui-nav-item layui-this">
      <a href="/home/dashboard.html" target="fm"><span class="iconfont icon-home"></span>首页</a>
    </li>
  3. 强制清除 <a> 链接的 CSS3 动画:

    a {
      transition: none !important;
    }

3.7 渲染图片头像和文字头像

  1. 修改头部区域的的头像结构如下:

    <a href="javascript:;" class="userinfo">
      <img src="http://t.cn/RCzsdCq" class="layui-nav-img" />
      <span class="text-avatar">A</span>
      个人中心
    </a>
  2. 在左侧导航区域的 ul 之前添加如下头像结构:

    <div class="userinfo">
        <img src="http://t.cn/RCzsdCq" class="layui-nav-img" />
        <span class="text-avatar">A</span>
        <span id="welcome">欢迎 ***</span>
    </div>
  3. 添加样式美化 UI 结构:

    .userinfo {
      height: 60px;
      line-height: 60px;
      text-align: center;
      font-size: 12px;
      user-select: none;
    }
    
    .layui-side-scroll .userinfo {
      border-bottom: 1px solid #282b33;
    }
    
    .layui-nav-img {
      width: 40px;
      height: 40px;
    }
    
    .text-avatar {
      display: inline-block;
      width: 40px;
      height: 40px;
      background-color: #009688;
      border-radius: 50%;
      line-height: 40px;
      text-align: center;
      font-size: 20px;
      color: #fff;
      position: relative;
      top: 4px;
      margin-right: 10px;
    }