修改bug。新增牛只,超链接
This commit is contained in:
168
backend/controllers/cattleTypeController.js
Normal file
168
backend/controllers/cattleTypeController.js
Normal file
@@ -0,0 +1,168 @@
|
||||
/**
|
||||
* 牛只类型控制器
|
||||
* 处理cattle_type表的CRUD操作
|
||||
*/
|
||||
|
||||
const { sequelize } = require('../config/database-simple')
|
||||
|
||||
class CattleTypeController {
|
||||
/**
|
||||
* 获取所有牛只类型
|
||||
*/
|
||||
async getAllTypes(req, res) {
|
||||
try {
|
||||
const [types] = await sequelize.query('SELECT * FROM cattle_type ORDER BY id ASC')
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: types,
|
||||
message: '获取牛只类型列表成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取牛只类型列表失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取牛只类型列表失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取牛只类型
|
||||
*/
|
||||
async getTypeById(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
const [types] = await sequelize.query('SELECT * FROM cattle_type WHERE id = ?', [id])
|
||||
|
||||
if (types.length === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '牛只类型不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: types[0],
|
||||
message: '获取牛只类型成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取牛只类型失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取牛只类型失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建牛只类型
|
||||
*/
|
||||
async createType(req, res) {
|
||||
try {
|
||||
const { name, description } = req.body
|
||||
|
||||
if (!name) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '类型名称不能为空'
|
||||
})
|
||||
}
|
||||
|
||||
const [result] = await sequelize.query(
|
||||
'INSERT INTO cattle_type (name, description) VALUES (?, ?)',
|
||||
[name, description || null]
|
||||
)
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: { id: result.insertId, name, description },
|
||||
message: '创建牛只类型成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建牛只类型失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '创建牛只类型失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新牛只类型
|
||||
*/
|
||||
async updateType(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
const { name, description } = req.body
|
||||
|
||||
if (!name) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '类型名称不能为空'
|
||||
})
|
||||
}
|
||||
|
||||
const [result] = await sequelize.query(
|
||||
'UPDATE cattle_type SET name = ?, description = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?',
|
||||
[name, description || null, id]
|
||||
)
|
||||
|
||||
if (result.affectedRows === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '牛只类型不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: { id: parseInt(id), name, description },
|
||||
message: '更新牛只类型成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新牛只类型失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '更新牛只类型失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除牛只类型
|
||||
*/
|
||||
async deleteType(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
|
||||
const [result] = await sequelize.query('DELETE FROM cattle_type WHERE id = ?', [id])
|
||||
|
||||
if (result.affectedRows === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '牛只类型不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '删除牛只类型成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除牛只类型失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '删除牛只类型失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new CattleTypeController()
|
||||
168
backend/controllers/cattleUserController.js
Normal file
168
backend/controllers/cattleUserController.js
Normal file
@@ -0,0 +1,168 @@
|
||||
/**
|
||||
* 牛只用途控制器
|
||||
* 处理cattle_user表的CRUD操作
|
||||
*/
|
||||
|
||||
const { sequelize } = require('../config/database-simple')
|
||||
|
||||
class CattleUserController {
|
||||
/**
|
||||
* 获取所有牛只用途
|
||||
*/
|
||||
async getAllUsers(req, res) {
|
||||
try {
|
||||
const [users] = await sequelize.query('SELECT * FROM cattle_user ORDER BY id ASC')
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: users,
|
||||
message: '获取牛只用途列表成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取牛只用途列表失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取牛只用途列表失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取牛只用途
|
||||
*/
|
||||
async getUserById(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
const [users] = await sequelize.query('SELECT * FROM cattle_user WHERE id = ?', [id])
|
||||
|
||||
if (users.length === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '牛只用途不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: users[0],
|
||||
message: '获取牛只用途成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取牛只用途失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取牛只用途失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建牛只用途
|
||||
*/
|
||||
async createUser(req, res) {
|
||||
try {
|
||||
const { name, description } = req.body
|
||||
|
||||
if (!name) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '用途名称不能为空'
|
||||
})
|
||||
}
|
||||
|
||||
const [result] = await sequelize.query(
|
||||
'INSERT INTO cattle_user (name, description) VALUES (?, ?)',
|
||||
[name, description || null]
|
||||
)
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: { id: result.insertId, name, description },
|
||||
message: '创建牛只用途成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建牛只用途失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '创建牛只用途失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新牛只用途
|
||||
*/
|
||||
async updateUser(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
const { name, description } = req.body
|
||||
|
||||
if (!name) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '用途名称不能为空'
|
||||
})
|
||||
}
|
||||
|
||||
const [result] = await sequelize.query(
|
||||
'UPDATE cattle_user SET name = ?, description = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?',
|
||||
[name, description || null, id]
|
||||
)
|
||||
|
||||
if (result.affectedRows === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '牛只用途不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: { id: parseInt(id), name, description },
|
||||
message: '更新牛只用途成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新牛只用途失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '更新牛只用途失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除牛只用途
|
||||
*/
|
||||
async deleteUser(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
|
||||
const [result] = await sequelize.query('DELETE FROM cattle_user WHERE id = ?', [id])
|
||||
|
||||
if (result.affectedRows === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '牛只用途不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '删除牛只用途成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除牛只用途失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '删除牛只用途失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new CattleUserController()
|
||||
@@ -122,7 +122,8 @@ class ElectronicFenceController {
|
||||
type = 'collector',
|
||||
description = '',
|
||||
coordinates,
|
||||
farm_id = null
|
||||
farm_id = null,
|
||||
is_active = true
|
||||
} = req.body
|
||||
|
||||
// 验证必填字段
|
||||
@@ -152,6 +153,7 @@ class ElectronicFenceController {
|
||||
center_lat: parseFloat(center.lat.toFixed(7)), // 限制精度为7位小数
|
||||
area,
|
||||
farm_id,
|
||||
is_active,
|
||||
created_by: req.user?.id || 1 // 默认使用管理员ID
|
||||
})
|
||||
|
||||
|
||||
@@ -157,7 +157,8 @@ class ElectronicFencePointController {
|
||||
|
||||
// 批量创建坐标点
|
||||
const createdPoints = await ElectronicFencePoint.createPoints(fence_id, points, {
|
||||
createdBy: req.user?.id
|
||||
createdBy: req.user?.id,
|
||||
created_by: req.user?.id
|
||||
});
|
||||
|
||||
res.status(201).json({
|
||||
|
||||
197
backend/controllers/iotJbqClientController.js
Normal file
197
backend/controllers/iotJbqClientController.js
Normal file
@@ -0,0 +1,197 @@
|
||||
/**
|
||||
* 智能耳标客户端控制器
|
||||
* 处理iot_jbq_client表的CRUD操作
|
||||
*/
|
||||
|
||||
const { sequelize } = require('../config/database-simple')
|
||||
|
||||
class IotJbqClientController {
|
||||
/**
|
||||
* 获取所有智能耳标设备
|
||||
*/
|
||||
async getAllClients(req, res) {
|
||||
try {
|
||||
const { cid, page = 1, pageSize = 10 } = req.query
|
||||
|
||||
let whereClause = ''
|
||||
let params = []
|
||||
|
||||
if (cid) {
|
||||
whereClause = `WHERE cid = '${cid}'`
|
||||
}
|
||||
|
||||
const offset = (page - 1) * pageSize
|
||||
|
||||
// 获取总数
|
||||
const [countResult] = await sequelize.query(
|
||||
`SELECT COUNT(*) as total FROM iot_jbq_client ${whereClause}`
|
||||
)
|
||||
|
||||
// 获取数据
|
||||
const [clients] = await sequelize.query(
|
||||
`SELECT * FROM iot_jbq_client ${whereClause} ORDER BY id DESC LIMIT ${parseInt(pageSize)} OFFSET ${offset}`
|
||||
)
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: clients,
|
||||
pagination: {
|
||||
current: parseInt(page),
|
||||
pageSize: parseInt(pageSize),
|
||||
total: countResult[0].total
|
||||
},
|
||||
message: '获取智能耳标设备列表成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取智能耳标设备列表失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取智能耳标设备列表失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据CID获取智能耳标设备
|
||||
*/
|
||||
async getClientByCid(req, res) {
|
||||
try {
|
||||
const { cid } = req.params
|
||||
const [clients] = await sequelize.query(`SELECT * FROM iot_jbq_client WHERE cid = '${cid}'`)
|
||||
|
||||
if (clients.length === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '智能耳标设备不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: clients[0],
|
||||
message: '获取智能耳标设备成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取智能耳标设备失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取智能耳标设备失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取智能耳标设备
|
||||
*/
|
||||
async getClientById(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
const [clients] = await sequelize.query(`SELECT * FROM iot_jbq_client WHERE id = ${id}`)
|
||||
|
||||
if (clients.length === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '智能耳标设备不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: clients[0],
|
||||
message: '获取智能耳标设备成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取智能耳标设备失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '获取智能耳标设备失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新智能耳标设备
|
||||
*/
|
||||
async updateClient(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
const updateData = req.body
|
||||
|
||||
// 构建更新字段
|
||||
const updateFields = []
|
||||
|
||||
Object.keys(updateData).forEach(key => {
|
||||
if (updateData[key] !== undefined) {
|
||||
const value = typeof updateData[key] === 'string' ? `'${updateData[key]}'` : updateData[key]
|
||||
updateFields.push(`${key} = ${value}`)
|
||||
}
|
||||
})
|
||||
|
||||
if (updateFields.length === 0) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: '没有要更新的字段'
|
||||
})
|
||||
}
|
||||
|
||||
const [result] = await sequelize.query(
|
||||
`UPDATE iot_jbq_client SET ${updateFields.join(', ')} WHERE id = ${id}`
|
||||
)
|
||||
|
||||
if (result.affectedRows === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '智能耳标设备不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: { id: parseInt(id), ...updateData },
|
||||
message: '更新智能耳标设备成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新智能耳标设备失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '更新智能耳标设备失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除智能耳标设备
|
||||
*/
|
||||
async deleteClient(req, res) {
|
||||
try {
|
||||
const { id } = req.params
|
||||
|
||||
const [result] = await sequelize.query('DELETE FROM iot_jbq_client WHERE id = ?', [id])
|
||||
|
||||
if (result.affectedRows === 0) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: '智能耳标设备不存在'
|
||||
})
|
||||
}
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: '删除智能耳标设备成功'
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除智能耳标设备失败:', error)
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '删除智能耳标设备失败',
|
||||
error: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new IotJbqClientController()
|
||||
Reference in New Issue
Block a user