数据库与前端的连接

mysql(菜品管理系统)


技术栈:后端 Node.js 数据库 mysql 前端 jquery

数据库的搭建

1.新建数据库,本次数据库名字为menu
2.添加表单menu_goods/menu_type/menu_user

  • 注意格式为_
    在这里插入图片描述

3.根据所需内容设计表样式
在这里插入图片描述

4.在与后端进行连接时,需要保持运行状态
在这里插入图片描述

后端node.js

本次使用express模块作为搭建

  • express/mysql/multer都是第三方模块,都需要下载后再进行使用
  • 图片一在这里插入图片描述
//experss框架
const express=require("express")
//express的使用
const app=express()
//fs模块
const fs=require("fs")
//mysql模块
const mysql=require("mysql")
//连接到mysql服务器
const db=mysql.createConnection({
	host:"localhost",//host主机地址本文用的是本机地址,也可以用公司ip192.168.1.109
	user:"root",//用户名
	password:"",//密码
	database:"menu"//链接的数据库	
})
//post文件全域操作
const bodyparser=require("body-parser")
app.use(bodyparser.urlencoded({
	extended:false
}))
//引入图片接受的模块multer
const multer=require("multer")
let m=multer({
	dest:"./public/images"//图片保存路
})
app.use(m.any())//全局接受图片



//post请求注册页面
app.post("/reg",(req,res)=>{
	let {username,upass}=req.body
	//fs模块重命名.因为multer模块在保存后不加图片后缀,导致图片无法显示。具体参考图片一所示
	// fs.rename()
	let oldname="./public/images/"+req.files[0].filename
	let newname=oldname+"."+req.files[0].originalname.split(".")[1]
	fs.rename(oldname,newname,(err,data)=>{
		if(err){
			console.log("数据访问失败")
		}else{
			console.log("成功")
		}
	})
	//注册逻辑,查询语句
	db.query("select * from menu_user where username='"+username+"'",(err,data)=>{
		if(err){
			console.log(err)
			res.send("服务器查询失败")
		}else{
			if(data.length>0){
				res.send("用户已存在,注册失败")
			}else{
				db.query("INSERT INTO `menu_user` (`id`, `username`, `upass`, `uimg`) VALUES (NULL, '"+username+"', '"+upass+"', '"+newname+"');",(err,data)=>{
				   if(err){
					   res.send({message:"服务器数据注册成功"})
				   }else{
					   res.send({message:"服务器数据插入成功"})
				   }					
				})
			}
		}		
	})
})
//post登录页面
app.post("/login",(req,res)=>{
	let {username,upass}=req.body
	//登陆语句
	// console.log(username)
	// console.log(upass)
	db.query("select * from menu_user where username='"+username+"'",(err,data)=>{
		if(err){
			res.send({message:"服务器端错误"})
		}else{
			// console.log(data,2222)
			if(data.length>0){
				db.query("select * from menu_user where upass='"+upass+"'",(err,data)=>{
					if(err){
						res.send({message:"服务器密码请求错误"})
					}else{
						if(data.length>0){
							res.send({message:"登录成功"})
						}else{
							res.send({message:"登录失败,密码错误"})
						}						
					}
				})
			}else{
				res.send({message:"没有此用户,请重新输入"})
			}
			
		}
	})
})
app.use(express.static("./public"))
app.listen(8080)

前端

本次使用的是formdata进行数据交互

<body>
		<form action="http://localhost:8080/login" method="post" enctype="multipart/form-data" id="form">
			<p>
				名字:<input type="text" name="username"/>
			</p>
		    <p>
				密码:<input type="text" name="upass"/>
			</p>
			<button>登录</button>
		</form>
	</body>
	<script>
	    //使用formData进行数据交互
	    var form=document.getElementById("form")
	    form.onsubmit=function(){
			//1.创建异步对象xml
	        let f2=new FormData(form)	        
	        let xhr=new XMLHttpRequest()
			//2.创建连接
	        xhr.open(form.method,form.action,true)
			//3.发送请求
	        xhr.send(f2)
			//数据交互监听请求的状态变化
	        xhr.onreadystatechange=function(){
	            if(xhr.status==200&&xhr.readyState==4){
	                let result=JSON.parse(xhr.responseText)
	                console.log(result)//返回数据
	            }
	        }	
	        return false//阻止默认事件
	    }
	</script>
<think>嗯,用户的问题是关于前端和后端连接数据库的不同之处。我需要先理解前端和后端各自的角色,以及它们在连接数据库时的方式有什么不同。首先,前端通常指的是用户直接交互的部分,比如网页或移动应用界面,而后端则是处理业务逻辑、数据存储和数据库交互的部分。 根据用户提供的引用,比如引用[3]提到Django如何关联本地数据库,还有引用[4]关于k8s中前端和后端如何连接数据库的例子,可能后端连接数据库更直接,而前端通常不直接连接数据库。需要确认的是,前端是否真的直接连接数据库,或者是否有安全风险。 比如,传统上,前端通过API后端通信,后端再数据库交互。这样可以避免在前端暴露数据库凭证,提高安全性。但有些情况下,比如使用Firebase这样的服务,前端可能会直接数据库通信,但需要配置安全规则。这时候需要区分不同的场景。 另外,引用[1]和[2]提到了后端处理数据库连接的方式,比如使用连接池、ORM框架等。而后端连接数据库通常需要处理连接管理、事务、安全性等,而前端可能使用HTTP请求或WebSocket后端交互,而不是直接连接数据库。 可能需要分点比较:安全性、技术实现、适用场景、性能等方面。同时要注意引用中的例子,比如Django使用ORM,k8s中的服务发现机制,说明后端连接更注重稳定性和资源管理。 还要考虑用户可能的实际需求,比如开发时的架构选择,或者安全性的考虑。需要解释为什么前端不推荐直接连接数据库,比如跨域问题、暴露敏感信息等。 总结下来,前端连接数据库的方式较少,且需要特定条件,而后端有更多成熟的方案和最佳实践。需要明确两者的主要区别,并举例说明,帮助用户理解不同场景下的应用。</think>### 前端后端连接数据库的差异分析 #### **1. 安全性** - **前端连接数据库** 若直接在前端(如浏览器、移动端)连接数据库,需将数据库地址、账号、密码等敏感信息暴露给客户端,易被恶意攻击者截获[^3]。例如,前端JavaScript代码若直接调用MySQL连接,可能导致SQL注入或数据泄露风险。 例外场景:部分无服务器架构(如Firebase)允许前端通过SDK直接访问数据库,但需依赖严格的安全规则(如权限控制)[^4]。 - **后端连接数据库** 后端通过服务层(如API)间接操作数据库,敏感信息存储于服务器环境变量或配置文件中,客户端无法直接获取。例如Django通过`settings.py`配置数据库连接,并通过ORM(如Django ORM)提供安全的数据操作接口[^2]。 --- #### **2. 技术实现** - **前端连接数据库** - **直接连接(不推荐)**:需在前端代码中硬编码数据库连接信息,例如使用JavaScript的`mysql`库: ```javascript // 高风险示例!实际开发中应避免 const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '123456', database: 'test' }); ``` - **间接访问(推荐)**:通过HTTP请求调用后端API,例如使用`fetch`: ```javascript fetch('/api/data') .then(response => response.json()) .then(data => console.log(data)); ``` - **后端连接数据库** - **连接池管理**:后端通常使用连接池(如Java的HikariCP、Python的`psycopg2.pool`)复用数据库连接,避免频繁建立/断开连接的开销[^1]。 - **ORM框架**:通过对象关系映射(如Django ORM、SQLAlchemy)将数据库表映射为类,简化SQL操作并防止注入攻击[^2]。 ```python # Django ORM示例 from myapp.models import User users = User.objects.filter(age__gt=18) ``` --- #### **3. 适用场景** - **前端直接连接数据库** 仅适用于轻量级、低安全要求的场景(如本地原型开发),或依赖特定云服务(如Firebase、Supabase)的实时数据库。 - **后端连接数据库** 适用于企业级应用,需处理复杂业务逻辑、事务管理(如银行转账的ACID特性)和高并发请求的场景。 --- #### **4. 性能扩展性** - **前端连接数据库** 直接连接可能导致数据库暴露于公网,增加被攻击风险,且客户端数据库的频繁交互会降低性能(如跨地域延迟)。 - **后端连接数据库** 后端可通过缓存(如Redis)、负载均衡(如Nginx)和分布式数据库(如MySQL集群)优化性能,同时利用服务发现机制(如k8s DNS)实现动态扩缩容。 --- ### **总结对比表** | 维度 | 前端连接数据库 | 后端连接数据库 | |--------------|------------------------------------|------------------------------------| | **安全性** | 低(敏感信息暴露) | 高(信息隔离) | | **技术实现** | 直接调用或依赖云服务SDK | 连接池、ORM、API封装 | | **适用场景** | 原型开发、特定云服务 | 企业应用、高并发业务 | | **性能优化** | 受限(客户端网络条件) | 灵活(缓存、负载均衡、分布式) | ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值