首先项目初始化+安装element-ui、在之前的文章当中已经介绍的很详细
没有什么难度、login页面默认宽高都是页面的100%,登录盒子定位left:50%,top:50%,再返回自身的50% transform: translate(-50%,-50%);
登录盒子用到组件 el-form el-form-item el-input 根据官网固定用法 v-model 数据双向绑定 便于获取数据post 到服务器 这里还有一个小点:组件库提供的表单预计验证
组件data种定义好:
LoginRules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' }
],
password: [
{ min: 6, max: 16, message: '长度在 6 到 16 个字符', trigger: 'blur' },
{ required: true, message: '请输入登录密码', trigger: 'blur' }
]
}
required 必填 min max最大值最小值 message 未通过验证时提示的消息 trigger 触发方式
el-from 绑定 :rules="LoginRules"
el-form-item 使用具体的prop="username"
- <template>
- <div id="login">
- <div class="login-box">
- <div class="avatar-box">
- <img src="http://www.wsg3096.com/gangback/pub/ava.jpg" alt="">
- div>
- <el-form id="login-form" :model="loginPost" :rules="LoginRules" ref="login">
- <el-form-item prop="username">
- <el-input prefix-icon="iconfont icon-user"
- placeholder="请输入用户名"
- v-model="loginPost.username">el-input>
- el-form-item>
- <el-form-item prop="password">
- <el-input prefix-icon="iconfont icon-3702mima"
- type="password"
- v-model="loginPost.password"
- placeholder="请输入密码">el-input>
- el-form-item>
- <el-form-item class="btns">
- <el-button type="primary" @click="loginIn">登录el-button>
- <el-button plain @click="loginRs">重置el-button>
- el-form-item>
- el-form>
- div>
- div>
- template>
-
- <script>
- export default {
- name: 'login',
- data () {
- return {
- loginPost: {
- username: '',
- password: ''
- },
- LoginRules: {
- username: [
- { required: true, message: '请输入用户名', trigger: 'blur' }
- ],
- password: [
- { min: 6, max: 16, message: '长度在 6 到 16 个字符', trigger: 'blur' },
- { required: true, message: '请输入登录密码', trigger: 'blur' }
- ]
- }
- }
- },
- methods: {
- loginRs () {
- // 点击重置按钮 重置登录表单 resetFields()ele重置方法 用refs找到这个表单
- // console.log(this.$refs)
- this.$refs.login.resetFields()
- },
- loginIn () {
- // 点击登录按钮 先看验证结果 通过预验证后 再发起POST请求 valid返回布尔值
- // async额森特在前 await额威特在内 简化promise 再用对象结构 接收data
- this.$refs.login.validate(async valid => {
- if (!valid) return
- const { data: res } = await this.$http.post(
- 'login',
- this.loginPost
- )
- if (res.meta.status !== 200) return this.$Msg.error('登录失败!')
- await this.$Msg.success('登录成功!')
- /*
- *将登录成功的令牌 存到 浏览器会话存储当中(只在打开期间生效)
- * 再跳转路由到首页
- * */
- window.sessionStorage.setItem('token', res.data.token)
- // 这里因为是异步 所以this 划线了 但是效果没有影响
- await this.$router.push('/home')
- })
- }
- }
- }
-
- script>
-
- <style lang="less" scoped>
- #login{
- background: url("http://www.wsg3096.com/articleSystem/assets/img/index1.jpg") no-repeat center;
- width: 100%;
- height: 100%;
- position: relative;
- }
- .login-box{
- width: 450px;
- height: 300px;
- background: white;
- border-radius: 6px;
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%,-50%);
- box-shadow: 2px 8px 20px rgba(30,30,30,0.3);
- }
- .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: #fff;
- img{
- width: 100%;
- height: 100%;
- border-radius: 50%;
- background: #eee;
- }
- }
- .btns{
- display: flex;
- justify-content: flex-end;
- }
- #login-form{
- box-sizing: border-box;
- padding: 100px 20px 0px;
- }
- style>
在router种使用导航守卫加以验证
- // 挂载路由导航守卫
- router.beforeEach((to, from, next) => {
- /** to 将要访问的路径
- * from 代表从哪个路径跳转而来
- * next 表示放行
- * **/
- if (to.path === '/login') return next()// 去访问登录页面 直接放行
-
- const tokenStr = window.sessionStorage.getItem('token')
-
- if (!tokenStr) return next('/login')// 访问其他页面 检验有没有 token 没有就跳转到 login
- next()
- })