HTML+CSS+JS用户管理(可储存用户数据)

使用cookies记录账号密码信息,可以注册、登录、注销账号。 点赞❤️收藏⭐️关注😍 

效果图   源代码在效果图后面 

5147fc58d7ba49e7b1b9a7cf1e4c4d34.jpg

源代码

HTML

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>注册登录系统</title>

    <link rel="stylesheet" href="styles.css">

</head>

<body>

    <div class="container">

        <div id="form-container">

            <h2 id="form-title">登录</h2>

            <input type="text" id="username" placeholder="账号" required>

            <input type="password" id="password" placeholder="密码" required>

            <select id="type">

                <option value="student">学生</option>

                <option value="teacher">老师</option>

            </select>

            <button id="toggle-btn">切换到注册</button>

            <button id="submit-btn">登录</button>

            <button id="logout-toggle-btn">切换到注销</button>

        </div>

    </div>

    <script src="script.js"></script>

</body>

</html>

JavaScript    script.js

 

document.addEventListener('DOMContentLoaded', () => {

    const formTitle = document.getElementById('form-title');

    const usernameInput = document.getElementById('username');

    const passwordInput = document.getElementById('password');

    const typeSelect = document.getElementById('type');

    const toggleBtn = document.getElementById('toggle-btn');

    const submitBtn = document.getElementById('submit-btn');

    const logoutToggleBtn = document.getElementById('logout-toggle-btn');

 

    let mode = 'login'; // 可为 'login', 'register', 'logout'

 

    toggleBtn.addEventListener('click', () => {

        if (mode === 'login') {

            mode = 'register';

            updateForm();

        } else if (mode === 'register') {

            mode = 'login';

            updateForm();

        }

    });

 

    logoutToggleBtn.addEventListener('click', () => {

        mode = 'logout';

        updateForm();

    });

 

    submitBtn.addEventListener('click', () => {

        const username = usernameInput.value.trim();

        const password = passwordInput.value.trim();

        const type = typeSelect.value;

 

        if (username === '' || (mode !== 'logout' && password === '')) {

            alert('请填写所有字段');

            return;

        }

 

        if (mode === 'login') {

            login(username, password);

        } else if (mode === 'register') {

            register(username, password, type);

        } else if (mode === 'logout') {

            logout(username);

        }

    });

 

    function updateForm() {

        if (mode === 'login') {

            formTitle.textContent = '登录';

            submitBtn.textContent = '登录';

            toggleBtn.textContent = '切换到注册';

            logoutToggleBtn.textContent = '切换到注销';

            typeSelect.style.display = 'none';

            passwordInput.style.display = 'block';

        } else if (mode === 'register') {

            formTitle.textContent = '注册';

            submitBtn.textContent = '注册';

            toggleBtn.textContent = '切换到登录';

            logoutToggleBtn.textContent = '切换到注销';

            typeSelect.style.display = 'block';

            passwordInput.style.display = 'block';

        } else if (mode === 'logout') {

            formTitle.textContent = '注销';

            submitBtn.textContent = '注销';

            toggleBtn.textContent = '切换到登录';

            logoutToggleBtn.textContent = '切换到登录';

            typeSelect.style.display = 'none';

            passwordInput.style.display = 'none';

        }

    }

 

    function getCookie(name) {

        const value = `; ${document.cookie}`;

        const parts = value.split(`; ${name}=`);

        if (parts.length === 2) return parts.pop().split(';').shift();

    }

 

    function setCookie(name, value, days) {

        let expires = '';

        if (days) {

            const date = new Date();

            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));

            expires = `; expires=${date.toUTCString()}`;

        }

        document.cookie = `${name}=${value || ''}${expires}; path=/`;

    }

 

    function deleteCookie(name) {

        document.cookie = `${name}=; Max-Age=-99999999;`;

    }

 

    function register(username, password, type) {

        if (getCookie(username)) {

            alert('该账号已被注册');

            return;

        }

        const userData = JSON.stringify({ username, password, type });

        setCookie(username, userData, 7);

        alert('注册成功!请登录。');

        toggleBtn.click(); // 自动切换到登录

    }

 

    function login(username, password) {

        const userData = getCookie(username);

        if (!userData) {

            alert('账号不存在');

            return;

        }

 

        const user = JSON.parse(userData);

        if (user.password === password) {

            window.location.href = `ruso.html?username=${username}`;

        } else {

            alert('密码错误');

        }

    }

 

    function logout(username) {

        const userData = getCookie(username);

        if (!userData) {

            alert('账号不存在');

            return;

        }

 

        deleteCookie(username);

        alert('账号已注销');

        toggleBtn.click(); // 自动切换到登录

    }

});

CSS styles.css

body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    background-color: #f2f2f2;
    margin: 0;
    font-family: Arial, sans-serif;
}

.container {
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
}

#form-container {
    background-color: #fff;
    padding: 20px;
    border-radius: 10px;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
    width: 300px;
    text-align: center;
}

#form-title {
    margin-bottom: 20px;
    color: #e74c3c;
}

input, select {
    width: 100%;
    padding: 10px;
    margin: 10px 0;
    border: 1px solid #ccc;
    border-radius: 5px;
}

button {
    width: 100%;
    padding: 10px;
    margin-top: 10px;
    border: none;
    border-radius: 5px;
    cursor: pointer;
}

#toggle-btn, #logout-toggle-btn {
    background-color: #3498db;
    color: white;
}

#submit-btn {
    background-color: #e74c3c;
    color: white;
}

button:hover {
    opacity: 0.9;
}
 

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

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

相关文章

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…

前端报错adding CSS “touch-action: none“ to this element解决方案

目录 如图所示控制台出现报错&#xff1a; 原因&#xff1a; touch-action 介绍&#xff1a; 解决方案&#xff1a; 1.手动设置touch-action&#xff1a; 2.使用条件渲染&#xff1a; 3.CSS样式隔离&#xff1a; 4.浏览器兼容性&#xff1a; 5. 忽略警告 如图所示控制台…

Windows虚拟摄像头有哪些?分享5个方法,手机一键替换电脑摄像头!

Windows虚拟摄像头怎么用&#xff1f;当我们的电脑缺少摄像头时&#xff0c;我们可以借助虚拟摄像头实现。手机作为电脑摄像头的需求日益增长&#xff0c;本文就来给大家详细介绍&#xff0c;关于电脑虚拟摄像头的使用和说明&#xff0c;一起来看看吧&#xff01; &#xff08;…

微服务实战系列之玩转Docker(二)

前言 上一篇&#xff0c;博主对Docker的背景、理念和实现路径进行了简单的阐述。作为云原生技术的核心之一&#xff0c;轻量级的容器Docker&#xff0c;受到业界追捧。因为它抛弃了笨重的OS&#xff0c;也不带Data&#xff0c;可以说&#xff0c;能够留下来的都是打仗的“精锐…

Vue3 前置知识

1. Vue3 简介 2020年9月18日&#xff0c;Vue.js发布版3.8版本&#xff0c;代号&#xff1a;one Piece(海贼王)经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者官方发版地址&#xff1a;Release v3.0.0 One Piecevuejs/,core截止2023年10月&#xff0c;最新的公开版…

LRU CaChe(内存替换算法)

六、LURCache 0、LUR Cache概念 LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 什么是Cache&#xff1f;狭义的Cache指的是位于CPU和主存间的快速RAM&#xff0c;通常它不像系统主存那样使用DRAM技术&#xff0c;而使用昂…

打开磁盘格式为NTFS的磁盘 ntfs磁盘无法打开 移动硬盘出现ntfs怎么打不开了的原因和解决方案

在日常的工作和生活中&#xff0c;移动硬盘作为我们存储和传输数据的重要工具&#xff0c;发挥着不可替代的作用。然而&#xff0c;有时候我们会遇到这样一个问题&#xff1a;移动硬盘突然显示NTFS格式&#xff0c;并且无法正常打开。面对这种情况&#xff0c;我们往往感到束手…

【系统架构设计师】十一、系统架构设计(层次架构风格|MVC|面向服务的架构风格|ESB)

目录 五、层次架构风格 5.1 两层C/S架构 5.2 三层C/S架构 5.3 三层B/S架构 5.4 MVC架构 5.5 MVP架构 5.6 MVVM架构 六、面向服务的架构风格 6.1 SOA特征 6.2 Web Service 6.2.1 关键技术 6.2.2 WEB Service 6.3 企业服务总线ESB 相关推荐 历年真题练习 五、层次…

【MAUI】生命周期

.NET Multi-platform App UI (.NET MAUI) 应用通常有四种执行状态&#xff1a;“未运行”、“运行中”、“已停用”和“已停止”。 当应用从未运行状态转换为运行状态、从运行状态转换为已停用状态、从已停用状态转换为已停止状态、从已停止状态转换为运行状态&#xff0c;以及…

new mars3d.graphic.FixedRoute({的position长度超过一百条浏览器会卡死的解决方案

问题场景描述&#xff1a; FixedRoute的position数据已经很精细时&#xff0c;会导致卡死的问题 解决方案&#xff1a; 1. 数据已经很精细时&#xff0c;可以不用autoSurfaceHeight来计算&#xff0c;如果非要用&#xff0c;可以加个minDistance: 200参数。 fixedRoute.auto…

ChatGPT 深度解析:技术驱动的智能对话

在当今科技飞速发展的时代&#xff0c;ChatGPT 无疑成为了最耀眼的明星之一。它以其令人惊叹的智能对话能力&#xff0c;引发了全球范围内的广泛关注和热议。 ChatGPT 背后的技术堪称精妙绝伦。它基于深度学习算法&#xff0c;通过对海量数据的学习和分析&#xff0c;从而能够理…

BasicSR项目(通用图像超分、修复、增强工具库)介绍

项目地址&#xff1a;https://github.com/XPixelGroup/BasicSR 文档地址&#xff1a;https://github.com/XPixelGroup/BasicSR-docs/releases BasicSR 是一个开源项目&#xff0c;旨在提供一个方便易用的图像、视频的超分、复原、增强的工具箱。BasicSR 代码库从2018年4月20日…

【Memcached】Memcached的工作原理

目录 ​编辑 第2章&#xff1a;Memcached工作原理 2.1 数据存储与访问 2.2 分布式架构 2.3 数据过期机制 第2章&#xff1a;Memcached工作原理 2.1 数据存储与访问 Memcached是一种键值存储系统&#xff0c;其中数据以键值对的形式存储。键是用于定位数据的唯一标识符&am…

libyaml库的交叉编译

目录 1.Ubuntu环境中安装libyaml库 2.交叉编译 3.success 1.Ubuntu环境中安装libyaml库 官方地址&#xff1a;https://pyyaml.org/wiki/LibYAML 下载路径&#xff1a;http://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz 2.交叉编译 官方的下载路径为/usr/local下&am…

【unity实战】使用unity制作一个红点系统

前言 注意&#xff0c;本文是本人的学习笔记记录&#xff0c;这里先记录基本的代码&#xff0c;后面用到了再回来进行实现和整理 素材 https://assetstore.unity.com/packages/2d/gui/icons/2d-simple-ui-pack-218050 框架&#xff1a; RedPointSystem.cs using System.…

PHP全功能微信投票迷你平台系统小程序源码

&#x1f525;让决策变得超简单&#xff01;&#x1f389; &#x1f680;【一键创建&#xff0c;秒速启动】 嘿小伙伴们&#xff0c;你还在为组织投票而手忙脚乱吗&#xff1f;来试试这款全功能投票迷你微信小程序吧&#xff01;只需轻轻一点&#xff0c;无论是班级选举、社团…

【postgresql】pg_dump备份数据库

pg_dump 介绍 pg_dump 是一个用于备份 PostgreSQL 数据库的实用工具。它可以将数据库的内容导出为一个 SQL 脚本文件或其他格式的文件&#xff0c;以便在需要时进行恢复或迁移。 基本用法 pg_dump [选项] [数据库名] 命令选项 -h 或 --host&#xff1a;指定数据库服务器的主…

2024年大数据高频面试题(上篇)

文章目录 HDFS读流程和写流程HDFS读数据流程NameNode和Secondary NameNode工作机制FsimageEdits文件Seen_txidnamenode工作机制HA NameNode如何工作ZKFCHealthMonitorActiveStandbyElectorJouranlNode集群DataNode工作机制DataNode数据损坏压缩MapReduce工作流程MapTask工作流R…

Visual Studio远程调试工具

路径&#xff1a;Visual Studio安装路径/Common7/IDE/Remote Debugger/平台/msvsmon.exe。 平台有x86、x64&#xff0c;x64即可调试x86进程也可调试x64进程。 将平台路径下的所有文件拷贝至其他PC&#xff0c;运行msvsmon.exe。 工具栏选择“工具&#xff08;T&#xff09;”…

Ubuntu18.04安装ROS

1.添加ROS软件源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.listcurl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc输入指令&#xff1a;curl -s https:…