index.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. const express = require("express")
  2. //引入jwt
  3. const jwt = require("jsonwebtoken")
  4. const app = express()
  5. const STU_ARR = [
  6. { id: "1", name: "孙悟空", age: 18, gender: "男", address: "花果山" },
  7. { id: "2", name: "猪八戒", age: 28, gender: "男", address: "高老庄" },
  8. { id: "3", name: "沙和尚", age: 38, gender: "男", address: "流沙河" }
  9. ]
  10. //解析请求体的中间件
  11. app.use(express.urlencoded({ extended: true }))
  12. //解析json格式请求体的中间件
  13. app.use(express.json())
  14. app.use((req, res, next) => {
  15. //设置响应头,“*”表示所有请求都可以
  16. res.setHeader("Access-Control-Allow-Origin", "*")
  17. res.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,PATCH")
  18. res.setHeader("Access-Control-Allow-Headers", "Content-type,Authorization")
  19. //Access-Control-Allow-Origin 设置指定值时只能设置一个,如果有多个地址,
  20. //需要将地址放入数组,然后动态进行设置
  21. //res.setHeader("Access-Control-Allow-Origin","http://127.0.0.1:5500/")
  22. //Access-Control-Allow-Methods 允许的请求方式
  23. //Access-Control-Allow-Headers 允许传递的请求头
  24. next()
  25. //next()表示放行,否则程序到不了下一步
  26. })
  27. app.get("/test",(req,res)=>{
  28. })
  29. //定义一个登陆的路由
  30. app.post("/login", (req, res) => {
  31. //获取用户输入的用户名和密码
  32. const { username, password } = req.body
  33. //验证用户名和密码
  34. if (username === "admin" && password === "123123") {
  35. //登录成功,生成token
  36. const token = jwt.sign({
  37. id: "12345",
  38. username: "admin",
  39. nickname: "超级管理员"
  40. }, "chaojianquanmima",{
  41. expiresIn:"1d"
  42. })
  43. //实际开发中,密钥一般都存储在配置文件中,并且随机生成
  44. //登陆成功
  45. res.send({
  46. status: "ok",
  47. //如果只发送token,可能会有些数据不全,所以还可以发送一些没有加密的不太敏感的数据
  48. data: {
  49. token,
  50. nickname:"超级管理员"
  51. }
  52. })
  53. } else {
  54. //登陆失败
  55. res.status(403).send({
  56. status: "error",
  57. data: "用户名或密码错误"
  58. })
  59. }
  60. })
  61. //统一的api
  62. //定义学生信息相关的路由
  63. app.get("/students", (req, res) => {
  64. //console.log("收到students的get请求");
  65. try{
  66. //这个路由必须在用户登录后才能访问
  67. //需要检查用户是否登录
  68. //读取请求头
  69. //const token = req.get("Authorization").split(" ")[1]
  70. //console.log(token);
  71. //对token进行解码
  72. //const decodeToken = jwt.verify(token,"chaojianquanmima")
  73. //console.log(decodeToken);
  74. //解码成功,token有效
  75. //返回学生信息
  76. res.send({
  77. status: "ok",
  78. data: STU_ARR
  79. })
  80. }catch(e){
  81. //解码错误,用户token无效
  82. res.status(403).send({
  83. status:"error",
  84. data:"token无效"
  85. })
  86. }
  87. })
  88. //查询某个学生的路由
  89. app.get("/students/:id", (req, res) => {
  90. const id = req.params.id
  91. const stu = STU_ARR.find(item => item.id === id)
  92. //将数据返回
  93. res.send({
  94. status: "ok",
  95. data: stu
  96. })
  97. })
  98. //定义一个添加学生的路由
  99. app.post("/students", (req, res) => {
  100. //console.log("收到students的post请求",req.body);
  101. //获取学生的信息
  102. const { name, age, gender, address } = req.body
  103. //创建学生信息
  104. const stu = {
  105. id: +STU_ARR.at(-1).id + 1 + "",
  106. //STU_ARR.at(-1).id:获取最后一项的id,前面加个加号“+”表示转换为数值
  107. //+STU_ARR.at(-1).id + 1 + "":表示id加1后再转换为字符串
  108. name,
  109. age: +age,
  110. gender,
  111. address
  112. }
  113. //将学生信息添加到数组
  114. STU_ARR.push(stu)
  115. //添加成功
  116. res.send({
  117. status: "ok",
  118. data: stu
  119. })
  120. })
  121. //定义一个删除学生的路由,根据id删除学生
  122. app.delete("/students/:id", (req, res) => {
  123. //获取学生的id
  124. const id = req.params.id
  125. //遍历数组
  126. for (let i = 0; i < STU_ARR.length; i++) {
  127. if (STU_ARR[i].id == id) {
  128. const delStu = STU_ARR[i]
  129. STU_ARR.splice(i, 1)
  130. res.send({
  131. status: "ok",
  132. data: delStu
  133. })
  134. }
  135. }
  136. //如果执行到这里,说明学生不存在
  137. res.status(403).send({
  138. status: "error",
  139. data: "学生id不存在"
  140. })
  141. })
  142. //定义一个修改学生的路由
  143. //学生id可以在students后面传,也可以跟请求体一起传
  144. app.put("/students", (req, res) => {
  145. //获取数据
  146. const { id, name, age, gender, address } = req.body
  147. //根据id查询学生
  148. const updateStu = STU_ARR.find(item => item.id === id)
  149. if (updateStu) {
  150. updateStu.name = name
  151. updateStu.age = age
  152. updateStu.gender = gender
  153. updateStu.address = address
  154. res.send({
  155. status: "ok",
  156. data: updateStu
  157. })
  158. } else {
  159. res.status(403).send({
  160. status: "error",
  161. data: "学生id不存在"
  162. })
  163. }
  164. })
  165. app.listen(3000, () => {
  166. console.log("服务器已经启动")
  167. })