黑马VUE项目实战

登录页面

路由设置

const routes = [
  // 当用户访问/时重定向到login
  {path:'/',redirect:'/login'},
  {path:"/login",component:Login}  
]

登录界面布局

首先在assets文件加中新建css文件,其中global.css设置全局css,然后在App.vue中引入
在login中写一个登录盒子,居中:

.login_box{
    width: 450px;
    height: 300px;
    background-color: #fff;
    border-radius: 3px;
    position: absolute;
    left: 50%;
    top:50%;
    transform: translate(-50%,-50%);
  }

登录界面与验证功能:

<template>
  <div class="login_container">
    <div class="login_box">
      <!-- 头像区域 -->
      <div class="avatar_box">
        <img src="../assets/logo.png"/>
      </div>
      <!-- 登录区域 -->
      <el-form :model="loginForm" :rules="loginFormRules" class="login_form">
        <el-form-item prop="username">
          <el-input v-model="loginForm.username" placeholder="请输入用户名"
                    prefix-icon="el-icon-user"></el-input>
        </el-form-item>
        <el-form-item prop="password">
          <el-input type="password" v-model="loginForm.password" placeholder="请输入密码"
                    prefix-icon="el-icon-lock"
                    ></el-input>
        </el-form-item>
        <el-form class="btns">
          <el-button type="success">登录</el-button>
          <el-button type="info">重置</el-button>
        </el-form>
      </el-form>
    </div>
  </div>
</template>

<script>
export default {
    data(){
      return{
        loginForm:{
          username:'',
          password:''
        },
        loginFormRules:{
          username:[  { required: true, message: '请输入用户名称', trigger: 'blur' },
            { min: 3, max: 10, message: '长度在 3 到 5 个字符', trigger: 'blur' }],
          password:[{ required: true, message: '请输入密码', trigger: 'blur' },
            { min: 3, max: 10, message: '长度在 3 到 5 个字符', trigger: 'blur' }]

        }
      }
    }
}
</script>

<style scoped>
  .login_container{
    background-color: #2b4b6b;
    height: 100%;
  }
  .login_box{
    width: 450px;
    height: 300px;
    background-color: #fff;
    border-radius: 3px;
    position: absolute;
    left: 50%;
    top:50%;
    transform: translate(-50%,-50%);

  }
  .avatar_box{
    height: 130px;
    width: 130px;
    border: 1px solid #eee;
    border-radius: 50%;
    padding: 10px;
    box-shadow: 0  0 10px #ddd;
    position: absolute;
    left: 50%;
    transform: translate(-50%,-50%);
    background-color: #fff;
  }

  .avatar_box img{
    width: 100%;
    height: 100%;
    border-radius: 50%;
    background-color: #fff;
  }
  .btns{
    display: flex;
    justify-content: flex-end;
  }
  .login_form{
    position: absolute;
    bottom: 0;
    width: 100%;
    padding: 0 20px;
    box-sizing:border-box;
  }
</style>

其中使用eleme实现表单验证:
1、在eleme-form中使用:rules:“”绑定一个验证数据
2、在data中写该数据的验证
3、在eleme-form下的item中使用prop进行绑定

表单重置功能

1、在form-item中使用ref:“refname”获取标签对象
2、使用this. r e f s . r e f n a m e 获取标签 3 、在重置按钮使用 @ c l i c k = " " 绑定一个点击事件,在 m e t h o d s 中使用 t h i s . refs.refname获取标签 3、在重置按钮使用@click=""绑定一个点击事件,在methods中使用this. refs.refname获取标签3、在重置按钮使用@click=""绑定一个点击事件,在methods中使用this.refs.refname.resetFields实现重置
实现表单预验证

 login(){
        this.$refs.loginFormRef.validate(vaild=>{
          console.log(vaild);
        })
      }

使用axios实现登录功能

首先在main.js中配置

import axios from 'axios'
Vue.config.productionTip = false
// 配置请求的根路径
axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/'
Vue.prototype.$http = axios

然后再login函数中

 login(){
        this.$refs.loginFormRef.validate(async vaild=>{
          if(!vaild) return;
          //拿到data重命名为res
          const {data:res} = await this.$http.post("login",this.loginForm);
          console.log(res)
          if(res.meta.status!==200) return console.log("登录失败")
          console.log("登录成功")
        })
      }
      }

设置登录弹窗提示
首先在eleme.js中引入并挂载Message

import { Message } from 'element-ui' 
Vue.prototype.$message = Message

然后使用

if(res.meta.status!==200) return this.$message.error("登录失败!")
          this.$message.success("登录成功!")

登录后的路由跳转

window.sessionStorage.setItem("token",res.data.token);
          this.$router.push("/home");

路由守卫

// 挂载路由导航守卫
router.beforeEach((to,from,next) => {
  //to:将要访问那个路径
  // from:从那个路径跳转而来
  // next:一个函数,代表放行 next()放行   next('/login') 强制跳转到登录页
  if(to.path === '/login') return next()
  // 获取token
  const tokenStr = window.sessionStorage.getItem('token')
  // 如果token为空,则强制跳转到login界面
  if(!tokenStr) return next('/login')
  // 不为空则放行
  next()
})

退出登录

清除session,然后重定向到登录界面

 logout(){
            window.sessionStorage.clear()
            this.$router.push('/login')
        }

将登录功能推送到远程仓库

首先使用git status
在这里插入图片描述
上面是修改的,下面是新增的
然后使用git add . 把这些放到暂存区
使用git commit -m '实现登录功能‘进行本地提交
使用git branch发现当前是在login分支,使用git checkout main 切换到main分支
然后使用git merge合并main和login分支
最后使git push推送到远程仓库

Home页面

总体布局

使用eleme的container组件

<template>
    <el-container class="home-container">
        <el-header>
            <div>
                <img src="../assets/logo.png"/>
                <h1>电商后台管理系统</h1>
            </div>
            <el-button type="info" @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>

实现头部

template代码见上

<style>
.home-container{
    height: 100%;
}
.el-header{
    background: #333;
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: #fff;
    font-size: 20px;
}
.el-header div{
    display: flex;
    align-items: center;
}
.el-header div img{
    margin: 10px;
    width:50px;
    height: 50x;
}
.el-aside{
    background: #444;
    height: 100%;
}
.el-main{
    height: 100%;
    background: #eee;
}
</style>

左侧菜单

基本界面布局

<el-aside width="200px">
                    <el-menu
                    
                    background-color="#333"
                    text-color="#fff"
                    active-text-color="#aaa">
                    <el-submenu index="1">
                        <template slot="title">
                            <i class="el-icon-location"></i>
                            <span>导航一</span>
                        </template>
                        <el-menu-item index="1-1">
                            <template slot="title">
                                <i class="el-icon-location"></i>
                                <span>选项1</span>
                            </template>
                        </el-menu-item>
                    </el-submenu>
                   </el-menu>
                </el-aside>

从后端获取数据并美化

<template>
    <el-container class="home-container">
        <el-header>
            <div>
                <img src="../assets/logo.png"/>
                <h1>电商后台管理系统</h1>
            </div>
            <el-button type="info" @click="logout">退出</el-button>
        </el-header>
            <el-container>
                <el-aside width="200px">
                    <el-menu
                    background-color="#333"
                    text-color="#fff"
                    active-text-color="#409EFF">
                    <el-submenu :index="item.id + ''" v-for="item in menulist" :key="item.id">
                        <template slot="title">
                            <i :class="iconObj[item.id]"></i>
                            <span>{{item.authName}}</span>
                        </template>
                        <el-menu-item :index="subItem.authName + ''" v-for="subItem in  item.children" :key="subItem.id">
                            <template slot="title">
                                <i class="el-icon-menu"></i>
                                <span>{{subItem.authName}}</span>
                            </template>
                        </el-menu-item>
                    </el-submenu>
                   </el-menu>
                </el-aside>
                <el-main>Main</el-main>
            </el-container>
    </el-container>
</template>

<script>
export default {
    created(){
        this.getMenuList();
    },
    data(){
        return{
            menulist:[],
            iconObj:{
                '125':'el-icon-user-solid',
                '103':'el-icon-goods',
                '101':'el-icon-message-solid',
                '102':'el-icon-s-fold',
                '145':'el-icon-s-home',

            }
        }
    },
    methods:{
        logout(){
            window.sessionStorage.clear()
            this.$router.push('/login')
        },
        async getMenuList(){
            const {data : res } = await this.$http.get('menus')
            if(res.meta.status !== 200) return this.$message.error(res.meta.msg)
            this.menulist = res.data
            console.log(res)
        }
    }
}
</script>

<style>
.home-container{
    height: 100%;
}
.el-header{
    background: #333;
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: #fff;
    font-size: 20px;
}
.el-header div{
    display: flex;
    align-items: center;
}
.el-header div img{
    margin: 10px;
    width:50px;
    height: 50x;
}
.el-aside{
    background: #444;
    height: 100%;
}
.el-main{
    height: 100%;
    background: #eee;
}
</style>

功能快捷键

撤销:Ctrl/加粗样式Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值