博客系统之登录功能(前后端分离vue + flask)

前期安装

vue cli安装
sudo npm install -g @vue/cli

运行:

vue ui

会自动开启localhost:8000 页面

mysql安装(选做)
  1. 下载地址:https://dev.mysql.com/downloads/mysql/5.6.html, 找到适合的dmg版本下载
  2. 点击dmg一步步进行安装
  3. 配置环境变量(选做)

从 macOS Catalina 版开始,您的 Mac 将使用 zsh 作为默认登录 Shell 和交互式 Shell。您还可以在较低版本的 macOS 中将 zsh 设置为默认 Shell


vi ~/.zshrc

export PATH=${PATH}:/usr/local/mysql/bin

source ~/.zshrc

配置完成后,重启terminal,验证环境变量是否生效

mysql -u root -p

创建项目

先创建一个Python项目,然后在vue 服务器上创建vue的项目,将vue项目的路径存放在刚新建的python项目下

大概目录:

博客系统之登录功能(前后端分离vue + flask)
  • backup:自己创建的文件夹,里面主要存放.py文件
  • vue:启动vue服务后,用可视化方式创建的项目
  • init:自己创建,做一些初始化操作
  • run:自己创建,编写后端路由

; 初始化app

安装flask模块

pip3 install flask

新建 init.py 文件,代码如下:

from flask import Flask
from flask_cors import CORS

def create_app():
"""
    创建app对象
    :return:
"""
    app = Flask(__name__,
                static_folder="./vue-project/dist/static",
                template_folder="./vue-project/dist")

    cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

    return app

新建run.py文件,部分代码如下:

from flask import render_template, jsonify, request
import requests
from random import *
import init
from backup.database import Article, session
import json

app = init.create_app()

@app.route('/', defaults={'path': ''})
@app.route('/')
def catch_all(path):
    if app.debug:
        return requests.get('http://localhost:8080/{}'.format(path)).text
    return render_template("index.html")

@app.route('/api/login', methods=['GET', 'POST'])
def login():
    username = request.values.get('username')
    password = request.values.get('password')
    if username == 'xxxxx' and password == 'xxxx':
        res = {
            'isLogin': '0',
            'msg': 'success'
        }
        return jsonify(res)
    else:
        res = {
            'isLogin': '-1',
            'msg': 'fail'
        }
        return jsonify(res)

if __name__ == '__main__':
    app.run(debug=True)

连接database(选做)

先下载相关模块:

pip install flask-sqlalchemy pymysql

新建backup文件夹,在文件夹下面,新建database.py文件

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine, Integer, Text, DateTime
from sqlalchemy import Column, String
from datetime import datetime
import init

engine = create_engine('mysql+pymysql://user:password@127.0.0.1:3306/Blog_db?charset=utf8')
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()
Base.metadata.create_all(engine)

class Article(Base):
    __tablename__ = 'article'
    id = Column(Integer, primary_key=True, autoincrement=True)
    title = Column(String(255), nullable=True)
    content = Column(Text, nullable=False)
    create_time = Column(DateTime, default=datetime.now)
    status = Column(String(255), nullable=True)

    def __init__(self, title, content, status):
        self.title = title
        self.content = content
        self.status = status
编写后端路由

以登录为例子,在run.py 文件中,添加下列代码:

@app.route('/api/login', methods=['GET', 'POST'])
def login():
    username = request.values.get('username')
    password = request.values.get('password')
    if username == 'xxxxx' and password == 'xxxxx':
        res = {
            'isLogin': '0',
            'msg': 'success'
        }
        return jsonify(res)
    else:
        res = {
            'isLogin': '-1',
            'msg': 'fail'
        }
        return jsonify(res)
  • request.values.get可获取从前端传来的参数值
编写页面路由
  • 重写App.vue
<template>
  <div id="app">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

<style>

  width: 100%;
  height: 100%;
}
</style>

前端用的UI组件库是iview,如何在项目中进行配置,网上有很多资料,这边就不展开了

  • 开始写页面路由
    新建login_form.vue (在components路径下新建)只是引用了iview里面的Form组件
<template>
    <Form ref="formInline" :model="formInline" :rules="ruleInline" inline>
        <FormItem prop="user">
            <Input type="text" v-model="formInline.user" placeholder="Username">
                <Icon type="ios-person-outline" slot="prepend"></Icon>
            </Input>
        </FormItem>
        <FormItem prop="password">
            <Input type="password" v-model="formInline.password" placeholder="Password">
                <Icon type="ios-lock-outline" slot="prepend"></Icon>
            </Input>
        </FormItem>
        <FormItem>
            <Button type="primary" @click="sendToParent">Sign in</Button>
        </FormItem>
    </Form>
</template>
<script>
    export default {
        data () {
            return {
                formInline: {
                    user: '',
                    password: ''
                },
                ruleInline: {
                    user: [
                        { required: true, message: 'Please fill in the user name', trigger: 'blur' }
                    ],
                    password: [
                        { required: true, message: 'Please fill in the password.', trigger: 'blur' },
                        { type: 'string', min: 3, message: 'The password length cannot be less than 3 bits', trigger: 'blur' }
                    ]
                }
            }
        },
        methods: {

           sendToParent(){
               this.$emit("listenChildEvent", {username: this.formInline.user, password: this.formInline.password})
           }
        }
    }
</script>
  • 新建login.vue (在views路径下新建)
<template>
  <div class="login">
    <div class="login-con">
      <Card icon="log-in" title="欢迎登录" :bordered="false">
        <div class="form-con">
          <LoginForm v-on:listenChildEvent="checkLogin"/>
          <p class="login-tip">输入任意用户名和密码即可</p>
        </div>
      </Card>
    </div>
  </div>
</template>

<script>

import LoginForm from '@/components/Login_form.vue'
export default {
  name: 'Home',
  components: {
    LoginForm
  },

}
</script>
  • 配置路由:找到router>index.js 文件,添加login页面的路由

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)
import Home from '../views/Home.vue'
import About from '../views/About.vue'
import Login from '../views/Login.vue'
export default new Router({
  routes: [
    {
      path:"/",
      component:Home,
      name:"Home"
    },
    {
      path:"/about",
      component:About,
      name:"about"
    },
    {
      path: "/login",
      component: Login,
      name: "login"
    },

  ],
  mode:"history"
})

理论上,现在你可以访问localhost:8080/login页面了,如下:

博客系统之登录功能(前后端分离vue + flask)
连接前后端的桥梁

先下载模块:axios

npm install axios

接下来,到login.vue文件中,在scripts部分,填写调用后端路由的代码


import axios from "axios"

export default {
  name: 'Home',
  components: {
    LoginForm
  },

  methods: {
      checkLogin: function(data){
        console.log(data)

        var that = this
        var parms = new URLSearchParams()

        parms.append('username', data.username)
        parms.append('password', data.password)

        axios.post('http://localhost:5000/api/login', parms).then(function (res) {
        if (res.data.isLogin == '-1') {
          alert('用户名或密码错误')
        } else {
          sessionStorage.setItem('userInfo', JSON.stringify(res.data))
          that.$router.push({ path: '/' })
        }
      })

      }

  },

}

简单的登录功能就完成了,哦写到这,发现没用上数据库哈哈哈,登录我都直接写死了,没事的,之后的一些功能得用到数据库

目前的项目,非常简单且简陋的实现了登录,文章的增删查改功能,对源码感兴趣的同学 ,传送门在这里:https://github.com/herbyhabi/Blogsite-flask-vue

sqlalchemy的查询方式

    print(session.query(User).all())
    print(session.query(User.name, User.fullname).all())
    print(session.query(User, User.name).all())

    print(session.query(User).filter_by(name='user1').all())
    print(session.query(User).filter(User.name == "user").all())
    print(session.query(User).filter(User.name.like("user%")).all())

    print(session.query(User).filter(and_(User.name.like("user%"), User.fullname.like("first%"))).all())
    print(session.query(User).filter(or_(User.name.like("user%"), User.password != None)).all())

    print(session.query(User).filter("id>:id").params(id=1).all())

    print(session.query(User, Address).filter(User.id == Address.user_id).all())
    print(session.query(User).join(User.addresses).all())
    print(session.query(User).outerjoin(User.addresses).all())

    print(session.query(User.name, func.count('*').label("user_count")).group_by(User.name).all())
    print(session.query(User.name, func.sum(User.id).label("user_id_sum")).group_by(User.name).all())

    stmt = session.query(Address.user_id, func.count('*').label("address_count")).group_by(Address.user_id).subquery()
    print(session.query(User, stmt.c.address_count).outerjoin((stmt, User.id == stmt.c.user_id)).order_by(User.id).all())

    print(session.query(User).filter(exists().where(Address.user_id == User.id)))
    print(session.query(User).filter(User.addresses.any()))

Original: https://blog.csdn.net/qq_33303090/article/details/115966018
Author: 我叫何小北
Title: 博客系统之登录功能(前后端分离vue + flask)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/748156/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Cookie和Session的区别

    1、无状态HTTP 在了解cookie和session之前,我们需要了解HTTP的一个特点,叫做无状态,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在…

    Python 2023年6月12日
    075
  • pandas尾部添加一条_在pandas DataFrame的顶部添加一行

    在Pandas中,DataFrame是二维数据结构,即,数据以表格形式在行和列中对齐。我们可以使用列表,字典,系列和另一个DataFrame创建一个DataFrame。但是,当我们…

    Python 2023年8月7日
    062
  • flask前后端项目–实例-前端部分:-4-vue-Element Plus

    flask前后端项目–实例-前端部分:-4-vue-Element Plus组件添加事项 一、实验测试步骤 1.Element Plus添加 1.先备份App.VUE,…

    Python 2023年8月11日
    069
  • FHQ Treap 详解

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 弹尽粮绝,会员救园:…

    Python 2023年10月16日
    038
  • 如何用python排序并只输出前几个_python中DataFrame如何按列排序

    小编介绍过python中series排序的两种方法,那作为pandas中另一个数据结构DataFrame又是如何排序的呢?DataFrame排序形式有很多,本文以按列排序的形式向大…

    Python 2023年8月18日
    040
  • 十二pytest框架入门+allure报告

    pytest是一种自动化测试框架,pytest向下兼容unittest 命名规范 文件名以test开头,或者test结尾 类以Test开头,且类当中不能有init方法 方法或函数以…

    Python 2023年9月14日
    042
  • pandas 多折线图_pandas 数据可视化之折线图

    openpyxl+pandas coding=utf-8 import pandas as pd import time from openpyxl import Workbook…

    Python 2023年8月20日
    057
  • Pandas 操作数据(二)

    一、内置函数应用和映射 函数 用法 apply() 用于对DataFrame中的数据进行按行或者按列操作 map() 用于对Series中的每一个数据操作 applymap() 用…

    Python 2023年8月21日
    054
  • python数据可视化——Matplotlib

    前言 Matplotlib 是一个非常强大的 Python 画图工具 例如:线图; 散点图; 等高线图; 条形图; 柱状图; 3D 图形, 甚至是图形动画等等. python数据可…

    Python 2023年9月1日
    072
  • 联邦聚合(FedAvg、FedProx、SCAFFOLD)

    联邦聚合算法对比(FedAvg、FedProx、SCAFFOLD) 论文链接: FedAvg:Communication-Efficient Learning of Deep Ne…

    Python 2023年10月26日
    057
  • 神经网络算法基本原理及其实现

    目录 背景知识 人工神经元模型 激活函数 网络结构 工作状态 学习方式 BP算法原理 算法实现(MATLAB) 背景知识 在我们人体内的神经元的基本结构,相信大家并不陌生,看完下面…

    Python 2023年10月27日
    054
  • Python库-pandas详解

    Python库-pandas详解 1. pandas介绍 2. Series 3. DataFrame * 3.1 DataFrame结构 3.2 DataFrame属性与方法 3…

    Python 2023年8月22日
    059
  • 数字图像处理课程作业二-车牌识别

    写在最前 这是我大学课程的数字图像处理的实验报告,代码大部分是从网上直接复制使用,小部分是我自己改写的(例如matplotlib的使用),可以直接运行。内容比较详细,但是希望大家能…

    Python 2023年10月7日
    055
  • 使用Python为二年级的学生批量生成数学题

    文章目录 一.使用Python为二年级的学生批量生成数学题 * 1.1 背景 二.解决思路及其代码 三.排版及其打印 四.本文源码 一.使用Python为二年级的学生批量生成数学题…

    Python 2023年11月5日
    048
  • python面向对象编程

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Python 2023年5月23日
    073
  • Pygame对于视频播放的实现

    当我学习pygame的时候遇到了一个问题:pygame是否可以播放视频? 于是我找到了pygame的对应功能函数 video = pygame.movie.Movie(”) 但是…

    Python 2023年9月19日
    054
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球