Python(Falsk) + React && Golang(Gin) + Vue 全栈开发的最佳实践

        

        前面分别讲了 Python(Falsk) React Golang(Gin)Vue(Element),现在整体的给大家汇报一下,这个是简单搭建的demo,后面的添砖加瓦需要自己动手咯,有不明白的可以参考一下小编前面的文章,也许会给大家有答疑解惑的帮助

Python(Falsk):

https://blog.youkuaiyun.com/masterphp/article/details/136290855
https://blog.youkuaiyun.com/masterphp/article/details/138627802

React:

https://blog.youkuaiyun.com/masterphp/article/details/139242705

Golang(Gin):

https://blog.youkuaiyun.com/masterphp/article/details/129757434
https://blog.youkuaiyun.com/masterphp/article/details/130877001
https://blog.youkuaiyun.com/masterphp/article/details/131493155
https://blog.youkuaiyun.com/masterphp/article/details/131523360
https://blog.youkuaiyun.com/masterphp/article/details/132208407
https://blog.youkuaiyun.com/masterphp/article/details/132307220
https://blog.youkuaiyun.com/masterphp/article/details/132414796

Vscode的安装:

        首先讲一下Vscode的安装(用于React和Vue),本次完成项目的搭建,借助了一个工具:通意灵码,通意灵码:基于阿里云提供的一个服务,说的明白一点就是一个智能代码辅助工具,实际上用下来,个人觉得和Chatgpt平分秋色,各有各的优点与弊端,所以建议大家两个都去安装一下,适合自己的才是最好的

node14版本以上安装:

1.安装13版本
2.下载14版本zip(覆盖安装目录)
3.设置环境变量:NODE_SKIP_PLATFORM_CHECK :1
4.命令行使用 node -v 指令和npm -v ,检查当前 node 版本是否更新成功
5.设置全局模块存放路径和缓存文件夹(新建:node_global文件夹 + node_cache文件夹)
6.npm config set prefix "E:\node\node_global"    npm config set cache "E:\node\node_cache"
7.更换淘宝镜像(npm config set registry=https://registry.npm.taobao.org)
8.查看配置是否成功(npm config list)
9.设置环境变量: C:\Users\你的用户名\AppData\Roaming\npm 修改为 你的安装目录\node_global
10.新建环境变量(NODE_PATH :你的安装目录\node_global\node_modules)
11.新建环境变量(Path:%NODE_PATH%)

npm命令:

react-router-dom 安装命名(路由包):

npm install react-router-dom


antdesign安装命令(前端UI):

npm install antd --save
npm add antd@^4.24.2

使antdesign用babel-plugin-import插件可以实现按需加载:

npm install babel-plugin-import --save-dev


查看typescript版本:

npm view typescript version

CSS样式(5.0版本以下)

import  'antd/dist/antd.min.css'

CSS样式(5.0版本以上)

import 'antd/dist/antd.css'

cnpm安装

安装命令: npm install -g cnpm --registry=https://registry.npm.taobao.org 命令行下输入: cnpm -v 验证是否安装成功。


npm升级命令

npm install -g tar
npm uninstall fstream 


安装react:

1.npm install -g create-react-app(或者 npx create-react-app my-app)
2.create-react-app my-app(其中my-app是你的项目名称)
3.进入创建的项目目录:cd my-app
4.启动开发服务器:npm start


切换镜像:

npm config set registry= https://registry.npmjs.org/
npm config set registry=https://registry.npm.taobao.org

        Python使用的工具的PaCharm,使用这个工具的话需要激活码,所以大家懂的,有工具的,另外来说前期一个月的时间建议大家关闭代码提示,后期可以开启,主要是前期关闭可以加强关联记忆

        Golang使用的工具是Goland,其实使用Vscode也是非常好用的,看个人习惯,当然这个也是需要激活码的,所以嫌麻烦的同学可以直接上Vscode

Golang(Gin) + Vue:项目结构

GIN框架主入口:

package main

import (
	//GIN框架引入
	"github.com/gin-gonic/gin"
	//自定义模块引入
	"project/common"
	user "project/controller"
)

//初始化
func init()  {
	//数据库初始化
	common.Dbinit()
}

func main()  {
	//GIN框架初始化
	r := gin.Default()
	//设置安全访问
	r.SetTrustedProxies([]string{"127.0.0.1"})
	//定义常量
	r.Static("/source", "static")
	//设置模版
	r.LoadHTMLGlob("template/*")

	/*******************登录页开始***********************/
	r.GET("/login", func(c *gin.Context) {
		c.HTML(200,"login.html", gin.H{"title": "登录"})
	})

	r.POST("/logindo", func(context *gin.Context) {
		username := context.PostForm("username")
		password := context.PostForm("password")
		//判断
		if(username == "12" && password == "34"){
			//todo 设置session

			//返回值
			context.JSON(200, gin.H{
				"code": 0,
				"message":"成功",
			})
		}else{
			context.JSON(200, gin.H{
				"code": 1,
				"message":"参数错误",
			})
		}
	})
	/*******************登录页结束***********************/

	/*******************首页开始***********************/
	r.GET("/index", func(context *gin.Context) {
		context.HTML(200,"index.html",gin.H{"title": "首页"})
	})

	r.GET("/indexlist",user.Userlist)
	/*******************首页结束***********************/

	/*******************用户开始***********************/
	r.GET("/user_add", func(context *gin.Context) {
		context.HTML(200,"user_add.html",gin.H{"title":"新增用户"})
	})

	r.POST("/user_add_do",user.User_add_do)

	//用户编辑
	r.GET("/user_edit", func(context *gin.Context) {
		id := context.Query("id")
		context.HTML(200,"user_edit.html",gin.H{"title":"编辑用户","id":id})
	})

	r.POST("/user_info",user.User_info)

	//操作编辑
	r.POST("/user_edit_do",user.User_edit_do)

	r.POST("/user_del", user.User_del)
	/*******************用户结束***********************/

	/*******************文件上传开始***********************/
	r.POST("/imgupload",common.Imgupload)

	/*******************文件上传结束***********************/

	r.Run("localhost:8080")
}

数据库初始化:

package common

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

//定义全局变量
var  DB *gorm.DB

// 连接数据库的函数,返回一个 *sql.DB 对象以及一个 error 对象 (方法名记得大写,才可以被外部引用)。
func Dbinit(){
	dsn := "root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	DB,_ = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	fmt.Print("connect success")
}

公共方法:

package common

import (
	"github.com/gin-gonic/gin"
)

// 定义一个结构体来映射分页查询的数据
type Pagination struct {
	// 当前页码
	Page int `json:"page"`
	// 每页数量
	PageSize int `json:"pageSize"`
	// 总页数
	TotalPages int `json:"totalPages"`
	// 总记录数
	TotalCount int `json:"totalCount"`
}


// 定义一个结构体来映射返回的数据
type Response struct {
	// 状态码
	Code int `json:"code"`
	// 数据
	Data interface{} `json:"data"`
	// 消息
	Msg string `json:"msg"`
}

type Publicmodel struct {
	ID uint `json:"id" gorm:"primaryKey"`
}

//文件上传
func Imgupload(context *gin.Context)  {
	// 单个文件(判断上传的文件是否为空)
	file, err := context.FormFile("file")
	if err != nil {
		context.JSON(500, gin.H{
			"message": err.Error(),
		})
		return
	}
	//文件上传路径
	dst := "./static/img/upload/" + file.Filename
	// 上传文件到指定的目录
	context.SaveUploadedFile(file, dst)
	//返回数据
	context.JSON(200, gin.H{
		"message": "上传成功",
		"filename": file.Filename,
		"raw": dst,
	})
}

登录页面:

<style>
    @import url("/source/index.css");
    .el-input__inner{width: 80%!important;}
    #app{width: 100%;height: 100%;background: url(/source/img/loginbg.png) #F5F5F5 no-repeat;background-size: 70%;position: absolute}
    #content{ box-shadow: 22px 22px 0px #ebebeb;margin-top: 10%;z-index: 999;width: 475px;padding: 2rem;
        box-sizing: border-box;background-color: #fff;border-radius: 5px;position: relative;left: 60%;height: 30%}
</style>

<script src="/source/vue.js"></script>
<script src="/source/index.js"></script>
<script src="/source/axios.min.js"></script>

<div id="app">
    <div id="content">
        <el-form ref="form" :model="form" label-width="80px" >
            <el-form-item label="账号">
                <el-input type="text" v-model="form.username" autocomplete="off"  plac
<think>我们正在构建一个基础登录页面,使用Flask作为后端框架,Vue.js作为前端框架,MySQL作为数据库。主要步骤包括:1.环境搭建2.后端开发Flask):-创建Flask项目-连接MySQL数据库-创建用户模型-实现登录API3.前端开发Vue.js):-创建Vue.js项目-设计登录表单组件-使用axios发送登录请求4.前后端集成与测试注意:由于这是一个基础示例,我们将使用最简单的实现方式,不考虑生产环境的安性和优化。下面我们逐步进行。###1.环境搭建首先,确保已安装PythonNode.js和MySQL。创建项目目录,例如`flask-vue-login`,并在其中创建两个子目录:`backend`和`frontend`。####后端环境(Flask)进入`backend`目录,创建虚拟环境并安装所需包:```bashpython-mvenvvenvsourcevenv/bin/activate#Linux/Mac#或venv\Scripts\activate#Windowspipinstallflaskflask-corsflask-mysqldb```注意:`flask-mysqldb`依赖于系统上的MySQL开发库,请确保已安装。####前端环境(Vue.js)进入`frontend`目录,使用VueCLI创建项目:```bashvuecreate.```选择默认配置或手动选择(确保选中Router,因为后续可能用到)。然后安装axios:```bashnpminstallaxios```###2.后端开发####创建Flask项目在`backend`目录下创建`app.py`文件。####连接MySQL数据库我们将使用`flask-mysqldb`扩展来连接MySQL。首先,在MySQL中创建数据库和用户表。登录MySQL,执行:```sqlCREATEDATABASElogin_db;USElogin_db;CREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULL,passwordVARCHAR(50)NOTNULL);INSERTINTOusers(username,password)VALUES('test','test123');```在`app.py`中配置数据库连接并创建Flask应用:```pythonfromflaskimportFlask,jsonify,requestfromflask_mysqldbimportMySQLfromflask_corsimportCORSapp=Flask(__name__)CORS(app)#允许跨域请求#配置MySQLapp.config['MYSQL_HOST']='localhost'app.config['MYSQL_USER']='root'#替换为你的MySQL用户名app.config['MYSQL_PASSWORD']='password'#替换为你的MySQL密码app.config['MYSQL_DB']='login_db'mysql=MySQL(app)@app.route('/')defindex():return"Hello,World!"if__name__=='__main__':app.run(debug=True)```####实现登录API添加一个路由`/login`,接收POST请求,验证用户名和密码。```python@app.route('/login',methods=['POST'])deflogin():data=request.get_json()username=data.get('username')password=data.get('password')ifnotusernameornotpassword:returnjsonify({'message':'Missingusernameorpassword'}),400cur=mysql.connection.cursor()cur.execute("SELECT*FROMusersWHEREusername=%sANDpassword=%s",(username,password))user=cur.fetchone()cur.close()ifuser:returnjsonify({'message':'Loginsuccessful'}),200else:returnjsonify({'message':'Invalidcredentials'}),401```###3.前端开发在`frontend`目录中,我们将创建一个登录组件。####创建登录组件在`src/components`目录下创建`Login.vue`:```vue<template><div><h2>Login</h2><form@submit.prevent="handleSubmit"><div><labelfor="username">Username:</label><inputtype="text"id="username"v-model="username"required></div><div><labelfor="password">Password:</label><inputtype="password"id="password"v-model="password"required></div><buttontype="submit">Login</button></form><pv-if="message">{{message}}</p></div></template><script>importaxiosfrom'axios';exportdefault{data(){return{username:'',password:'',message:''};},methods:{asynchandleSubmit(){try{constresponse=awaitaxios.post('http://localhost:5000/login',{username:this.username,password:this.password});this.message=response.data.message;}catch(error){if(error.response){this.message=error.response.data.message;}else{this.message='Anerroroccurred';}}}}};</script>```####在App.vue中使用登录组件修改`src/App.vue`,引入登录组件:```vue<template><divid="app"><Login/></div></template><script>importLoginfrom'./components/Login.vue'exportdefault{name:'App',components:{Login}}</script>```###4.集成与测试1.启动后端:在`backend`目录下运行`pythonapp.py`。2.启动前端:在`frontend`目录下运行`npmrunserve`。访问前端地址(通常是`http://localhost:8080`),输入用户名`test`和密码`test123`,点击登录,应该会看到成功消息。注意:由于前端运行在8080端口,后端运行在5000端口,存在跨域问题。我们已经使用了`flask-cors`来处理,所以可以正常请求。以上就是一个基础登录页面的实现。§§相关问题§§1.如何提高登录功能的安性(例如使用密码哈希、JWT等)?2.如何实现用户注册功能?3.如何在前端使用VueRouter进行页面跳转(例如登录成功后跳转到主页)?4.如何将Flask后端和Vue前端部署到生产环境?</think>### 使用 Flask + Vue + MySQL 实现基础登录功能 以下是完整的实现方案,分为后端(Flask)、前端(Vue)和数据库(MySQL)三部分: --- ### 一、后端开发Flask) #### 1. 项目结构 ```bash backend/ ├── app.py ├── requirements.txt └── .env ``` #### 2. 安装依赖 ```bash pip install flask flask-cors flask-mysqldb python-dotenv ``` #### 3. 数据库配置 (`.env`) ```env MYSQL_HOST=localhost MYSQL_USER=root MYSQL_PASSWORD=your_password MYSQL_DB=login_db ``` #### 4. Flask 核心代码 (`app.py`) ```python from flask import Flask, jsonify, request from flask_mysqldb import MySQL from flask_cors import CORS import os from dotenv import load_dotenv load_dotenv() # 加载环境变量 app = Flask(__name__) CORS(app) # 解决跨域问题 # MySQL配置 app.config['MYSQL_HOST'] = os.getenv('MYSQL_HOST') app.config['MYSQL_USER'] = os.getenv('MYSQL_USER') app.config['MYSQL_PASSWORD'] = os.getenv('MYSQL_PASSWORD') app.config['MYSQL_DB'] = os.getenv('MYSQL_DB') mysql = MySQL(app) @app.route('/login', methods=['POST']) def login(): data = request.get_json() username = data['username'] password = data['password'] cur = mysql.connection.cursor() cur.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password)) user = cur.fetchone() cur.close() if user: return jsonify({'status': 'success', 'message': '登录成功'}) else: return jsonify({'status': 'error', 'message': '用户名或密码错误'}), 401 if __name__ == '__main__': app.run(debug=True) ``` --- ### 二、数据库设置(MySQL) #### 1. 创建数据库和表 ```sql CREATE DATABASE login_db; USE login_db; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL ); -- 插入测试用户 INSERT INTO users (username, password) VALUES ('user1', 'password123'), ('user2', 'abc@123'); ``` --- ### 三、前端开发Vue.js) #### 1. 项目结构 ```bash frontend/ ├── src/ │ ├── components/ │ │ └── Login.vue │ ├── App.vue │ ├── main.js └── package.json ``` #### 2. 安装依赖 ```bash npm install axios vue-router ``` #### 3. 登录组件 (`Login.vue`) ```vue <template> <div class="login-container"> <h2>用户登录</h2> <form @submit.prevent="handleSubmit"> <div class="form-group"> <label>用户名</label> <input type="text" v-model="username" required> </div> <div class="form-group"> <label>密码</label> <input type="password" v-model="password" required> </div> <button type="submit">登录</button> <p v-if="message" :class="statusClass">{{ message }}</p> </form> </div> </template> <script> import axios from 'axios'; export default { data() { return { username: '', password: '', message: '', status: '' } }, computed: { statusClass() { return this.status === 'success' ? 'success' : 'error'; } }, methods: { async handleSubmit() { try { const response = await axios.post('http://localhost:5000/login', { username: this.username, password: this.password }); this.message = response.data.message; this.status = response.data.status; if (response.data.status === 'success') { // 登录成功后的操作,例如路由跳转 this.$router.push('/dashboard'); } } catch (error) { this.message = '登录请求失败'; this.status = 'error'; } } } } </script> <style scoped> .login-container { max-width: 400px; margin: 0 auto; padding: 20px; } .form-group { margin-bottom: 15px; } .success { color: green; } .error { color: red; } </style> ``` #### 4. 路由配置 (`main.js`) ```javascript import Vue from 'vue' import App from './App.vue' import VueRouter from 'vue-router' import Login from './components/Login.vue' Vue.use(VueRouter); Vue.config.productionTip = false; const routes = [ { path: '/', component: Login }, { path: '/dashboard', component: () => import('./components/Dashboard.vue') } ]; const router = new VueRouter({ routes }); new Vue({ router, render: h => h(App), }).$mount('#app'); ``` --- ### 四、系统运行流程 1. **启动后端**: ```bash cd backend python app.py # 监听5000端口 ``` 2. **启动前端**: ```bash cd frontend npm run serve # 监听8080端口 ``` 3. **访问界面**: 打开浏览器访问 `http://localhost:8080` --- ### 关键注意事项 1. **跨域处理**: - 后端使用 `flask-cors` 允许前端跨域请求 - 生产环境需配置更严格的安策略 2. **密码安**: ```python # 实际项目中应使用密码哈希 from werkzeug.security import generate_password_hash, check_password_hash # 存储时 hashed_pw = generate_password_hash(password) # 验证时 if check_password_hash(stored_hash, input_password): # 验证通过 ``` 3. **会话管理**: - 建议使用 JWT(JSON Web Token)或 Flask-Session 管理用户会话 - 示例 JWT 实现: ```python import jwt from datetime import datetime, timedelta # 生成Token token = jwt.encode({ 'user': username, 'exp': datetime.utcnow() + timedelta(hours=1) }, app.config['SECRET_KEY']) ``` --- ### 部署建议 1. **后端部署**: - 使用 Gunicorn + Nginx 部署 Flask ```bash gunicorn -w 4 app:app ``` 2. **前端部署**: ```bash npm run build # 将dist目录部署到Nginx ``` 3. **数据库优化**: - 为 `username` 字段添加索引 - 使用连接池管理数据库连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值