#技术栈
- VUE
- VUE-router
- Element-UI(饿了么组件库)
- Axios(远程请求数据)
- Echarts
- Node.js
- Express
- JWT(模拟session)
- MySql
- Sequelize
#登录、退出
代码块分析:
<template>
<div class="login_container">
<div class="login_box">
<!-- 头像区域 -->
<div class="avatar_box">
<img src="../assets/logo.png" alt="">
</div>
<!-- 登录表单区域 -->
<el-form ref="loginFormRef" :model="loginForm" :rules="loginFormRules" label-width="0px" class="login_form">
<!-- 用户名 -->
<el-form-item prop="username">
<el-input v-model="loginForm.username" prefix-icon="iconfont icon-user"></el-input>
</el-form-item>
<!-- 密码 -->
<el-form-item prop="password">
<el-input v-model="loginForm.password" prefix-icon="iconfont icon-3702mima" type="password"></el-input>
</el-form-item>
<!-- 按钮区域 -->
<el-form-item class="btns">
<el-button type="primary" @click="login">登录</el-button>
<el-button type="info" @click="resetLoginForm">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
在element-ui官网找form直接拷贝,不用拷太多,4行足以。
首先,为form表单绑定数据模型对象(:model=“loginForm”),表单里的每一项也绑定对象属性(v-model=“loginForm.username”,v-model=“loginForm.password”);
写规则(:rules=“loginFormRules”),把规则绑到每一项(prop=“username”);
ref引出表单对象,只有引出这个,才能用一些强的一批的函数(重置,验证表单功能);
@click=“login”,@click=“resetLoginForm”,定义一些方法;
<script>
export default {
data() {
return {
// 这是登录表单的数据绑定对象,(:model=“loginForm”)
loginForm: {
username: 'admin', //数据对象的属性,这里是写死的
password: '123456'
},
// 这是表单的验证规则对象
loginFormRules: {
// 验证用户名是否合法,trigger:'blur':当失去焦点时触发,达到及时反馈数据是否符合要求
username: [
{ required: true, message: '请输入登录名称', trigger: 'blur' },
{ min: 3, max: 10, message: '长度在 3 到 10 个字符', trigger: 'blur' }
],
// 验证密码是否合法
password: [
{ required: true, message: '请输入登录密码', trigger: 'blur' },
{ min: 6, max: 15, message: '长度在 6 到 15 个字符', trigger: 'blur' }
]
}
}
},
methods: {
// 点击重置按钮,重置登录表单
resetLoginForm() {
//$ref.导出的表单对象.方法()
this.$refs.loginFormRef.resetFields()
},
//点击登录按钮
login() {
this.$refs.loginFormRef.validate(async valid => {
if (!valid) return
const { data: res } = await this.$http.post('login', this.loginForm)
if (res.meta.status !== 200) return this.$message.error('登录失败!')
this.$message.success('登录成功')
// 1. 将登录成功之后的 token,保存到客户端的 sessionStorage 中
// 1.1 项目中出了登录之外的其他API接口,必须在登录之后才能访问(携带token信息)
// 1.2 token 只应在当前网站打开期间生效,所以将 token 保存在 sessionStorage 中
window.sessionStorage.setItem('token', res.data.token)
// 2. 通过编程式导航跳转到后台主页,路由地址是 /home
this.$router.push('/home')
})
}
}
}
</script>
//css这里省略,太多了
<style lang="less" scoped>...
this.$http.post(‘login’, this.loginForm),这个是post方式请求远程数据接口(baseUrl+login),我这里用easymock来模拟接口,当请求成功时,返回一个promise对象,这里需要用await/async的方式来简单处理promise,处理后的数据是一个json格式的,我们只取有用的数据部分,即{ data:res },里面有状态码,token等信息。
登录成功后弹出一个登录成功的对话框,并绑定token,之后跳转到home。
技术点:http是无状态的,若不存在跨域问题,通过cookie,session记录状态,若存在跨域,则通过token维持状态。
token原理:
- 登录页面输入信息进行登录
- 服务器验证后,生成对应的token并返回
- 客户端存token值
- 后续的所有请求都需要携带token
- 服务器验证token
#样式
assets/css/global.css:全局样式
main文件导入全局样式
#开始
1.新建vue项目(vue-shop),选择babel,router,linter/formatter,使用配置文件。
2.码云上绑定公钥,生成远程仓库