当前位置: 首页 > news >正文

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

需要工具:

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!";// 这里可以添加登录成功后的代码,例如设置 sessionsession_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'] . "!";
?>

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

相关文章:

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

需要工具&#xff1a; MySQL数据库、vscode上的php插件PHP Server等 项目结构&#xff1a; login | --backend | --database.sql |--login.php |--welcome.php |--index.html |--script.js |--style.css 项目开展 index.html&#xff1a; 首先需要一个静态网页&#x…...

Vue中watch监听属性的一些应用总结

【1】vue2中watch的应用 ① 简单监视 在 Vue 2 中&#xff0c;如果你不需要深度监视&#xff0c;即只需监听顶层属性的变化&#xff0c;可以使用简写形式来定义 watch。这种方式更加简洁&#xff0c;适用于大多数基本场景。 示例代码 假设你有一个 Vue 组件&#xff0c;其中…...

MongoDB-aggregate流式计算:带条件的关联查询使用案例分析

在数据库的查询中&#xff0c;是一定会遇到表关联查询的。当两张大表关联时&#xff0c;时常会遇到性能和资源问题。这篇文章就是用一个例子来分享MongoDB带条件的关联查询发挥的作用。 假设工作环境中有两张MongoDB集合&#xff1a;SC_DATA&#xff08;学生基本信息集合&…...

Redis数据库与GO(一):安装,string,hash

安装包地址&#xff1a;https://github.com/tporadowski/redis/releases 建议下载zip版本&#xff0c;解压即可使用。解压后&#xff0c;依次打开目录下的redis-server.exe和redis-cli.exe&#xff0c;redis-cli.exe用于输入指令。 一、基本结构 如图&#xff0c;redis对外有个…...

expressjs,实现上传图片,返回图片链接

在 Express.js 中实现图片上传并返回图片链接&#xff0c;你通常需要使用一个中间件来处理文件上传&#xff0c;比如 multer。multer 是一个 node.js 的中间件&#xff0c;用于处理 multipart/form-data 类型的表单数据&#xff0c;主要用于上传文件。 以下是一个简单的示例&a…...

爬虫——XPath基本用法

第一章XML 一、xml简介 1.什么是XML&#xff1f; 1&#xff0c;XML指可扩展标记语言 2&#xff0c;XML是一种标记语言&#xff0c;类似于HTML 3&#xff0c;XML的设计宗旨是传输数据&#xff0c;而非显示数据 4&#xff0c;XML标签需要我们自己自定义 5&#xff0c;XML被…...

常见排序算法汇总

排序算法汇总 这篇文章说明下排序算法&#xff0c;直接开始。 1.冒泡排序 最简单直观的排序算法了&#xff0c;新手入门的第一个排序算法&#xff0c;也非常直观&#xff0c;最大的数字像泡泡一样一个个的“冒”到数组的最后面。 算法思想&#xff1a;反复遍历要排序的序列…...

Golang | Leetcode Golang题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; func repeatedSubstringPattern(s string) bool {return kmp(s s, s) }func kmp(query, pattern string) bool {n, m : len(query), len(pattern)fail : make([]int, m)for i : 0; i < m; i {fail[i] -1}for i : 1; i < m; i {j : …...

0.计网和操作系统

0.计网和操作系统 熟悉计算机网络和操作系统知识&#xff0c;包括 TCP/IP、UDP、HTTP、DNS 协议等。 常见的页面置换算法&#xff1a; 先进先出&#xff08;FIFO&#xff09;算法&#xff1a;将最早进入内存的页面替换出去。最近最少使用&#xff08;LRU&#xff09;算法&am…...

探索Prompt Engineering:开启大型语言模型潜力的钥匙

前言 什么是Prompt&#xff1f;Prompt Engineering? Prompt可以理解为向语言模型提出的问题或者指令&#xff0c;它是激发模型产生特定类型响应的“触发器”。 Prompt Engineering&#xff0c;即提示工程&#xff0c;是近年来随着大型语言模型&#xff08;LLM&#xff0c;Larg…...

滚雪球学Oracle[3.3讲]:数据定义语言(DDL)

全文目录&#xff1a; 前言一、约束的高级使用1.1 主键&#xff08;Primary Key&#xff09;案例演示&#xff1a;定义主键 1.2 唯一性约束&#xff08;Unique&#xff09;案例演示&#xff1a;定义唯一性约束 1.3 外键&#xff08;Foreign Key&#xff09;案例演示&#xff1a…...

ssrf学习(ctfhub靶场)

ssrf练习 目录 ssrf类型 漏洞形成原理&#xff08;来自网络&#xff09; 靶场题目 第一题&#xff08;url探测网站下文件&#xff09; 第二关&#xff08;使用伪协议&#xff09; 关于http和file协议的理解 file协议 http协议 第三关&#xff08;端口扫描&#xff09…...

ElasticSearch之网络配置

对官方文档Networking的阅读笔记。 ES集群中的节点&#xff0c;支持处理两类通信平面 集群内节点之间的通信&#xff0c;官方文档称之为transport layer。集群外的通信&#xff0c;处理客户端下发的请求&#xff0c;比如数据的CRUD&#xff0c;检索等&#xff0c;官方文档称之…...

【C语言进阶】系统测试与调试

1. 引言 在开始本教程的深度学习之前&#xff0c;我们需要了解整个教程的目标及其结构&#xff0c;以及为何进阶学习是提升C语言技能的关键。 目标和结构&#xff1a; 教程目标&#xff1a;本教程旨在通过系统化的学习&#xff0c;从单元测试、系统集成测试到调试技巧&#xf…...

多个单链表的合成

建立两个非递减有序单链表&#xff0c;然后合并成一个非递增有序的单链表。 注意&#xff1a;建立非递减有序的单链表&#xff0c;需要采用创建单链表的算法 输入格式: 1 9 5 7 3 0 2 8 4 6 0 输出格式: 9 8 7 6 5 4 3 2 1 输入样例: 在这里给出一组输入。例如&#xf…...

『建议收藏』ChatGPT Canvas功能进阶使用指南!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…...

Ollama 运行视觉语言模型LLaVA

Ollama的LLaVA&#xff08;大型语言和视觉助手&#xff09;模型集已更新至 1.6 版&#xff0c;支持&#xff1a; 更高的图像分辨率&#xff1a;支持高达 4 倍的像素&#xff0c;使模型能够掌握更多细节。改进的文本识别和推理能力&#xff1a;在附加文档、图表和图表数据集上进…...

gdb 调试 linux 应用程序的技巧介绍

使用 gdb 来调试 Linux 应用程序时&#xff0c;可以显著提高开发和调试的效率。gdb&#xff08;GNU 调试器&#xff09;是一款功能强大的调试工具&#xff0c;适用于调试各类 C、C 程序。它允许我们在运行程序时检查其状态&#xff0c;设置断点&#xff0c;跟踪变量值的变化&am…...

Java项目实战II基于Java+Spring Boot+MySQL的房产销售系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着房地产市场的蓬勃发展&#xff0c;房产销售业务日益复杂&#xff0c;传统的手工管理方式已难以满…...

aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图

aws(学习笔记第一课) 使用AWS CLI 学习内容&#xff1a; 使用AWS CLI配置密钥对创建ec2 server使用drawio&#xff08;vscode插件&#xff09;进行AWS的画图 1. 使用AWS CLI 注册AWS账号 AWS是通用的云计算平台&#xff0c;可以提供ec2&#xff0c;vpc&#xff0c;SNS以及clo…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

标注工具核心架构分析——主窗口的图像显示

&#x1f3d7;️ 标注工具核心架构分析 &#x1f4cb; 系统概述 主要有两个核心类&#xff0c;采用经典的 Scene-View 架构模式&#xff1a; &#x1f3af; 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 &#x1f527; 关键函数&…...

Shell 解释器​​ bash 和 dash 区别

bash 和 dash 都是 Unix/Linux 系统中的 ​​Shell 解释器​​&#xff0c;但它们在功能、语法和性能上有显著区别。以下是它们的详细对比&#xff1a; ​​1. 基本区别​​ ​​特性​​​​bash (Bourne-Again SHell)​​​​dash (Debian Almquist SHell)​​​​来源​​G…...