index.mjs 3.0 KB

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