You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
2.5 KiB
118 lines
2.5 KiB
/**
|
|
* 基础控制器类
|
|
* 提供控制器的通用功能和标准化响应格式
|
|
*/
|
|
|
|
export class BaseController {
|
|
constructor() {
|
|
this.serviceName = this.constructor.name.replace('Controller', 'Service')
|
|
}
|
|
|
|
/**
|
|
* 成功响应
|
|
*/
|
|
success(ctx, data = null, message = '操作成功', code = 200) {
|
|
ctx.status = code
|
|
ctx.body = {
|
|
success: true,
|
|
code,
|
|
message,
|
|
data,
|
|
timestamp: Date.now()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 错误响应
|
|
*/
|
|
error(ctx, message = '操作失败', code = 400, data = null) {
|
|
ctx.status = code
|
|
ctx.body = {
|
|
success: false,
|
|
code,
|
|
message,
|
|
data,
|
|
timestamp: Date.now()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 分页响应
|
|
*/
|
|
paginate(ctx, data, pagination, message = '获取成功') {
|
|
ctx.body = {
|
|
success: true,
|
|
code: 200,
|
|
message,
|
|
data,
|
|
pagination,
|
|
timestamp: Date.now()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取查询参数
|
|
*/
|
|
getQuery(ctx) {
|
|
return ctx.query || {}
|
|
}
|
|
|
|
/**
|
|
* 获取请求体
|
|
*/
|
|
getBody(ctx) {
|
|
return ctx.request.body || {}
|
|
}
|
|
|
|
/**
|
|
* 获取路径参数
|
|
*/
|
|
getParams(ctx) {
|
|
return ctx.params || {}
|
|
}
|
|
|
|
/**
|
|
* 获取用户信息
|
|
*/
|
|
getUser(ctx) {
|
|
return ctx.state.user || null
|
|
}
|
|
|
|
/**
|
|
* 验证必需参数
|
|
*/
|
|
validateRequired(data, requiredFields) {
|
|
const missing = []
|
|
requiredFields.forEach(field => {
|
|
if (!data[field] && data[field] !== 0) {
|
|
missing.push(field)
|
|
}
|
|
})
|
|
|
|
if (missing.length > 0) {
|
|
throw new Error(`缺少必需参数: ${missing.join(', ')}`)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 异步错误处理装饰器
|
|
*/
|
|
static asyncHandler(fn) {
|
|
return async (ctx, next) => {
|
|
try {
|
|
await fn(ctx, next)
|
|
} catch (error) {
|
|
console.error('Controller error:', error)
|
|
ctx.status = error.status || 500
|
|
ctx.body = {
|
|
success: false,
|
|
code: error.status || 500,
|
|
message: error.message || '服务器内部错误',
|
|
timestamp: Date.now()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export default BaseController
|