Vue3+node.js实现登录

文章目录

    • 前端代码实现
    • 后端代码实现
      • 跨域处理

前端代码实现

效果图
在这里插入图片描述
前端代码实现

<template><div class="login-container"><el-card class="login-card"><template #header><div class="card-header"><span>登录</span></div></template><el-form label-width="80px" ref="formRef" :model="formData" :rules="rules"><el-form-item label="用户名" prop="username"><el-input v-model="formData.username" placeholder="请输入用户名" ></el-input></el-form-item><el-form-item label="密码"  prop="password"><el-input v-model="formData.password" type="password" placeholder="请输入密码"></el-input></el-form-item><el-form-item><el-button style="width: 100%;"  @click="handleSubmit"  type="primary">登录</el-button></el-form-item><el-form-item ><el-button link type="info" @click="toggleToLogin"  >没有账号?去注册</el-button></el-form-item></el-form></el-card></div></template><script setup>import { ElMessage } from 'element-plus';import axios from 'axios';import { reactive, ref } from 'vue';//初始化const formRef = ref(null)//跳转注册页面const toggleToLogin = () => {location.href = '/register'}//表单数据const formData = ref({username:'',password:''}) 
// 修正校验规则
const rules = reactive({username:[{required: true, message: '请输入用户名', trigger: 'blur'},{min: 3, max: 20, message: '长度3到20个字符', trigger: 'blur'} ],password:[{required: true, message: '请输入密码', trigger: 'blur'},{min: 3, max: 20, message: '长度在3到20个字符', trigger: 'blur'}]
})// 登录处理
const handleSubmit = async () => {const form = formRef.valueif(!form) return;try {await form.validate();const res = await axios.post('http://localhost:3030/user/login', formData.value);if(res.data.code === 200) {  ElMessage.success( '登录成功');location.href = '/manager/home';} else {ElMessage.error( '登录失败');}} catch (error) {console.error('登录请求错误', error);ElMessage.error(error.response?.data?.message || '登录失败,请稍后重试');}
}</script><style scoped>.login-container {min-height: 100vh;display: flex;background-color: aqua;align-items: center;justify-content: center;}.login-card {width: 400px;border-radius: 8px;}.card-header {font-size: 24px;font-weight: bold;text-align: center;}</style>

后端代码实现

创建文件夹router,在router目录下创建path.js文件

//登录
router.post('/login', async (req,res)=>{try {const {username, password} = req.body// 验证参数if(!username?.trim() || !password?.trim()){  // 增加trim()检查return res.status(400).json({code: 400,message: '用户名和密码不能为空'})}const sql = 'select * from user where username = ? limit 1'const [rows] = await pool.query(sql,[username])if(rows.length === 0){return res.status(401).json({code: 401,message: '用户名或密码错误'  })}const user = rows[0]if(user.password !== password){return res.status(401).json({code: 401,message: '用户名或密码错误'})} // 删除敏感信息delete user.passwordsuccess(res, {code: 200,user,message: '登录成功'})} catch (error) {handleError(res, error)}
})

跨域处理

前端跨域,在vite.config.js中添加跨域请求

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'// https://vite.dev/config/
export default defineConfig({plugins: [vue(),vueDevTools(),],server:{proxy:{'/api':{target:'http://localhost:3030',changeOrigin:true,rewrite:(path) => path.replace(/^\/api/,'')}}},resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))},},
})

后端跨域,创建app.js,导入路由

const express = require('express')
const cors = require('cors')
const router = require('./router/path')const app = express()//解析数据
app.use(express.json())
app.use(express.urlencoded({extended:true}))
//跨域处理
app.use(cors({origin:['http://localhost:5173'],methods:['GET','POST','PUT','DELETE'],credentials:true,allowedHeaders:['Content-Type']}
))app.use('/user',router)const PORT = process.env.PORT || 3030
app.listen(PORT,()=>{console.log(`服务正在运行...端口为${PORT}`)
})

实现注册界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480403.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins 2.346.1最后一个支持java8的版本搭建

1.jenkins下载 下载地址&#xff1a;Index of /war-stable/2.346.1 2.部署 创建目标文件夹&#xff0c;移动到指定位置 创建一个启动脚本&#xff0c;deploy.sh #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/opt/projects/jenkins # 服务名称。同时约定部…

Windows10+VirtualBox+Ubuntu:安装虚拟机VirtualBox,虚拟机中安装Ubuntu

一、需求 在Windows10系统中&#xff0c;安装虚拟机VirtualBox&#xff0c;VirtualBox中安装Ubuntu桌面版。 二、环境准备 系统环境 Windows10 内存&#xff1a;8G 虚拟化 虚拟机的运行&#xff0c;如果需要Windows系统开启虚拟化&#xff0c;可以通过BIOS设置。 “虚拟…

pcb元器件选型与焊接测试时的一些个人经验

元件选型 在嘉立创生成bom表&#xff0c;对照bom表买 1、买电容时有50V或者100V是它的耐压值&#xff0c;注意耐压值 2、在买1117等降压芯片时注意它降压后的固定输出&#xff0c;有那种可调降压比如如下&#xff0c;别买错了 贴片元件焊接 我建议先薄薄的在引脚上涂上锡膏…

【漏洞复现】|百易云资产管理运营系统/mobilefront/c/2.php前台文件上传

漏洞描述 湖南众合百易信息技术有限公司&#xff08;简称&#xff1a;百易云&#xff09;成立于2017年是一家专注于不动产领域数字化研发及服务的国家高新技术企业&#xff0c;公司拥有不动产领域的数字化全面解决方案、覆盖住宅、写字楼、商业中心、专业市场、产业园区、公建、…

重学 Android 自定义 View 系列(八):星星评分控件(RatingBar)

前言 本节实现一个常见的星星评分控件&#xff0c;广泛应用于各种评价类应用中&#xff0c;比如电影评分、商品评价等。难度不大&#xff0c;直接开搂&#xff01; 最终效果如下&#xff1a; 1. 效果分析 显示若干颗星星&#xff08;默认为5颗&#xff0c;可根据属性配置&a…

【力扣热题100】—— Day3.相交链表

被你改变的那部分我&#xff0c;代替你&#xff0c;永远与我站在一起 —— 24.11.28 160. 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 …

SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD

目录 一、OFD 简介1.1 什么是 OFD&#xff1f;1.2 什么是 版式文档&#xff1f;1.3 为什么要用 OFD 而不是PDF&#xff1f; 二、ofdrw 简介2.1 定义2.2 Maven 依赖2.3 ofdrw 的 13 个模块 三、PDF/文本/图片 转 OFD&#xff08;ofdrw-conterver&#xff09;3.1 介绍&#xff1a…

cesium 3Dtiles变量

原本有一个变亮的属性luminanceAtZenith&#xff0c;但是新版本的cesium没有这个属性了。于是 let lightColor 3.0result._customShader new this.ffCesium.Cesium.CustomShader({fragmentShaderText:void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial mate…

Java 语言的起源发展与基本概念(JDK,JRE,JVM)

Java语言的起源 源起 Java语言最初是由Sun Microsystems公司&#xff08;该公司于2009年被Oracle公司收购&#xff09;开发的一种编程语言。其创造者是詹姆斯高斯林&#xff08;James Gosling&#xff09;&#xff0c;他是一位加拿大计算机科学家。其前身名为Oak&#xff08;橡…

Mac安装及合规无限使用Beyond Compare

文章目录 Beyond CompareBeyond Compare简介Beyond Compare安装Beyond Compare到期后继续免费使用 Beyond Compare Beyond Compare简介 Beyond Compare 是一款由 Scooter Software 开发的文件和文件夹比较工具。它主要用于对比两个文件或文件夹之间的差异&#xff0c;并支持文…

使用 Spring AI + Elasticsearch 让 RAG 变得简单

作者&#xff1a;来自 Elastic Laura Trotta 使用私人数据定制你的人工智能聊天机器人体验。 Spring AI 最近将 Elasticsearch 添加为向量存储&#xff0c;Elastic 团队为其提供了优化。我们很高兴展示使用 Spring AI 和 Elasticsearch 向量数据库&#xff08;vector database&…

C语言:深入理解指针

一.内存和地址 我们知道计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中&#xff0c;那我们买电脑的时候&#xff0c;电脑上内存是 8GB/16GB/32GB 等&#xff0c;那这些内存空间…

Spring Boot整合EasyExcel

文章目录 EasyExcel简介Spring Boot整合EasyExcel一、单sheet写操作二、多sheet写数据三、读操作 EasyExcel简介 1、EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel&#xff08;没有一次性将数据读取到内存…

Windsurf可以上传图片开发UI了

背景 曾经羡慕Cursor的“画图”开发功能&#xff0c;这不Windsurf安排上了。 Upload Images to Cascade Cascade now supports uploading images on premium models Ask Cascade to build or tweak UI from on image upload New keybindings Keybindings to navigate betwe…

Linux中使用ping提示“未知的名称或服务”

Linux中使用ping提示“未知的名称或服务” 问题&#xff1a;在linux系统中使用ping、telnet命令提示“未知的名称或服务”或 bad address。以centos系统为例&#xff1a; 问题原因&#xff1a; 1、未安装ping服务 2、操作系统未设置DNS&#xff08;尝试ping IP地址&#xff0…

【C++】深入解析 using namespace std 语句

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;什么是 std&#xff1f;&#x1f4af;using namespace std; 的作用&#x1f4af;为什么需要 std 命名空间&#xff1f;&#x1f4af;using namespace std; 的优缺点优点缺点…

Android音频框架总结

1、AudioFlinger&#xff1a;接收多个APP的数据&#xff0c;合并下发&#xff1b;是策略的执行者&#xff0c;例如具体如何与音频设备通信&#xff0c;如何维护现有系统中的音频设备&#xff0c;以及多个音频流的混音如何处理等等都得由它来完 成。 AudioFlinger主要包含3个主…

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置&#xff08;构建后发送邮件&#xff09; 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …

BASLER工业相机维修不能触发拍照如何处理解决这个问题

BASLER工业相机维修不能触发拍照如何处理解决这个问题&#xff1f;最近遇到挺多工业相机维修咨询这个不能触发拍照的案例&#xff0c;所以今天优米佳维修的技术就抽空整理了这篇关于BASLER相机不能触发拍照的处理方法分享给大家。 当碰到巴斯勒工业相机不能触发拍照的问题&…

68000汇编实战01-编程基础

文章目录 简介产生背景应用领域 语言学习EASy68K帮助文档IDE使用 编程语言commentslabels开始标签指令标签位置标签 opcode 操作码常用操作码数据传送算术运算逻辑运算控制流分支跳转地址跳转子程序跳转 位操作比较堆栈操作 IO操作码其他操作码 directives 指令DC指令EQU 指令S…