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

/**
* 基础控制器类
* 提供控制器的通用功能和标准化响应格式
*/
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