用户认证系统登录界面

news2024/12/17 1:15:41

下面是使用HTML和JavaScript实现的一个中文版登录界面,包含登录、注册和修改密码功能。注册成功后会显示提示信息,在登录成功后进入一个大大的欢迎页面。

1.代码展示

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>用户认证系统</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #f4f4f9;
        }
        .container {
            width: 300px;
            padding: 20px;
            background-color: white;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            border-radius: 5px;
            text-align: center;
        }
        h2 {
            margin-bottom: 20px;
        }
        form {
            display: flex;
            flex-direction: column;
        }
        input[type="text"],
        input[type="password"] {
            margin-bottom: 10px;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            width: 100%;
        }
        button {
            padding: 10px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            width: 100%;
        }
        button:hover {
            background-color: #0056b3;
        }
        .message {
            margin-top: 10px;
        }
        .success {
            color: green;
        }
        .error {
            color: red;
        }
        #welcome-container {
            width: 400px;
            padding: 40px;
            background-color: #d4edda;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            border-radius: 10px;
            text-align: center;
        }
        #welcome-message {
            font-size: 24px;
            margin-bottom: 20px;
        }
    </style>
</head>
<body>
    <div class="container" id="login-container">
        <h2>登录</h2>
        <form id="login-form">
            <input type="text" id="login-username" placeholder="用户名" required>
            <input type="password" id="login-password" placeholder="密码" required>
            <button type="submit">登录</button>
        </form>
        <p class="message error" id="login-error"></p>
        <p class="message"><a href="#" onclick="showRegisterForm(); return false;">注册新账号</a></p>
    </div>

    <div class="container" id="register-container" style="display: none;">
        <h2>注册</h2>
        <form id="register-form">
            <input type="text" id="register-username" placeholder="用户名" required>
            <input type="password" id="register-password" placeholder="密码" required>
            <button type="submit">注册</button>
        </form>
        <p class="message success" id="register-success"></p>
        <p class="message error" id="register-error"></p>
        <p class="message"><a href="#" onclick="showLoginForm(); return false;">返回登录</a></p>
    </div>

    <div class="container" id="change-password-container" style="display: none;">
        <h2>修改密码</h2>
        <form id="change-password-form">
            <input type="password" id="old-password" placeholder="旧密码" required>
            <input type="password" id="new-password" placeholder="新密码" required>
            <button type="submit">修改密码</button>
        </form>
        <p class="message error" id="change-password-error"></p>
        <p class="message"><a href="#" onclick="showWelcomePage(); return false;">返回欢迎页面</a></p>
    </div>

    <div id="welcome-container" style="display: none;">
        <h2 id="welcome-message"></h2>
        <button onclick="showChangePassword()">修改密码</button>
        <button onclick="logout()">注销</button>
    </div>

    <script>
        let users = [];
        let currentUser = null;

        document.getElementById('login-form').addEventListener('submit', function(event) {
            event.preventDefault();
            const username = document.getElementById('login-username').value;
            const password = document.getElementById('login-password').value;
            const user = users.find(user => user.username === username && user.password === password);
            if (user) {
                currentUser = user;
                showWelcomePage();
            } else {
                document.getElementById('login-error').textContent = '无效的用户名或密码';
            }
        });

        document.getElementById('register-form').addEventListener('submit', function(event) {
            event.preventDefault();
            const username = document.getElementById('register-username').value;
            const password = document.getElementById('register-password').value;
            if (!users.find(user => user.username === username)) {
                users.push({ username, password });
                document.getElementById('register-success').textContent = '注册成功!';
                setTimeout(() => {
                    document.getElementById('register-success').textContent = '';
                }, 3000);
                document.getElementById('register-username').value = '';
                document.getElementById('register-password').value = '';
                showLoginForm();
            } else {
                document.getElementById('register-error').textContent = '用户名已存在';
            }
        });

        document.getElementById('change-password-form').addEventListener('submit', function(event) {
            event.preventDefault();
            const oldPassword = document.getElementById('old-password').value;
            const newPassword = document.getElementById('new-password').value;
            if (currentUser && currentUser.password === oldPassword) {
                currentUser.password = newPassword;
                users = users.map(user => 
                    user.username === currentUser.username ? { ...user, password: newPassword } : user
                );
                document.getElementById('change-password-error').textContent = '密码修改成功';
                setTimeout(() => {
                    document.getElementById('change-password-error').textContent = '';
                }, 3000);
                hideChangePassword();
            } else {
                document.getElementById('change-password-error').textContent = '旧密码不正确';
            }
        });

        function showWelcomePage() {
            document.getElementById('login-container').style.display = 'none';
            document.getElementById('register-container').style.display = 'none';
            document.getElementById('change-password-container').style.display = 'none';
            document.getElementById('welcome-container').style.display = 'block';
            document.getElementById('welcome-message').textContent = `欢迎, ${currentUser.username}`;
        }

        function logout() {
            currentUser = null;
            document.getElementById('welcome-container').style.display = 'none';
            document.getElementById('login-container').style.display = 'block';
        }

        function showRegisterForm() {
            document.getElementById('login-container').style.display = 'none';
            document.getElementById('register-container').style.display = 'block';
            document.getElementById('login-error').textContent = ''; // Clear login error message
        }

        function showLoginForm() {
            document.getElementById('register-container').style.display = 'none';
            document.getElementById('login-container').style.display = 'block';
            document.getElementById('register-success').textContent = ''; // Clear registration success message
            document.getElementById('register-error').textContent = ''; // Clear registration error message
        }

        function showChangePassword() {
            document.getElementById('welcome-container').style.display = 'none';
            document.getElementById('change-password-container').style.display = 'block';
        }

        function hideChangePassword() {
            document.getElementById('change-password-container').style.display = 'none';
            document.getElementById('welcome-container').style.display = 'block';
        }
    </script>
</body>
</html>




2.功能说明:

这个应用程序使用纯HTML和JavaScript实现。

  • 包含登录、注册和修改密码功能。
  • 注册成功后会显示一条绿色的成功消息,并在3秒后自动消失。
  • 登录成功后,用户会被带到一个大大的欢迎页面。
  • 用户可以点击“注销”按钮退出登录。
  • 提供了从登录页面跳转到注册页面和从注册页面返回登录页面的链接。
  • 欢迎页面中有一个“修改密码”的按钮,可以跳转到修改密码页面。

3.效果图

在这里插入图片描述

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

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

相关文章

Pyside6 --Qt设计师--简单了解各个控件的作用之:Item Views

目录 一、List View二、Tree View三、Table View四、Column View 一、List View 学习方法和Buttons一样&#xff0c;大家自己在qt设计师上面在属性编辑区进行相应的学习&#xff01; 我就先紧着qt设计师的页面进行讲解&#xff0c;部分内容查自AI。 后面有什么好用的控件或者…

ArcGIS MultiPatch数据转换Obj数据

文章目录 ArcGIS MultiPatch数据转换Obj数据1 效果2 技术路线2.1 Multipatch To Collada2.2 Collada To Obj3 代码实现4 附录4.1 环境4.2 一些坑ArcGIS MultiPatch数据转换Obj数据 1 效果 2 技术路线 MultiPatch --MultipatchToCollada–> Collada --Assimp–> Obj 2.…

【mybatis】缓存

目录 1. mybatis的运行 1.1 引言 1.2 具体运行&#xff1a; 1.3 sqlSession 介绍local catch 2. 缓存 2.1 概念 2.2 使用缓存的原因 2.3 什么样的数据能使用缓存 3. Mybatis缓存 3.1 一级缓存 3.1.1 测试一级缓存 3.1.2 缓存失效的四种情况 $1 sqlSession不同 $…

ElasticSearch - 理解doc Values与Inverted Index倒排索引

文章目录 概述倒排索引&#xff1a;从图书馆的索引卡片谈起倒排索引的工作原理 docValues&#xff1a;从数据库的列式存储说起docValues的工作原理 docValues与倒排索引的对比两者的联系&#xff1a;组合使用&#xff0c;优化搜索与分析 小结 概述 在使用 Elasticsearch 进行大…

Python | 数据可视化中常见的4种标注及示例

在Python的数据可视化中&#xff0c;标注&#xff08;Annotation&#xff09;技术是一种非常有用的工具&#xff0c;它可以帮助用户更准确地解释图表中的数据和模式。在本文中&#xff0c;将带您了解使用Python实现数据可视化时应该了解的4种标注。 常见的标注方式 文本标注箭…

【原生js案例】如何实现一个穿透字体颜色的导航

普通的导航大家都会做&#xff0c;像这种穿透字体的导航应该很少见吧。高亮不是通过单独设置一个active类来设置字体高亮颜色&#xff0c;鼠标滑过导航项&#xff0c;字体可以部分是黑色&#xff0c;不分是白色&#xff0c;这种效果的实现 感兴趣的可以关注下我的系列课程【we…

前端中图标的使用

1 antd 使用inconfont.cn中的图标 <template><div class"icons-list"><icon-font type"icon-tuichu" /><icon-font type"icon-facebook" /><icon-font type"icon-twitter" /></div> </templ…

回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 CNN-BiGRU,即卷积神经网络(CNN)与双…

医学分割数据集B超图片肝脏分割数据集labelme格式271张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;271 标注数量(json文件个数)&#xff1a;271 标注类别数&#xff1a;1 标注类别名称:["liver"] 每个类别标注的框数&#xf…

【目标检查】YOLO系列之:Triton 推理服务器Ultralytics YOLO11

Triton 推理服务器 1、引言2、Triton服务器2.1 什么是Triton Inference Server2.2 将YOLO11 导出为ONNX 格式2.3 设置Triton 模型库2.3.1 创建目录结构2.3.2 将导出的ONNX 模型移至Triton 资源库 2.4 运行Triton 推断服务器2.4.1 使用 Docker 运行Triton Inference Server2.4.2…

论文学习——多种变化环境下基于多种群进化的动态约束多目标优化

论文题目&#xff1a;Multipopulation Evolution-Based Dynamic Constrained Multiobjective Optimization Under Diverse Changing Environments 多种变化环境下基于多种群进化的动态约束多目标优化&#xff08;Qingda Chen , Member, IEEE, Jinliang Ding , Senior Member, …

【C++】判断能否被 3, 5, 7 整除问题解析与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;老师代码实现与分析老师代码逻辑分析优点缺点 &#x1f4af;学生代码实现与分析学生代码逻辑分析优点缺点 &#x1f4af;改进与优化优化代码实现优化…

【构建工具】现代开发的重要角色

你可能有所听闻构建工具&#xff0c;但是不知道是干什么的&#xff0c;或者是开发中用到了&#xff0c;大概会使用&#xff0c;但是想理解一下具体的工作原理等&#xff0c;那么我将分享一下我对其的理解。【 我将分为两篇来讲解】。 当我们谈到构建工具时&#xff0c;可以把它…

npm或yarn包配置地址源

三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装&#xff1a;yarn install 注意…

Unity集成Wwise并进行开发

1. 背景 项目要接入WWise&#xff0c;学习一下 1.1 与Unity自带音频系统的区别 Unity有自己的原生音乐功能&#xff1a;AduioSound。但是这个功能较为简单&#xff0c;对于音效开发人员来说并不是很友好。在一些大型的游戏中&#xff0c;音效会接入Wwise这个软件。音效开发者…

【AI知识】有监督学习之回归任务(附线性回归代码及可视化)

1. 回归的基本概念 在机器学习的有监督学习中&#xff0c;回归&#xff08;Regression&#xff09;是一种常见的任务&#xff0c;它的目标是通过观察数据来建立一个模型&#xff0c;用一个或多个自变量来预测因变量的值。 回归分析通常用于&#xff1a; a.预测&#xff0c;基于…

C语言专题之宏的基本概念

合理使用宏可以使我们的代码更加简单&#xff0c;接下来小编就来讲解宏的基本概念&#xff01; 一、宏的定义 宏定义是C/C语言中一项强大而灵活的特性&#xff0c;它允许程序员使用预处理器指令来创建简化的代码表示。这种机制不仅提高了代码的可读性和可维护性&#xff0c;还…

MySQL 复合查询(重点)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 MySQL 复合查询&#xff08;重点&#xff09; 收录于专栏[MySQL] 本专栏旨在分享学习MySQL的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; …

WPF 控件

<div id"content_views" class"htmledit_views"><p id"main-toc"><strong>目录</strong></p> WPF基础控件 按钮控件&#xff1a; Button:按钮 RepeatButton:长按按钮 RadioButton:单选按钮 数据显示控件 Te…

Docker方式安装人人影视离线完整安装包

本文软件由网友 ルリデ 推荐&#xff1b; 上周&#xff0c;人人影视创始人宣布将人人影视二十年字幕数据开源分享 目前提供了两种使用方式&#xff1a; “在线应用” &#xff1a;意味着需要有互联网才可以使用。官方提供了网站&#xff1a;https://yyets.click “离线使用” …