index.mjs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. // 通过router实例的一些方法 比如 get、post等去定义 对应请求方法的路由
  9. router
  10. .post('/login', async (ctx) => {
  11. const { username, password } = ctx.request.body;
  12. let sql = `SELECT * FROM Users WHERE username = ? AND password = ?;`;
  13. let res = await ctx.execute(sql, [username, password]);
  14. if (res.length > 0) {
  15. // 如果认证成功
  16. // 1 制作token
  17. // console.log(jwt);
  18. const token = jwt.sign(res[0], SECRET, { expiresIn: '1h' });
  19. // 2 将token值和登录用户信息 一同响应给客户端
  20. ctx.body = {
  21. code: 0,
  22. message: '登录成功',
  23. data: {
  24. userInfo: res[0],
  25. token,
  26. },
  27. };
  28. } else {
  29. ctx.body = {
  30. code: 1,
  31. message: '用户名或密码不正确',
  32. };
  33. }
  34. })
  35. .get('/', tokenVerify({ secret: SECRET }), async (ctx) => {
  36. let res = await ctx.execute('select * from users;');
  37. ctx.status = 200;
  38. ctx.body =
  39. res === false
  40. ? {
  41. code: 1,
  42. message: '请求超时',
  43. }
  44. : {
  45. code: 0,
  46. msg: '成功',
  47. data: res,
  48. };
  49. })
  50. .put(
  51. '/upload',
  52. tokenVerify({ secret: SECRET }),
  53. koaBody({
  54. multipart: true,
  55. formidable: {
  56. keepExtensions: true,
  57. uploadDir: UPLOAD_DIR, // 设置上传文件的最终位置
  58. },
  59. onError(err, ctx) {
  60. ctx.body = {
  61. code: 1,
  62. msg: err,
  63. };
  64. },
  65. }),
  66. async (ctx) => {
  67. let filename = ctx.request.files.file.newFilename;
  68. let srcFile = `./${UPLOAD_DIR}/${filename}`;
  69. let destFile = srcFile;
  70. // 获取 请求体 中 除了file文件之外的其他数据
  71. const { folder } = ctx.request.body;
  72. // 如果用户在上传文件时 指定了目标文件夹
  73. if (folder) {
  74. // 1 将默认上传位置的文件 拷贝到 目标的文件夹下
  75. destFile = `./${UPLOAD_DIR}/${folder}/${filename}`;
  76. try {
  77. // 先确保destFile的文件夹都真实存在
  78. let isExist = await access(`./${UPLOAD_DIR}/${folder}`).catch(
  79. () => false
  80. );
  81. // isExist 就是 undefined 或者 false
  82. if (isExist == false) {
  83. // 如果不存在 就创建
  84. await mkdir(`./${UPLOAD_DIR}/${folder}`, { recursive: true });
  85. }
  86. await copyFile(srcFile, destFile);
  87. // 2 成功后 删除默认位置的文件
  88. await rm(srcFile);
  89. } catch (error) {
  90. console.error(error);
  91. }
  92. }
  93. // 给客户端响应数据
  94. ctx.body = {
  95. code: 0,
  96. data: {
  97. path: `${UPLOAD_DIR.replace(STATIC, '')}/${folder}/${filename}`,
  98. filename,
  99. },
  100. msg: '上传成功',
  101. };
  102. }
  103. );
  104. export default router;