php+jquery实现登录验证
16lz
2021-03-29
使用session会话控制实现登录、注册、退出
登录login.php
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
form{
display: grid;
gap: 1em;
width: 20em;
border: 1px solid #ccc;
padding: 2em 3em;
margin: 5em auto;
background-color: #efefef;
border-radius: .5em;
}
</style>
</head>
<body>
<form method="post" id='login'>
<span>用户登录</span>
<input type="email" name="email" placeholder="邮箱">
<input type="password" name="password" placeholder="密码">
<button type="button" name="submit">登录</button>
<span class="tips"></span>
</form>
</body>
<script>
const form=document.forms.login;
const email=form.email;
const password=form.password;
const btn=form.submit;
const xhr=new XMLHttpRequest;
const tips=document.querySelector('.tips');
btn.onclick=()=>{
if(email.value.trim().length>0 && password.value.trim().length >0){
xhr.open('post','handle.php?action=login');
xhr.responseType='json';
xhr.onload=()=>{
tips.innerHTML=xhr.response.msg;
if(xhr.response.status === 1){
setInterval(()=>location.href='index1.php',1000);
}
}
xhr.send(new FormData(form));
}else{
tips.innerHTML='邮箱或密码不能为空';
email.focus();
}
[email,password].forEach((item)=>item.oninput=()=>tips.innerHTML='')
}
</script>
</html>
效果图
注册页面resgiter.php
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
*{
margin: 0;
padding: 0;
}
form{
display: grid;
gap: 1em;
width: 20em;
border: 1px solid #ccc;
padding: 2em 3em;
margin: 5em auto;
background-color: #efefef;
border-radius: .5em;
}
</style>
</head>
<body>
<form method="post" id='login'>
<span>用户注册</span>
<input type="text" name="name" placeholder="用户名">
<input type="email" name="email" placeholder="邮箱">
<input type="password1" name="password1" placeholder="密码">
<input type="password2" name="password2" placeholder="再次输入密码">
<button type="button" name="submit">注册</button>
<span class="tips"></span>
</form>
</body>
<script>
const form=document.forms.login;
const name=form.name;
const email=form.email;
const password1=form.password1;
const password2=form.password2;
const btn=form.submit;
const xhr=new XMLHttpRequest;
const tips=document.querySelector('.tips');
btn.onclick=()=>{
if(email.value.trim().length>0 && password1.value.trim().length >0 && password2.value.trim().length >0 && name.value.trim().length >0){
if(password1.value !== password2.value){
tips.innerHTML='两次密码输入不一致';
}else{
xhr.open('post','handle.php?action=resgiter');
xhr.responseType='json';
xhr.onload=()=>{
console.log(xhr.response);
tips.innerHTML=xhr.response.msg;
if(xhr.response.status === 1){
setInterval(()=>location.href='index1.php',1000);
}
}
const data=new FormData(form);
data.delete('password2')
xhr.send(data);
}
}else{
tips.innerHTML='邮箱或密码不能为空';
email.focus();
}
[name,email,password1,password2].forEach((item)=>item.oninput=()=>tips.innerHTML='')
}
</script>
</html>
效果图
首页index1.php
<?php session_start()?>
src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
.active{
color: green;
}
.modal{
width: 550px;
position: absolute;
top: 0;
background-color: skyblue;
display: none;
}
a{
text-decoration: none;
color: #000;
}
*{
margin: 0;
padding: 0;
}
.header{
display: flex;
background-color: #333;
padding: .5em 1em;
}
.nav {
margin-left:auto;
}
a{
color: #aaa;
text-decoration: none;
}
a:hover{
color:#fff;
}
</style>
<div class="header">
<a href="index1.php">首页</a>
<div class="nav">
<?php if($_SESSION['email']):?>
<a href="#"><?php echo $_SESSION['email']?></a>
<a href="handle.php?action=logout">退出</a>
<?php else:?>
<a href="login.php">登录</a>
<a href="resgiter.php">注册</a>
<?php endif?>
</div>
</div>
<!-- 判断是否登录,登录才能看到数据 -->
<?php if($_SESSION['email']):?>
<table>
<caption>员工列表</caption>
<thead>
<tr>
<th>id</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>邮箱</th>
<th>生日</th>
<th>入职日期</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<p class="page">
</p>
<div class="modal">
<button class="close">关闭</button>
<form action="" method="POST" id="edit">
<p><label for="">姓名:<input type="text" value="" name="name" id="name" /></label></p>
<p><label for="">性别:<select name="gender" id="gender">
<option value="male">男</option>
<option value="female">女</option>
</select>
</label></p>
<p> <label for="">年龄:<input type="text" value="" name="age" id="age" /></label></p>
<p><label for="">邮箱:<input type="email" value="" name="email" id="email" /></label></p>
<p><label for="">生日:<input type="text" value="" name="borthday" id="borthday" /></label></p>
<input type="hidden" value="" name="id" id="id" />
<p> <label for=""><button class="save">保存</button></label></p>
</form>
</div>
<script>
select(1);
function show(data) {
var html = '';
$.each(data, function(index, value) {
html += '<tr>';
html += '<td>' + data[index]['id'] + '</td>';
html += '<td>' + data[index]['name'] + '</td>';
html += '<td>' + data[index]['gender'] + '</td>';
html += '<td>' + data[index]['age'] + '</td>';
html += '<td>' + data[index]['email'] + '</td>';
html += '<td>' + data[index]['borthday'] + '</td>';
html += '<td>' + data[index]['create_time'] + '</td>';
html += '<td><button class="edit" data-index='+data[index]['id']+'>编辑</button><button class="del"data-index='+data[index]['id']+'>删除</button></td>';
html += '</tr>';
})
return html;
}
// 查询
function select(page = 1) {
$.get("http://127.0.0.119/pdo/limit.php?action=select&p=" + page, function(res) {
var obj = jQuery.parseJSON(res);
let pages = obj.pages;
let rows = obj.rows;
console.log(rows);
$('tbody').html(show(rows));
$('.page').html(getPage(page, pages));
})
}
function getPage(page = 1, pages) {
let p = "";
let active = "";
// 首页|上一页
if (page <= 1) page = 1;
if (page !== 1) {
p += '<a href="http://127.0.0.119/pdo/limit.php?action=select&p=1">首页</a>';
p += '<a href="http://127.0.0.119/pdo/limit.php?action=select&p= '+ Math.max(1, page - 1) + '">上一页</a>';
}
// 高亮
for (i = 1; i <= pages; i++) {
active = "";
if (page == i) active = 'class="active"';
p += '<a href="http://127.0.0.119/pdo/limit.php?action=select&p=' + i+ '"'+ active + '>' + i + '</a>';
}
// 下一页|尾页
if (page >= pages) page = pages;
if (page != pages) {
p += '<a href="http://127.0.0.119/pdo/limit.php?action=select&p=' + ( parseInt(page) +1 ) + '">下一页</a>';
p += '<a href="http://127.0.0.119/pdo/limit.php?action=select&p=' + pages + '">尾页</a>';
}
return p;
}
$('.page').on('click',
function(event){
event.preventDefault();
event.stopPropagation();
let page=$(event.target).attr('href');
page=page.split('=')[2];
select(page);
}
);
//编辑
$(' tbody').on('click','.edit',function(){
let id=$(this).attr('data-index');
$.get("http://127.0.0.119/pdo/limit.php?action=getOne&id=" + id, function(res) {
var obj = jQuery.parseJSON(res);
let rows = obj.rows;
let name=rows.name;
let gender=rows.gender;
let age=rows.age;
let email=rows.email;
let borthday=rows.borthday;
let id=rows.id;
$('#name').val(name);
if (gender=='male'){
$('#gender option').removeAttr('selected');
$('#gender option:nth-of-type(0)').attr('selected',true);
}else{
$('#gender option').removeAttr('selected');
$('#gender option:nth-of-type(2)').attr('selected',true);
}
$('#age').val(age);
$('#email').val(email);
$('#borthday').val(borthday);
$('#id').val(id);
$('.modal').show();
});
});
$('.close').click(()=>{
$('.modal').hide();
})
//保存
$('.save').on('click',function(event){
event.preventDefault();
$.post("http://127.0.0.119/pdo/limit.php?action=save", $("#edit").serialize(),function(data){
var obj = jQuery.parseJSON(data);
alert(obj.msg);
if(obj.status===1){
$('.modal').hide();
location.reload();
}
});
})
//删除
$(' tbody').on('click','.del',function(){
let id=$(this).attr('data-index');
if(confirm('确定要删除吗?')){
$.get("http://127.0.0.119/pdo/limit.php?action=delete&id=" + id, function(res) {
var obj = jQuery.parseJSON(res);
alert(obj.msg);
if(obj.status===1)location.reload();
});
}
});
</script>
<?php else:?>
<script>
alert('没有登录请先登录');
location.href='login.php';
</script>
<?php endif?>
</body>
</html>
后端php代码
$config = [
'type' => 'mysql',
'host' => '127.0.0.1',
'dbname' => 'php',
'port' => 3306,
'charset' => 'utf8mb4',
'username' => 'root',
'passwrod' => '123456',
];
extract($config);
$dsn = sprintf('%s:dbname=%s;', $type, $dbname);
try {
$pdo = new PDO($dsn, $username, $passwrod);
//设置结果集的返回类型
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
die('连接失败' . $e->getMessage());
}
//开启session
session_start();
$action = $_GET['action'] ?? 'select';
$page = $_GET['p'] ?? 1;
$id = $_GET['id'] ?? 1;
$data = $_POST;
switch ($action) {
case 'select':
select($pdo, $page);
break;
case 'getOne':
getOne($pdo, $id);
break;
case 'save':
save($pdo, $data);
break;
case 'delete':
delete($pdo, $id);
break;
case 'login':
login($pdo, $data);
break;
case 'resgiter':
resgiter($pdo, $data);
break;
case 'logout':
logout();
break;
}
//查询所有数据
function select($pdo, $page = 1, $num = 5)
{
//计算当前页的起始偏移量
$offset = ($page - 1) * $num;
//ceil()向上取整
$sql = "SELECT CEIL(COUNT(1)/{$num}) total FROM user";
$row = $pdo->query($sql);
$pages = $row->fetch()['total'];
// print_r($row);
//每页显示的数据
$sql = "SELECT * FROM `user` LIMIT {$offset},{$num}";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll();
echo json_encode(['pages' => $pages, 'rows' => $rows]);
}
//获取单条信息
function getOne($pdo, $id)
{
$sql = "SELECT * FROM user WHERE id={$id}";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$rows = $stmt->fetch();
echo json_encode(['rows' => $rows]);
}
//更新数据
function save($pdo, $data)
{
if ($_SESSION['email'] != 'admin@admin.com') {
echo json_encode(['status' => 0, 'msg' => '没有权限,请联系管理员']);
}else{
$sql = "UPDATE `user` SET name = :name, gender = :gender, age = :age, email = :email, borthday = :borthday WHERE id=:id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':name', $data['name'], PDO::PARAM_STR);
$stmt->bindParam(':gender', $data['gender'], PDO::PARAM_STR);
$stmt->bindParam(':age', $data['age'], PDO::PARAM_STR);
$stmt->bindParam(':email', $data['email'], PDO::PARAM_STR);
$stmt->bindParam(':borthday', $data['borthday'], PDO::PARAM_STR);
$stmt->bindParam(':id', $data['id'], PDO::PARAM_INT);
$stmt->execute();
if ($stmt->rowCount() > 0) {
echo json_encode(['status' => 1, 'msg' => '更新成功']);
} else {
echo json_encode(['status' => 0, 'msg' => '更新失败']);
}
}
}
//删除数据
function delete($pdo, $id)
{
if ($_SESSION['email'] !== 'admin@admin.com') {
echo json_encode(['status' => 0, 'msg' => '没有权限,请联系管理员']);
}else{
$sql = "DELETE FROM `user` WHERE id=:id";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
if ($stmt->rowCount() > 0) {
echo json_encode(['status' => 1, 'msg' => '删除成功']);
} else {
echo json_encode(['status' => 0, 'msg' => '删除失败']);
}
}
}
// 登录
function login($pdo, $data)
{
$sql = "SELECT * FROM users WHERE email=:email AND password=md5(:password)";
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
if ($stmt->fetch()) {
$_SESSION['email'] = $data['email'];
echo json_encode(['status' => 1, 'msg' => '登录成功,正在跳转首页...']);
} else {
echo json_encode(['status' => 0, 'msg' => '邮箱或密码错误,登录失败']);
}
}
// 注册
function resgiter($pdo, $data)
{
$sql = "SELECT * FROM users ";
$stmt = $pdo->prepare($sql);
$stmt->bindColumn('email', $email);
$stmt->execute();
$emails = [];
while ($stmt->fetch(PDO::FETCH_BOUND)) {
$emails[] = $email;
}
if (in_array($data['email'], $emails)) {
echo json_encode(['status' => 0, 'msg' => '邮箱已经注册,请直接登录']);
} else {
$sql = 'insert users set name=:name,email=:email,password=md5(:password1)';
$stmt = $pdo->prepare($sql);
$stmt->execute($data);
if ($stmt->rowCount() === 1) {
$_SESSION['email'] = $data['email'];
echo json_encode(['status' => 1, 'msg' => '注册成功,正在跳转到首页']);
} else {
echo json_encode(['status' => 0, 'msg' => '注册失败']);
}
}
}
// 退出
function logout()
{
session_unset();
echo '<script>alert("退出成功");location.href="login.php";</script>';
}
普通用户登录没有编辑和删除的权限
如果没有登录打开首页则提示登录并且跳转到登录页面
管理员登录可以删除和编辑
注册
更多相关文章
- 苏宁首页仿写,及grid布局相关属性预习
- flex基础:flex项目上的三个属性以及利用flex完成移动商城首页的页
- flex模拟移动商城首页页面布局/grid布局的相关属性
- 利用flex布局模仿某商城首页
- flex项目上的三个属性及移动商城首页的页眉和页脚的布局
- 【案例】使用flex弹性布局仿写移动端苏宁首页并了解grid布局的相
- Authing 双周动态:支持飞书登录(3.13-3.27)
- css之flex项目属性与商城首页布局实战
- 移动商城首页的页眉和页脚的布局和flex项目三个属性