index.mjs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import Router from '@koa/router';
  2. import { koaBody } from 'koa-body';
  3. import { copyFile, rm, access, mkdir } from 'node:fs/promises';
  4. import { UPLOAD_DIR, STATIC, SECRET } from '../app.config.mjs';
  5. import jwt from 'jsonwebtoken';
  6. import tokenVerify from '../middlewares/jwt.verify.js';
  7. const router = new Router();
  8. import { createHash } from 'node:crypto'; // 密码加密: md5 属于 hash加密算法
  9. // 通过router实例的一些方法 比如 get、post等去定义 对应请求方法的路由
  10. router
  11. .post('/register', async (ctx) => {
  12. let { username, password } = ctx.request.body;
  13. password = createHash('md5').update(password).digest('hex');
  14. let sql =
  15. 'insert into Users(username, password, status, create_time) values(?, ?, 1, NOW());';
  16. try {
  17. let res = await ctx.execute(sql, [username, password]);
  18. if (res.affectedRows === 1) {
  19. ctx.body = {
  20. code: 0,
  21. message: '注册成功',
  22. };
  23. } else {
  24. ctx.body = {
  25. code: 1,
  26. message: '注册失败',
  27. };
  28. }
  29. } catch (err) {
  30. // 执行sql语句发生异常
  31. console.log(err);
  32. ctx.body = {
  33. code: 1,
  34. message: '网络超时',
  35. };
  36. }
  37. })
  38. .post('/login', async (ctx) => {
  39. let { username, password } = ctx.request.body;
  40. // 由于用户注册时 密码使用了md5加密 因此 这里 也需要将密码加密后 在去查询
  41. password = createHash('md5').update(password).digest('hex');
  42. let sql = `SELECT * FROM Users WHERE username = ? AND password = ?;`;
  43. let res = await ctx.execute(sql, [username, password]);
  44. if (res.length > 0) {
  45. // 如果认证成功
  46. // 1 制作token
  47. // console.log(jwt);
  48. const token = jwt.sign(res[0], SECRET, { expiresIn: '1h' });
  49. // 2 将token值和登录用户信息 一同响应给客户端
  50. ctx.body = {
  51. code: 0,
  52. message: '登录成功',
  53. data: {
  54. userInfo: res[0],
  55. token,
  56. },
  57. };
  58. } else {
  59. ctx.body = {
  60. code: 1,
  61. message: '用户名或密码不正确',
  62. };
  63. }
  64. })
  65. .get('/', tokenVerify({ secret: SECRET }), async (ctx) => {
  66. let res = await ctx.execute('select * from users;');
  67. ctx.status = 200;
  68. ctx.body =
  69. res === false
  70. ? {
  71. code: 1,
  72. message: '请求超时',
  73. }
  74. : {
  75. code: 0,
  76. msg: '成功',
  77. data: res,
  78. };
  79. })
  80. .put(
  81. '/upload',
  82. tokenVerify({ secret: SECRET }),
  83. koaBody({
  84. multipart: true,
  85. formidable: {
  86. keepExtensions: true,
  87. uploadDir: UPLOAD_DIR, // 设置上传文件的最终位置
  88. },
  89. onError(err, ctx) {
  90. ctx.body = {
  91. code: 1,
  92. msg: err,
  93. };
  94. },
  95. }),
  96. async (ctx) => {
  97. let filename = ctx.request.files.file.newFilename;
  98. let srcFile = `./${UPLOAD_DIR}/${filename}`;
  99. let destFile = srcFile;
  100. // 获取 请求体 中 除了file文件之外的其他数据
  101. const { folder } = ctx.request.body;
  102. // 如果用户在上传文件时 指定了目标文件夹
  103. if (folder) {
  104. // 1 将默认上传位置的文件 拷贝到 目标的文件夹下
  105. destFile = `./${UPLOAD_DIR}/${folder}/${filename}`;
  106. try {
  107. // 先确保destFile的文件夹都真实存在
  108. let isExist = await access(`./${UPLOAD_DIR}/${folder}`).catch(
  109. () => false
  110. );
  111. // isExist 就是 undefined 或者 false
  112. if (isExist == false) {
  113. // 如果不存在 就创建
  114. await mkdir(`./${UPLOAD_DIR}/${folder}`, { recursive: true });
  115. }
  116. await copyFile(srcFile, destFile);
  117. // 2 成功后 删除默认位置的文件
  118. await rm(srcFile);
  119. } catch (error) {
  120. console.error(error);
  121. }
  122. }
  123. // 给客户端响应数据
  124. ctx.body = {
  125. code: 0,
  126. data: {
  127. path: `${UPLOAD_DIR.replace(STATIC, '')}/${folder}/${filename}`,
  128. filename,
  129. },
  130. msg: '上传成功',
  131. };
  132. }
  133. );
  134. export default router;