亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索
博主信息
博文 17
粉絲 1
評論 0
訪問量 17743
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
PHP實戰(zhàn): 人員管理系統(tǒng)(續(xù))
zl的php學習博客
原創(chuàng)
3067人瀏覽過

該鏈接為這個實戰(zhàn)的前置代碼, http://ipnx.cn/blog/detail/26509.html

在上次的基礎上添加了登錄,注冊,退出登錄的功能(有簡單的驗證,如郵箱格式), 并且實現(xiàn)了一個簡單的權限管理(用戶沒有登錄的情況下只能查看,不能操作).

效果

效果圖

在之前的目錄結構上新加了兩個文件,修改了兩個文件:

<span id="1.2">controller</span>

<span id="1.2.1">handle.php</span>
  1. <?php
  2. session_start();
  3. $handle = $_GET['handle'] ?? $_POST['handle'] ?? 'select';
  4. //var_dump($_POST);
  5. //echo $handle;
  6. //die();
  7. switch ($handle) {
  8. case 'select':
  9. require __DIR__ . '/select.php';
  10. break;
  11. case 'update':
  12. require __DIR__ . '/update.php';
  13. break;
  14. case 'delete':
  15. require __DIR__ . '/delete.php';
  16. break;
  17. case 'login':
  18. require dirname(__DIR__) . '../config/connect.php';
  19. $pdo = connect();
  20. $sql = "SELECT email FROM `users` WHERE email=? AND password=md5(?);";
  21. $stmt = $pdo->prepare($sql);
  22. if ($stmt->execute([$_POST['email'], $_POST['password']])) {
  23. $data = $stmt->fetch();
  24. if (is_array($data) && count($data) === 1) {
  25. // 登錄成功, 寫入session
  26. $_SESSION['email'] = $_POST['email'];
  27. // 返回響應
  28. echo json_encode(['code' => 0, 'message' => '登錄成功, 正在刷新頁面....']);
  29. } else {
  30. echo json_encode(['code' => -20005, 'message' => '登錄失敗, 數(shù)據(jù)庫中沒有該用戶,請注冊!']);
  31. }
  32. } else {
  33. echo json_encode(['code' => $stmt->errorInfo()[0], 'message' => '未知錯誤, 請聯(lián)系管理員. : ' . $stmt->errorInfo()[1]]);
  34. }
  35. break;
  36. case 'register':
  37. require dirname(__DIR__) . '../config/connect.php';
  38. $pdo = connect();
  39. $stmt = $pdo->prepare("SELECT email From `users`");
  40. $stmt->bindColumn('email', $email);
  41. $stmt->execute();
  42. $emailAyy = [];
  43. while ($stmt->fetch(PDO::FETCH_BOUND)) {
  44. $emailAyy[] = $email;
  45. }
  46. if (!in_array($_POST['email'], $emailAyy)) {
  47. $sql = "INSERT `users` SET username=?, email=?,password=md5(?)";
  48. $stmt = $pdo->prepare($sql);
  49. $stmt->execute([$_POST['username'], $_POST['email'], $_POST['password']]);
  50. if ($stmt->rowCount() === 1) {
  51. // 注冊成功,自動登錄
  52. $_SESSION['email'] = $_POST['email'];
  53. echo json_encode(['code' => 0, 'message' => '注冊成功,正在跳轉....']);
  54. } else {
  55. echo json_encode(['code' => 20004, 'message' => '未知錯誤,請聯(lián)系管理員!']);
  56. }
  57. } else {
  58. echo json_encode(['code' => -20003, 'message' => '注冊失敗, 該郵箱已經(jīng)注冊過了!']);
  59. }
  60. break;
  61. case 'logout':
  62. // 清空session
  63. session_unset();
  64. // 刪除session文件
  65. session_destroy();
  66. // 退出登錄成功
  67. echo json_encode(['code' => 0, 'message' => '退成登錄成功!']);
  68. break;
  69. default:
  70. exit('未知錯誤');
  71. }

<span id="1.6">index.php</span>

  1. <?php session_start(); ?>
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>信息管理</title>
  7. <link rel="stylesheet" href="./pure-css3-icons/icono.min.css">
  8. <link rel="stylesheet" href="./style.css">
  9. <link rel="stylesheet" href="./user-style.css">
  10. </head>
  11. <body>
  12. <header>
  13. <a href="#">首頁</a>
  14. <nav class="user-operation">
  15. <?php if (!isset($_SESSION['email'])): ?>
  16. <a data-handle="login">登錄</a>
  17. <a data-handle="register">注冊</a>
  18. <?php else: ?>
  19. <span><?= $_SESSION['email'] ?></span>
  20. <a data-handle="logout">退出登錄</a>
  21. <?php endif; ?>
  22. </nav>
  23. </header>
  24. <table>
  25. <caption>信息管理</caption>
  26. <thead>
  27. <tr>
  28. <th>序號</th>
  29. <th>姓名</th>
  30. <th>性別</th>
  31. <th>年齡</th>
  32. <th>生日</th>
  33. <th>工資</th>
  34. <th>添加時間</th>
  35. <th>修改時間</th>
  36. <?php if (!empty($_SESSION['email'])) : ?>
  37. <th>操作</th>
  38. <?php endif; ?>
  39. </tr>
  40. </thead>
  41. <tbody class="tbody"></tbody>
  42. </table>
  43. <div class="paging"></div>
  44. <div class="masking">
  45. <div class="del-confirm">
  46. <header>
  47. <h3>警告</h3>
  48. <button onclick="delMaskingClose()"><i class="icono-cross"></i></button>
  49. </header>
  50. <masking-body>
  51. 確定刪除
  52. </masking-body>
  53. <footer>
  54. <button onclick="delMaskingClose()">取消</button>
  55. <button onclick="delMaskingConfirm()">確定</button>
  56. </footer>
  57. </div>
  58. <div class="edit-confirm">
  59. <header>
  60. <h3>編輯</h3>
  61. <button onclick="editMaskingClose()"><i class="icono-cross"></i></button>
  62. </header>
  63. <masking-body class="edit-form">
  64. </masking-body>
  65. <footer>
  66. <button onclick="editMaskingClose()">取消</button>
  67. <button onclick="editMaskingConfirm()">確定</button>
  68. </footer>
  69. </div>
  70. </div>
  71. <div class="user-masking">
  72. <div class="user-login" style="display: block">
  73. <header>
  74. <h3>登錄</h3>
  75. <button onclick="userMaskingClose()"><i class="icono-cross"></i></button>
  76. </header>
  77. <masking-body>
  78. <form id="login">
  79. <label for="email">郵箱: </label>
  80. <input type="email" name="email" id="email" required>
  81. <label for="password">密碼: </label>
  82. <input type="password" name="password" id="password">
  83. <button type="button" class="user-submit" data-handle="login">登錄</button>
  84. <span class="tip"></span>
  85. <a class="no-account">沒有賬號? 點擊注冊</a>
  86. </form>
  87. </masking-body>
  88. </div>
  89. <div class="user-register">
  90. <header>
  91. <h3>注冊</h3>
  92. <button onclick="userMaskingClose()"><i class="icono-cross"></i></button>
  93. </header>
  94. <masking-body>
  95. <form id="register">
  96. <label for="username">用戶名: </label>
  97. <input type="text" name="username" id="username">
  98. <label for="email">郵箱: </label>
  99. <input type="email" name="email" id="email">
  100. <label for="password">密碼: </label>
  101. <input type="password" name="password" id="password">
  102. <label for="password1">確認密碼: </label>
  103. <input type="password" name="password1" id="password1">
  104. <button type="button" class="user-submit" data-handle="register">注冊</button>
  105. <span class="tip"></span>
  106. <a class="account">已有賬號? 點擊登錄</a>
  107. </form>
  108. </masking-body>
  109. </div>
  110. </div>
  111. <script src="./event.js"></script>
  112. <script src="./user-operation.js"></script>
  113. </body>
  114. </html>

<span id="1.8">數(shù)據(jù)表</span>

  1. /*
  2. Navicat MySQL Data Transfer
  3. Source Server : php_test
  4. Source Server Version : 50726
  5. Source Host : localhost:3306
  6. Source Database : phpedu
  7. Target Server Type : MYSQL
  8. Target Server Version : 50726
  9. File Encoding : 65001
  10. Date: 2021-03-02 17:04:52
  11. */
  12. SET FOREIGN_KEY_CHECKS=0;
  13. -- ----------------------------
  14. -- Table structure for users
  15. -- ----------------------------
  16. DROP TABLE IF EXISTS `users`;
  17. CREATE TABLE `users` (
  18. `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  19. `username` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用戶名',
  20. `email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '郵箱',
  21. `password` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密碼',
  22. `create_d` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
  23. PRIMARY KEY (`uid`),
  24. UNIQUE KEY `unique_email` (`email`)
  25. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
  26. -- ----------------------------
  27. -- Records of users
  28. -- ----------------------------
  29. INSERT INTO `users` VALUES ('1', 'admin', 'admin@qq.com', 'e10adc3949ba59abbe56e057f20f883e', '2021-03-02 16:28:15');
  30. INSERT INTO `users` VALUES ('2', 'zhangsan', 'zhangsan@qq.com', 'e10adc3949ba59abbe56e057f20f883e', '2021-03-02 16:43:23');

<span id="1.9">user-operation.js</span>

  1. const form = document.forms;
  2. const xhr = new XMLHttpRequest();
  3. const loginEmail = document.querySelector('#login #email');
  4. const loginPassword = document.querySelector('#login #password');
  5. const registerUsername = document.querySelector('#register #username');
  6. const registerEmail = document.querySelector('#register #email');
  7. const registerPassword = document.querySelector('#register #password');
  8. const registerPassword1 = document.querySelector('#register #password1');
  9. const loginTip = document.querySelector('#login .tip');
  10. const registerTip = document.querySelector('#register .tip');
  11. xhr.responseType = 'json';
  12. [loginEmail, loginPassword, registerUsername, registerEmail, registerPassword, registerPassword1]
  13. .forEach(item => item.oninput = () => [loginTip, registerTip].forEach(it => it.innerHTML = null));
  14. document.querySelector('.user-operation').addEventListener('click', function (ev) {
  15. ev.preventDefault();
  16. console.log(ev.target.getAttribute('data-handle'));
  17. switch (ev.target.getAttribute('data-handle')) {
  18. case 'login':
  19. document.querySelector('.user-masking').style.display = 'block';
  20. document.querySelector('.user-login').style.display = 'block';
  21. break;
  22. case 'register':
  23. document.querySelector('.user-masking').style.display = 'block';
  24. document.querySelector('.user-register').style.display = 'block';
  25. break;
  26. case 'logout':
  27. xhr.open('post', './Controller/handle.php?handle=logout');
  28. xhr.onload = () => {
  29. console.log(xhr.response);
  30. if (xhr.response.code === 0) {
  31. alert(xhr.response.message);
  32. location.href = 'index.php';
  33. }
  34. };
  35. xhr.onerror = (error) => console.log(error);
  36. xhr.send();
  37. break;
  38. default:
  39. alert('未知錯誤');
  40. }
  41. });
  42. document.querySelectorAll('.user-submit').forEach(item => item.addEventListener('click', function (ev) {
  43. console.log(ev.target.getAttribute('data-handle'));
  44. switch (ev.target.getAttribute('data-handle')) {
  45. case 'login':
  46. login();
  47. break;
  48. case 'register':
  49. register();
  50. break;
  51. default:
  52. alert('未知錯誤');
  53. }
  54. }));
  55. /**
  56. * 登錄方法
  57. */
  58. function login() {
  59. const login = form.login;
  60. if (login.email.value.trim().length > 0) { // 判斷郵箱是否有值
  61. // 判斷郵箱格式是否正確
  62. if (/^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/.test(login.email.value.trim())) {
  63. if (login.password.value.trim().length > 0) { // 判斷密碼是否有值
  64. const formData = new FormData(login);
  65. formData.append('handle', 'login');
  66. xhr.open('post', './Controller/handle.php');
  67. xhr.onload = () => {
  68. console.log(xhr.response);
  69. loginTip.innerHTML = xhr.response.message;
  70. if (xhr.response.code === 0) {
  71. setTimeout(() => location.href = 'index.php', 2000);
  72. }
  73. };
  74. xhr.onerror = (error) => console.log(error);
  75. xhr.send(formData);
  76. } else {
  77. loginTip.innerHTML = '請輸入密碼!';
  78. login.password.focus();
  79. }
  80. } else {
  81. loginTip.innerHTML = '請輸入正確格式的郵箱!';
  82. login.email.focus();
  83. }
  84. } else {
  85. loginTip.innerHTML = '請輸入郵箱!';
  86. login.email.focus();
  87. }
  88. }
  89. /**
  90. * 注冊方法
  91. */
  92. function register() {
  93. const register = form.register;
  94. console.log(register);
  95. if (register.username.value.trim().length > 0) { // 判斷用戶名是否有值
  96. if (register.email.value.trim().length > 0) { // 判斷郵箱是否有值
  97. // 判斷郵箱格式是否正確
  98. if (/^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/.test(register.email.value.trim())) {
  99. if (register.password.value.trim().length > 0) {// 判斷密碼是否有值
  100. if (register.password.value.trim() === register.password1.value.trim()) { // 判斷兩次密碼是否相同
  101. const formData = new FormData(register);
  102. formData.delete('password1');
  103. formData.append('handle', 'register');
  104. xhr.open('post', './Controller/handle.php');
  105. xhr.onload = () => {
  106. console.log(xhr.response);
  107. registerTip.innerHTML = xhr.response.message;
  108. if (xhr.response.code === 0) {
  109. setTimeout(() => location.href = 'index.php', 2000);
  110. }
  111. };
  112. xhr.onerror = (error) => console.log(error);
  113. xhr.send(formData);
  114. } else {
  115. registerTip.innerHTML = '請保證二次輸入的密碼和依次輸入的密碼相同!';
  116. register.password.focus();
  117. }
  118. } else {
  119. registerTip.innerHTML = '請輸入密碼!';
  120. register.password.focus();
  121. }
  122. } else {
  123. registerTip.innerHTML = '請輸入正確格式的郵箱!';
  124. register.email.focus();
  125. }
  126. } else {
  127. registerTip.innerHTML = '請輸入郵箱!';
  128. register.email.focus();
  129. }
  130. } else {
  131. registerTip.innerHTML = '請輸入用戶名';
  132. register.username.focus();
  133. }
  134. }
  135. document.querySelector('.no-account').addEventListener('click', function (ev) {
  136. document.querySelector('.user-login').style.display = 'none';
  137. document.querySelector('.user-register').style.display = 'block';
  138. });
  139. document.querySelector('.account').addEventListener('click', function (ev) {
  140. document.querySelector('.user-login').style.display = 'block';
  141. document.querySelector('.user-register').style.display = 'none';
  142. });
  143. function userMaskingClose() {
  144. document.querySelector('.user-masking').style.display = 'none';
  145. document.querySelector('.user-login').style.display = 'none';
  146. document.querySelector('.user-register').style.display = 'none';
  147. }

<span id="1.10">user-style.css</span>

  1. body > header {
  2. display: flex;
  3. align-self: stretch;
  4. padding: 0.5em 1em;
  5. background-color: #333333;
  6. }
  7. body > header > a {
  8. color: #bbbbbb;
  9. }
  10. body > header > nav {
  11. margin-left: auto;
  12. }
  13. body > header > nav a {
  14. color: #bbbbbb;
  15. }
  16. body > header a:hover {
  17. color: #ffffff;
  18. cursor: pointer;
  19. }
  20. .user-masking {
  21. position: fixed;
  22. top: 0;
  23. right: 0;
  24. bottom: 0;
  25. left: 0;
  26. background-color: rgba(0, 0, 0, .5);
  27. display: none;
  28. }
  29. .user-masking .user-login,
  30. .user-masking .user-register {
  31. width: 446px;
  32. height: 272px;
  33. background-color: #f4eded;
  34. border-radius: 1em;
  35. position: absolute;
  36. margin: auto;
  37. top: 0;
  38. right: 0;
  39. bottom: 0;
  40. left: 0;
  41. display: none;
  42. }
  43. .user-masking .user-register{
  44. height: 342px;
  45. }
  46. .user-masking header {
  47. display: flex;
  48. justify-content: space-between;
  49. align-items: center;
  50. padding: 8px 16px;
  51. border-bottom: 1px solid #3a3a3a;
  52. }
  53. .user-masking header button {
  54. background-color: transparent;
  55. border: none;
  56. height: 34px;
  57. width: 50px;
  58. cursor: pointer;
  59. }
  60. .user-masking masking-body {
  61. height: calc(100% - 50px);
  62. display: block;
  63. padding: 16px;
  64. }
  65. .user-masking masking-body form > label {
  66. /*place-self: center;*/
  67. text-align: left;
  68. line-height: 2em;
  69. }
  70. .user-masking masking-body form > input{
  71. padding: 0 .5em;
  72. line-height: 2em;
  73. }
  74. .user-masking masking-body form {
  75. display: grid;
  76. gap: .5em 0;
  77. width: 100%;
  78. padding: 1em 1em;
  79. grid-template-columns: 4.5em 1fr;
  80. }
  81. .user-submit{
  82. grid-area: span 1 / span 2;
  83. place-self: center;
  84. border: none;
  85. border-radius: .25em;
  86. background-color: #3485FB;
  87. padding: .5em 1em;
  88. }
  89. .tip{
  90. grid-area: span 1 / span 2;
  91. place-self: center;
  92. }
  93. .no-account,
  94. .account{
  95. grid-area: span 1 / span 2;
  96. place-self: center;
  97. }
  98. .no-account:hover,
  99. .account:hover{
  100. color: #7f007f;
  101. cursor: pointer;
  102. }
批改老師:天蓬老師天蓬老師

批改狀態(tài):合格

老師批語:
本博文版權歸博主所有,轉載請注明地址!如有侵權、違法,請聯(lián)系admin@php.cn舉報處理!
全部評論 文明上網(wǎng)理性發(fā)言,請遵守新聞評論服務協(xié)議
0條評論
作者最新博文
關于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓,幫助PHP學習者快速成長!
關注服務號 技術交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學習
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號

  • 登錄PHP中文網(wǎng),和優(yōu)秀的人一起學習!
    全站2000+教程免費學