Vue.js+Element UI 登录界面开发详解【附源码】

news2025/3/19 9:19:03

成果图:


一、技术架构解析

本登录模块采用前后端分离架构,前端基于Vue.js+Element UI实现交互逻辑,主要包含以下技术要点:

  1. 组件化开发 - 采用单文件组件形式组织代码
  2. 响应式设计 - 实现多终端适配
  3. 状态管理 - 使用sessionStorage维护会话状态
  4. 安全验证 - 前后端双重表单校验机制

二、核心实现原理

1. 数据驱动视图

通过Vue的响应式系统实现数据绑定:

data() {
  return {
    loginForm: {
      username: '',
      password: ''
    }
  }
}
  • 表单输入与loginForm对象双向绑定
  • 数据变更自动触发视图更新

2. 表单验证机制

rules: {
  username: [
    { required: true, message: '请输入用户名' },
    { min: 3, max: 20, message: '长度3-20字符' }
  ]
}
  • 实时校验输入合法性
  • 支持多种验证类型(必填、长度、正则等)

3. 登录流程控制

this.$axios.post('/user/login', loginData)
  .then(res => {
    sessionStorage.setItem("CurUser", JSON.stringify(res.data.user));
    this.$router.replace('/Index');
  })
  • 使用axios发送POST请求
  • 会话存储采用sessionStorage
  • 路由跳转通过Vue Router实现

三、关键技术点详解

1. 防重复提交设计

confirm_disabled: false, // 状态控制

// 请求开始
this.confirm_disabled = true; 

// 请求结束
.finally(() => {
  this.confirm_disabled = false;
})
  • 按钮禁用状态联动
  • 确保请求生命周期控制

2. 异常处理机制

.catch(error => {
  this.$message.error('服务器连接异常');
})
  • 网络异常统一处理
  • Element UI消息提示组件

3. 路由守卫集成

this.$router.replace('/Index');
  • 登录成功替换当前路由
  • 避免回退到登录页

四、完整代码

<template>
    <div class="loginBody">
        <div style="width:97%;text-align:center;color:white;padding: 100px 100px 0 0;font-size:22px;">
            <h1>新能源汽车充电监管系统</h1>
        </div>

        <div class="loginDiv">
            <div class="login-content">
                <h1 class="login-title">用户登录</h1>
                <el-form :model="loginForm" label-width="100px" :rules="rules" ref="loginForm" style="margin-left: 10px">
                    <el-form-item label="用户名" prop="username">
                        <el-input style="width: 200px" type="text" v-model="loginForm.username"
                                  autocomplete="off" size="medium"></el-input>
                    </el-form-item>
                    <el-form-item label="密码" prop="password">
                        <el-input style="width: 200px" type="password" v-model="loginForm.password"
                                  show-password autocomplete="off" size="medium" @keyup.enter.native="confirm"></el-input>
                    </el-form-item>
                    <el-form-item>
                        <el-button type="primary" size="medium" @click="confirm" :disabled="confirm_disabled">登 录</el-button>
                        <el-button type="primary" size="medium" @click="$router.push('/Register')" style="margin-left: 50px">注 册</el-button>
                    </el-form-item>
                </el-form>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    name: "Login",
    data() {
        return {
            confirm_disabled: false,
            loginForm: {
                username: '',  // 字段名改为username
                password: ''
            },
            rules: {
                username: [    // 对应字段修改
                    { required: true, message: '请输入用户名', trigger: 'blur' },
                    { min: 3, max: 20, message: '长度在3到20个字符', trigger: 'blur' }
                ],
                password: [
                    { required: true, message: '请输入密码', trigger: 'blur' }
                ]
            }
        }
    },
    methods: {
        confirm() {
            this.confirm_disabled = true;
            this.$refs.loginForm.validate((valid) => {
                if (valid) {
                    // 构造符合新接口要求的请求体
                    const loginData = {
                        username: this.loginForm.username,
                        password: this.loginForm.password
                    };

                    this.$axios.post(this.$httpUrl + '/user/login', loginData)
                        .then(res => res.data)
                        .then(res => {
                            if (res.code === 200) {
                                // 存储用户信息(根据实际返回数据结构调整)
                                sessionStorage.setItem("CurUser", JSON.stringify(res.data.user));

                                // 跳转前显示欢迎提示
                                this.$message.success(`欢迎回来,${res.data.user.realName || ''}!`);
                                this.$router.replace('/Index');
                            } else {
                                this.$message.error(res.msg || '登录失败,请检查用户名和密码');
                            }
                        })
                        .catch(error => {
                            console.error('登录请求错误:', error);
                            this.$message.error('服务器连接异常');
                        })
                        .finally(() => {
                            this.confirm_disabled = false;
                        });
                } else {
                    this.confirm_disabled = false;
                    return false;
                }
            });
        }
    }
}
</script>

<style scoped>
/* 保持原有样式不变 */
.loginBody {
    position: absolute;
    width: 100%;
    height: 100%;
    background: url('../assets/home.jpg');
    background-size: cover;
    overflow-x: hidden;
}

.loginDiv {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 450px;
    height: 330px;
    background: rgba(255, 255, 255, 0.95);
    border-radius: 15px;
    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}

.login-title {
    margin: 20px 0;
    text-align: center;
    color: #303133;
}

.login-content {
    padding: 25px;
}
</style>


五、开发注意事项

环境配置

  • 安装Element UI:npm install element-ui
  • 配置axios:需在main.js中全局引入

接口对接

  • 修改$httpUrl为实际后端地址
  • 根据实际API响应结构调整res.data.data.user路径

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

瑞幸需要宇树科技

吃不到“星巴克红利”&#xff0c;瑞幸活成“Manner”。 作者|古廿 编辑|杨舟 “是不是又要开始3月革命了。”有瑞幸员工透露&#xff0c;今年开始瑞幸加强了系统排班的执行力度。新的排班体系下&#xff0c;要求各时段门店实际值班人员和排班系统一致。如果需要调整&#xf…

linux 命令 vim

以下是 Linux 中 Vim 编辑器的核心命令总结&#xff0c;分为基础操作、高效编辑技巧和实用场景&#xff0c;助你快速掌握 1. 启动与退出 命令说明vim 文件名打开或新建文件vim 行号 文件名打开文件并跳转到指定行&#xff08;如 vim 10 file.txt&#xff09;:q退出 Vim&#…

解决MySQL字符集冲突引发的“Illegal mix of collations”错误

引言 在开发过程中&#xff0c;我们常常会遇到数据库层面的字符集兼容性问题。本文将通过一个典型的案例&#xff0c;分析因字符集不匹配导致的 Illegal mix of collations 错误&#xff0c;并提供完整的解决方案&#xff0c;帮助开发者彻底规避此类问题。 问题现象 假设我们…

Vue中的publicPath释义

publicPath 部署应用包时的基本URL。用法和 webpack 本身的 output.publicPath 一致&#xff0c;但是 Vue CLI 在一些其他地方也需要用到这个值&#xff0c;所以请始终使用 publicPath 而不要直接修改 webpack 的 output.publicPath。 默认情况下&#xff0c;Vue CLI 会假设你…

新造车不再比拼排名,恰是曲终人散时,剩者为王

据称新能源汽车周销量不再发布&#xff0c;这可能也预示着新造车终于到了给出答案的时候了&#xff0c;新造车企业前三强已基本确立&#xff0c;其余那些落后的车企已很难有突围的机会&#xff0c;而特斯拉无疑是其中的最大赢家。 3月份第一周的数据显示&#xff0c;销量最高的…

博客迁移----宝塔面板一键迁移遇到问题

前景 阿里云轻量级服务器到期了&#xff0c;又免费领了个ESC&#xff0c; 安转了宝塔面板。现在需要迁移数据&#xff0c;使用宝塔面板一键迁移功能&#xff0c;完成了数据的迁移&#xff0c;改了域名的解析&#xff0c;现在进入博客是显示502 bad grateway 宝塔搬家参考链接…

大数据处理最容易的开源平台

大数据处理最容易的开源平台可以从多个角度进行分析&#xff0c;包括易用性、灵活性、成本效益以及社区支持等方面。 Apache Spark Apache Spark 是一个广泛使用的开源大数据处理框架&#xff0c;以其快速、通用和易于使用的特点而著称。它支持多种编程语言&#xff08;如 Scal…

Dify 使用 - 创建 翻译 工作流

文章目录 1、选择 模板2、设置 和 基本使用3、运行应用 1、选择 模板 2、设置 和 基本使用 翻译模板 自带了系统提示词&#xff0c;你也可以修改 3、运行应用 右上角 点击 发布 – 更新&#xff0c;运行应用&#xff0c;就可以在新的对话界面中使用此功能 2025-03-18&#x…

TreelabPLMSCM数字化供应链解决方案0608(61页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 资料解读&#xff1a;TreelabPLMSCM 数字化供应链解决方案 0608 在当今快速变化的市场环境中&#xff0c;企业面临着诸多挑战&#xff0c;Treelab 数智化 PLM_SCM 行业解决方案应运而生。该方案聚焦市场趋势与行业现状&#xff0c;致力于解…

LogicFlow介绍

LogicFlow介绍 LogicFlow是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景&#xff0c;如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码平…

[蓝桥杯 2023 省 B] 飞机降落

[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti​ 时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 D i D_{i} Di​ 个单位时间&#xff0c;即它最早可以于 T i T_{i} Ti​ 时刻…

应用分层简介

一、什么是应用分层 应用分层是一种软件开发设计思想&#xff0c;它将应用程序分为多个层次&#xff0c;每个层次各司其职&#xff0c;多个层次之间协同提供完整的功能&#xff0c;根据项目的复杂程度&#xff0c;将项目分为三层或者更多层。 常见的MCV设计模式&#xff0c;就…

基于香橙派 KunpengPro学习CANN(3)——pytorch 模型迁移

通用模型迁移适配可以分为四个阶段&#xff1a;迁移分析、迁移适配、精度调试与性能调优。 迁移分析 迁移支持度分析&#xff1a; 准备NPU环境&#xff0c;获取模型的源码、权重和数据集等文件&#xff1b;使用迁移分析工具采集目标网络中的模型/算子清单&#xff0c;识别第三方…

电子硬件入门(三)——偏置电路

文章目录 一、先理解问题&#xff1a;为什么需要偏置电压&#xff1f;二.偏置电路生成的四大核心零件​三、工作流程图解​四、实物电路对照​五、常见问题答疑 一、先理解问题&#xff1a;为什么需要偏置电压&#xff1f; 想象一下&#xff0c;电机的电流像一条波浪线&#x…

使用C++写一个递推计算均方差和标准差的用例

文章目录 代码输出关键实现说明1. 类设计2. 算法核心3. 数值稳定性 扩展应用场景1. 实时传感器数据处理2. 大规模数据集分块处理 总结 以下是用 C 实现递推计算均值、方差和标准差的完整示例代码&#xff0c;基于 Welford 算法&#xff0c;适用于实时数据流或大数据场景&#x…

Vue:单文件组件

Vue&#xff1a;单文件组件 1、 什么是单文件组件&#xff1f; 在传统的Vue开发里&#xff0c;我们接触的是非单文件组件&#xff0c;它们通常被定义在同一个HTML文件中&#xff0c;随着项目规模的扩大&#xff0c;代码会变得杂乱无章&#xff0c;维护起来极为困难。而单文件…

JavaScript变量声明与DOM操作指南

变量声明 1.变量声明有三个 var let 和 const 我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉… 2.let or const ? 建议&#xff1a; const 优先&#xff0c;尽量使用const&#xff0c;原因是&#xff1a;…

[K!nd4SUS 2025] Crypto

最后一个把周末的补完。这个今天问了小鸡块神终于把一个补上&#xff0c;完成5/6&#xff0c;最后一个网站也上不去不弄了。 Matrices Matrices Matrices 这个是不是叫LWE呀&#xff0c;名词忘了&#xff0c;但意思还是知道。 b a*s e 这里的e是高斯分成&#xff0c;用1000…

工作记录 2017-02-04

工作记录 2017-02-04 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、DataExport的设置中去掉了ListPayors&#xff0c;见DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改为 “Insurance Name”。 3、修改了Payment Posted的E…

Etcd 服务搭建

&#x1f4a2;欢迎来到张胤尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Etcd 服务搭建预编译的二进制文件安装下载 etcd 的…