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

news2024/12/24 3:23:20

使用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.coloradmin.cn/o/1929133.html

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

相关文章

Python while循环

1.while循环格式 while 表达式:循环语句 使用break结束循环。 2.例 i 0 while True:print(i)i i 1if i > 101:break 结果&#xff1a; 这段代码从0循环到100&#xff0c;到101时结束循环。

在 PostgreSQL 里如何处理数据的存储优化和查询复杂度的平衡?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的存储优化和查询复杂度的平衡&#xff1f;一、理解数据存储优化和查询复…

网络安全保险产业发展洞察报告(2024)

数字经济高速增长&#xff0c;黑客攻击、数据泄露等网络安全风险可能直接导致企业遭受巨额的财务损失。网络安全保险作为风险转移和风险管理的有效工具&#xff0c;正逐渐成为数字安全框架中不可或缺的一环。 《网络安全保险产业发展洞察报告&#xff08;2024&#xff09;》梳…

独立站外链的数量和质量哪个更重要?

没有哪个更重要的说法&#xff0c;两者同样重要&#xff0c;很多人都有一个误解&#xff0c;认为质量才是重要的&#xff0c;质量当然重要&#xff0c;但一个网站全都是高质量的外链&#xff0c;反而会不自然&#xff0c;是极其有可能被谷歌判定为作弊外链的&#xff0c;而且这…

【python学习】标准库之文件目录访问-os.path方法和pathlib库的背景、功能、用法、代码示例和总结

引言 在Python中&#xff0c;处理文件和目录的访问有多种方式&#xff0c;其中两种最常用的方法是使用os.path模块和pathlib库 文章目录 引言一、os.path的定义二、os.path的功能2.1 路径分割和组合2.2 路径比较2.3 路径长度和组件获取2.4 路径转换2.5 路径命名 三、os.path的用…

JVM 内存介绍

本文主要介绍&#xff1a; JVM 内存分哪几个区&#xff0c;每个区的作用是什么 备注: 橙色:堆 和 方法区 &#xff0c;属于jvm公有部分,可以进行调优 灰色:java栈,本地方法栈和计数器 属于jvm的私有部分,不可进行调优 一个对象从创建到被回收的过程是怎样的? Personpnew Perso…

永磁同步电机高性能控制算法(14)—— 有源阻尼电流环

1.前言 在之前的之后中已经发过一篇复矢量电流环和我们平时用的比较多的前馈补偿的电流环的对比&#xff0c;感觉复矢量电流环的效果还是挺明显的。 https://zhuanlan.zhihu.com/p/682880365https://zhuanlan.zhihu.com/p/682880365 当时在看文献的时候&#xff0c;复矢量电…

itextpdf字体选择

itextpdf 版本7.2.5 itextpdf-html2pdf 版本4.0.5 这里讲的是通过html转pdf&#xff0c;在html2pdf中是通过html中font-family样式来确定字体的&#xff0c;那已知font-family的情况&#xff0c;怎么确定pdf中实际用的字体&#xff0c;大致分为两步&#xff1a; 1、通过font…

SpringBoot系列:通过AOP+注解优雅实现操作日志记录

文章目录 前言一、简介1.1 操作日志在企业应用中的重要性1.2 使用AOP和注解实现操作日志记录的好处 二、开发环境三、准备工作3.1 创建操作日志记录表3.2 创建系统日志实体类 四、代码实现4.1 创建业务枚举类4.2 创建日志注解4.3 创建操作状态枚举类4.4 创建IP工具类4.5 创建切…

Linux驱动开发-04LED灯驱动实验(直接操作寄存器)

一、Linux 下LED 灯驱动原理 Linux 下的任何外设驱动&#xff0c;最终都是要配置相应的硬件寄存器。驱动访问底层的硬件除了使用内存映射将物理地址空间转化为虚拟地址空间&#xff0c;去进行读写修改&#xff0c;还可以通过各种子系统函数去进行操作 1.1 地址映射 MMU 全称…

WebSocket实现群聊功能、房间隔离

引用WebSocket相关依赖 <dependency><groupId>javax.websocket</groupId><artifactId>javax.websocket-api</artifactId><version>1.1</version></dependency><dependency><groupId>org.springframework</grou…

Golang | Leetcode Golang题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; func lowestCommonAncestor(root, p, q *TreeNode) (ancestor *TreeNode) {ancestor rootfor {if p.Val < ancestor.Val && q.Val < ancestor.Val {ancestor ancestor.Left} else if p.Val > ancestor.Val && q…

【区块链 + 智慧政务】基于区块链的可信数据档案管理系统 | FISCO BCOS应用案例

目前&#xff0c;我国的档案管理整体上实行“电子化”和“纸质”同步并存的“双套制”管理体系&#xff0c;这套管理规范体系在一 定程度上满足了电子文件安全存储的要求。但是随着云计算、大数据、区块链等现代信息技术的快速发展&#xff0c;以及 全国“互联网 政务服务”工…

TG创建小程序交互APP登录以及机器人信息

1、搜索 BotFather &#xff0c;输入命令 /newbot 创建机器人。 2、修改机器人信息 /mybots 编辑名称 : 修改机器人名称 编辑关于: 修改关于 hayden yyds&#xff0c;修改以后打开机器人会出现在下图 编辑描述 : 机器人的描述 编辑描述图片 : 机器人的图片 编辑 Botpic…

让前端和后端要“动手”的7大行为,你中了几个。

前后端分离导致了二者在工作中交叉非常多&#xff0c;不像之前前端搞完静态页面&#xff0c;拽给后端就行了。 这种交叉必然导致巨大的沟通成本&#xff0c;贝格前端工场将项目踩过的坑&#xff0c;给大家分享一下。 前端工程师最讨厌的后端行为包括&#xff1a; 1. 不提供清…

高端的食材,往往只需要最简单的烹饪!ORB,仅此一招,Alpha达到年化36%

常常看到有人提问&#xff0c;如何挖掘因子和策略&#xff1f;ORB 策略的改进历史能给我们许多启发。一是一个策略值得研究数十年&#xff1b;二是温故而知新是永远的法宝。沉下心来&#xff0c;真正吃透 IT 系统、吃透数据和已有策略&#xff0c;比追风要好得多。 炒股要炒大…

备考美国数学竞赛AMC10:吃透1200道历年真题和知识点(持续)

距离2024年AMC10美国数学竞赛开赛预计还有3个多月的时间&#xff0c;实践证明&#xff0c;做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。 通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c…

[AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性

目录 背景描述 用浏览器访问&#xff0c;正常返回 ​编辑 AHK v2官方示例源代码 AHK v2运行结果报错(0x80092004) 找不到对象或属性 用thqby大佬的WinHttpRequest.ahk库测试报错 0x80092004 找不到对象或属性 附&#xff1a; 用Apifox访问&#xff0c;也正常返回 AHK v1 …

怎样优化 PostgreSQL 中对复杂查询的并行执行计划?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样优化 PostgreSQL 中对复杂查询的并行执行计划一、了解并行执行计划的基础知识二、优化并行执行计划…

MySQL索引特性(上)

目录 索引的重要 案例 认识磁盘 MySQL与存储 先来研究一下磁盘 扇区 定位扇区 结论 磁盘随机访问与连续访问 MySQL与磁盘交互基本单位 建立共识 索引的理解 建立测试表 插入多条记录 局部性原理 所有的MySQL的操作(增删查改)全部都是在MySQL当中的内存中进行的&am…