登录功能(iview-admin login)

iview-admin登录模块改造

iview-admin自带登录模块但有以下改造点

  • 自带连接的数据是测试数据mock ,现改造成连接真实后台数据库
  • 自带未对登录的数据库和密码做验证,其无提示信息

iview-admin 登录模块流程分析

  • 启动应用 进入根路径:http://localhost:8080/
    因iview-admin 有权限控制判断是否有登录后的token ,无则跳转到登录页面
  • 权限控制src/router/index.js


    image.png
  • 路由控制src/router/router.js
export default [{
  path: '/login',
  name: 'login',
  meta: {
    title: 'Login - 登录',
    hideInMenu: true
  },
  component: () => import('@/view/login/login.vue')
},

找到登录页面组件@/view/login/login.vue
子组件:@/view/components/login-form/login-form.vue
流程:
界面输入用户信息(@/view/components/login-form/login-form.vue)
->调用父组件的handleSubmit方法(@/view/login/login.vue)
->再调用Vuex actions 方法handleLogin(@/store/user.js)
->再调用axios方法login(@/api/user.js)
->请求后接口数据

改造与后台接口连接

  • vue.config.js
devServer: {
    historyApiFallback: true,
    hot: true,
    inline: true,
    stats: {
      colors: true
    },
    proxy: {
      // 匹配代理的url
      '/api': {
        // 目标服务器地址
        target: 'localhost:5000',
        // 路径重写
        pathRewrite: {
          '^/api': '/api'
        },
        changeOrigin: true
      }
    }
  }
  • config/index.js
baseUrl: {
    // dev: 'https://www.easy-mock.com/mock/5add9213ce4d0e69998a6f51/iview-admin/',
    // pro: 'https://produce.com'
    dev: '',
    pro: ''
  }
  • login.vue
    -- 失败显示提示
    -- 密码加密
<style lang="less">
@import "./login.less";
</style>

<template>
  <div class="login">
    <div class="login-con">
      <Card icon="log-in"
            title="欢迎登录"
            :bordered="false">
        <div class="form-con">
          <login-form @on-success-valid="handleSubmit"></login-form>
          <p class="login-tip">
            <Alert type="error"
                   v-show="flag"
                   show-icon>
              {{message}}
            </Alert>
          </p>

        </div>
      </Card>
    </div>
  </div>
</template>

<script>
import LoginForm from '_c/login-form'
import { mapActions } from 'vuex'
import { getmd5 } from '@/libs/util'
export default {
  components: {
    LoginForm
  },
  data () {
    return {
      flag: false,
      message: ''
    }
  },
  methods: {
    ...mapActions([
      'handleLogin',
      'getUserInfo'
    ]),
    handleSubmit ({ userName, password }) {
      password = getmd5(password)
      this.handleLogin({ userName, password }).then(res => {
        const data = res
        this.message = data.message// 获取后始返回消息显示
        if (data.check_login) { // 判断是否登录成功
          this.getUserInfo().then(res => {
            this.$router.push({
              name: this.$config.homeName
            })
          })
        } else {
          this.flag = true // 失败显示返回的消息
        }
      })
    }
  }
}
</script>

<style>
</style>

后台flask

新建user的model models.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author:likang
from app import db #db是在app/__init__.py生成的关联后的SQLAlchemy实例
import sqlalchemy
Base = sqlalchemy.ext.declarative.declarative_base()
class User(db.Model):
    __tablename__ = 'users'

    user_id = db.Column(db.Integer, primary_key=True,autoincrement=True)
    name = db.Column(db.String(80), unique=True)
    access = db.Column(db.String(320), unique=True)
    password = db.Column(db.String(32), nullable=False)
    token = db.Column(db.String(32), nullable=False)
    avatar = db.Column(db.String(32), nullable=False)

    # def __init__(self, user_id, name, access,token,password,avatar):
    #     self.user_id = user_id
    #     self.name = name
    #     self.access = access
    #     self.token= token
    #     self.ppassword=password
    #     self.avatar=avatar
    def __repr__(self):
        return '<User %r>' % self.name

    def to_dict(self):
        return {c.name: getattr(self, c.name, None) for c in self.__table__.columns}

    Base.to_dict = to_dict

登录判断 login.py

from flask import  request, redirect, url_for, render_template,Blueprint,jsonify
# from app.utils.comm import geMD5,AlchemyEncoder
# import json
from app.models import User
app_login = Blueprint('app_login', __name__)
@app_login.route('/', methods=['GET', 'POST'])
def login_check():
    message = 'login failure'
    check_login = False
    user=[]
    token=''
    if request.args:
        uname=request.args.get("userName")
        password = request.args.get("password")
        print("param_password:",password,'param_uname:',uname)
        users=User.query.filter_by(name=uname).first()
        if(users):
            if(password==users.password):
                message = 'login success'
                check_login = True
                token=users.token
            else:
                message = '密码不存在'
        else:
            message='用户名不存在'
    re_map = {
        'user_id': users.user_id,
        'username':users.name,
        'access':users.access,
        'token':users.token,
        'message':message,
        'check_login':check_login
    }
    return re_map

测试登录

  • 密码错误


    image.png
  • 登录成功


    image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容