index.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. //! 主页
  2. //TODO 分页显示用户列表
  3. /**
  4. ** 给服务器传递消息,告知 当前页码以及每页显示条目
  5. *! 实现方案:2种
  6. ** 1. 通过search 查询字符串 方式 传递数据
  7. ** 什么是查询字符串,"?id=1&r=2" 这就是一个查询字符串,其中id 和 r都是查询参数,使用=给其赋予一个参数值。多个查询参数 使用 & 符号拼接。使用时必须拼接到url上,才能将数据传递给服务器。
  8. ** 2. 通过 请求体request-body 传递数据
  9. *! get 与 post 请求的区别
  10. ** 语义上
  11. 1、get是从服务器上获取数据。
  12. 2、post是向服务器传送数据。
  13. ** 传数据
  14. 1、 get请求没有 请求体,因此只能通过查询字符串给服务器传递数据,而查询字符串会拼接到请求地址URL中,因此 对任何人数据都是可见
  15. 2、 post请求,有请求体 可将发送给服务器的数据放到请求体中,这样一般用户是看不见数据的。
  16. ** 数据量
  17. 1、 get请求传数据时,url地址长度收到浏览器地址栏限制,理论最大值为 4K。实际上不能超过 2K。
  18. 2、 post传送的数据量较大,一般被默认为不受限制。
  19. ** 安全性
  20. 1、get安全性非常低。
  21. 2、post安全性较高。
  22. ** 效率上
  23. 1、 get 更简单 速度更快
  24. 2、 post 会复杂一点,效率较低。
  25. ** 缓存
  26. 1、get可以缓存
  27. 2、post刷新后数据不会缓存
  28. **/
  29. let page = 1; // 当前页码, 默认第一页
  30. const pageSize = 2; // 每页条目, 默认每页显示2条数据
  31. let total = 0; // 数据总数
  32. let pages = 0; // 总页数
  33. const tBodyEle = document.getElementById('listBody');
  34. const totalSp = document.querySelector('#totalSp');
  35. const prevlSp = document.querySelector('#prevlSp');
  36. const nextSp = document.querySelector('#nextSp');
  37. const newUserBtn = document.querySelector('#newUserBtn');
  38. function loadData() {
  39. axios({
  40. url: 'http://localhost:3000/users/page',
  41. method: 'get', // method默认值 也是 ‘get’
  42. params: {
  43. // 属性名 就是 查询参数名
  44. // page: page,
  45. // pageSize: pageSize,
  46. // ES6 对象简洁写法
  47. page,
  48. pageSize,
  49. }, // params 用来指定 查询参数 可以为对象类型。自动拼接到 请求地址
  50. })
  51. .then((result) => {
  52. // 由于是分页显示数据,因此每一次添加数据行时,清空上一次tbody中显示数据
  53. tBodyEle.innerHTML = '';
  54. // axios 得到的响应 result 是什么
  55. console.log(result);
  56. let { code, msg, data } = result.data;
  57. console.log(msg);
  58. // 2 校验数据的正确性,只有code == 200时 数据是正确的
  59. if (code !== 200) {
  60. return;
  61. }
  62. var tr, td;
  63. data.list.forEach((user) => {
  64. // 每循环一次,就新建一个tr DOM对象
  65. tr = document.createElement('tr');
  66. // 字符串拼接,在原生js操作dom中会频繁发生,但是存在一个问题 就是代码可读性 太低
  67. // 因此 在ES6 对字符串进行了一个扩展。叫做 模板字符串。
  68. // 模板字符串 中 可以 换行;也可以通过${}语法 将外部表达式的值 嵌入字符串中的指定位置
  69. td = `
  70. <td>
  71. <img class="avatar" src="${user.avatar}" alt="avatar" />
  72. </td>
  73. <td>${user.name}</td>
  74. <td>${user.password}</td>
  75. <td>${user.age}</td>
  76. <td>${user.sex === '0' ? '女' : '男'}</td>
  77. <td data-id="${user.id}">
  78. <span
  79. class="iconfont icon-edit edit"
  80. title="编辑"
  81. data-name="edit"
  82. ></span>
  83. <span
  84. class="iconfont icon-delete delete"
  85. title="删除"
  86. data-name="delete"
  87. ></span>
  88. </td>
  89. `; // 这就是模板字符串
  90. tr.innerHTML = td;
  91. // 下次循环开始前,记得将新建tr添加给tbody元素
  92. // 处理 点击 删除或者编辑按钮
  93. tr.addEventListener('click', function (e) {
  94. console.log(e.target);
  95. // 区分是 点击删除 还是 编辑
  96. // data-* 自定义属性,通过DOM对象的dataset属性来获取
  97. let { name } = e.target.dataset;
  98. let uid = e.target.parentNode.dataset.id;
  99. // console.log(uid);
  100. if (name === 'edit') {
  101. // 是编辑
  102. } else {
  103. // 是删除
  104. // 为了防止 用户 误触点击
  105. if (confirm('您确定删除该行数据吗?')) {
  106. // 用户确认了删除操作,接下来就可以 实现删除了
  107. // 发起网络请求,将服务器中 数据删除掉
  108. axios
  109. .delete('http://localhost:3000/users/delete', {
  110. data: {
  111. id: uid,
  112. },
  113. })
  114. .then((result) => {
  115. let { code, msg } = result.data;
  116. alert(msg);
  117. if (code == 200) {
  118. // 一旦 删除成功后,要刷新页面数据
  119. loadData();
  120. }
  121. });
  122. }
  123. }
  124. });
  125. tBodyEle.append(tr);
  126. });
  127. // 将分页信息 保存起来
  128. total = data.page.total;
  129. totalSp.innerHTML = ` ${total} `;
  130. pages = data.page.pages;
  131. })
  132. .catch((err) => {
  133. console.log(err);
  134. });
  135. }
  136. prevSp.addEventListener('click', () => {
  137. if (page === 1) {
  138. alert('已经在首页了亲!');
  139. // 如果是 第一页,这里表示没有上一页
  140. return;
  141. }
  142. page--;
  143. // 页码 减一后,重新获取数据
  144. loadData();
  145. });
  146. nextSp.addEventListener('click', () => {
  147. if (page === pages) {
  148. alert('已经到尾页了亲!');
  149. // 如果是 最后页,这里表示没有下一页
  150. return;
  151. }
  152. page++;
  153. // 页码 加一后,重新获取数据
  154. loadData();
  155. });
  156. newUserBtn.addEventListener('click', () => {
  157. // 页面跳转时,此时该js文件被引入到 index.html中,因此下面路径 需要以index.html文件为参照
  158. window.location = 'pages/user.insert.html';
  159. });
  160. loadData();