员工管理添加登录验证 - 注册 - 管理授权

作业内容:将上周的员工管理系统加上登录验证功能,实现一个功能相对完整的:员工管理系统“,试试看,你行的

1. staffs 表添加 password 字段和密码为 md5 字段 id 的值作测试

  1. alter table staffs add password varchar(128) not null after name;
  2. update staffs set password = md5(id);

2. 添加前端静态页 0302.html

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>员工管理系统</title>
  8. <link rel="stylesheet" href="style.css">
  9. <style>
  10. body {
  11. margin: 0;
  12. }
  13. header {
  14. display: flex;
  15. width: 90%;
  16. justify-content: space-between;
  17. background-color: #333;
  18. padding: 0.5em 1em;
  19. }
  20. header a {
  21. color: #bbb;
  22. text-decoration: none;
  23. }
  24. header a:hover {
  25. color: white;
  26. }
  27. header nav {
  28. margin-left: auto;
  29. }
  30. </style>
  31. </head>
  32. <body>
  33. <header>
  34. <a href="">首页</a>
  35. <!-- 登录注册渲染区 -->
  36. <nav></nav>
  37. </header>
  38. <table>
  39. <caption>员工管理系统</caption>
  40. <!-- 表头渲染区 -->
  41. <thead></thead>
  42. <!-- 数据渲染区 -->
  43. <tbody></tbody>
  44. </table>
  45. <!-- 分页渲染区 -->
  46. <p></p>
  47. <!-- 模态框编辑区 -->
  48. <div class="modal edit">
  49. <div class="modal-drop"></div>
  50. <div class="modal-body">
  51. <button class="close">关闭</button>
  52. <form name="editform">
  53. <table>
  54. <caption>员工信息编辑</caption>
  55. <tbody>
  56. <tr>
  57. <td>姓名</td>
  58. <td><input type="text" value="" name="name"></td>
  59. </tr>
  60. <tr>
  61. <td>性别</td>
  62. <td>
  63. <select name="gender">
  64. <option value="male" selected></option>
  65. <option value="female"></option>
  66. </select>
  67. </td>
  68. </tr>
  69. <tr>
  70. <td>工资</td>
  71. <td><input type="text" value="" name="salary"></td>
  72. </tr>
  73. <tr>
  74. <td>邮箱</td>
  75. <td><input type="text" value="" name="email"></td>
  76. </tr>
  77. <tr>
  78. <td>生日</td>
  79. <td><input type="text" value="" name="birthday"></td>
  80. </tr>
  81. <tr>
  82. <td colspan="2"><button class="save">保存</button></td>
  83. </tr>
  84. </tbody>
  85. </table>
  86. </form>
  87. </div>
  88. </div>
  89. <!-- 模态登录区 -->
  90. <div class="modal login">
  91. <div class="modal-drop"></div>
  92. <div class="modal-body">
  93. <button class="close">关闭</button>
  94. <form name="loginform">
  95. <table>
  96. <caption>用户登录</caption>
  97. <tbody>
  98. <tr>
  99. <td>邮箱</td>
  100. <td><input type="text" value="" name="email" placeholder="邮箱"></td>
  101. </tr>
  102. <tr>
  103. <td>密码</td>
  104. <td><input type="password" name="password" placeholder="密码"></td>
  105. </tr>
  106. <tr>
  107. <td colspan="2"><button type="button" class="login">登录</button>
  108. <p class="tips"></p>
  109. </td>
  110. </tr>
  111. </tbody>
  112. </table>
  113. </form>
  114. </div>
  115. </div>
  116. <!-- 模态注册区 -->
  117. <div class="modal register">
  118. <div class="modal-drop"></div>
  119. <div class="modal-body">
  120. <button class="close">关闭</button>
  121. <form name="registerform">
  122. <table>
  123. <caption>用户注册</caption>
  124. <tbody>
  125. <tr>
  126. <td>姓名</td>
  127. <td><input type="text" value="" name="name" placeholder="用户名"></td>
  128. </tr>
  129. <tr>
  130. <td>性别</td>
  131. <td>
  132. <select name="gender">
  133. <option value="male" selected></option>
  134. <option value="female"></option>
  135. </select>
  136. </td>
  137. </tr>
  138. <tr>
  139. <td>工资</td>
  140. <td><input type="text" value="" name="salary" placeholder="薪水"></td>
  141. </tr>
  142. <tr>
  143. <td>邮箱</td>
  144. <td><input type="text" value="" name="email" placeholder="邮箱"></td>
  145. </tr>
  146. <tr>
  147. <td>生日</td>
  148. <td><input type="text" value="" name="birthday" placeholder="生日"></td>
  149. </tr>
  150. <tr>
  151. <td>密码</td>
  152. <td><input type="password" name="password" placeholder="密码"></td>
  153. </tr>
  154. <tr>
  155. <td>重复密码</td>
  156. <td><input type="password" name="password2" placeholder="重复密码"></td>
  157. </tr>
  158. <tr>
  159. <td colspan="2"><button type="button" class="register">注册</button>
  160. <p class="tips"></p>
  161. </td>
  162. </tr>
  163. </tbody>
  164. </table>
  165. </form>
  166. </div>
  167. </div>
  168. <!-- 模态框样式 -->
  169. <style>
  170. /* 模态框初始化隐藏 */
  171. .modal {
  172. display: none;
  173. }
  174. /* 遮罩层 */
  175. .modal .modal-drop {
  176. position: fixed;
  177. background-color: rgb(0, 0, 0, .5);
  178. top: 0;
  179. left: 0;
  180. right: 0;
  181. bottom: 0;
  182. }
  183. .modal .modal-body {
  184. position: fixed;
  185. background-color: #fff;
  186. padding: 1em;
  187. overflow: hidden;
  188. max-width: 25em;
  189. max-height: 20em;
  190. /* 水平垂直自动居中 */
  191. top: 0;
  192. left: 0;
  193. right: 0;
  194. bottom: 0;
  195. margin: auto;
  196. }
  197. /* 登录框高度 */
  198. .modal.login .modal-body {
  199. max-height: 14em;
  200. }
  201. /* 注册框高度 */
  202. .modal.register .modal-body {
  203. max-height: 24em;
  204. }
  205. /* 关闭按钮 */
  206. .modal .modal-body .close {
  207. position: absolute;
  208. top: 1.1em;
  209. right: 1.5em;
  210. width: 3em;
  211. height: 1.5em;
  212. }
  213. </style>
  214. <!-- 引入js文件 -->
  215. <script src="0302.js"></script>
  216. </body>
  217. </html>

3. 引入的 style.css 是默认的

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. color: #555;
  6. }
  7. body {
  8. display: flex;
  9. flex-direction: column;
  10. align-items: center;
  11. }
  12. /*表格样式*/
  13. table {
  14. width: 90%;
  15. border: 1px solid;
  16. border-collapse: collapse;
  17. text-align: center;
  18. }
  19. table caption {
  20. font-size: 1.2rem;
  21. margin: 10px;
  22. }
  23. table td,
  24. table th {
  25. border: 1px solid;
  26. padding: 5px;
  27. }
  28. table tr:hover {
  29. background-color: #eee;
  30. }
  31. table thead tr:only-of-type {
  32. background-color: lightcyan;
  33. }
  34. table button {
  35. width: 56px;
  36. height: 26px;
  37. }
  38. table button:last-of-type {
  39. color: red;
  40. }
  41. table button {
  42. cursor: pointer;
  43. margin: 0 3px;
  44. }
  45. /*分页条样式*/
  46. body > p {
  47. display: flex;
  48. }
  49. p > a {
  50. text-decoration: none;
  51. color: #555;
  52. border: 1px solid #888;
  53. padding: 5px 10px;
  54. margin: 10px 2px;
  55. }
  56. .active {
  57. background-color: seagreen;
  58. color: white;
  59. border: 1px solid seagreen;
  60. }

4. 引入 0302.js

  1. // 页面载入完成时默认渲染第一页数据
  2. window.onload = function () {
  3. select(1);
  4. };
  5. // 增
  6. // ...
  7. // 编辑和删除记录
  8. document.querySelector('table:first-of-type tbody').addEventListener('click', ev => {
  9. // 禁止自动点击
  10. ev.preventDefault();
  11. // 获取记录 id
  12. const id = ev.target.parentNode.parentNode.querySelector('td').textContent * 1;
  13. // 事件类型
  14. switch (ev.target.getAttribute('class')) {
  15. // 编辑
  16. case 'edit':
  17. // 显示模态框
  18. document.querySelector('.modal.edit').style.display = 'block';
  19. // 关闭模态框
  20. document.querySelector('.modal.edit .close').addEventListener('click', (eve) => {
  21. eve.preventDefault();
  22. document.querySelector('.modal.edit').style.display = 'none';
  23. });
  24. // 保存时关闭
  25. document.querySelector('.modal.edit .save').addEventListener('click', (eve) => {
  26. eve.preventDefault();
  27. document.querySelector('.modal.edit').style.display = 'none';
  28. });
  29. // 模态框外点击关闭
  30. document.querySelector('.modal.edit .modal-drop').addEventListener('click', (eve) => {
  31. eve.preventDefault();
  32. document.querySelector('.modal.edit').style.display = 'none';
  33. });
  34. // 获取数据
  35. let name = ev.target.parentNode.parentNode.querySelector('td:nth-of-type(2)').textContent;
  36. let gender = ev.target.parentNode.parentNode.querySelector('td:nth-of-type(3)').textContent;
  37. let salary = ev.target.parentNode.parentNode.querySelector('td:nth-of-type(4)').textContent * 1;
  38. let email = ev.target.parentNode.parentNode.querySelector('td:nth-of-type(5)').textContent;
  39. let birthday = ev.target.parentNode.parentNode.querySelector('td:nth-of-type(6)').textContent;
  40. // console.log(id, name, gender, salary, email, birthday);
  41. // 渲染到模态框
  42. let form = document.forms.editform;
  43. form.name.value = name;
  44. form.gender.value = gender;
  45. form.salary.value = salary;
  46. form.email.value = email;
  47. form.birthday.value = birthday;
  48. // 编辑事件
  49. document.querySelector('.modal .save').addEventListener('click', (eve) => {
  50. // 禁止默认提交和冒泡
  51. eve.preventDefault();
  52. eve.stopPropagation();
  53. // 获取模态框编辑数据
  54. name = form.name.value;
  55. gender = form.gender.value;
  56. salary = form.salary.value;
  57. email = form.email.value;
  58. birthday = form.birthday.value;
  59. // console.log(id, name, gender, salary, email, birthday);
  60. // 创建对象
  61. let xhr = new XMLHttpRequest();
  62. // 配置参数
  63. xhr.open('post', 'handle.php?action=update&id=' + id);
  64. // 处理请求
  65. xhr.onload = () => {
  66. // console.log(xhr.response);
  67. // 更新数据写回页面
  68. ev.target.parentNode.parentNode.querySelector('td:nth-of-type(2)').textContent = name;
  69. ev.target.parentNode.parentNode.querySelector('td:nth-of-type(3)').textContent = gender;
  70. ev.target.parentNode.parentNode.querySelector('td:nth-of-type(4)').textContent = salary;
  71. ev.target.parentNode.parentNode.querySelector('td:nth-of-type(5)').textContent = email;
  72. ev.target.parentNode.parentNode.querySelector('td:nth-of-type(6)').textContent = birthday;
  73. };
  74. // 发送请求
  75. xhr.send(new FormData(document.forms.namedItem('editform')));
  76. });
  77. break;
  78. // 删除
  79. case 'delete':
  80. if (confirm('确认删除编号 ' + id + ' 记录?')) {
  81. // 创建对象
  82. let xhr = new XMLHttpRequest();
  83. // 配置参数
  84. xhr.open('get', 'handle.php?action=delete&id=' + id);
  85. // 处理请求
  86. xhr.onload = () => {
  87. // 删除节点
  88. ev.target.parentNode.parentNode.remove();
  89. };
  90. // 发送请求
  91. xhr.send(null);
  92. }
  93. break
  94. }
  95. });
  96. // 查
  97. function select(page = 1) {
  98. // 创建对象
  99. const xhr = new XMLHttpRequest();
  100. // 配置参数
  101. xhr.open('get', 'handle.php?action=select&page=' + page);
  102. // 数据类型
  103. xhr.responseType = 'json';
  104. // 处理请求
  105. xhr.onload = () => {
  106. // console.log(xhr.response);
  107. let pages = xhr.response.pages;
  108. let staffs = xhr.response.staffs;
  109. // 是否登录
  110. let is_login = xhr.response.is_login;
  111. // 是否管理员 admin
  112. let is_admin = xhr.response.is_admin;
  113. // 渲染表头
  114. document.querySelector('table:first-of-type thead').innerHTML = get_thead(is_admin);
  115. // 渲染数据
  116. document.querySelector('table:first-of-type tbody').innerHTML = get_datas(staffs, is_admin);
  117. // 渲染分页
  118. document.querySelector('p:first-of-type').innerHTML = get_pages(page, pages);
  119. // 渲染登录注册区
  120. show_loginout();
  121. };
  122. // 发送请求
  123. xhr.send(null);
  124. }
  125. // 无刷新分页
  126. document.querySelector('p:first-of-type').addEventListener('click', ev => {
  127. // 禁用默认跳转
  128. ev.preventDefault();
  129. // 点击当前激活页,无效点击
  130. if (ev.target.classList.contains('active')) return;
  131. // 去掉原激活样式
  132. [...ev.currentTarget.children].forEach(ele => ele.classList.remove('active'));
  133. // 当前页添加激活样式
  134. ev.target.classList.add('active');
  135. // 获取当前页
  136. let page = get_current_page();
  137. // 渲染点击页的数据
  138. select(page);
  139. });
  140. // 渲染数据
  141. function get_datas(datas, is_admin = 0) {
  142. let str = '';
  143. for (let i = 0; i < datas.length; i++) {
  144. str += '<tr>';
  145. str += '<td>' + datas[i]['id'] + '</td>';
  146. str += '<td>' + datas[i]['name'] + '</td>';
  147. str += '<td>' + datas[i]['gender'] + '</td>';
  148. str += '<td>' + datas[i]['salary'] + '</td>';
  149. str += '<td>' + datas[i]['email'] + '</td>';
  150. str += '<td>' + datas[i]['birthday'] + '</td>';
  151. str += '<td>' + datas[i]['create_at'] + '</td>';
  152. // 如果登录显示编辑删除
  153. if (is_admin) {
  154. str += '<td><button class="edit">编辑</button><button class="delete">删除</button></td>';
  155. }
  156. str += '</tr>';
  157. }
  158. return str;
  159. }
  160. // 表头渲染
  161. function get_thead(is_admin = 0) {
  162. let str = '';
  163. str += '<tr>';
  164. str += '<td>编号</td>';
  165. str += '<td>姓名</td>';
  166. str += '<td>性别</td>';
  167. str += '<td>工资</td>';
  168. str += '<td>邮箱</td>';
  169. str += '<td>生日</td>';
  170. str += '<td>入职时间</td>';
  171. // 如果登录显示操作
  172. if (is_admin) {
  173. str += '<td>操作</td>';
  174. }
  175. str += '</tr>';
  176. return str;
  177. }
  178. // 分页数据
  179. function get_pages(page = 1, pages) {
  180. let paginate = '';
  181. let active = '';
  182. // 首页|上一页
  183. if (page <= 1) page = 1;
  184. if (page !== 1) {
  185. paginate += '<a href="' + document.URL + '?p=1">首页</a>';
  186. paginate += '<a href="' + document.URL + '?p=' + Math.max(1, page - 1) + '">上一页</a>';
  187. }
  188. // 高亮分页
  189. for (i = 1; i <= pages; i++) {
  190. active = '';
  191. if (page == i) active = ' class="active"';
  192. paginate += '<a href="' + document.URL + '?p=' + i + '"' + active + '>' + i + '</a>';
  193. }
  194. // 下一页|尾页
  195. if (page >= pages) page = pages;
  196. if (page !== pages) {
  197. paginate += '<a href="' + document.URL + '?p=' + Math.min(page + 1, pages) + '">下一页</a>';
  198. paginate += '<a href="' + document.URL + '?p=' + pages + '">尾页</a>';
  199. }
  200. return paginate;
  201. }
  202. // 登录|注册模态框
  203. document.querySelector('header > nav').addEventListener('click', ev => {
  204. // 禁止自动点击
  205. ev.preventDefault();
  206. // 事件类型
  207. switch (ev.target.getAttribute('class')) {
  208. // 登录
  209. case 'login':
  210. // 显示模态框
  211. document.querySelector('.modal.login').style.display = 'block';
  212. // 关闭模态框
  213. document.querySelector('.modal.login .close').addEventListener('click', (eve) => {
  214. eve.preventDefault();
  215. document.querySelector('.modal.login').style.display = 'none';
  216. });
  217. // 模态框外点击关闭
  218. document.querySelector('.modal.login .modal-drop').addEventListener('click', (eve) => {
  219. eve.preventDefault();
  220. document.querySelector('.modal.login').style.display = 'none';
  221. });
  222. // 登录事件
  223. document.querySelector('.modal.login .login').addEventListener('click', (eve) => {
  224. // 获取登录框数据
  225. let form = document.forms.loginform;
  226. [form.email, form.password].forEach((item) => item.oninput = () => tips.innerHTML = null);
  227. // 提示框
  228. let tips = document.querySelector('.modal.login .tips');
  229. // 非空验证
  230. if (!form.email.value.trim().length) {
  231. form.email.focus();
  232. tips.innerHTML = '邮箱为空';
  233. return;
  234. }
  235. if (!form.password.value.trim().length) {
  236. form.password.focus();
  237. tips.innerHTML = '密码为空';
  238. return;
  239. }
  240. // 创建对象
  241. const xhr = new XMLHttpRequest();
  242. // 配置参数
  243. xhr.open('post', 'handle.php?action=login');
  244. // 响应类型
  245. xhr.responseType = 'json';
  246. // 处理请求
  247. xhr.onload = () => {
  248. // console.log(xhr.response);
  249. // 显示登录消息
  250. tips.innerHTML = xhr.response.msg;
  251. // 登录失败时
  252. if (xhr.response.status) {
  253. return;
  254. }
  255. // 登录成功,延时关闭登录框
  256. setTimeout(() => document.querySelector('.modal.login').style.display = 'none', 2000);
  257. // 获取当前页码
  258. let page = get_current_page();
  259. // 渲染数据
  260. select(page);
  261. };
  262. // 发送请求
  263. xhr.send(new FormData(form));
  264. });
  265. break;
  266. // 添加和注册一样
  267. case 'add':
  268. break;
  269. // 注册
  270. case 'register':
  271. // 显示模态框
  272. document.querySelector('.modal.register').style.display = 'block';
  273. // 关闭模态框
  274. document.querySelector('.modal.register .close').addEventListener('click', (eve) => {
  275. eve.preventDefault();
  276. document.querySelector('.modal.register').style.display = 'none';
  277. });
  278. // 模态框外点击关闭
  279. document.querySelector('.modal.register .modal-drop').addEventListener('click', (eve) => {
  280. eve.preventDefault();
  281. document.querySelector('.modal.register').style.display = 'none';
  282. });
  283. // 注册事件
  284. document.querySelector('.modal.register .register').addEventListener('click', (eve) => {
  285. // 获取登录框数据
  286. let form = document.forms.registerform;
  287. [form.email, form.password, form.password2].forEach((item) => item.oninput = () => tips.innerHTML = null);
  288. // 提示框
  289. let tips = document.querySelector('.modal.register .tips');
  290. // 非空验证
  291. if (!form.email.value.trim().length) {
  292. form.email.focus();
  293. tips.innerHTML = '邮箱为空';
  294. return;
  295. }
  296. if (!form.password.value.trim().length) {
  297. form.password.focus();
  298. tips.innerHTML = '密码为空';
  299. return;
  300. }
  301. if (!form.password2.value.trim().length) {
  302. form.password2.focus();
  303. tips.innerHTML = '重复密码为空';
  304. return;
  305. }
  306. if (form.password.value !== form.password2.value) {
  307. form.password.focus();
  308. tips.innerHTML = '两次密码不一致';
  309. return;
  310. }
  311. // 创建对象
  312. const xhr = new XMLHttpRequest();
  313. // 配置参数
  314. xhr.open('post', 'handle.php?action=register');
  315. // 响应类型
  316. xhr.responseType = 'json';
  317. // 处理请求
  318. xhr.onload = () => {
  319. // console.log(xhr.response);
  320. // 显示注册消息
  321. tips.innerHTML = xhr.response.msg;
  322. // 注册失败时
  323. if (xhr.response.status) {
  324. return;
  325. }
  326. // 注册成功,延时关闭注册框
  327. setTimeout(() => document.querySelector('.modal.register').style.display = 'none', 2000);
  328. // 获取当前页码
  329. let page = get_current_page();
  330. // 渲染数据
  331. select(page);
  332. };
  333. //失败回调
  334. xhr.onerror = () => console.log('XHR Fail....');
  335. // 发送请求
  336. const data = new FormData(form);
  337. data.delete('password2');
  338. xhr.send(data);
  339. });
  340. break;
  341. // 登出
  342. case 'logout':
  343. // 创建对象
  344. const xhr = new XMLHttpRequest();
  345. // 配置参数
  346. xhr.open('post', 'handle.php?action=logout');
  347. // 响应类型
  348. xhr.responseType = 'json';
  349. // 处理请求
  350. xhr.onload = () => {
  351. alert('登出成功!');
  352. // 获取当前页码
  353. let page = get_current_page();
  354. // 渲染数据
  355. select(page);
  356. };
  357. // 发送请求
  358. xhr.send(null);
  359. break;
  360. //添加记录
  361. case 'add':
  362. break;
  363. }
  364. });
  365. // 计算当前页码
  366. function get_current_page() {
  367. let page = 1;
  368. let select = document.querySelector('p:first-of-type').children;
  369. if (select) {
  370. let url = [...select].filter(ele => ele.classList.contains('active')).shift().href;
  371. if (url.indexOf("?") !== -1) {
  372. page = url.split("=")[1];
  373. }
  374. }
  375. return page;
  376. }
  377. // 渲染登录注册
  378. function show_loginout() {
  379. // 创建对象
  380. const xhr = new XMLHttpRequest();
  381. // 配置参数
  382. xhr.open('get', 'handle.php?action=loginout');
  383. // 处理请求
  384. xhr.onload = () => {
  385. // 渲染登录注册区
  386. document.querySelector('header>nav').innerHTML = xhr.response;
  387. };
  388. // 发送请求
  389. xhr.send(null);
  390. }

5. ajax 请求文件 handle.php

  1. <?php
  2. $config = [
  3. 'type' => 'mysql',
  4. 'host' => '127.0.0.1',
  5. 'dbname' => 'phpedu',
  6. 'port' => '3306',
  7. 'charset' => 'utf8mb4',
  8. 'username' => 'root',
  9. 'password' => 'root',
  10. ];
  11. extract($config);
  12. $dsn = sprintf('%s:host=%s;dbname=%s;port=%s;charset=%s', $type, $host, $dbname, $port, $charset);
  13. try {
  14. $pdo = new PDO($dsn, $username, $password);
  15. // 设置结果集的返回类型
  16. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  17. // var_dump($pdo,'连接成功');
  18. } catch (PDOException $e) {
  19. die('连接失败:' . $e->getMessage());
  20. }
  21. // 会话开启
  22. if (!session_id()) session_start();
  23. // 每页显示记录数
  24. $action = $_GET['action'] ?? 'select';
  25. $page = $_GET['page'] ?? 1;
  26. switch ($action) {
  27. // 删
  28. case 'delete':
  29. die(del_data($pdo, $_GET['id'] ?? 0));
  30. break;
  31. // 改
  32. case 'update':
  33. $id = $_GET['id'] ?? 0;
  34. $name = $_POST['name'];
  35. $gender = $_POST['gender'];
  36. $salary = $_POST['salary'];
  37. $email = $_POST['email'];
  38. $birthday = $_POST['birthday'];
  39. die(update_data($pdo, $id, $name, $gender, $salary, $email, $birthday));
  40. break;
  41. // 查
  42. case 'select':
  43. die(get_datas($pdo, $page));
  44. // 渲染登录注册
  45. case 'loginout':
  46. if (isset($_SESSION['email']) && $_SESSION['email']) {
  47. $btn = '';
  48. // 管理权限,仅 admin 允许添加员工
  49. if (is_admin($pdo)) {
  50. $btn = ' <a href="javascript:;" class="add">添加</a>';
  51. }
  52. die('<a href="#">' . $_SESSION['email'] . '</a> &nbsp;<a href="javascript:;" class="logout">退出</a>' . $btn);
  53. } else {
  54. die('<a href="javascript:;" class="login">登录</a>&nbsp;<a href="javascript:;" class="register">注册</a>');
  55. }
  56. break;
  57. // 登录
  58. case 'login':
  59. if (isset($_SESSION['email']) && $_SESSION['email']) {
  60. die(json_encode(['status' => 1, 'msg' => '你已经登录!']));
  61. }
  62. $sql = "SELECT email FROM staffs WHERE email = :email AND password = md5(:password)";
  63. $stmt = $pdo->prepare($sql);
  64. if ($stmt->execute($_POST)) {
  65. if ($stmt->fetch()) {
  66. // 保存 session
  67. $_SESSION['email'] = $_POST['email'];
  68. die(json_encode(['status' => 0, 'msg' => $_POST['email'] . '登录成功,请稍后...']));
  69. } else {
  70. die(json_encode(['status' => 1, 'msg' => '邮箱或密码错误!']));
  71. }
  72. }
  73. die(json_encode(['status' => 1, 'msg' => '发生错误了,重试!']));
  74. break;
  75. // 增,和注册一样
  76. case 'add':
  77. break;
  78. // 注册
  79. case 'register':
  80. if (isset($_SESSION['email']) && $_SESSION['email']) {
  81. die(json_encode(['status' => 1, 'msg' => '你已经登录!']));
  82. }
  83. $sql = "SELECT COUNT(1) as count FROM staffs WHERE email = '{$_POST['email']}'";
  84. if ($pdo->query($sql)->fetch()['count']) {
  85. die(json_encode(['status' => 1, 'msg' => '该邮箱已被注册,换一个!']));
  86. }
  87. $sql = 'INSERT staffs SET name = :name, password = md5(:password), gender = :gender, salary = :salary, email = :email, birthday = :birthday';
  88. $stmt = $pdo->prepare($sql);
  89. if ($stmt->execute($_POST)) {
  90. if ($stmt->rowCount()) {
  91. // 实现注册并自动登录
  92. $_SESSION['email'] = $_POST['email'];
  93. die(json_encode(['status' => 0, 'msg' => '注册成功,请稍后...']));
  94. } else {
  95. die(json_encode(['status' => 1, 'msg' => '注册失败,请联系管理员']));
  96. }
  97. }
  98. die(json_encode(['status' => 1, 'msg' => '发生错误了,重试!']));
  99. break;
  100. // 登出
  101. case 'logout':
  102. if (isset($_SESSION['email'])) unset($_SESSION['email']);
  103. break;
  104. default:
  105. exit('Error!');
  106. }
  107. // 更新记录
  108. function update_data($pdo, $id, $name, $gender, $salary, $email, $birthday)
  109. {
  110. if ($id) {
  111. $sql = "UPDATE staffs SET name = :name, gender = :gender, salary = :salary, email = :email, birthday = :birthday WHERE id = :id";
  112. $stmt = $pdo->prepare($sql);
  113. $stmt->bindParam(':id', $id, PDO::PARAM_INT);
  114. $stmt->bindParam(':name', $name);
  115. $stmt->bindParam(':gender', $gender);
  116. $stmt->bindParam(':salary', $salary);
  117. $stmt->bindParam(':email', $email);
  118. $stmt->bindParam(':birthday', $birthday);
  119. $stmt->execute();
  120. if ($stmt->rowCount() > 0) {
  121. return '更新成功!';
  122. }
  123. }
  124. return '更新错误!';
  125. }
  126. // 删除记录
  127. function del_data($pdo, $id = 0)
  128. {
  129. if ($id) {
  130. $sql = "DELETE FROM staffs WHERE id = :id";
  131. $stmt = $pdo->prepare($sql);
  132. $stmt->bindParam(':id', $id, PDO::PARAM_INT);
  133. $stmt->execute();
  134. if ($stmt->rowCount() > 0) {
  135. return '删除成功!';
  136. }
  137. }
  138. return '删除错误!';
  139. }
  140. // 数据总页数
  141. function get_pages($pdo, $page = 1, $num = 5)
  142. {
  143. // 总页数
  144. $num = 5;
  145. $sql = "SELECT CEIL(COUNT(1)/{$num}) total FROM staffs";
  146. $pages = $pdo->query($sql)->fetch()['total'];
  147. return $pages;
  148. }
  149. // 每页显示数
  150. function get_datas($pdo, $page = 1, $num = 5)
  151. {
  152. // 获取总页数
  153. $pages = get_pages($pdo);
  154. // 每页显示的数据
  155. $offset = ($page - 1) * $num;
  156. $sql = "SELECT * FROM `staffs` LIMIT {$offset}, {$num}";
  157. $stmt = $pdo->prepare($sql);
  158. $stmt->execute();
  159. $staffs = $stmt->fetchAll();
  160. // $staffs = $pdo->query($sql)->fetchAll();
  161. return json_encode(['pages' => $pages, 'staffs' => $staffs, 'is_admin' => is_admin($pdo)]);
  162. }
  163. // 是否管理员 admin
  164. function is_admin($pdo)
  165. {
  166. if (isset($_SESSION['email']) && $_SESSION['email']) {
  167. $sql = "SELECT COUNT(1) as count FROM staffs WHERE email = '{$_SESSION['email']}' AND name = 'admin'";
  168. if ($pdo->query($sql)->fetch()['count']) {
  169. return true;
  170. }
  171. }
  172. return false;
  173. }
  • 注册一个 root 用户名

测试

  • 注册成功后点击最后一页查看

测试

测试

  • 退出后,以 admin 的 admin@php.cn 登录

测试

  • 对管理员开放操作权限

测试

更多相关文章

  1. PHP实战: 人员管理系统(续)
  2. 【asp.net core 系列】- 11 Service层的实现样板
  3. 辣鸡,使用CAS机制完成SSO
  4. cookie在二级域名间共享完成sso
  5. 详解微信小程序登录wx.login(Object object)
  6. 你没有看错,爬网页数据,C# 也可以像 Jquery 那样
  7. 功能测试——app测试要点最全分析
  8. 克隆虚拟机和相互登录
  9. 一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)

随机推荐

  1. jquery常用代码片段
  2. JQuery的一些基本功能代码(CH1&2)
  3. 【jQuery】调用delay()方法延时执行动画
  4. 将JavaScript数组转换成逗号分隔列表的简
  5. 想要改进我的jQuery代码,做我想要的,太丑了
  6. Struts2使用jQuery JSONP解决跨域问题
  7. Ajax/jQuery -在页面加载时将网页内容加
  8. jQuery弹出窗口不能打开。
  9. 将php jsonencode数组结果显示为ajax成功
  10. 【JavaScript】jQuery+ajax传递json数组(