一个真实可用的登录界面!

news2024/11/28 0:48:41

需要工具:

MySQL数据库、vscode上的php插件PHP Server等

项目结构:

login

| --backend

        | --database.sql

        |--login.php

        |--welcome.php

|--index.html

|--script.js

|--style.css

项目开展

index.html:

        首先需要一个静态网页,在前面已经讲了很多有关的代码,这里也是常规的,但是这里我们需要post到一个php页面,请注意。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="login-container">
        <h1>登录</h1>
        <form action="backend/login.php" method="post">
            <div class="input-group">
                <label for="username">用户名:</label>
                <input type="text" id="username" name="username" required>
            </div>
            <div class="input-group">
                <label for="password">密码:</label>
                <div class="input-group-password">
                    <input type="password" id="password" name="password" required>
                    <button type="button" id="toggle-password" aria-label="显示/隐藏密码"></button>
                </div>
                <div id="message"></div>
            </div>                               
            <div class="input-group">
                <button type="submit">Login</button>
            </div>
        </form>
    </div>
    <script src="script.js"></script>
</body>
</html>

script.js :

        js主要用来实现表单提交、记住用户名等内容,不是本次重点,有问题可以参考之前邮箱注册提交那一篇。

document.addEventListener('DOMContentLoaded', function () {
    const loginForm = document.querySelector('form');
    const usernameInput = document.getElementById('username');
    const passwordInput = document.getElementById('password');
    const messageElement = document.getElementById('message'); // 使用已有的消息显示元素

    // 表单提交事件
    loginForm.addEventListener('submit', function (event) {
        if (usernameInput.value.trim() === '' || passwordInput.value.trim() === '') {
            event.preventDefault(); // 阻止表单提交
            messageElement.textContent = '用户名和密码不能为空';
            return false;
        }
        // 清除之前的消息
        messageElement.textContent = '';
    });

    // 记住用户名
    const savedUsername = localStorage.getItem('username');
    if (savedUsername) {
        usernameInput.value = savedUsername;
    }

    usernameInput.addEventListener('change', function () {
        localStorage.setItem('username', usernameInput.value);
    });
});

style.css:

body {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    background-color: #f7f7f7;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    background-image: linear-gradient(to right, #f7f7f7, #d6d6d6);
}

.login-container {
    background-color: white;
    padding: 30px;
    border-radius: 10px;
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
    width: 350px;
    text-align: center;
    transition: box-shadow 0.3s ease;
}

.login-container:hover {
    box-shadow: 0 15px 40px rgba(0, 0, 0, 0.2);
}

.login-container h1 {
    color: #333;
    font-size: 26px;
    margin-bottom: 25px;
    letter-spacing: 1px;
}

.input-group {
    margin-bottom: 15px;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    width: 100%;
}

.input-group-password {
    position: relative; /* 保持输入框和按钮在同一容器中 */
    width: 100%;
}

input[type="password"] {
    width: 10%;
    padding: 0px;
    padding-right: 0px; /* 为显示密码按钮预留更多空间 */
    border: 1px solid #ccc;
    border-radius: 5px;
    font-size: 16px;
    color: #333;
    box-sizing: border-box;
    transition: border-color 0.3s ease, box-shadow 0.3s ease;
}

input[type="password"]:focus {
    outline: none;
    border-color: #5c67fb;
    box-shadow: 0 0 10px rgba(92, 103, 251, 0.5);
}

#toggle-password {
    position: absolute;
    right: 10px; /* 调整为紧贴输入框的右侧 */
    top: 50%; /* 使按钮垂直居中 */
    transform: translateY(-50%);
    /* background-color: transparent; */
    border: none;
    cursor: pointer;
    font-size: 18px; /* 图标大小 */
    color: #5c67fb;
    padding: 0;
}

input[type="text"], /* 确保点击显示图标后,输入框正常切换为 text 类型 */
input[type="password"] {
    width: 100%;
    padding: 12px;
    padding-right: 40px; /* 为按钮留出更多空间 */
    border: 1px solid #ccc;
    border-radius: 5px;
    font-size: 16px;
    color: #333;
    box-sizing: border-box;
    transition: border-color 0.3s ease, box-shadow 0.3s ease;
}

button {
    width: 100%;
    padding: 14px;
    background-color: #5c67fb;
    border: none;
    color: white;
    border-radius: 8px;
    font-size: 16px;
    cursor: pointer;
    transition: background-color 0.3s ease;
    margin-top: 15px;
}

button:hover {
    background-color: #4a54e1;
}

button:active {
    background-color: #3c45b9;
}

button:focus {
    outline: none;
    box-shadow: 0 0 5px rgba(92, 103, 251, 0.5);
}

#message {
    color: red;
    font-size: 14px;
    margin-top: 10px;
    text-align: left;
}

@media (max-width: 768px) {
    .login-container {
        width: 85%;
        padding: 20px;
    }
}

@media (max-width: 600px) {
    .login-container {
        width: 90%;
        padding: 15px;
    }
}

login.php:

        php是这次的重点,首先需要连接数据库,这个就需要下载vscode中的MySQL插件,下载完成之后在左边就会有图标:

        点击就可以创建连接,输入你的MySQL账号密码:

         连接成功后,输入下面的代码,注意把username和password改成你自己的:

<?php
// 连接数据库
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "mydatabase";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 获取表单数据
$username = $_POST['username'];
$password = $_POST['password'];

// 防止 SQL 注入
$username = $conn->real_escape_string($username);
$password = $conn->real_escape_string($password);

// 哈希用户输入的密码
// $hashed_password = password_hash($password, PASSWORD_DEFAULT);

// 验证用户
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // 输出信息
    echo "Login successful!";
    // 这里可以添加登录成功后的代码,例如设置 session
    session_start();
    $_SESSION['username'] = $username;
    // 重定向到欢迎页面
    header("Location: welcome.php");
} else {
    echo "账号或密码错误";
}

$conn->close();
?>

        这里如果php.ini设置不好可能会出现问题,找不到mysqli这个拓展,需要手动处理一下,当然这里不赘述。并且加密的过程被我注释掉了,防止新手搞不明白密码。

        数据库需要自己先创建,这里提供一个简单的数据库创建方案database.sql:

CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;

CREATE TABLE IF NOT EXISTS `users` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL,
  `password` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `users` (`username`, `password`) VALUES ('admin', '123456');

         最后登陆成功我们给一个非常简单的weicome.php:

<?php
session_start();

if (!isset($_SESSION['username'])) {
    header("Location: login.html");
    exit;
}

echo "Welcome, " . $_SESSION['username'] . "!";
?>

        至此,所有的代码运行之后应该可以实现输入账号密码,与数据库比对,重定向到欢迎界面这样的过程,可以将这个代码放在任何一个需要登录的网页中(自夸一下),当然还有很多很多的内容需要补充,留给你们自己发挥~

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

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

相关文章

双十一适合买什么东西?数码好物推荐指南!

​临近双十一&#xff0c;我猜很多朋友已经为双11做好了准备&#xff0c;打算开启买买买的节奏了&#xff01;都想着趁着双十一把平时因为价格太贵舍不得下单的东西彻底拿下&#xff01;作为一名数码博主&#xff0c;每年双11的时候都会疯狂囤很多物品&#xff0c;所以今天就跟…

创始人模式--格雷厄姆

以下是 Paul Graham 的文章《创始人模式》的翻译&#xff1a; 创始人模式 2024 年 9 月 上周在一个 Y Combinator 的活动中&#xff0c;Brian Chesky 做了一个演讲&#xff0c;在场的每个人都会记住。我之后与大多数创始人交谈时&#xff0c;他们都说这是他们听过的最好的演…

pytorch基础:模型的权值初始化与损失函数

文章目录 一、权值初始化1.2Kaiming初始化1.4 十种权重初始化方法 2.损失函数2.1损失函数初步介绍2.2交叉熵损失CrossEntropyLoss 2.3 剩余的17种损失函数介绍 一、权值初始化 在搭建好网络模型之后&#xff0c;一个重要的步骤就是对网络模型中的权值进行初始化。适当的权值初…

SpringBoot框架在明星周边销售网站中的应用

3系统分析 3.1可行性分析 通过对本星之语明星周边产品销售网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本星之语明星周边产品销售网站采用JAVA作为开发语…

国庆期间不停歇—学习ROS2第四天

1.现在终端中创建文件 其次在该文件目录下打开&#xff0c;最后在VS中 创建两个文件夹&#xff0c;最后一个是src 在终端中创建pkg&#xff0c; ros2 pkg create demo_python_topic --build-type ament_python --dependencies rclpy example_interfaces --license Apache-2.0…

[C#]使用纯opencvsharp部署yolov11-onnx图像分类模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 使用纯OpenCvSharp部署YOLOv11-ONNX图像分类模型是一项复杂的任务&#xff0c;但可以通过以下步骤实现&#xff1a; 准备环境&#xff1a;首先&#xff0c;确保开发环境已安装OpenCvSharp和必…

Spring14——案例:利用AOP环绕通知计算业务层接口执行效率

前面介绍了这么多种通知类型&#xff0c;具体该选哪一种呢? 我们可以通过一些案例加深下对通知类型的学习。 34-案例&#xff1a;利用AOP环绕通知计算业务层接口执行效率 需求分析 这个需求也比较简单&#xff0c;前面我们在介绍AOP的时候已经演示过: 需求:任意业务层接口…

链表--链表的一个技巧

少年的书桌上没有虚度的光阴 2024.10.5 大家好&#xff0c;我是小苏。 今天给大家分享一下近期我刷力扣链表题的一个技巧&#xff01; 我们知道&#xff0c;链表和数组的重要区别之一是&#xff1a; 链表不支持随机访问&#xff0c;数组支持 我们可以根据这一特性&#xff1a;把…

信息安全工程师(35)访问控制类型

前言 访问控制是几乎所有系统&#xff08;包括计算机系统和非计算机系统&#xff09;都需要用到的一种技术&#xff0c;它基于用户身份及其所归属的某项定义组来限制用户对某些信息项的访问&#xff0c;或限制对某些控制功能的使用。 一、自主访问控制&#xff08;DAC&#xff…

ElasticSearch备考 -- Search across cluster

一、题目 配置两个集群&#xff0c;集群名称为my-application-01、my-application-02&#xff0c;导入es自带Sample flight data数据集&#xff0c;配置扩集群检索&#xff0c;查询数据 二、思考 准备工作有两个集群&#xff0c;并需要对集群配置角色中增加 remote_cluster_cl…

物联网智能设备:未来生活的变革者

文章目录 引言什么是物联网智能设备&#xff1f;技术架构应用场景挑战与解决方案未来发展趋势结论 引言 随着科技的迅猛发展&#xff0c;物联网&#xff08;IoT&#xff09;正在改变我们生活的方方面面。从智能家居到工业自动化&#xff0c;物联网智能设备正在逐步融入我们的日…

AI应用的东风,奥特曼不想错过

文&#xff5c;魏琳华 编&#xff5c;王一粟 作为炙手可热的AI公司&#xff0c;Open AI又一次拿到了一轮足以令对手眼红的巨额融资。10月2日&#xff0c;Open AI宣布顺利完成66亿美元融资&#xff0c;补上了烧钱研发亏损的同时&#xff0c;还为下一轮竞争拿到了资金支持。 跻…

【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合

【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合 目录 文章目录 【电商搜索】现代工业级电商搜索技术-中科院计算机研究所-生成型检索与多级相关性相结合目录0. 论文信息1. 摘要2. 研究背景3. 主要挑战4. 创新点5. 算法模型1. **标识符设…

还在“卷”长度?长文本模型真的基于上下文进行回复吗?

近年来&#xff0c;随着长文本模型&#xff08;Long-context Model, LCM&#xff09;技术的突飞猛进&#xff0c;处理长上下文的能力已成为各大语言模型&#xff08;Large Language Model, LLM&#xff09;的核心竞争力&#xff0c;也是各大技术厂商争夺的焦点。截至2023年12月…

SystemC学习(1)— SystemC安装与HelloWorld

SystemC学习&#xff08;1&#xff09;— SystemC安装与HelloWorld 一、前言 参考文档&#xff1a; 1、ubuntu系统安装systemc-2.3.4流程 2、SystemC语言学习笔记 3、SystemC资料2.ppt 4、SystemC入门笔记 二、安装包下载与安装 我们可以直接从官网下载SystemC的库安装包&a…

多字节字符集CString转换string

实现函数如下&#xff1a; std::string CStringToUTF8(const CString& str) {// Step 1: 将 MBCS (GBK) CString 转换为宽字符&#xff08;WCHAR&#xff09;int wideLen MultiByteToWideChar(CP_ACP, 0, str.GetString(), -1, NULL, 0);if (wideLen < 0)return "…

组件中$router/$route的由来(vue-router源码分析)

1.vue-router源码下载 我们可以到github上找到对应版本的vue-router 版本号可以到项目中的node_modules/vue-router/dist/vue-router.js查看嘴上面的许可证说明(package.json只提供了版本的大致范围 ^表示2.2.x 而~表示2.x.x 都为>的含义) 在github上的vue-router我们要选择…

一个月学会Java 第2天 认识类与对象

Day2 认识类与对象 第一章 初识类 经过一个程序的编写&#xff0c;应该对程序的结构有点好奇了吧&#xff0c;如果你有基础&#xff0c;接下来的肯定非常的易懂&#xff0c;如果你没有基础也没有关系&#xff0c;反复琢磨一下也就懂了&#x1f606; 我们来重复一下第一个程序 …

Vivado - JTAG to AXI Master (DDR4)

目录 1. 简介 2. JTAG 直接操作 DDR4 2.1 Block Design 2.2 AXI SmartConnect 2.3 DDR4 MIG 2.3.1 时钟和复位 2.3.2 AXI Slave 接口 2.4 XDC 约束 2.5 TCL 代码 2.5.1 写入 DDR4 2.5.2 读取 DDR4 3. HLS IP 操作 DDR4 3.1 Block Design 3.2 HLS IP 3.2.1 HLS 代…

TypeScript面向对象 01

使用class关键字来定义一个类。对象中主要包含了两个部分&#xff1a;属性和方法。 class Person {// 定义实例属性name:string glm;age:number 1234; } const a new Person(); console.log(a.name);在属性前使用static关键字可以定义类属性&#xff08;静态属性&#xff0…