Files
yunrui_asset/backend/validation/rackSchema.js
T
zhang1106 258b7af7c8 feat(机柜管理): 实现机柜ID自动生成功能
- 修改机柜创建逻辑,当rackId为空时自动生成RACKxxx格式的ID
- 更新验证规则,rackId改为可选字段并允许空值
- 调整前端表单提示,明确机柜ID可留空自动生成
- 优化导入功能,支持自动生成机柜ID并改进验证逻辑
- 提供机柜导入模板下载功能,模板中明确ID可留空
2026-02-06 13:33:45 +08:00

170 lines
3.8 KiB
JavaScript

const Joi = require('joi');
// 机柜状态枚举
const RACK_STATUS = ['active', 'inactive', 'maintenance'];
// 创建机柜验证Schema
const createRackSchema = Joi.object({
rackId: Joi.string()
.max(50)
.pattern(/^[a-zA-Z0-9_-]+$/)
.allow('', null)
.messages({
'string.max': '机柜ID不能超过50个字符',
'string.pattern.base': '机柜ID只能包含字母、数字、下划线和横线'
}),
name: Joi.string()
.required()
.max(100)
.messages({
'string.empty': '机柜名称不能为空',
'string.max': '机柜名称不能超过100个字符',
'any.required': '机柜名称是必填字段'
}),
height: Joi.number()
.integer()
.min(1)
.max(100)
.default(42)
.messages({
'number.base': '高度必须是数字',
'number.integer': '高度必须是整数',
'number.min': '高度不能小于1',
'number.max': '高度不能大于100'
}),
maxPower: Joi.number()
.min(0)
.max(1000000)
.default(10000)
.messages({
'number.base': '最大功率必须是数字',
'number.min': '最大功率不能小于0',
'number.max': '最大功率不能超过1000000'
}),
currentPower: Joi.number()
.min(0)
.default(0)
.messages({
'number.base': '当前功率必须是数字',
'number.min': '当前功率不能小于0'
}),
status: Joi.string()
.valid(...RACK_STATUS)
.default('active')
.messages({
'any.only': `状态必须是以下之一: ${RACK_STATUS.join(', ')}`
}),
roomId: Joi.string()
.required()
.max(50)
.messages({
'string.empty': '机房ID不能为空',
'string.max': '机房ID不能超过50个字符',
'any.required': '机房ID是必填字段'
}),
description: Joi.string()
.max(500)
.allow('', null)
.messages({
'string.max': '描述不能超过500个字符'
})
});
// 更新机柜验证Schema
const updateRackSchema = Joi.object({
rackId: Joi.string()
.max(50)
.pattern(/^[a-zA-Z0-9_-]+$/)
.messages({
'string.max': '机柜ID不能超过50个字符',
'string.pattern.base': '机柜ID只能包含字母、数字、下划线和横线'
}),
name: Joi.string()
.max(100)
.messages({
'string.max': '机柜名称不能超过100个字符'
}),
height: Joi.number()
.integer()
.min(1)
.max(100)
.messages({
'number.base': '高度必须是数字',
'number.integer': '高度必须是整数',
'number.min': '高度不能小于1',
'number.max': '高度不能大于100'
}),
maxPower: Joi.number()
.min(0)
.max(1000000)
.messages({
'number.base': '最大功率必须是数字',
'number.min': '最大功率不能小于0',
'number.max': '最大功率不能超过1000000'
}),
currentPower: Joi.number()
.min(0)
.messages({
'number.base': '当前功率必须是数字',
'number.min': '当前功率不能小于0'
}),
status: Joi.string()
.valid(...RACK_STATUS)
.messages({
'any.only': `状态必须是以下之一: ${RACK_STATUS.join(', ')}`
}),
roomId: Joi.string()
.max(50),
description: Joi.string()
.max(500)
.allow('', null)
.messages({
'string.max': '描述不能超过500个字符'
})
}).min(1).messages({
'object.min': '至少需要提供一个字段进行更新'
});
// 查询机柜验证Schema
const queryRackSchema = Joi.object({
roomId: Joi.string()
.max(50)
.allow(''),
status: Joi.string()
.valid(...RACK_STATUS, 'all')
.allow(''),
keyword: Joi.string()
.max(100)
.allow(''),
page: Joi.number()
.integer()
.min(1)
.default(1),
pageSize: Joi.number()
.integer()
.min(1)
.max(100)
.default(10)
});
module.exports = {
createRackSchema,
updateRackSchema,
queryRackSchema,
RACK_STATUS
};