From 008ffdfd7c1be7e5f1f582480fde32efbb5ffad5 Mon Sep 17 00:00:00 2001 From: juzeon <812312770@qq.com> Date: Sun, 26 Sep 2021 16:47:02 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E7=94=A8=E6=88=B7=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E5=A4=B4=E5=83=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +++ src/helpers/entity-fill.ts | 1 + src/index.ts | 2 ++ src/models/user-model.ts | 4 ++++ src/routers/user-router.ts | 16 +++++++++++++--- src/services/user-service.ts | 20 +++++++++++++++++++- src/types.ts | 1 + 7 files changed, 43 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 3ceb9cd..dd21b89 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "dependencies": { "@types/cors": "^2.8.12", "@types/express": "^4.17.13", + "@types/express-fileupload": "^1.1.7", "@types/express-jwt": "^6.0.2", "@types/jsonwebtoken": "^8.5.4", "@types/node": "^16.4.1", @@ -25,8 +26,10 @@ "dotenv": "^10.0.0", "express": "^4.17.1", "express-async-handler": "^1.1.4", + "express-fileupload": "^1.2.1", "express-jwt": "^6.0.0", "express-validator": "^6.12.1", + "form-data": "^4.0.0", "jsonwebtoken": "^8.5.1", "promise-mysql": "^5.0.3", "qs": "^6.10.1", diff --git a/src/helpers/entity-fill.ts b/src/helpers/entity-fill.ts index 88f7f07..1325d45 100644 --- a/src/helpers/entity-fill.ts +++ b/src/helpers/entity-fill.ts @@ -5,6 +5,7 @@ export function fillIUser(single: any) { id: single.id, username: single.username, realName: single.realName, + avatar: single.avatar, role: single.role } } diff --git a/src/index.ts b/src/index.ts index a714b50..e86526f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,10 +9,12 @@ import type {ErrorRequestHandler} from "express" import {IResultJson} from "./types" import {postRouter} from "./routers/post-router" import {adminRouter} from "./routers/admin-router" +import fileUpload from "express-fileupload" const app = express() app.use(cors()) +app.use(fileUpload()) app.use(express.urlencoded({extended: true})) app.use( expressJWT({ diff --git a/src/models/user-model.ts b/src/models/user-model.ts index 0355a70..09629be 100644 --- a/src/models/user-model.ts +++ b/src/models/user-model.ts @@ -28,4 +28,8 @@ export class UserModel { } return fillIUser(user[0]) } + + async updateAvatar(id: number, avatar: string) { + await db.query('update users set avatar=? where id=?', [avatar, id]) + } } diff --git a/src/routers/user-router.ts b/src/routers/user-router.ts index 965f4b3..4e15495 100644 --- a/src/routers/user-router.ts +++ b/src/routers/user-router.ts @@ -2,10 +2,11 @@ import 'reflect-metadata' import express from "express" import {Container} from "typedi" import {UserService} from "../services/user-service" -import {body, validationResult,} from "express-validator" -import {hasValidationErrors} from "../includes" +import {body, check, validationResult,} from "express-validator" +import {hasValidationErrors, resultJson} from "../includes" import {JWTUserPayload} from "../types" import expressAsyncHandler from "express-async-handler" +import {UploadedFile} from "express-fileupload" let userService = Container.get(UserService) @@ -18,8 +19,17 @@ userRouter.post('/login', res.json(await userService.login(req.body.username, req.body.password)) }) ) -userRouter.get('/me',expressAsyncHandler(async (req:express.Request,res:express.Response)=>{ +userRouter.get('/me', expressAsyncHandler(async (req: express.Request, res: express.Response) => { res.json(await userService.me(req.user as JWTUserPayload)) })) +userRouter.post('/uploadAvatar', + expressAsyncHandler(async (req: express.Request, res: express.Response) => { + if (!req.files?.image) { + res.json(resultJson.error('请选择要上传的图片')) + return + } + res.json(await userService.uploadAvatar(req.user as JWTUserPayload, req.files.image as UploadedFile)) + }) +) export {userRouter} diff --git a/src/services/user-service.ts b/src/services/user-service.ts index e892d3c..a0835cc 100644 --- a/src/services/user-service.ts +++ b/src/services/user-service.ts @@ -7,6 +7,9 @@ import qs from 'qs' import jwt from "jsonwebtoken" import {appConfig} from "../config" import {JWTUserPayload} from "../types" +import fileUpload, {UploadedFile} from "express-fileupload" +import axios from "axios" +import FormData from "form-data" @Service() export class UserService { @@ -29,6 +32,7 @@ export class UserService { rsa, ul: username.length.toString(), pl: password.length.toString(), + lt: ticket, execution: 'e1s1', _eventId: 'submit' })) @@ -51,7 +55,21 @@ export class UserService { } async me(jwtUserPayload: JWTUserPayload) { - let user=await this.userModel.findUserById(jwtUserPayload.id) + let user = await this.userModel.findUserById(jwtUserPayload.id) return resultJson.success(user) } + + async uploadAvatar(jwtUserPayload: JWTUserPayload, image: UploadedFile) { + let form = new FormData() + form.append('image', image.data, image.name) + let resp = await axios.post('https://image.kieng.cn/upload.html?type=jd', form, { + headers: form.getHeaders() + }) + if (resp.data.code !== 200) { + return resultJson.error(resp.data.msg) + } + let avatar: string = resp.data.data.url + await this.userModel.updateAvatar(jwtUserPayload.id, avatar) + return resultJson.success(avatar) + } } diff --git a/src/types.ts b/src/types.ts index 1a4c219..ff277a1 100644 --- a/src/types.ts +++ b/src/types.ts @@ -9,6 +9,7 @@ export interface IUser { id?: number, username: string, realName: string, + avatar?: string, role: TUserRole }