Browse Source

✨ feat: 增加头像上传功能

Pchen. 7 months ago
parent
commit
c43ce14108

+ 1 - 1
apis/User/Login/Register.js

@@ -103,7 +103,7 @@ class Register extends API {
         const uuid = md5(Date.now() + email + code);
         const session = this.createSession(code, Math.random().toFixed(6).slice(-6));
         const hashPassword = bcryptjs.hashSync(password, 10);
-        const avatar = 'https://vthc.cn/img/avatar.png';
+        const avatar = '/avatar/avatar.png';
 
         sql = 'INSERT INTO users (uuid, username, avatar, session, admin, email, password) VALUES (?, ?, ?, ?, ?, ?, ?)';
         let result = await db.query(sql, [uuid, username, avatar, session, admin, email, hashPassword]);

+ 116 - 0
apis/User/UserInfo/UploadAvatar.js

@@ -0,0 +1,116 @@
+const API = require("../../../lib/API");
+const db = require("../../../plugin/DataBase/db");
+const { BaseStdResponse } = require("../../../BaseStdResponse");
+const Redis = require('../../../plugin/DataBase/Redis');
+const AccessControl = require("../../../lib/AccessControl");
+const multer = require('multer'); // 用于文件上传
+const path = require('path'); // 用于处理文件路径
+
+// 配置Multer的存储选项
+const storage = multer.diskStorage({
+    destination: (req, file, cb) => {
+        cb(null, 'uploads/avatar/');
+    },
+    filename: (req, file, cb) => {
+        const uuid = req.params.uuid;
+        const fileExtension = path.extname(file.originalname);
+        cb(null, `${uuid}${fileExtension}`);
+    }
+});
+
+// 限制文件类型
+const fileFilter = (req, file, cb) => {
+    // 只接受以下扩展名的图片文件
+    const allowedTypes = /jpeg|jpg|png|gif/;
+    const extname = allowedTypes.test(path.extname(file.originalname).toLowerCase());
+    const mimetype = allowedTypes.test(file.mimetype);
+
+    if (extname && mimetype) {
+        return cb(null, true);
+    } else {
+        cb(new Error('只允许上传图片文件 (jpeg, jpg, png, gif)'));
+    }
+};
+
+// 初始化Multer中间件
+const upload = multer({
+    storage: storage,
+    fileFilter: fileFilter,
+    limits: { fileSize: 3 * 1024 * 1024 } // 限制文件大小为3MB
+}).single('avatar');
+
+class UploadAvatar extends API {
+    constructor() {
+        super();
+
+        this.setMethod("POST");
+        this.setPath("/User/UploadAvatar/:uuid/:session");
+    }
+
+    async onRequest(req, res) {
+        // 使用Multer中间件处理文件上传
+        upload(req, res, async (err) => {
+            if (err) {
+                this.logger.error(`头像上传失败!${err.stack || ''}`)
+                return res.json({
+                    ...BaseStdResponse.ERR
+                });
+            }
+
+            let { uuid, session } = req.params;
+
+            if ([uuid, session].some(value => value === '' || value === null || value === undefined)) {
+                return res.json({
+                    ...BaseStdResponse.MISSING_PARAMETER,
+                    endpoint: 1513126
+                });
+            }
+
+            if (!await AccessControl.checkSession(uuid, session)) {
+                return res.json({
+                    ...BaseStdResponse.ACCESS_DENIED,
+                    endpoint: 48153145
+                });
+            }
+
+            if (!req.file) {
+                return res.json({
+                    ...BaseStdResponse.MISSING_PARAMETER,
+                    msg: '请上传头像文件'
+                });
+            }
+
+            const avatarPath = `/avatar/${req.file.filename}`; // 获取文件路径
+
+            let sql = 'UPDATE users SET avatar = ? WHERE uuid = ?';
+            let result = await db.query(sql, [avatarPath, uuid]);
+
+            if (result && result.affectedRows > 0) {
+                sql = 'SELECT username, wxid, avatar, email FROM users WHERE uuid = ?';
+                let rows = await db.query(sql, [uuid]);
+
+                if (!rows || rows.length === 0) {
+                    return res.json({
+                        ...BaseStdResponse.DATABASE_ERR
+                    });
+                }
+
+                res.json({
+                    ...BaseStdResponse.OK,
+                    data: {
+                        uuid,
+                        username: rows[0].username,
+                        wxid: rows[0].wxid,
+                        email: rows[0].email,
+                        avatar: rows[0].avatar,
+                        session
+                    }
+                });
+            } else {
+                res.json({ ...BaseStdResponse.ERR, endpoint: 7894378, msg: '头像更新失败!' });
+            }
+        });
+    }
+}
+
+module.exports.UploadAvatar = UploadAvatar;

+ 3 - 0
lib/Server.js

@@ -20,6 +20,9 @@ class SERVER {
         //解决cors跨域
         this.app.use(cors());
 
+        //使用静态资源
+        this.app.use(express.static('./uploads'));
+
         // 初始化数据库连接
         this.db = new MySQL();
 

BIN
uploads/avatar/avatar.png


BIN
uploads/avatar/baac4cdbbc7787293ec1b431d6971cdc.png