From 8f7a71321bc2d45cf90ea5179118ad54887b13fb Mon Sep 17 00:00:00 2001 From: juzeon <812312770@qq.com> Date: Sun, 25 Jul 2021 20:04:04 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E5=88=97=E5=87=BApo?= =?UTF-8?q?st?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 1 + src/config.ts | 3 ++- src/includes.ts | 4 ++++ src/index.ts | 4 +++- src/models/post-model.ts | 11 +++++++++-- src/routers/admin-router.ts | 27 +++++++++++++++++++++++++++ src/services/admin-service.ts | 15 +++++++++++++++ 7 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 src/routers/admin-router.ts create mode 100644 src/services/admin-service.ts diff --git a/.env.example b/.env.example index b10ba85..b5ce4d0 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,6 @@ NDH_PORT=9444 NDH_JWT_SECRET= +NDH_POST_PER_PAGE=10 NDH_DB_HOST= NDH_DB_USER= diff --git a/src/config.ts b/src/config.ts index ad203e0..aebab97 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,6 +5,7 @@ const appConfig = { dbUser: process.env.NDH_DB_USER, dbPassword: process.env.NDH_DB_PASSWORD, dbName: process.env.NDH_DB_NAME, - jwtSecret:process.env.NDH_JWT_SECRET || 'default-jwt-secret' + jwtSecret: process.env.NDH_JWT_SECRET || 'default-jwt-secret', + postPerPage: process.env.NDH_POST_PER_PAGE as any as number } export {appConfig} diff --git a/src/includes.ts b/src/includes.ts index 345ab0a..1b689fd 100644 --- a/src/includes.ts +++ b/src/includes.ts @@ -77,3 +77,7 @@ export function getAxiosInstance() { export function getTimestampInSeconds() { return Math.floor(Date.now() / 1000) } + +export function pageToLimitSqlSegment(page: number) { + return ' limit ' + (page - 1) * appConfig.postPerPage + ',' + appConfig.postPerPage +} diff --git a/src/index.ts b/src/index.ts index 5092f2a..a714b50 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,7 @@ import expressJWT from 'express-jwt' import type {ErrorRequestHandler} from "express" import {IResultJson} from "./types" import {postRouter} from "./routers/post-router" +import {adminRouter} from "./routers/admin-router" const app = express() @@ -30,7 +31,8 @@ const authErrorHandler: ErrorRequestHandler = app.use(authErrorHandler) app.use('/user', userRouter) -app.use('/post',postRouter) +app.use('/post', postRouter) +app.use('/admin',adminRouter) async function entrypoint() { await getPoolCreatingPromise() diff --git a/src/models/post-model.ts b/src/models/post-model.ts index f6a7169..35447c0 100644 --- a/src/models/post-model.ts +++ b/src/models/post-model.ts @@ -1,7 +1,8 @@ import 'reflect-metadata' import {Service} from "typedi" -import {IPost} from "../types" -import {db} from "../includes" +import {IPost, TPostStatus} from "../types" +import {db, pageToLimitSqlSegment} from "../includes" +import {fillIPost} from "../helpers/entity-fill" @Service() export class PostModel { @@ -10,4 +11,10 @@ export class PostModel { post.userId, post.content, post.image, post.status, post.time ]) } + + async findPostByStatus(status: TPostStatus, page: number) { + let arr = await db.query('select * from posts where status=? order by time desc ' + + pageToLimitSqlSegment(page),[status]) + return arr.map((single: any) => fillIPost(single)) + } } diff --git a/src/routers/admin-router.ts b/src/routers/admin-router.ts new file mode 100644 index 0000000..c7db348 --- /dev/null +++ b/src/routers/admin-router.ts @@ -0,0 +1,27 @@ +import 'reflect-metadata' +import express from "express" +import {JWTUserPayload, TPostStatus} from "../types" +import {hasValidationErrors, resultJson} from "../includes" +import {param, query} from "express-validator" +import {Container} from "typedi" +import {AdminService} from "../services/admin-service" + +let adminService = Container.get(AdminService) +let adminRouter = express.Router() +adminRouter.use((req: express.Request, res: express.Response, next) => { + if ((req.user as JWTUserPayload).role < 2) { + res.json(resultJson.error('您需要管理员权限来造访该接口')) + } else { + next() + } +}) +adminRouter.get('/list/:status', + param('status').isIn([1, 2, 3]).withMessage('Post状态仅支援1,2,3'), + query('page').default(1).isInt({min: 1}).withMessage('页码必须>=1'), + async (req: express.Request, res: express.Response) => { + if(hasValidationErrors(req,res)) return + res.json(await adminService.list(req.params.status as any as TPostStatus, req.query.page as any as number)) + } +) + +export {adminRouter} diff --git a/src/services/admin-service.ts b/src/services/admin-service.ts new file mode 100644 index 0000000..a08c0f0 --- /dev/null +++ b/src/services/admin-service.ts @@ -0,0 +1,15 @@ +import 'reflect-metadata' +import {Inject, Service} from "typedi" +import {TPostStatus} from "../types" +import {resultJson} from "../includes" +import {PostModel} from "../models/post-model" + +@Service() +export class AdminService { + @Inject() + postModel!: PostModel + + async list(status: TPostStatus, page: number) { + return resultJson.success(await this.postModel.findPostByStatus(status, page)) + } +}