管理员列出post
This commit is contained in:
父節點
959bf13156
當前提交
8f7a71321b
@ -1,5 +1,6 @@
|
|||||||
NDH_PORT=9444
|
NDH_PORT=9444
|
||||||
NDH_JWT_SECRET=
|
NDH_JWT_SECRET=
|
||||||
|
NDH_POST_PER_PAGE=10
|
||||||
|
|
||||||
NDH_DB_HOST=
|
NDH_DB_HOST=
|
||||||
NDH_DB_USER=
|
NDH_DB_USER=
|
||||||
|
@ -5,6 +5,7 @@ const appConfig = {
|
|||||||
dbUser: process.env.NDH_DB_USER,
|
dbUser: process.env.NDH_DB_USER,
|
||||||
dbPassword: process.env.NDH_DB_PASSWORD,
|
dbPassword: process.env.NDH_DB_PASSWORD,
|
||||||
dbName: process.env.NDH_DB_NAME,
|
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}
|
export {appConfig}
|
||||||
|
@ -77,3 +77,7 @@ export function getAxiosInstance() {
|
|||||||
export function getTimestampInSeconds() {
|
export function getTimestampInSeconds() {
|
||||||
return Math.floor(Date.now() / 1000)
|
return Math.floor(Date.now() / 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function pageToLimitSqlSegment(page: number) {
|
||||||
|
return ' limit ' + (page - 1) * appConfig.postPerPage + ',' + appConfig.postPerPage
|
||||||
|
}
|
||||||
|
@ -8,6 +8,7 @@ import expressJWT from 'express-jwt'
|
|||||||
import type {ErrorRequestHandler} from "express"
|
import type {ErrorRequestHandler} from "express"
|
||||||
import {IResultJson} from "./types"
|
import {IResultJson} from "./types"
|
||||||
import {postRouter} from "./routers/post-router"
|
import {postRouter} from "./routers/post-router"
|
||||||
|
import {adminRouter} from "./routers/admin-router"
|
||||||
|
|
||||||
const app = express()
|
const app = express()
|
||||||
|
|
||||||
@ -30,7 +31,8 @@ const authErrorHandler: ErrorRequestHandler =
|
|||||||
app.use(authErrorHandler)
|
app.use(authErrorHandler)
|
||||||
|
|
||||||
app.use('/user', userRouter)
|
app.use('/user', userRouter)
|
||||||
app.use('/post',postRouter)
|
app.use('/post', postRouter)
|
||||||
|
app.use('/admin',adminRouter)
|
||||||
|
|
||||||
async function entrypoint() {
|
async function entrypoint() {
|
||||||
await getPoolCreatingPromise()
|
await getPoolCreatingPromise()
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import 'reflect-metadata'
|
import 'reflect-metadata'
|
||||||
import {Service} from "typedi"
|
import {Service} from "typedi"
|
||||||
import {IPost} from "../types"
|
import {IPost, TPostStatus} from "../types"
|
||||||
import {db} from "../includes"
|
import {db, pageToLimitSqlSegment} from "../includes"
|
||||||
|
import {fillIPost} from "../helpers/entity-fill"
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class PostModel {
|
export class PostModel {
|
||||||
@ -10,4 +11,10 @@ export class PostModel {
|
|||||||
post.userId, post.content, post.image, post.status, post.time
|
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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
27
src/routers/admin-router.ts
Normal file
27
src/routers/admin-router.ts
Normal file
@ -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}
|
15
src/services/admin-service.ts
Normal file
15
src/services/admin-service.ts
Normal file
@ -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))
|
||||||
|
}
|
||||||
|
}
|
載入中…
x
新增問題並參考
Block a user