删除废弃的API和架构文档
This commit is contained in:
226
README.md
Normal file
226
README.md
Normal file
@@ -0,0 +1,226 @@
|
||||
# 宁夏智慧养殖监管平台
|
||||
|
||||
<div align="center">
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
**现代化的智慧养殖监管平台,集成IoT设备监控、动物健康管理、数据可视化分析等功能**
|
||||
|
||||
[功能特性](#功能特性) • [快速开始](#快速开始) • [项目架构](#项目架构) • [文档](#文档) • [贡献指南](#贡献指南)
|
||||
|
||||
</div>
|
||||
|
||||
## 📋 项目概述
|
||||
|
||||
宁夏智慧养殖监管平台是一个现代化的农场管理系统,旨在通过数字化手段提升养殖业的管理效率和监管水平。系统采用前后端分离架构,支持多端访问,为养殖场管理者、监管部门和相关机构提供全方位的智慧养殖解决方案。
|
||||
|
||||
### 🎯 核心价值
|
||||
|
||||
- **智能监控**:实时监控养殖环境和设备状态
|
||||
- **数据驱动**:基于大数据分析的决策支持
|
||||
- **全程追溯**:完整的养殖过程记录和追溯
|
||||
- **多端协同**:支持Web端、小程序等多平台访问
|
||||
- **安全可靠**:企业级安全防护和数据保护
|
||||
|
||||
## ✨ 功能特性
|
||||
|
||||
### 🏭 核心业务模块
|
||||
|
||||
- **🏢 养殖场管理**:养殖场信息、圈舍管理、电子围栏
|
||||
- **🐄 动物健康管理**:牲畜档案、健康监测、批次管理
|
||||
- **📱 IoT设备监控**:传感器数据、设备状态、实时告警
|
||||
- **📊 数据可视化**:统计分析、图表展示、决策支持
|
||||
- **👥 用户权限管理**:多角色权限、操作审计、安全控制
|
||||
- **🛒 产品订单管理**:产品销售、订单处理、库存管理
|
||||
- **⚠️ 预警管理**:智能告警、异常处理、风险预防
|
||||
|
||||
### 🌐 多端支持
|
||||
|
||||
- **管理后台**:基于Vue 3的现代化管理界面
|
||||
- **数据大屏**:实时数据展示和监控大屏
|
||||
- **官方网站**:产品展示和信息发布
|
||||
- **小程序矩阵**:
|
||||
- 银行端小程序:金融服务支持
|
||||
- 政府端小程序:监管和政策发布
|
||||
- 保险端小程序:保险服务管理
|
||||
|
||||
### 🛠️ 技术特性
|
||||
|
||||
- **现代化技术栈**:Vue 3 + Node.js + MySQL
|
||||
- **响应式设计**:适配多种设备和屏幕尺寸
|
||||
- **实时通信**:WebSocket支持实时数据推送
|
||||
- **地图集成**:百度地图API地理信息展示
|
||||
- **性能监控**:完整的系统性能监控体系
|
||||
- **API文档**:Swagger自动生成API文档
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 环境要求
|
||||
|
||||
- **Node.js**: 16.20.2+
|
||||
- **MySQL**: 8.0+
|
||||
- **npm**: 8.0.0+
|
||||
|
||||
### 安装步骤
|
||||
|
||||
1. **克隆项目**
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd nxxmdata
|
||||
```
|
||||
|
||||
2. **安装依赖**
|
||||
```bash
|
||||
# 安装后端依赖
|
||||
cd backend
|
||||
npm install
|
||||
|
||||
# 安装前端依赖
|
||||
cd ../admin-system
|
||||
npm install
|
||||
|
||||
# 安装数据大屏依赖
|
||||
cd ../datav
|
||||
npm install
|
||||
```
|
||||
|
||||
3. **配置环境**
|
||||
```bash
|
||||
# 复制环境配置文件
|
||||
cp backend/.env.example backend/.env
|
||||
cp admin-system/.env.example admin-system/.env
|
||||
|
||||
# 编辑配置文件,设置数据库连接等信息
|
||||
```
|
||||
|
||||
4. **初始化数据库**
|
||||
```bash
|
||||
cd backend
|
||||
npm run init-db
|
||||
```
|
||||
|
||||
5. **启动服务**
|
||||
```bash
|
||||
# 启动后端服务 (端口: 5000)
|
||||
cd backend
|
||||
npm run dev
|
||||
|
||||
# 启动管理后台 (端口: 5173)
|
||||
cd admin-system
|
||||
npm run dev
|
||||
|
||||
# 启动数据大屏 (端口: 5174)
|
||||
cd datav
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 访问地址
|
||||
|
||||
- **管理后台**: http://localhost:5173
|
||||
- **数据大屏**: http://localhost:5174
|
||||
- **API文档**: http://localhost:5000/api-docs
|
||||
- **官方网站**: 直接打开 `website/index.html`
|
||||
|
||||
## 🏗️ 项目架构
|
||||
|
||||
```
|
||||
nxxmdata/
|
||||
├── 📁 backend/ # 后端API服务
|
||||
│ ├── config/ # 配置文件
|
||||
│ ├── controllers/ # 控制器
|
||||
│ ├── models/ # 数据模型
|
||||
│ ├── routes/ # 路由定义
|
||||
│ ├── middleware/ # 中间件
|
||||
│ └── utils/ # 工具类
|
||||
├── 📁 admin-system/ # 管理后台前端
|
||||
│ ├── src/ # 源代码
|
||||
│ ├── components/ # 组件库
|
||||
│ └── views/ # 页面视图
|
||||
├── 📁 datav/ # 数据可视化大屏
|
||||
├── 📁 website/ # 官方网站
|
||||
├── 📁 bank_mini_program/ # 银行端小程序
|
||||
├── 📁 government-mini-program/ # 政府端小程序
|
||||
├── 📁 insurance_mini_program/ # 保险端小程序
|
||||
├── 📁 docs/ # 项目文档
|
||||
└── 📁 scripts/ # 脚本工具
|
||||
```
|
||||
|
||||
### 技术栈
|
||||
|
||||
**后端技术栈**
|
||||
- Node.js 16.20.2 + Express.js
|
||||
- Sequelize ORM + MySQL 8.0
|
||||
- JWT认证 + bcryptjs加密
|
||||
- Swagger API文档
|
||||
- Winston日志系统
|
||||
|
||||
**前端技术栈**
|
||||
- Vue 3.4.15 + Vite
|
||||
- Ant Design Vue 4.0
|
||||
- ECharts 5.4 数据可视化
|
||||
- Pinia 状态管理
|
||||
- Axios HTTP客户端
|
||||
|
||||
## 📚 文档
|
||||
|
||||
### 核心文档
|
||||
|
||||
- [📋 产品需求文档](docs/config/PRD.md) - 详细的业务需求和功能规格
|
||||
- [🏗️ 系统架构文档](docs/config/arch.md) - 技术架构和系统设计
|
||||
- [🔧 开发指南](docs/DEVELOPMENT.md) - 开发环境搭建和开发规范
|
||||
- [🚀 部署指南](docs/DEPLOYMENT.md) - 生产环境部署说明
|
||||
- [📖 API文档](docs/API.md) - 接口设计和使用说明
|
||||
|
||||
### 专项文档
|
||||
|
||||
- [🏦 银行端小程序文档](docs/银行端小程序产品需求文档.md)
|
||||
- [🏛️ 政府端小程序文档](docs/政府端产品需求文档.md)
|
||||
- [🛡️ 保险端小程序文档](docs/保险端产品需求文档.md)
|
||||
- [🔒 安全说明](docs/SECURITY.md)
|
||||
- [❓ 故障排除](docs/TROUBLESHOOTING.md)
|
||||
|
||||
## 🤝 贡献指南
|
||||
|
||||
我们欢迎所有形式的贡献!请阅读 [贡献指南](docs/CONTRIBUTING.md) 了解如何参与项目开发。
|
||||
|
||||
### 开发流程
|
||||
|
||||
1. Fork 项目
|
||||
2. 创建功能分支 (`git checkout -b feature/AmazingFeature`)
|
||||
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
|
||||
4. 推送到分支 (`git push origin feature/AmazingFeature`)
|
||||
5. 创建 Pull Request
|
||||
|
||||
### 代码规范
|
||||
|
||||
- 遵循 ESLint 配置
|
||||
- 使用语义化提交信息
|
||||
- 编写单元测试
|
||||
- 更新相关文档
|
||||
|
||||
## 📄 许可证
|
||||
|
||||
本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。
|
||||
|
||||
## 📞 联系我们
|
||||
|
||||
- **项目维护者**: NXXM Development Team
|
||||
- **技术支持**: [创建Issue](../../issues)
|
||||
- **文档反馈**: [文档仓库](docs/)
|
||||
|
||||
## 🙏 致谢
|
||||
|
||||
感谢所有为项目做出贡献的开发者和用户!
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
**⭐ 如果这个项目对你有帮助,请给我们一个星标!**
|
||||
|
||||
Made with ❤️ by NXXM Development Team
|
||||
|
||||
</div>
|
||||
@@ -0,0 +1,84 @@
|
||||
/**
|
||||
* 修复iot_cattle表外键约束问题
|
||||
*
|
||||
* 问题描述:
|
||||
* - iot_cattle表的strain字段与cattle_user表的id字段类型不匹配
|
||||
* - 导致外键约束创建失败
|
||||
*
|
||||
* 解决方案:
|
||||
* - 检查两个字段的类型并确保它们匹配
|
||||
* - 重新创建外键约束
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
up: async (queryInterface, Sequelize) => {
|
||||
// 开始事务
|
||||
const transaction = await queryInterface.sequelize.transaction();
|
||||
|
||||
try {
|
||||
// 1. 检查并修改cattle_user表的id字段类型为TINYINT以匹配iot_cattle表的strain字段
|
||||
await queryInterface.changeColumn('cattle_user', 'id', {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '用途ID'
|
||||
}, { transaction });
|
||||
|
||||
// 2. 删除现有的不兼容外键约束(如果存在)
|
||||
await queryInterface.sequelize.query(
|
||||
'ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS iot_cattle_ibfk_2',
|
||||
{ transaction }
|
||||
);
|
||||
|
||||
// 3. 确保iot_cattle表的strain字段类型为TINYINT
|
||||
await queryInterface.changeColumn('iot_cattle', 'strain', {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '品系'
|
||||
}, { transaction });
|
||||
|
||||
// 4. 重新创建外键约束
|
||||
await queryInterface.sequelize.query(
|
||||
'ALTER TABLE iot_cattle ADD CONSTRAINT iot_cattle_ibfk_2 FOREIGN KEY (strain) REFERENCES cattle_user (id) ON DELETE RESTRICT ON UPDATE CASCADE',
|
||||
{ transaction }
|
||||
);
|
||||
|
||||
// 提交事务
|
||||
await transaction.commit();
|
||||
console.log('✅ 成功修复iot_cattle表外键约束问题');
|
||||
} catch (error) {
|
||||
// 回滚事务
|
||||
await transaction.rollback();
|
||||
console.error('❌ 修复iot_cattle表外键约束失败:', error.message);
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
|
||||
down: async (queryInterface, Sequelize) => {
|
||||
// 回滚操作
|
||||
const transaction = await queryInterface.sequelize.transaction();
|
||||
|
||||
try {
|
||||
// 1. 删除外键约束
|
||||
await queryInterface.sequelize.query(
|
||||
'ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS iot_cattle_ibfk_2',
|
||||
{ transaction }
|
||||
);
|
||||
|
||||
// 2. 恢复cattle_user表的id字段类型(可根据需要调整)
|
||||
await queryInterface.changeColumn('cattle_user', 'id', {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '用途ID'
|
||||
}, { transaction });
|
||||
|
||||
// 提交事务
|
||||
await transaction.commit();
|
||||
console.log('✅ 成功回滚外键约束修复');
|
||||
} catch (error) {
|
||||
// 回滚事务
|
||||
await transaction.rollback();
|
||||
console.error('❌ 回滚外键约束修复失败:', error.message);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
};
|
||||
278
backend/migrations/20250118000013_create_iot_cattle_table.js
Normal file
278
backend/migrations/20250118000013_create_iot_cattle_table.js
Normal file
@@ -0,0 +1,278 @@
|
||||
/**
|
||||
* 创建iot_cattle表
|
||||
*
|
||||
* 问题描述:
|
||||
* - 数据库中缺少iot_cattle表
|
||||
* - 需要创建该表并正确设置外键约束
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
up: async (queryInterface, Sequelize) => {
|
||||
await queryInterface.createTable('iot_cattle', {
|
||||
id: {
|
||||
type: Sequelize.INTEGER,
|
||||
primaryKey: true,
|
||||
autoIncrement: true,
|
||||
allowNull: false,
|
||||
comment: '牛只ID'
|
||||
},
|
||||
org_id: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '组织ID'
|
||||
},
|
||||
ear_number: {
|
||||
type: Sequelize.BIGINT,
|
||||
allowNull: false,
|
||||
comment: '耳标号'
|
||||
},
|
||||
sex: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '性别'
|
||||
},
|
||||
strain: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '品系'
|
||||
},
|
||||
varieties: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '品种'
|
||||
},
|
||||
cate: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '类别'
|
||||
},
|
||||
birth_weight: {
|
||||
type: Sequelize.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
comment: '出生体重'
|
||||
},
|
||||
birthday: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '出生日期'
|
||||
},
|
||||
pen_id: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: true,
|
||||
comment: '栏舍ID'
|
||||
},
|
||||
into_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '入栏时间'
|
||||
},
|
||||
parity: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '胎次'
|
||||
},
|
||||
source: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '来源'
|
||||
},
|
||||
source_day: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '来源天数'
|
||||
},
|
||||
source_weight: {
|
||||
type: Sequelize.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
comment: '来源体重'
|
||||
},
|
||||
weight: {
|
||||
type: Sequelize.DOUBLE(11, 2),
|
||||
allowNull: false,
|
||||
comment: '当前体重'
|
||||
},
|
||||
event: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '事件'
|
||||
},
|
||||
event_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '事件时间'
|
||||
},
|
||||
lactation_day: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '泌乳天数'
|
||||
},
|
||||
semen_num: {
|
||||
type: Sequelize.STRING(30),
|
||||
allowNull: false,
|
||||
comment: '精液编号'
|
||||
},
|
||||
is_wear: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否佩戴设备'
|
||||
},
|
||||
batch_id: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '批次ID'
|
||||
},
|
||||
imgs: {
|
||||
type: Sequelize.STRING(800),
|
||||
allowNull: false,
|
||||
comment: '图片'
|
||||
},
|
||||
is_ele_auth: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否电子认证'
|
||||
},
|
||||
is_qua_auth: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否质量认证'
|
||||
},
|
||||
is_delete: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '是否删除'
|
||||
},
|
||||
is_out: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '是否出栏'
|
||||
},
|
||||
create_uid: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '创建人ID'
|
||||
},
|
||||
create_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '创建时间'
|
||||
},
|
||||
algebra: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '代数'
|
||||
},
|
||||
colour: {
|
||||
type: Sequelize.TEXT,
|
||||
allowNull: false,
|
||||
comment: '毛色'
|
||||
},
|
||||
info_weight: {
|
||||
type: Sequelize.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
comment: '信息体重'
|
||||
},
|
||||
descent: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '血统'
|
||||
},
|
||||
is_vaccin: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否接种疫苗'
|
||||
},
|
||||
is_insemination: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否人工授精'
|
||||
},
|
||||
is_insure: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否投保'
|
||||
},
|
||||
is_mortgage: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否抵押'
|
||||
},
|
||||
update_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '更新时间'
|
||||
},
|
||||
breed_bull_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '配种时间'
|
||||
},
|
||||
level: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '等级'
|
||||
},
|
||||
six_weight: {
|
||||
type: Sequelize.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
comment: '6月龄体重'
|
||||
},
|
||||
eighteen_weight: {
|
||||
type: Sequelize.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
comment: '18月龄体重'
|
||||
},
|
||||
twelve_day_weight: {
|
||||
type: Sequelize.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
comment: '12日龄体重'
|
||||
},
|
||||
eighteen_day_weight: {
|
||||
type: Sequelize.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
comment: '18日龄体重'
|
||||
},
|
||||
xxiv_day_weight: {
|
||||
type: Sequelize.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
comment: '24日龄体重'
|
||||
},
|
||||
semen_breed_imgs: {
|
||||
type: Sequelize.STRING(800),
|
||||
allowNull: false,
|
||||
comment: '精液配种图片'
|
||||
},
|
||||
sell_status: {
|
||||
type: Sequelize.SMALLINT,
|
||||
allowNull: false,
|
||||
comment: '销售状态'
|
||||
},
|
||||
weight_calculate_time: {
|
||||
type: Sequelize.DATE,
|
||||
allowNull: true,
|
||||
comment: '体重计算时间'
|
||||
},
|
||||
day_of_birthday: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: true,
|
||||
comment: '出生天数'
|
||||
}
|
||||
}, {
|
||||
charset: 'utf8mb4',
|
||||
comment: '物联网牛只表'
|
||||
});
|
||||
|
||||
// 添加索引
|
||||
await queryInterface.addIndex('iot_cattle', ['org_id']);
|
||||
await queryInterface.addIndex('iot_cattle', ['strain']);
|
||||
await queryInterface.addIndex('iot_cattle', ['varieties']);
|
||||
await queryInterface.addIndex('iot_cattle', ['pen_id']);
|
||||
await queryInterface.addIndex('iot_cattle', ['batch_id']);
|
||||
|
||||
console.log('✅ 成功创建iot_cattle表');
|
||||
},
|
||||
|
||||
down: async (queryInterface, Sequelize) => {
|
||||
await queryInterface.dropTable('iot_cattle');
|
||||
console.log('✅ 成功删除iot_cattle表');
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* 为iot_cattle表添加外键约束
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
up: async (queryInterface, Sequelize) => {
|
||||
// 添加外键约束
|
||||
await queryInterface.sequelize.query(`
|
||||
ALTER TABLE iot_cattle
|
||||
ADD CONSTRAINT fk_iot_cattle_org_id
|
||||
FOREIGN KEY (org_id) REFERENCES farms (id)
|
||||
ON DELETE CASCADE ON UPDATE CASCADE
|
||||
`);
|
||||
|
||||
await queryInterface.sequelize.query(`
|
||||
ALTER TABLE iot_cattle
|
||||
ADD CONSTRAINT fk_iot_cattle_strain
|
||||
FOREIGN KEY (strain) REFERENCES cattle_user (id)
|
||||
ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
`);
|
||||
|
||||
await queryInterface.sequelize.query(`
|
||||
ALTER TABLE iot_cattle
|
||||
ADD CONSTRAINT fk_iot_cattle_varieties
|
||||
FOREIGN KEY (varieties) REFERENCES cattle_type (id)
|
||||
ON DELETE RESTRICT ON UPDATE CASCADE
|
||||
`);
|
||||
|
||||
await queryInterface.sequelize.query(`
|
||||
ALTER TABLE iot_cattle
|
||||
ADD CONSTRAINT fk_iot_cattle_pen_id
|
||||
FOREIGN KEY (pen_id) REFERENCES cattle_pens (id)
|
||||
ON DELETE SET NULL ON UPDATE CASCADE
|
||||
`);
|
||||
|
||||
await queryInterface.sequelize.query(`
|
||||
ALTER TABLE iot_cattle
|
||||
ADD CONSTRAINT fk_iot_cattle_batch_id
|
||||
FOREIGN KEY (batch_id) REFERENCES cattle_batches (id)
|
||||
ON DELETE SET NULL ON UPDATE CASCADE
|
||||
`);
|
||||
|
||||
console.log('✅ 成功为iot_cattle表添加外键约束');
|
||||
},
|
||||
|
||||
down: async (queryInterface, Sequelize) => {
|
||||
// 删除外键约束
|
||||
await queryInterface.sequelize.query('ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS fk_iot_cattle_org_id');
|
||||
await queryInterface.sequelize.query('ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS fk_iot_cattle_strain');
|
||||
await queryInterface.sequelize.query('ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS fk_iot_cattle_varieties');
|
||||
await queryInterface.sequelize.query('ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS fk_iot_cattle_pen_id');
|
||||
await queryInterface.sequelize.query('ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS fk_iot_cattle_batch_id');
|
||||
|
||||
console.log('✅ 成功删除iot_cattle表的外键约束');
|
||||
}
|
||||
};
|
||||
137
backend/migrations/20250118000015_add_missing_animal_fields.js
Normal file
137
backend/migrations/20250118000015_add_missing_animal_fields.js
Normal file
@@ -0,0 +1,137 @@
|
||||
/**
|
||||
* 为animals表添加缺失的字段
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
up: async (queryInterface, Sequelize) => {
|
||||
const { DataTypes } = require('sequelize');
|
||||
|
||||
// 添加项圈编号字段
|
||||
await queryInterface.addColumn('animals', 'collar_number', {
|
||||
type: DataTypes.STRING(50),
|
||||
allowNull: false,
|
||||
comment: '项圈编号'
|
||||
});
|
||||
|
||||
// 添加动物耳号字段
|
||||
await queryInterface.addColumn('animals', 'ear_tag', {
|
||||
type: DataTypes.STRING(50),
|
||||
allowNull: true,
|
||||
comment: '动物耳号'
|
||||
});
|
||||
|
||||
// 添加动物类型字段
|
||||
await queryInterface.addColumn('animals', 'animal_type', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
defaultValue: 1,
|
||||
comment: '动物类型:1-牛,2-羊,3-猪,4-马'
|
||||
});
|
||||
|
||||
// 添加品种字段
|
||||
await queryInterface.addColumn('animals', 'breed', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
defaultValue: 1,
|
||||
comment: '品种:1-西藏高山牦牛,2-荷斯坦奶牛,3-西门塔尔牛,4-安格斯牛,5-小尾寒羊,6-波尔山羊'
|
||||
});
|
||||
|
||||
// 添加品类字段
|
||||
await queryInterface.addColumn('animals', 'category', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
defaultValue: 1,
|
||||
comment: '品类:1-乳肉兼用,2-肉用,3-乳用,4-种用'
|
||||
});
|
||||
|
||||
// 添加来源类型字段
|
||||
await queryInterface.addColumn('animals', 'source_type', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
defaultValue: 1,
|
||||
comment: '来源类型:1-合作社,2-农户,3-养殖场,4-进口'
|
||||
});
|
||||
|
||||
// 添加出生日期字段
|
||||
await queryInterface.addColumn('animals', 'birth_date', {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: true,
|
||||
comment: '出生日期'
|
||||
});
|
||||
|
||||
// 添加出生体重字段
|
||||
await queryInterface.addColumn('animals', 'birth_weight', {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: true,
|
||||
defaultValue: 0.00,
|
||||
comment: '出生体重'
|
||||
});
|
||||
|
||||
// 添加断奶体重字段
|
||||
await queryInterface.addColumn('animals', 'weaning_weight', {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: true,
|
||||
defaultValue: 0.00,
|
||||
comment: '断奶体重'
|
||||
});
|
||||
|
||||
// 添加断奶日龄字段
|
||||
await queryInterface.addColumn('animals', 'weaning_age', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
defaultValue: 0,
|
||||
comment: '断奶日龄'
|
||||
});
|
||||
|
||||
// 添加入场日期字段
|
||||
await queryInterface.addColumn('animals', 'entry_date', {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: true,
|
||||
comment: '入场日期'
|
||||
});
|
||||
|
||||
// 添加历史已产胎次字段
|
||||
await queryInterface.addColumn('animals', 'calving_count', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
defaultValue: 0,
|
||||
comment: '历史已产胎次'
|
||||
});
|
||||
|
||||
// 添加乳头数(左)字段
|
||||
await queryInterface.addColumn('animals', 'left_teat_count', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
comment: '乳头数(左)'
|
||||
});
|
||||
|
||||
// 添加乳头数(右)字段
|
||||
await queryInterface.addColumn('animals', 'right_teat_count', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
comment: '乳头数(右)'
|
||||
});
|
||||
|
||||
console.log('✅ 成功为animals表添加缺失的字段');
|
||||
},
|
||||
|
||||
down: async (queryInterface, Sequelize) => {
|
||||
// 删除添加的字段
|
||||
await queryInterface.removeColumn('animals', 'collar_number');
|
||||
await queryInterface.removeColumn('animals', 'ear_tag');
|
||||
await queryInterface.removeColumn('animals', 'animal_type');
|
||||
await queryInterface.removeColumn('animals', 'breed');
|
||||
await queryInterface.removeColumn('animals', 'category');
|
||||
await queryInterface.removeColumn('animals', 'source_type');
|
||||
await queryInterface.removeColumn('animals', 'birth_date');
|
||||
await queryInterface.removeColumn('animals', 'birth_weight');
|
||||
await queryInterface.removeColumn('animals', 'weaning_weight');
|
||||
await queryInterface.removeColumn('animals', 'weaning_age');
|
||||
await queryInterface.removeColumn('animals', 'entry_date');
|
||||
await queryInterface.removeColumn('animals', 'calving_count');
|
||||
await queryInterface.removeColumn('animals', 'left_teat_count');
|
||||
await queryInterface.removeColumn('animals', 'right_teat_count');
|
||||
|
||||
console.log('✅ 成功回滚animals表字段添加操作');
|
||||
}
|
||||
};
|
||||
894
docs/API.md
894
docs/API.md
@@ -1,894 +0,0 @@
|
||||
# API 文档
|
||||
|
||||
## 概述
|
||||
|
||||
宁夏智慧养殖监管平台提供全面的RESTful API,支持农场管理、设备监控、动物健康管理、用户管理、订单管理等核心功能。
|
||||
|
||||
## 基础信息
|
||||
|
||||
- **Base URL**: `http://localhost:5350/api` (开发环境)
|
||||
- **Authentication**: JWT Bearer Token
|
||||
- **Content-Type**: `application/json`
|
||||
- **API Version**: v1.0
|
||||
|
||||
## 认证机制
|
||||
|
||||
### JWT Token认证
|
||||
所有需要认证的API都需要在请求头中包含JWT Token:
|
||||
|
||||
```http
|
||||
Authorization: Bearer <your_jwt_token>
|
||||
```
|
||||
|
||||
### Token获取
|
||||
通过登录接口获取Token:
|
||||
```http
|
||||
POST /api/auth/login
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"username": "your_username",
|
||||
"password": "your_password"
|
||||
}
|
||||
```
|
||||
|
||||
## 通用响应格式
|
||||
|
||||
### 成功响应
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {},
|
||||
"message": "操作成功",
|
||||
"timestamp": "2025-01-18T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### 错误响应
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"error": {
|
||||
"code": "ERROR_CODE",
|
||||
"message": "错误描述",
|
||||
"details": "详细错误信息"
|
||||
},
|
||||
"timestamp": "2025-01-18T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### HTTP状态码
|
||||
- `200` - 请求成功
|
||||
- `201` - 创建成功
|
||||
- `400` - 请求参数错误
|
||||
- `401` - 未认证或Token过期
|
||||
- `403` - 权限不足
|
||||
- `404` - 资源不存在
|
||||
- `409` - 资源冲突
|
||||
- `500` - 服务器内部错误
|
||||
|
||||
## 认证相关API
|
||||
|
||||
### 用户登录
|
||||
```http
|
||||
POST /api/auth/login
|
||||
```
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"username": "admin",
|
||||
"password": "password123"
|
||||
}
|
||||
```
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||
"user": {
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"email": "admin@example.com",
|
||||
"roles": ["admin"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 用户注册
|
||||
```http
|
||||
POST /api/auth/register
|
||||
```
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"username": "newuser",
|
||||
"email": "newuser@example.com",
|
||||
"password": "password123",
|
||||
"phone": "13800138000"
|
||||
}
|
||||
```
|
||||
|
||||
### 用户登出
|
||||
```http
|
||||
POST /api/auth/logout
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
### 验证Token
|
||||
```http
|
||||
GET /api/auth/verify
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
## 用户管理API
|
||||
|
||||
### 获取用户列表
|
||||
```http
|
||||
GET /api/users
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
**查询参数:**
|
||||
- `page` (int): 页码,默认1
|
||||
- `limit` (int): 每页数量,默认10
|
||||
- `search` (string): 搜索关键词
|
||||
- `status` (string): 用户状态 (`active`, `inactive`, `banned`)
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"users": [
|
||||
{
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"email": "admin@example.com",
|
||||
"phone": "13800138000",
|
||||
"status": "active",
|
||||
"created_at": "2025-01-01T00:00:00Z",
|
||||
"roles": ["admin"]
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"page": 1,
|
||||
"limit": 10,
|
||||
"total": 1,
|
||||
"pages": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 获取用户详情
|
||||
```http
|
||||
GET /api/users/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
### 创建用户
|
||||
```http
|
||||
POST /api/users
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"username": "newuser",
|
||||
"email": "newuser@example.com",
|
||||
"password": "password123",
|
||||
"phone": "13800138000",
|
||||
"status": "active",
|
||||
"roles": ["user"]
|
||||
}
|
||||
```
|
||||
|
||||
### 更新用户
|
||||
```http
|
||||
PUT /api/users/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
### 删除用户
|
||||
```http
|
||||
DELETE /api/users/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
## 养殖场管理API
|
||||
|
||||
### 获取养殖场列表
|
||||
```http
|
||||
GET /api/farms
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**查询参数:**
|
||||
- `page` (int): 页码,默认1
|
||||
- `limit` (int): 每页数量,默认10
|
||||
- `type` (string): 养殖场类型
|
||||
- `status` (string): 状态 (`active`, `inactive`, `maintenance`)
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"farms": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "宁夏示范养殖场",
|
||||
"type": "奶牛养殖",
|
||||
"location": {
|
||||
"lat": 38.46667,
|
||||
"lng": 106.26667
|
||||
},
|
||||
"address": "宁夏回族自治区银川市金凤区",
|
||||
"contact": "张经理",
|
||||
"phone": "13800138000",
|
||||
"status": "active",
|
||||
"created_at": "2025-01-01T00:00:00Z"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"page": 1,
|
||||
"limit": 10,
|
||||
"total": 1,
|
||||
"pages": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 获取公开养殖场数据
|
||||
```http
|
||||
GET /api/farms/public
|
||||
```
|
||||
**需要认证**: 否
|
||||
|
||||
### 获取养殖场详情
|
||||
```http
|
||||
GET /api/farms/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
### 创建养殖场
|
||||
```http
|
||||
POST /api/farms
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"name": "新养殖场",
|
||||
"type": "养猪场",
|
||||
"longitude": 106.26667,
|
||||
"latitude": 38.46667,
|
||||
"address": "详细地址",
|
||||
"owner": "联系人姓名",
|
||||
"phone": "13800138000",
|
||||
"status": "active"
|
||||
}
|
||||
```
|
||||
|
||||
### 更新养殖场
|
||||
```http
|
||||
PUT /api/farms/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
### 删除养殖场
|
||||
```http
|
||||
DELETE /api/farms/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
## 设备管理API
|
||||
|
||||
### 获取设备列表
|
||||
```http
|
||||
GET /api/devices
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**查询参数:**
|
||||
- `page` (int): 页码
|
||||
- `limit` (int): 每页数量
|
||||
- `farm_id` (int): 养殖场ID
|
||||
- `type` (string): 设备类型
|
||||
- `status` (string): 设备状态 (`online`, `offline`, `maintenance`)
|
||||
|
||||
### 获取设备详情
|
||||
```http
|
||||
GET /api/devices/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "温度传感器001",
|
||||
"type": "温度传感器",
|
||||
"status": "online",
|
||||
"farm_id": 1,
|
||||
"metrics": {
|
||||
"temperature": 25.5,
|
||||
"humidity": 60
|
||||
},
|
||||
"last_maintenance": "2025-01-01T00:00:00Z",
|
||||
"installation_date": "2024-01-01T00:00:00Z",
|
||||
"farm": {
|
||||
"id": 1,
|
||||
"name": "宁夏示范养殖场"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 创建设备
|
||||
```http
|
||||
POST /api/devices
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"name": "新设备",
|
||||
"type": "传感器",
|
||||
"farm_id": 1,
|
||||
"installation_date": "2025-01-18",
|
||||
"metrics": {
|
||||
"temperature": 25.0
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 更新设备
|
||||
```http
|
||||
PUT /api/devices/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
### 删除设备
|
||||
```http
|
||||
DELETE /api/devices/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
## 动物管理API
|
||||
|
||||
### 获取动物列表
|
||||
```http
|
||||
GET /api/animals
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**查询参数:**
|
||||
- `page` (int): 页码
|
||||
- `limit` (int): 每页数量
|
||||
- `farm_id` (int): 养殖场ID
|
||||
- `type` (string): 动物类型
|
||||
- `health_status` (string): 健康状态 (`healthy`, `sick`, `quarantine`)
|
||||
|
||||
### 获取动物详情
|
||||
```http
|
||||
GET /api/animals/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
### 创建动物记录
|
||||
```http
|
||||
POST /api/animals
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"type": "奶牛",
|
||||
"count": 100,
|
||||
"farm_id": 1,
|
||||
"health_status": "healthy",
|
||||
"notes": "备注信息"
|
||||
}
|
||||
```
|
||||
|
||||
### 更新动物记录
|
||||
```http
|
||||
PUT /api/animals/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
### 删除动物记录
|
||||
```http
|
||||
DELETE /api/animals/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
## 预警管理API
|
||||
|
||||
### 获取预警列表
|
||||
```http
|
||||
GET /api/alerts
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**查询参数:**
|
||||
- `page` (int): 页码
|
||||
- `limit` (int): 每页数量
|
||||
- `farm_id` (int): 养殖场ID
|
||||
- `level` (string): 预警级别 (`low`, `medium`, `high`, `critical`)
|
||||
- `status` (string): 预警状态 (`active`, `acknowledged`, `resolved`)
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"alerts": [
|
||||
{
|
||||
"id": 1,
|
||||
"type": "temperature_high",
|
||||
"level": "high",
|
||||
"message": "温度过高警报",
|
||||
"status": "active",
|
||||
"farm_id": 1,
|
||||
"device_id": 1,
|
||||
"created_at": "2025-01-18T10:00:00Z",
|
||||
"farm": {
|
||||
"name": "宁夏示范养殖场"
|
||||
},
|
||||
"device": {
|
||||
"name": "温度传感器001"
|
||||
}
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"page": 1,
|
||||
"limit": 10,
|
||||
"total": 1,
|
||||
"pages": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 确认预警
|
||||
```http
|
||||
PUT /api/alerts/{id}/acknowledge
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
### 解决预警
|
||||
```http
|
||||
PUT /api/alerts/{id}/resolve
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"resolution_notes": "问题已解决,温度已恢复正常"
|
||||
}
|
||||
```
|
||||
|
||||
## 产品管理API
|
||||
|
||||
### 获取产品列表
|
||||
```http
|
||||
GET /api/products
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**查询参数:**
|
||||
- `page` (int): 页码
|
||||
- `limit` (int): 每页数量
|
||||
- `search` (string): 搜索关键词
|
||||
- `is_active` (boolean): 是否激活
|
||||
|
||||
### 获取产品详情
|
||||
```http
|
||||
GET /api/products/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
### 创建产品
|
||||
```http
|
||||
POST /api/products
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"name": "优质鲜牛奶",
|
||||
"description": "新鲜优质牛奶,富含营养",
|
||||
"price": 5000,
|
||||
"stock": 1000,
|
||||
"image_url": "/uploads/products/milk.jpg",
|
||||
"is_active": true
|
||||
}
|
||||
```
|
||||
|
||||
### 更新产品
|
||||
```http
|
||||
PUT /api/products/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
### 删除产品
|
||||
```http
|
||||
DELETE /api/products/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
## 订单管理API
|
||||
|
||||
### 获取订单列表
|
||||
```http
|
||||
GET /api/orders
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**查询参数:**
|
||||
- `page` (int): 页码
|
||||
- `limit` (int): 每页数量
|
||||
- `user_id` (int): 用户ID
|
||||
- `status` (string): 订单状态 (`pending`, `processing`, `shipped`, `delivered`, `cancelled`)
|
||||
- `payment_status` (string): 支付状态 (`unpaid`, `paid`, `refunded`)
|
||||
|
||||
### 获取订单详情
|
||||
```http
|
||||
GET /api/orders/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"id": 1,
|
||||
"user_id": 1,
|
||||
"total_amount": 10000,
|
||||
"status": "pending",
|
||||
"payment_status": "unpaid",
|
||||
"shipping_address": "收货地址",
|
||||
"created_at": "2025-01-18T10:00:00Z",
|
||||
"user": {
|
||||
"username": "用户名",
|
||||
"email": "user@example.com"
|
||||
},
|
||||
"items": [
|
||||
{
|
||||
"id": 1,
|
||||
"product_id": 1,
|
||||
"quantity": 2,
|
||||
"price": 5000,
|
||||
"product": {
|
||||
"name": "优质鲜牛奶",
|
||||
"image_url": "/uploads/products/milk.jpg"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 创建订单
|
||||
```http
|
||||
POST /api/orders
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"product_id": 1,
|
||||
"quantity": 2
|
||||
}
|
||||
],
|
||||
"shipping_address": "收货地址"
|
||||
}
|
||||
```
|
||||
|
||||
### 更新订单状态
|
||||
```http
|
||||
PUT /api/orders/{id}/status
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"status": "processing"
|
||||
}
|
||||
```
|
||||
|
||||
## 统计分析API
|
||||
|
||||
### 系统概览统计
|
||||
```http
|
||||
GET /api/stats/overview
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"farms": {
|
||||
"total": 10,
|
||||
"active": 8,
|
||||
"inactive": 2
|
||||
},
|
||||
"devices": {
|
||||
"total": 50,
|
||||
"online": 45,
|
||||
"offline": 3,
|
||||
"maintenance": 2
|
||||
},
|
||||
"animals": {
|
||||
"total": 5000,
|
||||
"healthy": 4800,
|
||||
"sick": 150,
|
||||
"quarantine": 50
|
||||
},
|
||||
"alerts": {
|
||||
"active": 5,
|
||||
"resolved_today": 12
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 养殖场统计
|
||||
```http
|
||||
GET /api/stats/farms/{id}
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
### 预警统计
|
||||
```http
|
||||
GET /api/stats/alerts
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**查询参数:**
|
||||
- `timeRange` (string): 时间范围 (`today`, `week`, `month`)
|
||||
|
||||
### 动物健康统计
|
||||
```http
|
||||
GET /api/stats/animals
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**查询参数:**
|
||||
- `farm_id` (int): 养殖场ID
|
||||
|
||||
## 地图服务API
|
||||
|
||||
### 获取地图数据
|
||||
```http
|
||||
GET /api/map/data
|
||||
```
|
||||
**需要认证**: 是
|
||||
|
||||
**响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {
|
||||
"farms": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "宁夏示范养殖场",
|
||||
"location": {
|
||||
"lat": 38.46667,
|
||||
"lng": 106.26667
|
||||
},
|
||||
"type": "奶牛养殖",
|
||||
"status": "active",
|
||||
"devices_count": 5,
|
||||
"animals_count": 500
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 性能监控API
|
||||
|
||||
### 获取性能指标
|
||||
```http
|
||||
GET /api/performance/metrics
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
### 获取系统资源信息
|
||||
```http
|
||||
GET /api/performance/system
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
### 获取数据库性能信息
|
||||
```http
|
||||
GET /api/performance/database
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
### 获取API性能统计
|
||||
```http
|
||||
GET /api/performance/api
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: admin
|
||||
|
||||
## 文件上传API
|
||||
|
||||
### 上传头像
|
||||
```http
|
||||
POST /api/upload/avatar
|
||||
```
|
||||
**需要认证**: 是
|
||||
**Content-Type**: `multipart/form-data`
|
||||
|
||||
**请求:**
|
||||
```
|
||||
Content-Type: multipart/form-data
|
||||
|
||||
avatar: [文件]
|
||||
```
|
||||
|
||||
### 上传产品图片
|
||||
```http
|
||||
POST /api/upload/product
|
||||
```
|
||||
**需要认证**: 是
|
||||
**权限要求**: manager
|
||||
**Content-Type**: `multipart/form-data`
|
||||
|
||||
## 错误代码参考
|
||||
|
||||
| 错误代码 | 描述 | HTTP状态码 |
|
||||
|---------|------|------------|
|
||||
| `INVALID_CREDENTIALS` | 用户名或密码错误 | 401 |
|
||||
| `TOKEN_EXPIRED` | Token已过期 | 401 |
|
||||
| `TOKEN_INVALID` | Token无效 | 401 |
|
||||
| `INSUFFICIENT_PERMISSIONS` | 权限不足 | 403 |
|
||||
| `RESOURCE_NOT_FOUND` | 资源不存在 | 404 |
|
||||
| `VALIDATION_ERROR` | 参数验证失败 | 400 |
|
||||
| `DUPLICATE_RESOURCE` | 资源重复 | 409 |
|
||||
| `DATABASE_ERROR` | 数据库错误 | 500 |
|
||||
| `INTERNAL_SERVER_ERROR` | 服务器内部错误 | 500 |
|
||||
|
||||
## API限制
|
||||
|
||||
### 频率限制
|
||||
- 登录接口:每分钟最多5次尝试
|
||||
- 普通API:每分钟最多1000次请求
|
||||
- 上传接口:每分钟最多10次请求
|
||||
|
||||
### 文件上传限制
|
||||
- 头像:最大2MB,支持jpg、png格式
|
||||
- 产品图片:最大5MB,支持jpg、png、webp格式
|
||||
|
||||
## SDK示例
|
||||
|
||||
### JavaScript/Node.js
|
||||
```javascript
|
||||
// 安装: npm install axios
|
||||
|
||||
const axios = require('axios');
|
||||
|
||||
class NxxmdataAPI {
|
||||
constructor(baseURL, token) {
|
||||
this.client = axios.create({
|
||||
baseURL: baseURL,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${token}`,
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async getFarms(params = {}) {
|
||||
const response = await this.client.get('/farms', { params });
|
||||
return response.data;
|
||||
}
|
||||
|
||||
async createFarm(farmData) {
|
||||
const response = await this.client.post('/farms', farmData);
|
||||
return response.data;
|
||||
}
|
||||
}
|
||||
|
||||
// 使用示例
|
||||
const api = new NxxmdataAPI('http://localhost:5350/api', 'your_token');
|
||||
const farms = await api.getFarms({ page: 1, limit: 10 });
|
||||
```
|
||||
|
||||
### Python
|
||||
```python
|
||||
import requests
|
||||
|
||||
class NxxmdataAPI:
|
||||
def __init__(self, base_url, token):
|
||||
self.base_url = base_url
|
||||
self.headers = {
|
||||
'Authorization': f'Bearer {token}',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
|
||||
def get_farms(self, params=None):
|
||||
response = requests.get(f'{self.base_url}/farms',
|
||||
headers=self.headers, params=params)
|
||||
return response.json()
|
||||
|
||||
def create_farm(self, farm_data):
|
||||
response = requests.post(f'{self.base_url}/farms',
|
||||
headers=self.headers, json=farm_data)
|
||||
return response.json()
|
||||
|
||||
# 使用示例
|
||||
api = NxxmdataAPI('http://localhost:5350/api', 'your_token')
|
||||
farms = api.get_farms({'page': 1, 'limit': 10})
|
||||
```
|
||||
|
||||
## 测试环境
|
||||
|
||||
### Swagger文档
|
||||
访问 `http://localhost:5350/api-docs` 查看交互式API文档。
|
||||
|
||||
### Postman集合
|
||||
提供完整的Postman集合文件,包含所有API的示例请求。
|
||||
|
||||
---
|
||||
|
||||
## 更新记录
|
||||
|
||||
- **v1.0** (2025-01-18): 初始版本,包含所有核心API
|
||||
- 定期更新,请关注CHANGELOG.md
|
||||
|
||||
## 联系方式
|
||||
|
||||
如有API相关问题,请联系:
|
||||
- 技术支持: api-support@nxxmdata.com
|
||||
- 文档反馈: docs@nxxmdata.com
|
||||
|
||||
*最后更新: 2025年1月*
|
||||
@@ -1,630 +0,0 @@
|
||||
# 宁夏智慧养殖监管平台部署指南
|
||||
|
||||
## 概述
|
||||
|
||||
本文档详细说明了宁夏智慧养殖监管平台的部署流程,包括开发环境、测试环境和生产环境的部署方案。
|
||||
|
||||
## 系统要求
|
||||
|
||||
### 基础要求
|
||||
- **操作系统**: Linux (推荐 Ubuntu 18.04+), macOS 10.14+, Windows 10+
|
||||
- **Node.js**: 18.0 或更高版本
|
||||
- **MySQL**: 8.0 或更高版本
|
||||
- **内存**: 最少 4GB RAM(推荐 8GB+)
|
||||
- **存储**: 最少 20GB 可用空间
|
||||
|
||||
### 推荐配置(生产环境)
|
||||
- **CPU**: 4核 或更高
|
||||
- **内存**: 16GB RAM
|
||||
- **存储**: 100GB SSD
|
||||
- **网络**: 100Mbps 带宽
|
||||
|
||||
## 前期准备
|
||||
|
||||
### 1. 环境检查
|
||||
```bash
|
||||
# 检查 Node.js 版本
|
||||
node --version # 应显示 v18.0.0 或更高
|
||||
|
||||
# 检查 npm 版本
|
||||
npm --version
|
||||
|
||||
# 检查 MySQL 版本
|
||||
mysql --version # 应显示 8.0 或更高
|
||||
```
|
||||
|
||||
### 2. 数据库准备
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE nxxmdata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 创建数据库用户(可选)
|
||||
CREATE USER 'nxxmdata_user'@'localhost' IDENTIFIED BY 'your_secure_password';
|
||||
GRANT ALL PRIVILEGES ON nxxmdata.* TO 'nxxmdata_user'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
### 3. 获取源代码
|
||||
```bash
|
||||
# 克隆项目(如果使用Git)
|
||||
git clone <repository-url>
|
||||
cd nxxmdata
|
||||
|
||||
# 或者解压源码包
|
||||
unzip nxxmdata.zip
|
||||
cd nxxmdata
|
||||
```
|
||||
|
||||
## 开发环境部署
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
#### 后端依赖安装
|
||||
```bash
|
||||
cd backend
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 前端依赖安装
|
||||
```bash
|
||||
# 管理后台
|
||||
cd admin-system/frontend
|
||||
npm install
|
||||
|
||||
# 官网大屏
|
||||
cd ../../website/data-screen
|
||||
npm install
|
||||
|
||||
# 微信小程序(可选)
|
||||
cd ../../mini_program/farm-monitor-dashboard
|
||||
npm install
|
||||
```
|
||||
|
||||
### 2. 环境配置
|
||||
|
||||
#### 后端环境配置
|
||||
在 `backend` 目录下创建 `.env` 文件:
|
||||
```bash
|
||||
# 数据库配置
|
||||
DB_HOST=localhost
|
||||
DB_PORT=3306
|
||||
DB_NAME=nxxmdata
|
||||
DB_USER=root
|
||||
DB_PASSWORD=your_mysql_password
|
||||
|
||||
# JWT配置
|
||||
JWT_SECRET=your_jwt_secret_key_here
|
||||
JWT_EXPIRES_IN=24h
|
||||
|
||||
# 服务器配置
|
||||
PORT=5350
|
||||
NODE_ENV=development
|
||||
|
||||
# 百度地图API配置
|
||||
BAIDU_MAP_API_KEY=your_baidu_map_api_key
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL=debug
|
||||
LOG_FILE_PATH=./logs/
|
||||
```
|
||||
|
||||
#### 前端环境配置
|
||||
在 `admin-system/frontend` 目录下创建 `.env` 文件:
|
||||
```bash
|
||||
# API配置
|
||||
VITE_API_BASE_URL=http://localhost:5350/api
|
||||
VITE_BAIDU_MAP_API_KEY=your_baidu_map_api_key
|
||||
|
||||
# 开发服务器配置
|
||||
VITE_PORT=5301
|
||||
```
|
||||
|
||||
### 3. 数据库初始化
|
||||
```bash
|
||||
cd backend
|
||||
|
||||
# 运行数据库迁移
|
||||
npm run init-db
|
||||
|
||||
# 或者手动执行SQL脚本
|
||||
mysql -u root -p nxxmdata < create_tables.sql
|
||||
```
|
||||
|
||||
### 4. 启动开发服务器
|
||||
|
||||
#### 启动后端服务
|
||||
```bash
|
||||
cd backend
|
||||
npm run dev
|
||||
# 服务将在 http://localhost:5350 启动
|
||||
```
|
||||
|
||||
#### 启动前端服务
|
||||
```bash
|
||||
# 启动管理后台
|
||||
cd admin-system/frontend
|
||||
npm run dev
|
||||
# 服务将在 http://localhost:5301 启动
|
||||
|
||||
# 启动官网大屏
|
||||
cd ../../website/data-screen
|
||||
npm run dev
|
||||
# 服务将在 http://localhost:5302 启动
|
||||
```
|
||||
|
||||
### 5. 验证部署
|
||||
访问以下URL验证部署是否成功:
|
||||
- 后端API: http://localhost:5350/api/health
|
||||
- 管理后台: http://localhost:5301
|
||||
- 官网大屏: http://localhost:5302
|
||||
- API文档: http://localhost:5350/api-docs
|
||||
|
||||
## 测试环境部署
|
||||
|
||||
### 1. 使用PM2管理进程
|
||||
```bash
|
||||
# 安装PM2
|
||||
npm install -g pm2
|
||||
|
||||
# 构建项目
|
||||
cd admin-system/frontend
|
||||
npm run build
|
||||
|
||||
cd ../../website/data-screen
|
||||
npm run build
|
||||
|
||||
# 启动后端服务
|
||||
cd ../../backend
|
||||
pm2 start ecosystem.config.js --env test
|
||||
```
|
||||
|
||||
### 2. Nginx配置
|
||||
创建 `/etc/nginx/sites-available/nxxmdata-test` 文件:
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name test.nxxmdata.com;
|
||||
|
||||
# 前端静态文件
|
||||
location / {
|
||||
root /path/to/nxxmdata/admin-system/frontend/dist;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# 官网大屏
|
||||
location /screen {
|
||||
root /path/to/nxxmdata/website/data-screen/dist;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# API代理
|
||||
location /api {
|
||||
proxy_pass http://localhost:5350;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 生产环境部署
|
||||
|
||||
### 1. Docker部署(推荐)
|
||||
|
||||
#### 创建Dockerfile
|
||||
```dockerfile
|
||||
# 多阶段构建 - 前端构建阶段
|
||||
FROM node:18-alpine AS frontend-builder
|
||||
|
||||
# 构建管理后台
|
||||
WORKDIR /app/admin-system/frontend
|
||||
COPY admin-system/frontend/package*.json ./
|
||||
RUN npm ci --only=production
|
||||
COPY admin-system/frontend/ ./
|
||||
RUN npm run build
|
||||
|
||||
# 构建官网大屏
|
||||
WORKDIR /app/website/data-screen
|
||||
COPY website/data-screen/package*.json ./
|
||||
RUN npm ci --only=production
|
||||
COPY website/data-screen/ ./
|
||||
RUN npm run build
|
||||
|
||||
# 后端运行阶段
|
||||
FROM node:18-alpine AS backend
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 安装后端依赖
|
||||
COPY backend/package*.json ./
|
||||
RUN npm ci --only=production
|
||||
|
||||
# 复制后端代码
|
||||
COPY backend/ ./
|
||||
|
||||
# 复制前端构建产物
|
||||
COPY --from=frontend-builder /app/admin-system/frontend/dist ./public/admin
|
||||
COPY --from=frontend-builder /app/website/data-screen/dist ./public/screen
|
||||
|
||||
# 创建非root用户
|
||||
RUN addgroup -g 1001 -S nodejs
|
||||
RUN adduser -S node -u 1001
|
||||
USER node
|
||||
|
||||
EXPOSE 5350
|
||||
|
||||
CMD ["npm", "start"]
|
||||
```
|
||||
|
||||
#### 创建docker-compose.yml
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
nxxmdata-app:
|
||||
build: .
|
||||
ports:
|
||||
- "5350:5350"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DB_HOST=mysql
|
||||
- DB_PORT=3306
|
||||
- DB_NAME=nxxmdata
|
||||
- DB_USER=nxxmdata_user
|
||||
- DB_PASSWORD=${DB_PASSWORD}
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
depends_on:
|
||||
- mysql
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./logs:/app/logs
|
||||
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
|
||||
- MYSQL_DATABASE=nxxmdata
|
||||
- MYSQL_USER=nxxmdata_user
|
||||
- MYSQL_PASSWORD=${DB_PASSWORD}
|
||||
ports:
|
||||
- "3306:3306"
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
- ./create_tables.sql:/docker-entrypoint-initdb.d/init.sql
|
||||
restart: unless-stopped
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf
|
||||
- ./ssl:/etc/nginx/ssl
|
||||
depends_on:
|
||||
- nxxmdata-app
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
```
|
||||
|
||||
#### 创建环境变量文件
|
||||
创建 `.env` 文件:
|
||||
```bash
|
||||
# 数据库密码
|
||||
DB_PASSWORD=your_secure_db_password
|
||||
MYSQL_ROOT_PASSWORD=your_secure_root_password
|
||||
|
||||
# JWT密钥
|
||||
JWT_SECRET=your_very_secure_jwt_secret_key
|
||||
|
||||
# 百度地图API
|
||||
BAIDU_MAP_API_KEY=your_baidu_map_api_key
|
||||
```
|
||||
|
||||
#### 部署命令
|
||||
```bash
|
||||
# 构建并启动服务
|
||||
docker-compose up -d
|
||||
|
||||
# 查看服务状态
|
||||
docker-compose ps
|
||||
|
||||
# 查看日志
|
||||
docker-compose logs -f nxxmdata-app
|
||||
```
|
||||
|
||||
### 2. 传统部署方式
|
||||
|
||||
#### 安装和配置
|
||||
```bash
|
||||
# 1. 克隆项目
|
||||
git clone <repository-url>
|
||||
cd nxxmdata
|
||||
|
||||
# 2. 安装依赖
|
||||
cd backend && npm install --production
|
||||
cd ../admin-system/frontend && npm install && npm run build
|
||||
cd ../../website/data-screen && npm install && npm run build
|
||||
|
||||
# 3. 配置环境变量
|
||||
cp backend/.env.example backend/.env
|
||||
# 编辑 .env 文件,设置生产环境配置
|
||||
|
||||
# 4. 初始化数据库
|
||||
cd backend && npm run init-db
|
||||
|
||||
# 5. 使用PM2启动服务
|
||||
npm install -g pm2
|
||||
pm2 start ecosystem.config.js --env production
|
||||
```
|
||||
|
||||
#### PM2配置文件 (ecosystem.config.js)
|
||||
```javascript
|
||||
module.exports = {
|
||||
apps: [{
|
||||
name: 'nxxmdata-backend',
|
||||
script: './server.js',
|
||||
cwd: './backend',
|
||||
instances: 'max',
|
||||
exec_mode: 'cluster',
|
||||
env: {
|
||||
NODE_ENV: 'production',
|
||||
PORT: 5350
|
||||
},
|
||||
error_file: './logs/pm2-error.log',
|
||||
out_file: './logs/pm2-out.log',
|
||||
log_file: './logs/pm2-combined.log',
|
||||
time: true
|
||||
}]
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Nginx配置(生产环境)
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name nxxmdata.com www.nxxmdata.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name nxxmdata.com www.nxxmdata.com;
|
||||
|
||||
ssl_certificate /etc/nginx/ssl/nxxmdata.com.crt;
|
||||
ssl_certificate_key /etc/nginx/ssl/nxxmdata.com.key;
|
||||
|
||||
# SSL配置
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
|
||||
ssl_prefer_server_ciphers off;
|
||||
|
||||
# Gzip压缩
|
||||
gzip on;
|
||||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
|
||||
|
||||
# 管理后台
|
||||
location / {
|
||||
root /path/to/nxxmdata/admin-system/frontend/dist;
|
||||
try_files $uri $uri/ /index.html;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# 官网大屏
|
||||
location /screen {
|
||||
alias /path/to/nxxmdata/website/data-screen/dist;
|
||||
try_files $uri $uri/ /index.html;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# API代理
|
||||
location /api {
|
||||
proxy_pass http://localhost:5350;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_connect_timeout 30s;
|
||||
proxy_send_timeout 30s;
|
||||
proxy_read_timeout 30s;
|
||||
}
|
||||
|
||||
# API文档
|
||||
location /api-docs {
|
||||
proxy_pass http://localhost:5350;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 监控和维护
|
||||
|
||||
### 1. 日志管理
|
||||
```bash
|
||||
# PM2日志管理
|
||||
pm2 logs
|
||||
pm2 logs nxxmdata-backend
|
||||
pm2 flush # 清空日志
|
||||
|
||||
# 应用日志位置
|
||||
tail -f backend/logs/app.log
|
||||
tail -f backend/logs/error.log
|
||||
```
|
||||
|
||||
### 2. 性能监控
|
||||
```bash
|
||||
# PM2监控
|
||||
pm2 monit
|
||||
|
||||
# 系统资源监控
|
||||
htop
|
||||
iostat -x 1
|
||||
```
|
||||
|
||||
### 3. 数据库备份
|
||||
```bash
|
||||
# 创建备份脚本 backup.sh
|
||||
#!/bin/bash
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
mysqldump -u root -p nxxmdata > /backup/nxxmdata_$DATE.sql
|
||||
find /backup -name "nxxmdata_*.sql" -mtime +7 -delete
|
||||
|
||||
# 设置定时任务
|
||||
crontab -e
|
||||
# 添加: 0 2 * * * /path/to/backup.sh
|
||||
```
|
||||
|
||||
### 4. 自动更新脚本
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# update.sh
|
||||
cd /path/to/nxxmdata
|
||||
git pull origin main
|
||||
|
||||
# 构建前端
|
||||
cd admin-system/frontend && npm run build
|
||||
cd ../../website/data-screen && npm run build
|
||||
|
||||
# 重启服务
|
||||
pm2 restart nxxmdata-backend
|
||||
```
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **端口占用**
|
||||
```bash
|
||||
# 查看端口占用
|
||||
lsof -i :5350
|
||||
netstat -tulpn | grep :5350
|
||||
|
||||
# 解决方法:杀死占用进程或更改端口
|
||||
```
|
||||
|
||||
2. **数据库连接失败**
|
||||
```bash
|
||||
# 检查MySQL服务状态
|
||||
systemctl status mysql
|
||||
|
||||
# 检查连接配置
|
||||
mysql -u root -p -h localhost
|
||||
```
|
||||
|
||||
3. **内存不足**
|
||||
```bash
|
||||
# 查看内存使用
|
||||
free -h
|
||||
top
|
||||
|
||||
# 优化PM2配置,减少实例数量
|
||||
```
|
||||
|
||||
4. **磁盘空间不足**
|
||||
```bash
|
||||
# 查看磁盘使用
|
||||
df -h
|
||||
|
||||
# 清理日志文件
|
||||
pm2 flush
|
||||
find /path/to/logs -name "*.log" -mtime +30 -delete
|
||||
```
|
||||
|
||||
## 安全加固
|
||||
|
||||
### 1. 防火墙配置
|
||||
```bash
|
||||
# 使用ufw
|
||||
ufw allow 22 # SSH
|
||||
ufw allow 80 # HTTP
|
||||
ufw allow 443 # HTTPS
|
||||
ufw enable
|
||||
```
|
||||
|
||||
### 2. SSL证书配置
|
||||
```bash
|
||||
# 使用Let's Encrypt
|
||||
certbot --nginx -d nxxmdata.com -d www.nxxmdata.com
|
||||
|
||||
# 自动续期
|
||||
echo "0 12 * * * /usr/bin/certbot renew --quiet" | crontab -
|
||||
```
|
||||
|
||||
### 3. 定期安全更新
|
||||
```bash
|
||||
# 系统更新
|
||||
apt update && apt upgrade -y
|
||||
|
||||
# Node.js依赖安全检查
|
||||
npm audit
|
||||
npm audit fix
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 1. 数据库优化
|
||||
```sql
|
||||
-- 添加必要的索引
|
||||
CREATE INDEX idx_farms_location ON farms(location);
|
||||
CREATE INDEX idx_devices_status ON devices(status);
|
||||
CREATE INDEX idx_alerts_created_at ON alerts(created_at);
|
||||
|
||||
-- 定期优化表
|
||||
OPTIMIZE TABLE farms, devices, alerts, users;
|
||||
```
|
||||
|
||||
### 2. 缓存配置
|
||||
```bash
|
||||
# 安装Redis(可选)
|
||||
apt install redis-server
|
||||
|
||||
# 在应用中配置Redis缓存
|
||||
```
|
||||
|
||||
### 3. CDN配置
|
||||
- 静态资源使用CDN加速
|
||||
- 图片和视频文件外部存储
|
||||
|
||||
## 回滚策略
|
||||
|
||||
### 1. 代码回滚
|
||||
```bash
|
||||
# Git回滚
|
||||
git revert <commit-hash>
|
||||
git push origin main
|
||||
|
||||
# 重新部署
|
||||
./update.sh
|
||||
```
|
||||
|
||||
### 2. 数据库回滚
|
||||
```bash
|
||||
# 恢复数据库备份
|
||||
mysql -u root -p nxxmdata < /backup/nxxmdata_20231201_020000.sql
|
||||
```
|
||||
|
||||
### 3. 服务回滚
|
||||
```bash
|
||||
# 停止当前版本
|
||||
pm2 stop nxxmdata-backend
|
||||
|
||||
# 恢复上一版本
|
||||
pm2 start ecosystem.config.js.backup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 联系信息
|
||||
|
||||
如有部署问题,请联系技术支持团队:
|
||||
- 邮箱: tech-support@nxxmdata.com
|
||||
- 电话: 400-xxx-xxxx
|
||||
|
||||
*最后更新: 2025年1月*
|
||||
@@ -1,932 +0,0 @@
|
||||
# 开发指南
|
||||
|
||||
## 概述
|
||||
|
||||
本文档为开发者提供宁夏智慧养殖监管平台的详细开发指南,包括开发环境搭建、代码规范、开发流程、调试技巧等内容。
|
||||
|
||||
## 开发环境搭建
|
||||
|
||||
### 系统要求
|
||||
- **Node.js**: 18.0+ (推荐使用 LTS 版本)
|
||||
- **npm**: 8.0+ 或 **yarn**: 1.22+
|
||||
- **MySQL**: 8.0+
|
||||
- **Git**: 2.25+
|
||||
- **编辑器**: VSCode (推荐)
|
||||
|
||||
### 工具推荐
|
||||
- **API测试**: Postman 或 Insomnia
|
||||
- **数据库管理**: MySQL Workbench 或 phpMyAdmin
|
||||
- **版本控制**: Git + GitHub/GitLab
|
||||
- **终端**: iTerm2 (macOS) 或 Windows Terminal
|
||||
|
||||
### 环境搭建步骤
|
||||
|
||||
#### 1. 克隆项目
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd nxxmdata
|
||||
```
|
||||
|
||||
#### 2. 安装依赖
|
||||
```bash
|
||||
# 后端依赖
|
||||
cd backend
|
||||
npm install
|
||||
|
||||
# 前端依赖 - 管理后台
|
||||
cd ../admin-system/frontend
|
||||
npm install
|
||||
|
||||
# 前端依赖 - 官网大屏
|
||||
cd ../../website/data-screen
|
||||
npm install
|
||||
|
||||
# 微信小程序(可选)
|
||||
cd ../../mini_program/farm-monitor-dashboard
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 3. 数据库配置
|
||||
```bash
|
||||
# 创建数据库
|
||||
mysql -u root -p
|
||||
CREATE DATABASE nxxmdata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
# 导入数据结构
|
||||
cd backend
|
||||
mysql -u root -p nxxmdata < ../create_tables.sql
|
||||
```
|
||||
|
||||
#### 4. 环境变量配置
|
||||
```bash
|
||||
# 后端环境变量
|
||||
cp backend/.env.example backend/.env
|
||||
# 编辑 .env 文件,配置数据库连接等信息
|
||||
|
||||
# 前端环境变量
|
||||
cp admin-system/frontend/.env.example admin-system/frontend/.env
|
||||
# 配置API基础URL等
|
||||
```
|
||||
|
||||
#### 5. 启动开发服务器
|
||||
```bash
|
||||
# 启动后端 (Terminal 1)
|
||||
cd backend
|
||||
npm run dev
|
||||
|
||||
# 启动管理后台前端 (Terminal 2)
|
||||
cd admin-system/frontend
|
||||
npm run dev
|
||||
|
||||
# 启动官网大屏 (Terminal 3)
|
||||
cd website/data-screen
|
||||
npm run dev
|
||||
```
|
||||
|
||||
## 项目结构详解
|
||||
|
||||
### 后端架构 (`backend/`)
|
||||
```
|
||||
backend/
|
||||
├── config/ # 配置文件
|
||||
│ ├── database.js # 数据库配置
|
||||
│ ├── swagger.js # API文档配置
|
||||
│ └── performance-config.js # 性能监控配置
|
||||
├── controllers/ # 控制器层
|
||||
│ ├── farmController.js # 农场业务逻辑
|
||||
│ ├── deviceController.js # 设备业务逻辑
|
||||
│ └── userController.js # 用户业务逻辑
|
||||
├── models/ # 数据模型层
|
||||
│ ├── Farm.js # 农场模型
|
||||
│ ├── Device.js # 设备模型
|
||||
│ └── User.js # 用户模型
|
||||
├── routes/ # 路由层
|
||||
│ ├── farms.js # 农场相关路由
|
||||
│ ├── devices.js # 设备相关路由
|
||||
│ └── auth.js # 认证相关路由
|
||||
├── middleware/ # 中间件
|
||||
│ ├── auth.js # 认证中间件
|
||||
│ └── performance-middleware.js # 性能监控中间件
|
||||
├── utils/ # 工具类
|
||||
│ ├── logger.js # 日志工具
|
||||
│ └── performance-monitor.js # 性能监控工具
|
||||
├── migrations/ # 数据库迁移
|
||||
├── seeds/ # 种子数据
|
||||
├── logs/ # 日志文件
|
||||
└── server.js # 服务器入口
|
||||
```
|
||||
|
||||
### 前端架构 (`admin-system/frontend/`)
|
||||
```
|
||||
frontend/
|
||||
├── src/
|
||||
│ ├── components/ # 可复用组件
|
||||
│ │ ├── BaiduMap.vue # 百度地图组件
|
||||
│ │ ├── EChart.vue # 图表组件
|
||||
│ │ └── Dashboard.vue # 仪表盘组件
|
||||
│ ├── views/ # 页面组件
|
||||
│ │ ├── Home.vue # 首页
|
||||
│ │ ├── MapView.vue # 地图视图
|
||||
│ │ └── Analytics.vue # 数据分析
|
||||
│ ├── stores/ # 状态管理 (Pinia)
|
||||
│ │ ├── user.js # 用户状态
|
||||
│ │ └── data.js # 数据状态
|
||||
│ ├── router/ # 路由配置
|
||||
│ │ ├── index.js # 路由实例
|
||||
│ │ └── routes.js # 路由定义
|
||||
│ ├── utils/ # 工具函数
|
||||
│ │ └── api.js # API调用封装
|
||||
│ ├── styles/ # 样式文件
|
||||
│ └── config/ # 配置文件
|
||||
├── public/ # 静态资源
|
||||
└── vite.config.js # Vite配置
|
||||
```
|
||||
|
||||
## 开发规范
|
||||
|
||||
### 代码风格规范
|
||||
|
||||
#### JavaScript/Vue.js 规范
|
||||
```javascript
|
||||
// 1. 使用 ES6+ 语法
|
||||
const apiUrl = process.env.VITE_API_BASE_URL;
|
||||
|
||||
// 2. 函数命名使用驼峰命名
|
||||
function getUserInfo() {}
|
||||
|
||||
// 3. 常量使用大写字母和下划线
|
||||
const API_BASE_URL = 'http://localhost:5350/api';
|
||||
|
||||
// 4. 类名使用 PascalCase
|
||||
class UserService {}
|
||||
|
||||
// 5. 文件名使用 kebab-case
|
||||
// user-service.js, farm-detail.vue
|
||||
```
|
||||
|
||||
#### Vue.js 组件规范
|
||||
```vue
|
||||
<template>
|
||||
<!-- 1. 模板根元素必须有唯一的根节点 -->
|
||||
<div class="component-name">
|
||||
<!-- 2. 使用语义化的HTML标签 -->
|
||||
<header class="component-header">
|
||||
<h1>{{ title }}</h1>
|
||||
</header>
|
||||
<main class="component-content">
|
||||
<!-- 3. 事件处理使用 handle 前缀 -->
|
||||
<button @click="handleSubmit">提交</button>
|
||||
</main>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
|
||||
export default {
|
||||
name: 'ComponentName', // 4. 组件名使用 PascalCase
|
||||
props: {
|
||||
// 5. Props 定义要详细
|
||||
title: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
emits: ['submit'], // 6. 声明所有 emit 事件
|
||||
setup(props, { emit }) {
|
||||
// 7. 响应式数据使用 ref 或 reactive
|
||||
const isLoading = ref(false)
|
||||
|
||||
// 8. 计算属性使用 computed
|
||||
const displayTitle = computed(() => {
|
||||
return props.title.toUpperCase()
|
||||
})
|
||||
|
||||
// 9. 方法使用 handle 前缀
|
||||
const handleSubmit = () => {
|
||||
emit('submit')
|
||||
}
|
||||
|
||||
// 10. 生命周期钩子
|
||||
onMounted(() => {
|
||||
// 组件挂载后的逻辑
|
||||
})
|
||||
|
||||
return {
|
||||
isLoading,
|
||||
displayTitle,
|
||||
handleSubmit
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
/* 11. 样式使用 scoped 避免污染 */
|
||||
.component-name {
|
||||
/* 12. 使用 BEM 命名法 */
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
#### Node.js 后端规范
|
||||
```javascript
|
||||
// 1. 使用严格模式
|
||||
'use strict';
|
||||
|
||||
// 2. 模块导入顺序:内置模块 -> 第三方模块 -> 本地模块
|
||||
const path = require('path');
|
||||
const express = require('express');
|
||||
const { Farm } = require('../models');
|
||||
|
||||
// 3. 异步函数使用 async/await
|
||||
const getFarms = async (req, res) => {
|
||||
try {
|
||||
// 4. 输入验证
|
||||
const { page = 1, limit = 10 } = req.query;
|
||||
|
||||
// 5. 业务逻辑
|
||||
const farms = await Farm.findAll({
|
||||
limit: parseInt(limit),
|
||||
offset: (parseInt(page) - 1) * parseInt(limit)
|
||||
});
|
||||
|
||||
// 6. 统一响应格式
|
||||
res.json({
|
||||
success: true,
|
||||
data: farms,
|
||||
message: '获取成功'
|
||||
});
|
||||
} catch (error) {
|
||||
// 7. 错误处理
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: {
|
||||
message: error.message
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
getFarms
|
||||
};
|
||||
```
|
||||
|
||||
### Git 工作流规范
|
||||
|
||||
#### 分支命名规范
|
||||
```bash
|
||||
# 功能分支
|
||||
feature/user-management
|
||||
feature/device-monitoring
|
||||
|
||||
# 修复分支
|
||||
fix/login-error
|
||||
fix/map-display-issue
|
||||
|
||||
# 发布分支
|
||||
release/v1.0.0
|
||||
|
||||
# 热修复分支
|
||||
hotfix/security-patch
|
||||
```
|
||||
|
||||
#### 提交信息规范
|
||||
```bash
|
||||
# 格式: type(scope): description
|
||||
|
||||
# 类型 (type):
|
||||
# feat: 新功能
|
||||
# fix: 修复bug
|
||||
# docs: 文档更新
|
||||
# style: 代码格式调整
|
||||
# refactor: 重构
|
||||
# test: 测试相关
|
||||
# chore: 构建过程或辅助工具的变动
|
||||
|
||||
# 示例:
|
||||
git commit -m "feat(user): add user registration functionality"
|
||||
git commit -m "fix(map): resolve baidu map display issue"
|
||||
git commit -m "docs(api): update API documentation"
|
||||
```
|
||||
|
||||
### 数据库设计规范
|
||||
|
||||
#### 表命名规范
|
||||
```sql
|
||||
-- 表名使用小写字母和下划线
|
||||
CREATE TABLE users (...);
|
||||
CREATE TABLE user_roles (...);
|
||||
CREATE TABLE device_sensors (...);
|
||||
|
||||
-- 字段名使用小写字母和下划线
|
||||
ALTER TABLE users ADD COLUMN created_at DATETIME;
|
||||
ALTER TABLE users ADD COLUMN updated_at DATETIME;
|
||||
|
||||
-- 索引命名
|
||||
CREATE INDEX idx_users_email ON users(email);
|
||||
CREATE INDEX idx_farms_location ON farms(location);
|
||||
```
|
||||
|
||||
#### 模型定义规范
|
||||
```javascript
|
||||
// models/User.js
|
||||
const { DataTypes } = require('sequelize');
|
||||
|
||||
module.exports = (sequelize) => {
|
||||
const User = sequelize.define('User', {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
primaryKey: true,
|
||||
autoIncrement: true,
|
||||
comment: '用户唯一标识'
|
||||
},
|
||||
username: {
|
||||
type: DataTypes.STRING(50),
|
||||
allowNull: false,
|
||||
unique: true,
|
||||
comment: '用户名'
|
||||
},
|
||||
email: {
|
||||
type: DataTypes.STRING(100),
|
||||
allowNull: false,
|
||||
unique: true,
|
||||
validate: {
|
||||
isEmail: true
|
||||
},
|
||||
comment: '邮箱地址'
|
||||
}
|
||||
}, {
|
||||
tableName: 'users',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
comment: '用户表'
|
||||
});
|
||||
|
||||
// 定义关联关系
|
||||
User.associate = (models) => {
|
||||
User.belongsToMany(models.Role, {
|
||||
through: models.UserRole,
|
||||
foreignKey: 'user_id',
|
||||
otherKey: 'role_id'
|
||||
});
|
||||
};
|
||||
|
||||
return User;
|
||||
};
|
||||
```
|
||||
|
||||
## 开发流程
|
||||
|
||||
### 功能开发流程
|
||||
|
||||
#### 1. 需求分析
|
||||
- 理解业务需求
|
||||
- 确认技术方案
|
||||
- 评估开发时间
|
||||
|
||||
#### 2. 设计阶段
|
||||
```bash
|
||||
# 数据库设计
|
||||
# 1. 创建或修改表结构
|
||||
# 2. 更新模型定义
|
||||
# 3. 编写迁移脚本
|
||||
|
||||
# API设计
|
||||
# 1. 定义路由
|
||||
# 2. 设计请求/响应格式
|
||||
# 3. 更新API文档
|
||||
|
||||
# 前端设计
|
||||
# 1. UI组件设计
|
||||
# 2. 状态管理设计
|
||||
# 3. 路由规划
|
||||
```
|
||||
|
||||
#### 3. 开发阶段
|
||||
```bash
|
||||
# 创建功能分支
|
||||
git checkout -b feature/new-feature
|
||||
|
||||
# 后端开发
|
||||
# 1. 创建/修改模型
|
||||
# 2. 编写控制器逻辑
|
||||
# 3. 添加路由
|
||||
# 4. 编写单元测试
|
||||
|
||||
# 前端开发
|
||||
# 1. 创建Vue组件
|
||||
# 2. 实现业务逻辑
|
||||
# 3. 添加样式
|
||||
# 4. 集成API
|
||||
|
||||
# 提交代码
|
||||
git add .
|
||||
git commit -m "feat: implement new feature"
|
||||
git push origin feature/new-feature
|
||||
```
|
||||
|
||||
#### 4. 测试阶段
|
||||
```bash
|
||||
# 单元测试
|
||||
npm test
|
||||
|
||||
# 集成测试
|
||||
npm run test:integration
|
||||
|
||||
# 端到端测试
|
||||
npm run test:e2e
|
||||
|
||||
# 手动测试
|
||||
# 1. 功能测试
|
||||
# 2. 兼容性测试
|
||||
# 3. 性能测试
|
||||
```
|
||||
|
||||
#### 5. 代码审查
|
||||
- 创建 Pull Request
|
||||
- 代码审查
|
||||
- 修改反馈问题
|
||||
- 合并到主分支
|
||||
|
||||
### 调试技巧
|
||||
|
||||
#### 后端调试
|
||||
|
||||
##### 1. 使用 console.log 调试
|
||||
```javascript
|
||||
// 在关键位置添加日志
|
||||
console.log('User data:', userData);
|
||||
console.log('Database query result:', result);
|
||||
|
||||
// 使用 JSON.stringify 查看对象
|
||||
console.log('Request body:', JSON.stringify(req.body, null, 2));
|
||||
```
|
||||
|
||||
##### 2. 使用 Winston 日志
|
||||
```javascript
|
||||
const logger = require('../utils/logger');
|
||||
|
||||
// 不同级别的日志
|
||||
logger.info('User logged in', { userId: user.id });
|
||||
logger.warn('Invalid input', { input: req.body });
|
||||
logger.error('Database error', { error: error.message });
|
||||
```
|
||||
|
||||
##### 3. 使用 Node.js 调试器
|
||||
```bash
|
||||
# 启动调试模式
|
||||
node --inspect-brk server.js
|
||||
|
||||
# 在 Chrome 中打开 chrome://inspect
|
||||
# 连接到 Node.js 进程进行调试
|
||||
```
|
||||
|
||||
##### 4. 数据库查询调试
|
||||
```javascript
|
||||
// 启用 Sequelize 日志
|
||||
const sequelize = new Sequelize(config, {
|
||||
logging: console.log, // 显示 SQL 查询
|
||||
benchmark: true // 显示查询时间
|
||||
});
|
||||
|
||||
// 手动执行 SQL 查询
|
||||
const [results, metadata] = await sequelize.query(
|
||||
'SELECT * FROM users WHERE id = ?',
|
||||
{ replacements: [userId] }
|
||||
);
|
||||
```
|
||||
|
||||
#### 前端调试
|
||||
|
||||
##### 1. 使用 Vue DevTools
|
||||
```bash
|
||||
# 安装 Vue DevTools 浏览器扩展
|
||||
# 查看组件状态、props、events
|
||||
# 检查 Pinia store 状态
|
||||
```
|
||||
|
||||
##### 2. 使用 console.log
|
||||
```javascript
|
||||
// 在组件中添加调试信息
|
||||
export default {
|
||||
setup() {
|
||||
const userData = ref(null);
|
||||
|
||||
const fetchUser = async () => {
|
||||
console.log('Fetching user data...');
|
||||
const response = await api.getUser();
|
||||
console.log('User response:', response);
|
||||
userData.value = response.data;
|
||||
};
|
||||
|
||||
return { userData, fetchUser };
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
##### 3. 使用浏览器开发者工具
|
||||
```javascript
|
||||
// 在代码中设置断点
|
||||
debugger;
|
||||
|
||||
// 查看网络请求
|
||||
// Network 标签页 -> 检查 API 请求和响应
|
||||
|
||||
// 查看控制台错误
|
||||
// Console 标签页 -> 查看 JavaScript 错误
|
||||
```
|
||||
|
||||
##### 4. API 调试
|
||||
```javascript
|
||||
// 创建 API 调试工具
|
||||
const apiDebug = {
|
||||
log: (method, url, data, response) => {
|
||||
console.group(`API ${method.toUpperCase()} ${url}`);
|
||||
console.log('Request data:', data);
|
||||
console.log('Response:', response);
|
||||
console.groupEnd();
|
||||
}
|
||||
};
|
||||
|
||||
// 在 API 调用中使用
|
||||
const response = await axios.post('/api/farms', farmData);
|
||||
apiDebug.log('POST', '/api/farms', farmData, response.data);
|
||||
```
|
||||
|
||||
### 性能优化
|
||||
|
||||
#### 后端性能优化
|
||||
|
||||
##### 1. 数据库查询优化
|
||||
```javascript
|
||||
// 使用索引
|
||||
// 在经常查询的字段上添加索引
|
||||
CREATE INDEX idx_farms_status ON farms(status);
|
||||
|
||||
// 避免 N+1 查询
|
||||
const farms = await Farm.findAll({
|
||||
include: [{
|
||||
model: Device,
|
||||
as: 'devices'
|
||||
}]
|
||||
});
|
||||
|
||||
// 使用分页
|
||||
const farms = await Farm.findAndCountAll({
|
||||
limit: 10,
|
||||
offset: (page - 1) * 10
|
||||
});
|
||||
|
||||
// 只查询需要的字段
|
||||
const farms = await Farm.findAll({
|
||||
attributes: ['id', 'name', 'status']
|
||||
});
|
||||
```
|
||||
|
||||
##### 2. 缓存策略
|
||||
```javascript
|
||||
// 使用内存缓存
|
||||
const cache = new Map();
|
||||
|
||||
const getCachedData = (key) => {
|
||||
if (cache.has(key)) {
|
||||
return cache.get(key);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
const setCachedData = (key, data, ttl = 300000) => {
|
||||
cache.set(key, data);
|
||||
setTimeout(() => cache.delete(key), ttl);
|
||||
};
|
||||
```
|
||||
|
||||
##### 3. 异步处理
|
||||
```javascript
|
||||
// 使用 Promise.all 并行处理
|
||||
const [farms, devices, users] = await Promise.all([
|
||||
Farm.findAll(),
|
||||
Device.findAll(),
|
||||
User.findAll()
|
||||
]);
|
||||
|
||||
// 使用 stream 处理大量数据
|
||||
const stream = Farm.findAll({ stream: true });
|
||||
stream.on('data', (farm) => {
|
||||
// 处理单个农场数据
|
||||
});
|
||||
```
|
||||
|
||||
#### 前端性能优化
|
||||
|
||||
##### 1. 组件懒加载
|
||||
```javascript
|
||||
// router/routes.js
|
||||
const routes = [
|
||||
{
|
||||
path: '/farms',
|
||||
component: () => import('../views/Farms.vue') // 懒加载
|
||||
}
|
||||
];
|
||||
```
|
||||
|
||||
##### 2. 图片优化
|
||||
```vue
|
||||
<template>
|
||||
<!-- 图片懒加载 -->
|
||||
<img v-lazy="imageUrl" alt="Farm image">
|
||||
|
||||
<!-- 响应式图片 -->
|
||||
<picture>
|
||||
<source media="(min-width: 800px)" :srcset="largeImage">
|
||||
<img :src="smallImage" alt="Farm">
|
||||
</picture>
|
||||
</template>
|
||||
```
|
||||
|
||||
##### 3. 虚拟滚动
|
||||
```vue
|
||||
<template>
|
||||
<!-- 大列表虚拟滚动 -->
|
||||
<virtual-scroll
|
||||
:items="farms"
|
||||
:item-height="60"
|
||||
#default="{ item }"
|
||||
>
|
||||
<farm-item :farm="item" />
|
||||
</virtual-scroll>
|
||||
</template>
|
||||
```
|
||||
|
||||
### 测试指南
|
||||
|
||||
#### 单元测试
|
||||
|
||||
##### 后端单元测试 (Jest)
|
||||
```javascript
|
||||
// tests/controllers/farmController.test.js
|
||||
const { getFarms } = require('../../controllers/farmController');
|
||||
const { Farm } = require('../../models');
|
||||
|
||||
jest.mock('../../models');
|
||||
|
||||
describe('Farm Controller', () => {
|
||||
describe('getFarms', () => {
|
||||
it('should return farms list', async () => {
|
||||
const mockFarms = [
|
||||
{ id: 1, name: 'Farm 1' },
|
||||
{ id: 2, name: 'Farm 2' }
|
||||
];
|
||||
|
||||
Farm.findAll.mockResolvedValue(mockFarms);
|
||||
|
||||
const req = { query: {} };
|
||||
const res = {
|
||||
json: jest.fn(),
|
||||
status: jest.fn().mockReturnThis()
|
||||
};
|
||||
|
||||
await getFarms(req, res);
|
||||
|
||||
expect(res.json).toHaveBeenCalledWith({
|
||||
success: true,
|
||||
data: mockFarms,
|
||||
message: '获取成功'
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
##### 前端单元测试 (Vitest)
|
||||
```javascript
|
||||
// tests/components/FarmList.test.js
|
||||
import { mount } from '@vue/test-utils';
|
||||
import FarmList from '@/components/FarmList.vue';
|
||||
|
||||
describe('FarmList', () => {
|
||||
it('renders farm list correctly', () => {
|
||||
const farms = [
|
||||
{ id: 1, name: 'Farm 1', status: 'active' },
|
||||
{ id: 2, name: 'Farm 2', status: 'inactive' }
|
||||
];
|
||||
|
||||
const wrapper = mount(FarmList, {
|
||||
props: { farms }
|
||||
});
|
||||
|
||||
expect(wrapper.findAll('.farm-item')).toHaveLength(2);
|
||||
expect(wrapper.text()).toContain('Farm 1');
|
||||
expect(wrapper.text()).toContain('Farm 2');
|
||||
});
|
||||
|
||||
it('emits select event when farm is clicked', async () => {
|
||||
const farms = [{ id: 1, name: 'Farm 1', status: 'active' }];
|
||||
|
||||
const wrapper = mount(FarmList, {
|
||||
props: { farms }
|
||||
});
|
||||
|
||||
await wrapper.find('.farm-item').trigger('click');
|
||||
|
||||
expect(wrapper.emitted('select')).toBeTruthy();
|
||||
expect(wrapper.emitted('select')[0]).toEqual([farms[0]]);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
#### 集成测试
|
||||
```javascript
|
||||
// tests/integration/farms.test.js
|
||||
const request = require('supertest');
|
||||
const app = require('../../server');
|
||||
|
||||
describe('Farms API', () => {
|
||||
it('GET /api/farms should return farms list', async () => {
|
||||
const response = await request(app)
|
||||
.get('/api/farms')
|
||||
.set('Authorization', 'Bearer valid_token')
|
||||
.expect(200);
|
||||
|
||||
expect(response.body.success).toBe(true);
|
||||
expect(Array.isArray(response.body.data)).toBe(true);
|
||||
});
|
||||
|
||||
it('POST /api/farms should create new farm', async () => {
|
||||
const farmData = {
|
||||
name: 'Test Farm',
|
||||
type: 'cattle',
|
||||
longitude: 106.26667,
|
||||
latitude: 38.46667
|
||||
};
|
||||
|
||||
const response = await request(app)
|
||||
.post('/api/farms')
|
||||
.set('Authorization', 'Bearer admin_token')
|
||||
.send(farmData)
|
||||
.expect(201);
|
||||
|
||||
expect(response.body.success).toBe(true);
|
||||
expect(response.body.data.name).toBe(farmData.name);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 部署和运维
|
||||
|
||||
#### 本地开发部署
|
||||
```bash
|
||||
# 1. 启动所有服务
|
||||
npm run dev:all
|
||||
|
||||
# 2. 查看日志
|
||||
tail -f backend/logs/app.log
|
||||
|
||||
# 3. 数据库管理
|
||||
npm run db:migrate
|
||||
npm run db:seed
|
||||
```
|
||||
|
||||
#### 生产环境部署
|
||||
```bash
|
||||
# 1. 构建项目
|
||||
npm run build
|
||||
|
||||
# 2. 使用 PM2 部署
|
||||
pm2 start ecosystem.config.js --env production
|
||||
|
||||
# 3. 监控服务
|
||||
pm2 monit
|
||||
pm2 logs
|
||||
```
|
||||
|
||||
## 常见问题解决
|
||||
|
||||
### 开发环境问题
|
||||
|
||||
#### 1. 端口占用
|
||||
```bash
|
||||
# 查找占用端口的进程
|
||||
lsof -i :5350
|
||||
netstat -ano | findstr :5350 # Windows
|
||||
|
||||
# 杀死进程
|
||||
kill -9 <PID>
|
||||
taskkill /PID <PID> /F # Windows
|
||||
```
|
||||
|
||||
#### 2. 依赖安装失败
|
||||
```bash
|
||||
# 清除 npm 缓存
|
||||
npm cache clean --force
|
||||
|
||||
# 删除 node_modules 重新安装
|
||||
rm -rf node_modules package-lock.json
|
||||
npm install
|
||||
|
||||
# 使用 yarn 代替 npm
|
||||
yarn install
|
||||
```
|
||||
|
||||
#### 3. 数据库连接失败
|
||||
```bash
|
||||
# 检查 MySQL 服务状态
|
||||
brew services list | grep mysql # macOS
|
||||
systemctl status mysql # Linux
|
||||
net start mysql # Windows
|
||||
|
||||
# 测试数据库连接
|
||||
mysql -u root -p -h localhost -P 3306
|
||||
```
|
||||
|
||||
### 运行时问题
|
||||
|
||||
#### 1. API 请求失败
|
||||
```javascript
|
||||
// 检查网络请求
|
||||
// 1. 打开浏览器开发者工具
|
||||
// 2. 查看 Network 标签页
|
||||
// 3. 检查请求状态码和响应内容
|
||||
|
||||
// 添加请求拦截器
|
||||
axios.interceptors.request.use(
|
||||
config => {
|
||||
console.log('Request:', config);
|
||||
return config;
|
||||
},
|
||||
error => {
|
||||
console.error('Request Error:', error);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
```
|
||||
|
||||
#### 2. 组件渲染问题
|
||||
```javascript
|
||||
// 检查 Vue 组件状态
|
||||
// 1. 安装 Vue DevTools
|
||||
// 2. 检查组件 props 和 data
|
||||
// 3. 查看 computed 属性
|
||||
// 4. 检查事件监听器
|
||||
```
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 代码组织
|
||||
1. **模块化开发**: 将功能拆分成独立的模块
|
||||
2. **组件复用**: 创建可复用的组件库
|
||||
3. **状态管理**: 合理使用 Pinia 管理应用状态
|
||||
4. **错误处理**: 统一的错误处理机制
|
||||
5. **日志记录**: 详细的日志记录便于调试
|
||||
|
||||
### 性能优化
|
||||
1. **懒加载**: 组件和路由懒加载
|
||||
2. **缓存策略**: 合理使用缓存提升性能
|
||||
3. **数据库优化**: 优化查询语句和索引
|
||||
4. **图片优化**: 压缩图片和使用适当格式
|
||||
5. **打包优化**: 优化 Webpack/Vite 配置
|
||||
|
||||
### 安全考虑
|
||||
1. **输入验证**: 严格验证用户输入
|
||||
2. **权限控制**: 实现细粒度的权限控制
|
||||
3. **SQL注入防护**: 使用参数化查询
|
||||
4. **XSS防护**: 过滤和转义用户输入
|
||||
5. **CSRF防护**: 实现 CSRF Token 机制
|
||||
|
||||
## 工具和资源
|
||||
|
||||
### 开发工具
|
||||
- **IDE**: VSCode
|
||||
- **API测试**: Postman
|
||||
- **数据库**: MySQL Workbench
|
||||
- **版本控制**: Git
|
||||
- **包管理**: npm/yarn
|
||||
|
||||
### 有用的 VSCode 插件
|
||||
- **Vue Language Features (Volar)**: Vue 3 支持
|
||||
- **ESLint**: 代码质量检查
|
||||
- **Prettier**: 代码格式化
|
||||
- **Auto Rename Tag**: 自动重命名标签
|
||||
- **Bracket Pair Colorizer**: 括号高亮
|
||||
- **GitLens**: Git 增强
|
||||
|
||||
### 学习资源
|
||||
- **Vue.js 官方文档**: https://vuejs.org/
|
||||
- **Node.js 官方文档**: https://nodejs.org/
|
||||
- **Sequelize 文档**: https://sequelize.org/
|
||||
- **Ant Design Vue**: https://antdv.com/
|
||||
- **ECharts 文档**: https://echarts.apache.org/
|
||||
|
||||
---
|
||||
|
||||
## 联系支持
|
||||
|
||||
如有开发相关问题,请联系:
|
||||
- **技术支持**: dev-support@nxxmdata.com
|
||||
- **文档反馈**: docs@nxxmdata.com
|
||||
- **Bug 报告**: bugs@nxxmdata.com
|
||||
|
||||
*最后更新: 2025年1月*
|
||||
115
docs/README.md
115
docs/README.md
@@ -1,19 +1,104 @@
|
||||
# 项目文档目录说明
|
||||
# 宁夏智慧养殖监管平台文档中心
|
||||
|
||||
本文档说明了项目中docs目录的结构和内容。
|
||||
## 文档概述
|
||||
|
||||
## 目录结构
|
||||
本文档中心包含了宁夏智慧养殖监管平台的完整技术文档,涵盖产品需求、系统架构、开发指南、部署运维等各个方面。
|
||||
|
||||
- `config/` - 存放项目的所有配置文档,包括:
|
||||
- 产品需求文档 (PRD.md)
|
||||
- 系统架构文档 (arch.md)
|
||||
- 系统设计文档 (design.md)
|
||||
- 开发计划文档 (dev-plan.md)
|
||||
- 任务文档 (task.md)
|
||||
- 数据同步修复报告 (data-sync-fix-report.md)
|
||||
- 农场数据导入摘要 (farms-data-import-summary.md)
|
||||
- 位置数据验证报告 (location-data-validation-report.md)
|
||||
## 2. 文档结构
|
||||
|
||||
- 其他技术文档
|
||||
- 百度地图许可说明 (baidu-map-license.md)
|
||||
- 性能监控说明 (performance-monitoring.md)
|
||||
### 2.1 需求文档 (requirements/)
|
||||
- **PRD.md** - 核心产品需求文档
|
||||
- **政府端产品需求文档.md** - 政府监管端功能需求
|
||||
- **保险端产品需求文档.md** - 保险理赔端功能需求
|
||||
- **银行端小程序产品需求文档.md** - 银行贷款端小程序需求
|
||||
- **official-website-prd.md** - 官方网站产品需求
|
||||
|
||||
### 2.2 系统架构 (architecture/)
|
||||
- **系统架构文档.md** - 整体架构设计、技术选型、部署方案
|
||||
- **系统详细设计文档.md** - 详细的系统设计和技术实现方案
|
||||
- **数据库设计文档.md** - 数据模型、表结构、关系设计
|
||||
- **开发计划.md** - 项目开发计划、里程碑、资源配置
|
||||
- **设计文档.md** - UI/UX设计规范、交互设计
|
||||
|
||||
### 2.3 开发文档 (development/)
|
||||
- **开发指南.md** - 环境搭建、开发规范、调试技巧
|
||||
- **API接口文档.md** - 接口定义、参数说明、示例代码
|
||||
- **代码规范.md** - 编码标准、命名规范、最佳实践
|
||||
- **测试文档.md** - 测试策略、工具配置、用例设计
|
||||
- **环境配置文档.md** - 开发、测试、生产环境配置指南
|
||||
- **CONTRIBUTING.md** - 项目贡献指南、开发流程
|
||||
- **examples/** - 配置文件示例、代码模板
|
||||
|
||||
### 2.4 运维文档 (operations/)
|
||||
- **部署文档.md** - 环境部署、配置管理、容器化部署
|
||||
- **监控运维文档.md** - 系统监控、性能优化、故障处理
|
||||
- **SECURITY.md** - 安全指南、漏洞报告、安全配置
|
||||
- **TROUBLESHOOTING.md** - 常见问题、故障排除、解决方案
|
||||
- **performance-monitoring.md** - 性能监控配置和分析
|
||||
- **data-sync-fix-report.md** - 数据同步问题修复报告
|
||||
- **farms-data-import-summary.md** - 养殖场数据导入总结
|
||||
- **location-data-validation-report.md** - 位置数据验证报告
|
||||
|
||||
### 2.5 项目管理 (project/)
|
||||
- **项目管理文档.md** - 项目组织架构、计划管理、风险控制
|
||||
- **开发计划文档.md** - 项目规划、里程碑、时间安排
|
||||
- **任务文档.md** - 任务分解、进度跟踪、问题记录
|
||||
- **变更日志.md** - 版本更新、功能变更、问题修复
|
||||
- **baidu-map-license.md** - 百度地图许可证信息
|
||||
- **FINAL_STRUCTURE_REPORT.md** - 项目结构最终报告
|
||||
- **PROJECT_CLEANUP_REPORT.md** - 项目清理报告
|
||||
|
||||
## 文档维护
|
||||
|
||||
### 版本管理
|
||||
- 所有文档都有版本历史记录
|
||||
- 重要变更会在CHANGELOG.md中记录
|
||||
- 文档与代码版本保持同步
|
||||
|
||||
### 更新规范
|
||||
1. **文档更新**: 功能变更时同步更新相关文档
|
||||
2. **版本标记**: 每次更新都要更新版本号和修改日期
|
||||
3. **审核流程**: 重要文档变更需要团队审核
|
||||
4. **格式统一**: 遵循Markdown格式规范
|
||||
|
||||
### 贡献指南
|
||||
- 参考 [贡献指南](./CONTRIBUTING.md) 了解如何参与文档维护
|
||||
- 提交文档变更前请先阅读相关规范
|
||||
- 鼓励团队成员积极完善文档内容
|
||||
|
||||
## 快速导航
|
||||
|
||||
### 新手入门
|
||||
1. 阅读 [产品需求文档](./requirements/PRD.md) 了解项目背景
|
||||
2. 查看 [系统架构文档](./architecture/系统架构文档.md) 理解技术架构
|
||||
3. 按照 [开发指南](./development/开发指南.md) 配置开发环境
|
||||
4. 参考 [API接口文档](./development/API接口文档.md) 进行接口开发
|
||||
|
||||
### 部署上线
|
||||
1. 阅读 [部署文档](./operations/部署文档.md) 了解部署流程
|
||||
2. 参考 [安全配置](./operations/SECURITY.md) 进行安全设置
|
||||
3. 遇到问题查看 [故障排除](./operations/TROUBLESHOOTING.md)
|
||||
|
||||
### 多端开发
|
||||
1. 根据目标端选择对应的需求文档
|
||||
2. 查看 [代码规范](./development/代码规范.md)
|
||||
3. 参考 [贡献指南](./development/CONTRIBUTING.md) 了解开发流程
|
||||
|
||||
## 联系我们
|
||||
|
||||
### 技术支持
|
||||
- **邮箱**: tech-support@nxxmdata.com
|
||||
- **电话**: 400-xxx-xxxx
|
||||
- **工作时间**: 周一至周五 9:00-18:00
|
||||
|
||||
### 文档反馈
|
||||
如果您发现文档中的错误或有改进建议,请通过以下方式联系我们:
|
||||
- 提交 Issue 到项目仓库
|
||||
- 发送邮件到 docs@nxxmdata.com
|
||||
- 直接提交 Pull Request
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2024年1月20日
|
||||
**文档版本**: v2.0
|
||||
**维护团队**: 宁夏智慧养殖平台开发团队
|
||||
287
docs/architecture/开发计划.md
Normal file
287
docs/architecture/开发计划.md
Normal file
@@ -0,0 +1,287 @@
|
||||
# 宁夏智慧养殖监管平台开发计划
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| v1.0 | 2025-01-19 | 初始版本 | 系统架构师 |
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
### 1.1 项目背景
|
||||
宁夏智慧养殖监管平台是一个综合性的数字化养殖监管系统,旨在通过现代信息技术提升养殖业的管理水平和监管效率。
|
||||
|
||||
### 1.2 开发目标
|
||||
- 构建完整的智慧养殖监管平台
|
||||
- 实现多端应用协同工作
|
||||
- 确保系统稳定性和可扩展性
|
||||
- 提供优质的用户体验
|
||||
|
||||
## 2. 项目范围
|
||||
|
||||
### 2.1 核心模块
|
||||
- **后端服务** (backend/)
|
||||
- **管理后台** (admin-system/)
|
||||
- **官方网站** (website/)
|
||||
- **小程序矩阵** (mini-app/)
|
||||
|
||||
### 2.2 支撑模块
|
||||
- 数据库设计与实现
|
||||
- API接口开发
|
||||
- 用户权限管理
|
||||
- 数据分析与报表
|
||||
|
||||
## 3. 开发阶段规划
|
||||
|
||||
### 3.1 第一阶段:基础架构搭建 (4周)
|
||||
|
||||
#### 3.1.1 后端基础服务 (2周)
|
||||
**任务分解:**
|
||||
- [ ] 项目初始化和环境配置 (2人日)
|
||||
- [ ] 数据库设计和建表 (3人日)
|
||||
- [ ] 基础框架搭建 (Express + Sequelize) (2人日)
|
||||
- [ ] 用户认证和权限管理 (3人日)
|
||||
- [ ] 基础API接口开发 (4人日)
|
||||
|
||||
**工时估算:** 14人日
|
||||
**负责人员:** 后端开发工程师 2人
|
||||
**里程碑:** 基础API服务可用
|
||||
|
||||
#### 3.1.2 前端基础框架 (2周)
|
||||
**任务分解:**
|
||||
- [ ] 管理后台项目初始化 (1人日)
|
||||
- [ ] 官网项目初始化 (1人日)
|
||||
- [ ] UI组件库集成和配置 (2人日)
|
||||
- [ ] 路由和状态管理配置 (2人日)
|
||||
- [ ] 基础页面布局开发 (4人日)
|
||||
- [ ] 登录和权限验证 (4人日)
|
||||
|
||||
**工时估算:** 14人日
|
||||
**负责人员:** 前端开发工程师 2人
|
||||
**里程碑:** 前端基础框架完成
|
||||
|
||||
### 3.2 第二阶段:核心功能开发 (8周)
|
||||
|
||||
#### 3.2.1 用户管理模块 (2周)
|
||||
**任务分解:**
|
||||
- [ ] 用户注册和登录API (2人日)
|
||||
- [ ] 用户信息管理API (2人日)
|
||||
- [ ] 角色权限管理API (3人日)
|
||||
- [ ] 前端用户管理界面 (4人日)
|
||||
- [ ] 权限控制组件开发 (3人日)
|
||||
|
||||
**工时估算:** 14人日
|
||||
**负责人员:** 全栈开发工程师 2人
|
||||
|
||||
#### 3.2.2 养殖场管理模块 (3周)
|
||||
**任务分解:**
|
||||
- [ ] 养殖场信息管理API (3人日)
|
||||
- [ ] 养殖场地理位置服务 (2人日)
|
||||
- [ ] 养殖场档案管理 (3人日)
|
||||
- [ ] 前端养殖场管理界面 (5人日)
|
||||
- [ ] 地图展示和交互功能 (4人日)
|
||||
- [ ] 数据导入导出功能 (4人日)
|
||||
|
||||
**工时估算:** 21人日
|
||||
**负责人员:** 全栈开发工程师 2人
|
||||
|
||||
#### 3.2.3 监控数据模块 (3周)
|
||||
**任务分解:**
|
||||
- [ ] 环境监控数据API (3人日)
|
||||
- [ ] 实时数据处理服务 (4人日)
|
||||
- [ ] 数据存储和查询优化 (3人日)
|
||||
- [ ] 前端数据展示界面 (4人日)
|
||||
- [ ] 图表和可视化组件 (4人日)
|
||||
- [ ] 报警和通知功能 (3人日)
|
||||
|
||||
**工时估算:** 21人日
|
||||
**负责人员:** 全栈开发工程师 2人
|
||||
|
||||
### 3.3 第三阶段:小程序开发 (4周)
|
||||
|
||||
#### 3.3.1 政府端小程序 (1.5周)
|
||||
**任务分解:**
|
||||
- [ ] 小程序项目初始化 (1人日)
|
||||
- [ ] 监管数据查看功能 (3人日)
|
||||
- [ ] 养殖场信息查询 (2人日)
|
||||
- [ ] 数据统计和报表 (3人日)
|
||||
- [ ] 消息通知功能 (1人日)
|
||||
|
||||
**工时估算:** 10人日
|
||||
**负责人员:** 小程序开发工程师 1人
|
||||
|
||||
#### 3.3.2 保险端小程序 (1.5周)
|
||||
**任务分解:**
|
||||
- [ ] 小程序项目初始化 (1人日)
|
||||
- [ ] 保险业务管理 (3人日)
|
||||
- [ ] 理赔数据查看 (2人日)
|
||||
- [ ] 风险评估功能 (3人日)
|
||||
- [ ] 业务流程管理 (1人日)
|
||||
|
||||
**工时估算:** 10人日
|
||||
**负责人员:** 小程序开发工程师 1人
|
||||
|
||||
#### 3.3.3 银行端小程序 (1周)
|
||||
**任务分解:**
|
||||
- [ ] 小程序项目初始化 (1人日)
|
||||
- [ ] 贷款业务管理 (2人日)
|
||||
- [ ] 客户信息查看 (2人日)
|
||||
- [ ] 风险控制功能 (2人日)
|
||||
- [ ] 业务审批流程 (1人日)
|
||||
|
||||
**工时估算:** 8人日
|
||||
**负责人员:** 小程序开发工程师 1人
|
||||
|
||||
### 3.4 第四阶段:系统集成和测试 (3周)
|
||||
|
||||
#### 3.4.1 系统集成 (1周)
|
||||
**任务分解:**
|
||||
- [ ] 各模块接口联调 (2人日)
|
||||
- [ ] 数据一致性验证 (2人日)
|
||||
- [ ] 性能优化 (3人日)
|
||||
|
||||
**工时估算:** 7人日
|
||||
**负责人员:** 全栈开发工程师 2人
|
||||
|
||||
#### 3.4.2 测试阶段 (2周)
|
||||
**任务分解:**
|
||||
- [ ] 单元测试编写 (3人日)
|
||||
- [ ] 集成测试执行 (3人日)
|
||||
- [ ] 用户验收测试 (4人日)
|
||||
- [ ] 性能测试 (2人日)
|
||||
- [ ] 安全测试 (2人日)
|
||||
|
||||
**工时估算:** 14人日
|
||||
**负责人员:** 测试工程师 2人
|
||||
|
||||
### 3.5 第五阶段:部署上线 (2周)
|
||||
|
||||
#### 3.5.1 生产环境部署 (1周)
|
||||
**任务分解:**
|
||||
- [ ] 生产环境配置 (2人日)
|
||||
- [ ] 数据库迁移 (1人日)
|
||||
- [ ] 应用部署和配置 (2人日)
|
||||
- [ ] 域名和SSL证书配置 (1人日)
|
||||
- [ ] 监控和日志配置 (1人日)
|
||||
|
||||
**工时估算:** 7人日
|
||||
**负责人员:** 运维工程师 1人
|
||||
|
||||
#### 3.5.2 上线验证 (1周)
|
||||
**任务分解:**
|
||||
- [ ] 生产环境功能验证 (2人日)
|
||||
- [ ] 性能监控和调优 (2人日)
|
||||
- [ ] 用户培训和文档 (2人日)
|
||||
- [ ] 问题修复和优化 (1人日)
|
||||
|
||||
**工时估算:** 7人日
|
||||
**负责人员:** 全栈开发工程师 2人
|
||||
|
||||
## 4. 资源配置
|
||||
|
||||
### 4.1 人员配置
|
||||
- **项目经理**: 1人,负责项目整体协调和进度管理
|
||||
- **系统架构师**: 1人,负责技术架构设计和技术决策
|
||||
- **后端开发工程师**: 2人,负责后端服务开发
|
||||
- **前端开发工程师**: 2人,负责管理后台和官网开发
|
||||
- **小程序开发工程师**: 1人,负责小程序矩阵开发
|
||||
- **测试工程师**: 2人,负责测试用例设计和执行
|
||||
- **运维工程师**: 1人,负责部署和运维工作
|
||||
|
||||
### 4.2 技术资源
|
||||
- **开发环境**: 本地开发环境 + 测试服务器
|
||||
- **生产环境**: 云服务器 + 数据库 + CDN
|
||||
- **第三方服务**: 百度地图API、短信服务、支付服务
|
||||
|
||||
## 5. 风险管理
|
||||
|
||||
### 5.1 技术风险
|
||||
- **风险**: 第三方API服务不稳定
|
||||
- **应对**: 准备备用方案,实现服务降级
|
||||
- **风险**: 数据库性能瓶颈
|
||||
- **应对**: 提前进行性能测试,优化查询和索引
|
||||
|
||||
### 5.2 进度风险
|
||||
- **风险**: 需求变更导致延期
|
||||
- **应对**: 严格控制需求变更,建立变更评估流程
|
||||
- **风险**: 人员流动影响进度
|
||||
- **应对**: 做好知识传承,建立备用人员计划
|
||||
|
||||
### 5.3 质量风险
|
||||
- **风险**: 测试不充分导致线上问题
|
||||
- **应对**: 建立完善的测试体系,增加自动化测试
|
||||
- **风险**: 安全漏洞
|
||||
- **应对**: 进行安全评估,建立安全开发规范
|
||||
|
||||
## 6. 质量保证
|
||||
|
||||
### 6.1 代码质量
|
||||
- 建立代码审查机制
|
||||
- 使用ESLint和Prettier统一代码风格
|
||||
- 编写单元测试,确保代码覆盖率
|
||||
|
||||
### 6.2 文档质量
|
||||
- 维护完整的API文档
|
||||
- 编写用户使用手册
|
||||
- 建立技术文档更新机制
|
||||
|
||||
### 6.3 测试质量
|
||||
- 制定详细的测试计划
|
||||
- 执行多层次测试(单元、集成、系统、验收)
|
||||
- 建立缺陷跟踪和修复流程
|
||||
|
||||
## 7. 项目里程碑
|
||||
|
||||
| 里程碑 | 计划完成时间 | 交付物 |
|
||||
|--------|--------------|--------|
|
||||
| 基础架构完成 | 第4周 | 后端API框架、前端基础框架 |
|
||||
| 核心功能完成 | 第12周 | 用户管理、养殖场管理、监控数据模块 |
|
||||
| 小程序开发完成 | 第16周 | 三端小程序应用 |
|
||||
| 系统测试完成 | 第19周 | 测试报告、缺陷修复 |
|
||||
| 生产上线 | 第21周 | 生产环境部署、用户培训 |
|
||||
|
||||
## 8. 沟通计划
|
||||
|
||||
### 8.1 定期会议
|
||||
- **日常站会**: 每日上午9:00,15分钟
|
||||
- **周例会**: 每周五下午,1小时
|
||||
- **月度评审**: 每月最后一周,2小时
|
||||
|
||||
### 8.2 报告机制
|
||||
- **日报**: 开发人员每日提交工作进展
|
||||
- **周报**: 项目经理每周汇总项目状态
|
||||
- **月报**: 向管理层汇报项目整体进展
|
||||
|
||||
## 9. 成功标准
|
||||
|
||||
### 9.1 功能标准
|
||||
- 所有核心功能按需求实现
|
||||
- 系统性能满足预期指标
|
||||
- 用户体验良好
|
||||
|
||||
### 9.2 质量标准
|
||||
- 代码覆盖率达到80%以上
|
||||
- 系统可用性达到99.5%以上
|
||||
- 安全测试通过
|
||||
|
||||
### 9.3 交付标准
|
||||
- 按时完成项目交付
|
||||
- 预算控制在计划范围内
|
||||
- 用户满意度达到85%以上
|
||||
|
||||
## 10. 后续维护
|
||||
|
||||
### 10.1 维护计划
|
||||
- 建立7x24小时监控体系
|
||||
- 制定应急响应预案
|
||||
- 定期进行系统优化和升级
|
||||
|
||||
### 10.2 迭代计划
|
||||
- 根据用户反馈持续优化功能
|
||||
- 定期发布新版本
|
||||
- 扩展新的业务模块
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 本文档将根据项目进展情况定期更新
|
||||
**联系方式**: 如有疑问,请联系项目经理或系统架构师
|
||||
592
docs/architecture/数据库设计文档.md
Normal file
592
docs/architecture/数据库设计文档.md
Normal file
@@ -0,0 +1,592 @@
|
||||
# 宁夏智慧养殖监管平台 数据库设计文档
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 作者 | 描述 |
|
||||
|------|------|------|------|
|
||||
| v1.0 | 2025-01-19 | 开发团队 | 初始版本,完整数据库设计 |
|
||||
|
||||
## 1. 数据库概述
|
||||
|
||||
### 1.1 设计原则
|
||||
|
||||
**数据完整性原则:**
|
||||
- 实体完整性:每个表都有主键
|
||||
- 参照完整性:外键约束确保数据一致性
|
||||
- 域完整性:字段类型和约束确保数据有效性
|
||||
|
||||
**性能优化原则:**
|
||||
- 合理的索引设计
|
||||
- 分区表设计(大数据量表)
|
||||
- 查询优化友好的表结构
|
||||
|
||||
**扩展性原则:**
|
||||
- 预留扩展字段
|
||||
- 模块化表设计
|
||||
- 支持水平和垂直扩展
|
||||
|
||||
### 1.2 技术规范
|
||||
|
||||
**数据库引擎:** MySQL 8.0+
|
||||
**字符集:** utf8mb4
|
||||
**排序规则:** utf8mb4_unicode_ci
|
||||
**存储引擎:** InnoDB
|
||||
**事务支持:** ACID 完整性
|
||||
|
||||
## 2. 数据库架构设计
|
||||
|
||||
### 2.1 逻辑架构
|
||||
|
||||
```
|
||||
宁夏智慧养殖监管平台数据库
|
||||
├── 用户权限模块
|
||||
│ ├── users (用户表)
|
||||
│ ├── roles (角色表)
|
||||
│ ├── permissions (权限表)
|
||||
│ ├── role_permissions (角色权限关联表)
|
||||
│ └── menu_permissions (菜单权限表)
|
||||
├── 养殖场管理模块
|
||||
│ ├── farms (养殖场表)
|
||||
│ ├── animals (动物信息表)
|
||||
│ ├── iot_cattle (物联网牛只表)
|
||||
│ ├── cattle_types (牛只品种表)
|
||||
│ └── cattle_users (牛只用户表)
|
||||
├── 设备管理模块
|
||||
│ ├── devices (设备表)
|
||||
│ ├── sensor_data (传感器数据表)
|
||||
│ ├── iot_xq_clients (物联网客户端表)
|
||||
│ ├── iot_jbq_servers (物联网服务器表)
|
||||
│ └── iot_jbq_clients (物联网客户端表)
|
||||
├── 圈舍管理模块
|
||||
│ ├── pens (圈舍表)
|
||||
│ ├── cattle_pens (牛只圈舍表)
|
||||
│ ├── cattle_batches (牛只批次表)
|
||||
│ └── cattle_batch_animals (批次动物关联表)
|
||||
├── 电子围栏模块
|
||||
│ ├── electronic_fences (电子围栏表)
|
||||
│ └── electronic_fence_points (围栏点表)
|
||||
├── 业务记录模块
|
||||
│ ├── cattle_transfer_records (牛只转移记录表)
|
||||
│ ├── cattle_exit_records (牛只出场记录表)
|
||||
│ ├── alerts (预警表)
|
||||
│ └── operation_logs (操作日志表)
|
||||
├── 商城模块
|
||||
│ ├── products (产品表)
|
||||
│ ├── orders (订单表)
|
||||
│ └── order_items (订单项表)
|
||||
└── 系统配置模块
|
||||
├── system_configs (系统配置表)
|
||||
└── form_logs (表单日志表)
|
||||
```
|
||||
|
||||
### 2.2 物理架构
|
||||
|
||||
**主从复制架构:**
|
||||
- 主库:负责写操作和实时查询
|
||||
- 从库:负责读操作和数据备份
|
||||
- 读写分离:提高系统并发能力
|
||||
|
||||
**分库分表策略:**
|
||||
- 按业务模块分库
|
||||
- 大数据量表按时间分表(如传感器数据表)
|
||||
- 按养殖场ID分表(如动物信息表)
|
||||
|
||||
## 3. 核心数据表设计
|
||||
|
||||
### 3.1 用户权限模块
|
||||
|
||||
#### 3.1.1 用户表 (users)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 用户ID(主键)|
|
||||
| username | VARCHAR | 50 | NO | - | 用户名(唯一)|
|
||||
| email | VARCHAR | 100 | NO | - | 邮箱(唯一)|
|
||||
| password | VARCHAR | 255 | NO | - | 密码(加密存储)|
|
||||
| phone | VARCHAR | 20 | YES | NULL | 手机号 |
|
||||
| avatar | VARCHAR | 255 | YES | NULL | 头像URL |
|
||||
| roles | INT | - | YES | 2 | 角色ID(外键)|
|
||||
| status | ENUM | - | NO | 'active' | 状态:active/inactive/suspended |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
**索引设计:**
|
||||
```sql
|
||||
PRIMARY KEY (id)
|
||||
UNIQUE KEY uk_username (username)
|
||||
UNIQUE KEY uk_email (email)
|
||||
INDEX idx_roles (roles)
|
||||
INDEX idx_status (status)
|
||||
```
|
||||
|
||||
#### 3.1.2 角色表 (roles)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 角色ID(主键)|
|
||||
| name | VARCHAR | 50 | NO | - | 角色名称(唯一)|
|
||||
| description | TEXT | - | YES | NULL | 角色描述 |
|
||||
| status | ENUM | - | NO | 'active' | 状态:active/inactive |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
### 3.2 养殖场管理模块
|
||||
|
||||
#### 3.2.1 养殖场表 (farms)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 养殖场ID(主键)|
|
||||
| name | VARCHAR | 100 | NO | - | 养殖场名称 |
|
||||
| type | VARCHAR | 50 | NO | - | 养殖场类型 |
|
||||
| location | JSON | - | NO | {} | 地理位置(经纬度)|
|
||||
| address | VARCHAR | 255 | YES | NULL | 详细地址 |
|
||||
| contact | VARCHAR | 50 | YES | NULL | 联系人 |
|
||||
| phone | VARCHAR | 20 | YES | NULL | 联系电话 |
|
||||
| status | ENUM | - | NO | 'active' | 状态:active/inactive/maintenance |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
**索引设计:**
|
||||
```sql
|
||||
PRIMARY KEY (id)
|
||||
INDEX idx_name (name)
|
||||
INDEX idx_type (type)
|
||||
INDEX idx_status (status)
|
||||
```
|
||||
|
||||
#### 3.2.2 动物信息表 (animals)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | BIGINT | - | NO | AUTO_INCREMENT | 动物ID(主键)|
|
||||
| collar_number | VARCHAR | 50 | NO | - | 项圈编号 |
|
||||
| ear_tag | VARCHAR | 50 | YES | NULL | 动物耳号 |
|
||||
| animal_type | INT | - | NO | 1 | 动物类型:1-牛,2-羊,3-猪,4-马 |
|
||||
| breed | INT | - | NO | 1 | 品种ID |
|
||||
| category | INT | - | NO | 1 | 品类:1-乳肉兼用,2-肉用,3-乳用,4-种用 |
|
||||
| source_type | INT | - | NO | 1 | 来源类型:1-合作社,2-农户,3-养殖场,4-进口 |
|
||||
| birth_date | DATE | - | YES | NULL | 出生日期 |
|
||||
| birth_weight | DECIMAL | 10,2 | YES | 0.00 | 出生体重 |
|
||||
| weaning_weight | DECIMAL | 10,2 | YES | 0.00 | 断奶体重 |
|
||||
| weaning_age | INT | - | YES | 0 | 断奶日龄 |
|
||||
| entry_date | DATE | - | YES | NULL | 入场日期 |
|
||||
| calving_count | INT | - | YES | 0 | 历史已产胎次 |
|
||||
| left_teat_count | INT | - | YES | NULL | 乳头数(左) |
|
||||
| right_teat_count | INT | - | YES | NULL | 乳头数(右) |
|
||||
| farm_id | INT | - | YES | NULL | 农场ID(外键)|
|
||||
| pen_id | INT | - | YES | NULL | 圈舍ID(外键)|
|
||||
| status | INT | - | NO | 1 | 状态:1-正常,2-生病,3-死亡 |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
**索引设计:**
|
||||
```sql
|
||||
PRIMARY KEY (id)
|
||||
INDEX idx_collar_number (collar_number)
|
||||
INDEX idx_ear_tag (ear_tag)
|
||||
INDEX idx_farm_id (farm_id)
|
||||
INDEX idx_pen_id (pen_id)
|
||||
INDEX idx_animal_type (animal_type)
|
||||
INDEX idx_status (status)
|
||||
```
|
||||
|
||||
#### 3.2.3 物联网牛只表 (iot_cattle)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | BIGINT | - | NO | AUTO_INCREMENT | 牛只ID(主键)|
|
||||
| orgId | INT | - | YES | NULL | 组织ID(外键到farms)|
|
||||
| penId | INT | - | YES | NULL | 圈舍ID(外键)|
|
||||
| batchId | INT | - | YES | NULL | 批次ID(外键)|
|
||||
| varieties | INT | - | YES | NULL | 品种ID(外键)|
|
||||
| strain | INT | - | YES | NULL | 品系ID(外键)|
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
### 3.3 设备管理模块
|
||||
|
||||
#### 3.3.1 设备表 (devices)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 设备ID(主键)|
|
||||
| name | VARCHAR | 100 | NO | - | 设备名称 |
|
||||
| type | VARCHAR | 50 | NO | - | 设备类型 |
|
||||
| model | VARCHAR | 100 | YES | NULL | 设备型号 |
|
||||
| serial_number | VARCHAR | 100 | YES | NULL | 设备序列号 |
|
||||
| farm_id | INT | - | YES | NULL | 农场ID(外键)|
|
||||
| location | JSON | - | YES | NULL | 设备位置 |
|
||||
| status | ENUM | - | NO | 'active' | 状态:active/inactive/maintenance |
|
||||
| last_heartbeat | TIMESTAMP | - | YES | NULL | 最后心跳时间 |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
#### 3.3.2 传感器数据表 (sensor_data)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | BIGINT | - | NO | AUTO_INCREMENT | 数据ID(主键)|
|
||||
| device_id | INT | - | NO | - | 设备ID(外键)|
|
||||
| farm_id | INT | - | YES | NULL | 农场ID(外键)|
|
||||
| sensor_type | VARCHAR | 50 | NO | - | 传感器类型 |
|
||||
| value | DECIMAL | 10,4 | NO | - | 传感器数值 |
|
||||
| unit | VARCHAR | 20 | YES | NULL | 数值单位 |
|
||||
| timestamp | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 数据时间戳 |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
|
||||
**分表策略:**
|
||||
- 按月分表:sensor_data_YYYYMM
|
||||
- 保留最近12个月数据,历史数据归档
|
||||
|
||||
### 3.4 圈舍管理模块
|
||||
|
||||
#### 3.4.1 牛只圈舍表 (cattle_pens)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 圈舍ID(主键)|
|
||||
| name | VARCHAR | 100 | NO | - | 圈舍名称 |
|
||||
| farm_id | INT | - | NO | - | 农场ID(外键)|
|
||||
| capacity | INT | - | NO | 0 | 容量 |
|
||||
| current_count | INT | - | NO | 0 | 当前数量 |
|
||||
| pen_type | VARCHAR | 50 | YES | NULL | 圈舍类型 |
|
||||
| area | DECIMAL | 10,2 | YES | NULL | 面积(平方米)|
|
||||
| status | ENUM | - | NO | 'active' | 状态:active/inactive/maintenance |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
#### 3.4.2 牛只批次表 (cattle_batches)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 批次ID(主键)|
|
||||
| batch_name | VARCHAR | 100 | NO | - | 批次名称 |
|
||||
| farm_id | INT | - | NO | - | 农场ID(外键)|
|
||||
| batch_date | DATE | - | NO | - | 批次日期 |
|
||||
| total_count | INT | - | NO | 0 | 总数量 |
|
||||
| current_count | INT | - | NO | 0 | 当前数量 |
|
||||
| status | ENUM | - | NO | 'active' | 状态:active/completed/cancelled |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
### 3.5 电子围栏模块
|
||||
|
||||
#### 3.5.1 电子围栏表 (electronic_fences)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 围栏ID(主键)|
|
||||
| name | VARCHAR | 100 | NO | - | 围栏名称 |
|
||||
| farm_id | INT | - | NO | - | 农场ID(外键)|
|
||||
| fence_type | VARCHAR | 50 | NO | - | 围栏类型 |
|
||||
| status | ENUM | - | NO | 'active' | 状态:active/inactive |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
#### 3.5.2 围栏点表 (electronic_fence_points)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 点ID(主键)|
|
||||
| fence_id | INT | - | NO | - | 围栏ID(外键)|
|
||||
| latitude | DECIMAL | 10,8 | NO | - | 纬度 |
|
||||
| longitude | DECIMAL | 11,8 | NO | - | 经度 |
|
||||
| point_order | INT | - | NO | - | 点序号 |
|
||||
| created_by | INT | - | YES | NULL | 创建人(外键)|
|
||||
| updated_by | INT | - | YES | NULL | 更新人(外键)|
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
### 3.6 业务记录模块
|
||||
|
||||
#### 3.6.1 预警表 (alerts)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | INT | - | NO | AUTO_INCREMENT | 预警ID(主键)|
|
||||
| farm_id | INT | - | YES | NULL | 农场ID(外键)|
|
||||
| device_id | INT | - | YES | NULL | 设备ID(外键)|
|
||||
| alert_type | VARCHAR | 50 | NO | - | 预警类型 |
|
||||
| level | ENUM | - | NO | 'low' | 预警级别:low/medium/high/critical |
|
||||
| title | VARCHAR | 200 | NO | - | 预警标题 |
|
||||
| message | TEXT | - | YES | NULL | 预警消息 |
|
||||
| status | ENUM | - | NO | 'pending' | 状态:pending/acknowledged/resolved |
|
||||
| acknowledged_at | TIMESTAMP | - | YES | NULL | 确认时间 |
|
||||
| resolved_at | TIMESTAMP | - | YES | NULL | 解决时间 |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 更新时间 |
|
||||
|
||||
#### 3.6.2 操作日志表 (operation_logs)
|
||||
|
||||
| 字段名 | 类型 | 长度 | 是否为空 | 默认值 | 说明 |
|
||||
|--------|------|------|----------|--------|------|
|
||||
| id | BIGINT | - | NO | AUTO_INCREMENT | 日志ID(主键)|
|
||||
| user_id | INT | - | YES | NULL | 用户ID(外键)|
|
||||
| action | VARCHAR | 100 | NO | - | 操作动作 |
|
||||
| resource | VARCHAR | 100 | NO | - | 操作资源 |
|
||||
| resource_id | INT | - | YES | NULL | 资源ID |
|
||||
| details | JSON | - | YES | NULL | 操作详情 |
|
||||
| ip_address | VARCHAR | 45 | YES | NULL | IP地址 |
|
||||
| user_agent | TEXT | - | YES | NULL | 用户代理 |
|
||||
| created_at | TIMESTAMP | - | NO | CURRENT_TIMESTAMP | 创建时间 |
|
||||
|
||||
## 4. 数据库优化策略
|
||||
|
||||
### 4.1 索引优化
|
||||
|
||||
**主键索引:**
|
||||
- 所有表都使用自增整型主键
|
||||
- 确保主键的唯一性和非空性
|
||||
|
||||
**唯一索引:**
|
||||
- 用户名、邮箱等唯一字段
|
||||
- 设备序列号等业务唯一标识
|
||||
|
||||
**复合索引:**
|
||||
```sql
|
||||
-- 传感器数据查询优化
|
||||
CREATE INDEX idx_sensor_data_query ON sensor_data (device_id, sensor_type, timestamp);
|
||||
|
||||
-- 动物信息查询优化
|
||||
CREATE INDEX idx_animal_farm_status ON animals (farm_id, status, created_at);
|
||||
|
||||
-- 预警查询优化
|
||||
CREATE INDEX idx_alert_farm_status ON alerts (farm_id, status, level, created_at);
|
||||
```
|
||||
|
||||
### 4.2 分区策略
|
||||
|
||||
**时间分区:**
|
||||
```sql
|
||||
-- 传感器数据按月分区
|
||||
CREATE TABLE sensor_data (
|
||||
-- 字段定义...
|
||||
) PARTITION BY RANGE (YEAR(created_at) * 100 + MONTH(created_at)) (
|
||||
PARTITION p202501 VALUES LESS THAN (202502),
|
||||
PARTITION p202502 VALUES LESS THAN (202503),
|
||||
-- 更多分区...
|
||||
);
|
||||
```
|
||||
|
||||
**哈希分区:**
|
||||
```sql
|
||||
-- 操作日志按用户ID哈希分区
|
||||
CREATE TABLE operation_logs (
|
||||
-- 字段定义...
|
||||
) PARTITION BY HASH(user_id) PARTITIONS 8;
|
||||
```
|
||||
|
||||
### 4.3 查询优化
|
||||
|
||||
**慢查询优化:**
|
||||
- 启用慢查询日志
|
||||
- 定期分析慢查询
|
||||
- 优化查询语句和索引
|
||||
|
||||
**缓存策略:**
|
||||
- Redis缓存热点数据
|
||||
- 查询结果缓存
|
||||
- 分布式缓存架构
|
||||
|
||||
## 5. 数据安全与备份
|
||||
|
||||
### 5.1 数据安全
|
||||
|
||||
**访问控制:**
|
||||
- 数据库用户权限最小化
|
||||
- 应用层数据访问控制
|
||||
- 敏感数据加密存储
|
||||
|
||||
**数据加密:**
|
||||
```sql
|
||||
-- 密码字段加密
|
||||
password VARCHAR(255) NOT NULL COMMENT '密码(bcrypt加密)'
|
||||
|
||||
-- 敏感信息加密存储
|
||||
phone VARCHAR(255) COMMENT '手机号(AES加密)'
|
||||
```
|
||||
|
||||
### 5.2 备份策略
|
||||
|
||||
**全量备份:**
|
||||
- 每日凌晨全量备份
|
||||
- 备份文件异地存储
|
||||
- 备份文件加密压缩
|
||||
|
||||
**增量备份:**
|
||||
- 每小时增量备份
|
||||
- binlog备份和恢复
|
||||
- 实时数据同步
|
||||
|
||||
**备份验证:**
|
||||
- 定期备份恢复测试
|
||||
- 备份文件完整性校验
|
||||
- 灾难恢复演练
|
||||
|
||||
## 6. 监控与维护
|
||||
|
||||
### 6.1 性能监控
|
||||
|
||||
**关键指标:**
|
||||
- QPS(每秒查询数)
|
||||
- 连接数和活跃连接
|
||||
- 慢查询统计
|
||||
- 表空间使用率
|
||||
|
||||
**监控工具:**
|
||||
- MySQL Performance Schema
|
||||
- Prometheus + Grafana
|
||||
- 自定义监控脚本
|
||||
|
||||
### 6.2 维护策略
|
||||
|
||||
**定期维护:**
|
||||
- 表结构优化
|
||||
- 索引重建和优化
|
||||
- 数据清理和归档
|
||||
- 统计信息更新
|
||||
|
||||
**容量规划:**
|
||||
- 存储容量预测
|
||||
- 性能瓶颈分析
|
||||
- 扩容方案制定
|
||||
|
||||
## 7. 数据字典
|
||||
|
||||
### 7.1 枚举值定义
|
||||
|
||||
**用户状态 (user_status):**
|
||||
- active:激活
|
||||
- inactive:未激活
|
||||
- suspended:已暂停
|
||||
|
||||
**设备状态 (device_status):**
|
||||
- active:正常运行
|
||||
- inactive:离线
|
||||
- maintenance:维护中
|
||||
|
||||
**预警级别 (alert_level):**
|
||||
- low:低级
|
||||
- medium:中级
|
||||
- high:高级
|
||||
- critical:严重
|
||||
|
||||
**动物类型 (animal_type):**
|
||||
- 1:牛
|
||||
- 2:羊
|
||||
- 3:猪
|
||||
- 4:马
|
||||
|
||||
### 7.2 业务规则
|
||||
|
||||
**数据完整性规则:**
|
||||
1. 动物必须关联到养殖场
|
||||
2. 设备必须关联到养殖场
|
||||
3. 传感器数据必须关联到设备
|
||||
4. 预警可以关联到设备或养殖场
|
||||
|
||||
**业务逻辑规则:**
|
||||
1. 圈舍当前数量不能超过容量
|
||||
2. 动物转移需要记录转移记录
|
||||
3. 批次完成后不能再添加动物
|
||||
4. 电子围栏至少需要3个点
|
||||
|
||||
## 8. 版本升级与迁移
|
||||
|
||||
### 8.1 版本控制
|
||||
|
||||
**数据库版本管理:**
|
||||
- 使用数据库迁移工具
|
||||
- 版本号管理和追踪
|
||||
- 回滚方案制定
|
||||
|
||||
**升级策略:**
|
||||
- 灰度升级
|
||||
- 数据迁移验证
|
||||
- 业务连续性保障
|
||||
|
||||
### 8.2 数据迁移
|
||||
|
||||
**迁移工具:**
|
||||
- 自定义迁移脚本
|
||||
- 数据同步工具
|
||||
- 数据验证工具
|
||||
|
||||
**迁移流程:**
|
||||
1. 数据备份
|
||||
2. 结构升级
|
||||
3. 数据迁移
|
||||
4. 数据验证
|
||||
5. 业务切换
|
||||
|
||||
## 9. 附录
|
||||
|
||||
### 9.1 建表语句示例
|
||||
|
||||
```sql
|
||||
-- 用户表
|
||||
CREATE TABLE users (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
username VARCHAR(50) NOT NULL UNIQUE,
|
||||
email VARCHAR(100) NOT NULL UNIQUE,
|
||||
password VARCHAR(255) NOT NULL,
|
||||
phone VARCHAR(20),
|
||||
avatar VARCHAR(255),
|
||||
roles INT DEFAULT 2,
|
||||
status ENUM('active', 'inactive', 'suspended') DEFAULT 'active',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_roles (roles),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 养殖场表
|
||||
CREATE TABLE farms (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
type VARCHAR(50) NOT NULL,
|
||||
location JSON NOT NULL DEFAULT (JSON_OBJECT()),
|
||||
address VARCHAR(255),
|
||||
contact VARCHAR(50),
|
||||
phone VARCHAR(20),
|
||||
status ENUM('active', 'inactive', 'maintenance') DEFAULT 'active',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
INDEX idx_name (name),
|
||||
INDEX idx_type (type),
|
||||
INDEX idx_status (status)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
```
|
||||
|
||||
### 9.2 常用查询示例
|
||||
|
||||
```sql
|
||||
-- 查询养殖场及其动物数量
|
||||
SELECT f.id, f.name, COUNT(a.id) as animal_count
|
||||
FROM farms f
|
||||
LEFT JOIN animals a ON f.id = a.farm_id AND a.status = 1
|
||||
WHERE f.status = 'active'
|
||||
GROUP BY f.id, f.name;
|
||||
|
||||
-- 查询最近24小时的预警统计
|
||||
SELECT alert_type, level, COUNT(*) as count
|
||||
FROM alerts
|
||||
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
|
||||
GROUP BY alert_type, level
|
||||
ORDER BY count DESC;
|
||||
|
||||
-- 查询设备在线状态
|
||||
SELECT d.id, d.name, d.status,
|
||||
CASE
|
||||
WHEN d.last_heartbeat >= DATE_SUB(NOW(), INTERVAL 5 MINUTE) THEN 'online'
|
||||
ELSE 'offline'
|
||||
END as online_status
|
||||
FROM devices d
|
||||
WHERE d.status = 'active';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**文档维护说明:**
|
||||
本文档应随着系统功能的增加和数据库结构的变化及时更新。所有数据库结构变更都应该通过版本控制进行管理,确保开发、测试、生产环境的一致性。
|
||||
1555
docs/architecture/系统架构文档.md
Normal file
1555
docs/architecture/系统架构文档.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,340 +0,0 @@
|
||||
# 宁夏智慧养殖监管平台产品需求文档
|
||||
|
||||
## 版本历史
|
||||
| 版本 | 日期 | 作者 | 描述 |
|
||||
|------|------|------|------|
|
||||
| v1.0 | 2025-01-18 | 产品经理 | 初始版本 |
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
### 1.1 项目背景
|
||||
宁夏回族自治区作为中国重要的畜牧业基地,养殖业在区域经济发展中占据重要地位。随着现代信息技术的快速发展,传统养殖业正逐步向智能化、数字化方向转型升级。为提升宁夏地区养殖业的管理水平和监管效率,建设一套完善的智慧养殖监管平台势在必行。
|
||||
|
||||
### 1.2 项目目标
|
||||
宁夏智慧养殖监管平台旨在通过数字化手段实现对养殖全过程的监管,具体目标包括:
|
||||
- 实现养殖场信息数字化管理
|
||||
- 提供养殖环境实时监控功能
|
||||
- 支持养殖过程数据记录与追溯
|
||||
- 提供数据分析和决策支持
|
||||
- 构建统一的养殖监管体系
|
||||
|
||||
### 1.3 成功标准
|
||||
- 用户日活跃度提升20%
|
||||
- 养殖场管理效率提升30%
|
||||
- 异常预警响应时间缩短至5分钟内
|
||||
- 系统可用性达到99.9%
|
||||
|
||||
### 1.4 范围界定
|
||||
**本版本包含:**
|
||||
- 用户权限管理系统
|
||||
- 养殖场信息管理
|
||||
- 设备监控管理
|
||||
- 动物健康管理
|
||||
- 预警管理系统
|
||||
- 数据可视化展示
|
||||
|
||||
**本版本不包含:**
|
||||
- 移动端小程序功能(二期规划)
|
||||
- 人工智能预警功能(三期规划)
|
||||
- 微服务架构改造(后续版本)
|
||||
|
||||
## 2. 用户角色与用例
|
||||
|
||||
### 2.1 用户角色
|
||||
| 角色 | 描述 | 权限范围 |
|
||||
|------|------|----------|
|
||||
| 系统管理员 | 负责系统整体管理和维护 | 全系统权限,用户管理,系统配置 |
|
||||
| 养殖场管理员 | 负责具体养殖场的管理 | 养殖场信息管理,设备监控,动物管理 |
|
||||
| 监管人员 | 负责区域养殖监管 | 数据查看,预警处理,报表分析 |
|
||||
| 普通用户 | 基础系统使用者 | 个人信息管理,数据查看 |
|
||||
|
||||
### 2.2 核心用例
|
||||
|
||||
#### 用例1:用户登录认证
|
||||
**As a** 系统用户
|
||||
**I want to** 通过账号密码登录系统
|
||||
**So that** 我可以访问系统功能
|
||||
|
||||
**验收标准:**
|
||||
- Given 用户打开登录页面
|
||||
- When 输入正确的用户名和密码
|
||||
- Then 系统跳转到仪表盘页面
|
||||
- And 显示欢迎信息
|
||||
|
||||
#### 用例2:养殖场信息管理
|
||||
**As a** 养殖场管理员
|
||||
**I want to** 管理养殖场基本信息
|
||||
**So that** 我可以维护养殖场档案
|
||||
|
||||
**验收标准:**
|
||||
- Given 用户有养殖场管理权限
|
||||
- When 进入养殖场管理页面
|
||||
- Then 可以查看养殖场列表
|
||||
- And 可以新增、编辑、删除养殖场信息
|
||||
|
||||
#### 用例3:实时设备监控
|
||||
**As a** 监管人员
|
||||
**I want to** 实时查看设备状态
|
||||
**So that** 我可以及时发现设备异常
|
||||
|
||||
**验收标准:**
|
||||
- Given 用户有设备查看权限
|
||||
- When 进入设备监控页面
|
||||
- Then 可以查看设备实时状态
|
||||
- And 设备异常时收到预警通知
|
||||
|
||||
## 3. 功能需求
|
||||
|
||||
### 3.1 用户管理模块
|
||||
|
||||
#### 3.1.1 用户认证
|
||||
**用户故事:** As a 用户,I want to 通过安全的方式登录系统,so that 我的账户信息得到保护
|
||||
|
||||
**验收标准:**
|
||||
- Given 用户访问登录页面
|
||||
- When 输入正确的凭证
|
||||
- Then 系统颁发JWT令牌
|
||||
- And 令牌有效期24小时
|
||||
- And 密码使用bcrypt加密存储
|
||||
|
||||
#### 3.1.2 权限管理
|
||||
**用户故事:** As a 系统管理员,I want to 管理用户角色和权限,so that 我可以控制不同用户的访问范围
|
||||
|
||||
**验收标准:**
|
||||
- Given 管理员进入权限管理页面
|
||||
- When 分配用户角色
|
||||
- Then 用户获得相应权限
|
||||
- And 权限变更实时生效
|
||||
|
||||
### 3.2 养殖场管理模块
|
||||
|
||||
#### 3.2.1 养殖场信息维护
|
||||
**用户故事:** As a 养殖场管理员,I want to 维护养殖场基本信息,so that 信息准确完整
|
||||
|
||||
**验收标准:**
|
||||
- Given 管理员进入养殖场管理
|
||||
- When 填写养殖场信息(名称、类型、位置、联系人等)
|
||||
- Then 信息保存到数据库
|
||||
- And 地理位置信息格式正确
|
||||
|
||||
#### 3.2.2 地图展示
|
||||
**用户故事:** As a 监管人员,I want to 在地图上查看养殖场分布,so that 我可以直观了解区域养殖情况
|
||||
|
||||
**验收标准:**
|
||||
- Given 用户有地图查看权限
|
||||
- When 打开地图页面
|
||||
- Then 显示所有养殖场位置标记
|
||||
- And 点击标记显示养殖场基本信息
|
||||
|
||||
### 3.3 设备监控模块
|
||||
|
||||
#### 3.3.1 设备状态监控
|
||||
**用户故事:** As a 监管人员,I want to 实时监控设备状态,so that 我可以确保设备正常运行
|
||||
|
||||
**验收标准:**
|
||||
- Given 设备数据正常上报
|
||||
- When 用户查看设备监控页面
|
||||
- Then 显示设备实时状态(在线、离线、维护)
|
||||
- And 状态更新间隔不超过30秒
|
||||
|
||||
#### 3.3.2 设备预警
|
||||
**用户故事:** As a 系统用户,I want to 接收设备异常预警,so that 我可以及时处理问题
|
||||
|
||||
**验收标准:**
|
||||
- Given 设备出现异常状态
|
||||
- When 系统检测到异常
|
||||
- Then 发送预警通知给相关用户
|
||||
- And 预警级别根据异常程度划分
|
||||
|
||||
### 3.4 动物管理模块
|
||||
|
||||
#### 3.4.1 动物信息管理
|
||||
**用户故事:** As a 养殖场管理员,I want to 管理动物基本信息,so that 我可以跟踪动物健康状况
|
||||
|
||||
**验收标准:**
|
||||
- Given 管理员进入动物管理
|
||||
- When 录入动物信息(类型、数量、健康状态)
|
||||
- Then 信息保存到数据库
|
||||
- And 健康状态可更新
|
||||
|
||||
#### 3.4.2 健康监测
|
||||
**用户故事:** As a 监管人员,I want to 查看动物健康数据,so that 我可以评估养殖场健康状况
|
||||
|
||||
**验收标准:**
|
||||
- Given 有动物健康数据
|
||||
- When 用户查看健康报表
|
||||
- Then 显示健康状态统计
|
||||
- And 可以按时间范围筛选
|
||||
|
||||
### 3.5 数据分析模块
|
||||
|
||||
#### 3.5.1 数据可视化
|
||||
**用户故事:** As a 用户,I want to 通过图表查看数据,so that 我可以更直观理解数据趋势
|
||||
|
||||
**验收标准:**
|
||||
- Given 有统计数据
|
||||
- When 用户打开数据看板
|
||||
- Then 显示ECharts图表
|
||||
- And 图表支持交互操作
|
||||
|
||||
#### 3.5.2 报表生成
|
||||
**用户故事:** As a 监管人员,I want to 生成养殖统计报表,so that 我可以进行决策分析
|
||||
|
||||
**验收标准:**
|
||||
- Given 用户有报表权限
|
||||
- When 选择报表类型和时间范围
|
||||
- Then 生成PDF格式报表
|
||||
- And 报表包含关键指标数据
|
||||
|
||||
## 4. 非功能需求
|
||||
|
||||
### 4.1 性能要求
|
||||
- 页面加载时间:<3秒
|
||||
- API响应时间:<500ms
|
||||
- 并发用户支持:1000+用户
|
||||
- 数据查询性能:复杂查询<2秒
|
||||
|
||||
### 4.2 安全要求
|
||||
- 数据传输:HTTPS加密
|
||||
- 身份认证:JWT令牌机制
|
||||
- 密码存储:bcrypt加密
|
||||
- SQL注入防护:ORM参数化查询
|
||||
- XSS防护:输入验证和转义
|
||||
|
||||
### 4.3 可靠性要求
|
||||
- 系统可用性:99.9%
|
||||
- 数据备份:每日自动备份
|
||||
- 故障恢复:30分钟内恢复
|
||||
- 监控告警:关键指标监控
|
||||
|
||||
### 4.4 兼容性要求
|
||||
- 浏览器支持:Chrome、Firefox、Safari最新版本
|
||||
- 移动端适配:响应式设计
|
||||
- 分辨率支持:1920x1080及以上
|
||||
|
||||
## 5. 原型说明
|
||||
|
||||
### 5.1 界面布局
|
||||
- **顶部导航栏**:系统logo、用户信息、通知中心、退出按钮
|
||||
- **侧边菜单**:模块导航菜单,支持折叠展开
|
||||
- **主内容区**:功能页面展示区域
|
||||
- **底部信息**:版权信息、系统版本
|
||||
|
||||
### 5.2 关键页面
|
||||
|
||||
#### 5.2.1 登录页面
|
||||
- 用户名/密码输入框
|
||||
- 记住密码选项
|
||||
- 登录按钮
|
||||
- 忘记密码链接
|
||||
|
||||
#### 5.2.2 仪表盘页面
|
||||
- 数据概览卡片(养殖场数、设备数、动物数、预警数)
|
||||
- 实时监控图表
|
||||
- 最新预警列表
|
||||
- 快捷操作入口
|
||||
|
||||
#### 5.2.3 养殖场管理页面
|
||||
- 养殖场列表表格
|
||||
- 搜索筛选功能
|
||||
- 新增/编辑表单
|
||||
- 地图展示选项卡
|
||||
|
||||
#### 5.2.4 设备监控页面
|
||||
- 设备状态卡片布局
|
||||
- 实时数据图表
|
||||
- 状态筛选功能
|
||||
- 设备详情模态框
|
||||
|
||||
#### 5.2.5 数据报表页面
|
||||
- 时间范围选择器
|
||||
- 图表展示区域
|
||||
- 报表类型切换
|
||||
- 数据导出功能
|
||||
|
||||
### 5.3 交互流程
|
||||
|
||||
#### 5.3.1 登录流程
|
||||
1. 用户访问系统 → 跳转到登录页面
|
||||
2. 输入用户名密码 → 点击登录按钮
|
||||
3. 验证通过 → 跳转到仪表盘页面
|
||||
4. 验证失败 → 显示错误提示
|
||||
|
||||
#### 5.3.2 预警处理流程
|
||||
1. 设备异常 → 系统生成预警
|
||||
2. 预警通知 → 用户收到通知
|
||||
3. 查看预警详情 → 进入预警处理页面
|
||||
4. 处理预警 → 更新预警状态
|
||||
5. 填写处理说明 → 完成预警处理
|
||||
|
||||
## 6. API规范
|
||||
|
||||
### 6.1 通用响应格式
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {},
|
||||
"message": "操作成功",
|
||||
"timestamp": "2025-01-18T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 错误处理
|
||||
- HTTP状态码:4xx客户端错误,5xx服务端错误
|
||||
- 错误信息:中英文错误描述
|
||||
- 错误日志:记录详细错误信息
|
||||
|
||||
### 6.3 认证机制
|
||||
- Authorization: Bearer <token>
|
||||
- Token过期:401 Unauthorized
|
||||
- 权限不足:403 Forbidden
|
||||
|
||||
## 7. 数据字典
|
||||
|
||||
### 7.1 状态枚举
|
||||
- 用户状态:active, inactive, banned
|
||||
- 设备状态:online, offline, maintenance
|
||||
- 预警级别:low, medium, high, critical
|
||||
- 预警状态:active, acknowledged, resolved
|
||||
- 健康状态:healthy, sick, quarantine
|
||||
|
||||
### 7.2 字段规范
|
||||
- 时间格式:YYYY-MM-DD HH:mm:ss
|
||||
- 金额单位:分(整数存储)
|
||||
- 地理坐标:JSON格式 {latitude: 0, longitude: 0}
|
||||
|
||||
## 8. 依赖关系
|
||||
|
||||
### 8.1 第三方服务
|
||||
- 百度地图API:地理位置服务
|
||||
- 邮件服务:预警通知发送
|
||||
- SMS服务:重要通知短信
|
||||
|
||||
### 8.2 基础设施
|
||||
- MySQL数据库:数据存储
|
||||
- Redis缓存:会话缓存
|
||||
- 文件存储:图片文件存储
|
||||
- CDN服务:静态资源加速
|
||||
|
||||
## 9. 约束条件
|
||||
|
||||
### 9.1 技术约束
|
||||
- 前端:Vue 3.x + Ant Design Vue
|
||||
- 后端:Node.js + Express + Sequelize
|
||||
- 数据库:MySQL 8.0+
|
||||
- 部署环境:Docker容器化
|
||||
|
||||
### 9.2 业务约束
|
||||
- 数据隐私:养殖场数据权限隔离
|
||||
- 监管合规:符合农业监管部门要求
|
||||
- 数据准确性:关键数据必须验证
|
||||
|
||||
## 10. 待定问题
|
||||
|
||||
1. **移动端支持范围**:是否需要开发原生APP还是PWA即可?
|
||||
2. **第三方集成**:需要集成哪些物联网设备厂商?
|
||||
3. **数据保留策略**:历史数据保留多长时间?
|
||||
4. **多语言支持**:是否需要支持英文版本?
|
||||
|
||||
---
|
||||
*文档最后更新:2025年1月18日*
|
||||
@@ -1,423 +0,0 @@
|
||||
# 项目架构文档
|
||||
|
||||
## 1. 项目概述
|
||||
本项目是**宁夏智慧养殖监管平台**,一个现代化的农场管理系统,包含以下核心功能:
|
||||
- **农场设备监控**: 实时监控农场设备状态和运行数据
|
||||
- **动物健康管理**: 跟踪和管理动物健康状况
|
||||
- **地图可视化**: 基于百度地图的农场地理信息展示
|
||||
- **数据分析与可视化**: 提供丰富的图表和统计分析
|
||||
- **用户权限管理**: 基于角色的用户认证和授权系统
|
||||
- **订单管理**: 产品销售和订单处理功能
|
||||
- **预警管理**: 实时告警监控和预警处理
|
||||
- **性能监控**: 实时系统性能监控和分析
|
||||
|
||||
## 2. 目录结构
|
||||
### 2.1 后端 (`backend/`)
|
||||
- `config/`: 配置文件
|
||||
- `database.js`: MySQL数据库连接配置
|
||||
- `database-pool.js`: 数据库连接池管理
|
||||
- `performance-config.js`: 性能监控配置
|
||||
- `swagger.js`: API文档配置
|
||||
- `controllers/`: 业务逻辑控制器
|
||||
- `farmController.js`: 农场管理
|
||||
- `animalController.js`: 动物管理
|
||||
- `deviceController.js`: 设备管理
|
||||
- `alertController.js`: 告警管理
|
||||
- `statsController.js`: 统计分析
|
||||
- `mapController.js`: 地图服务
|
||||
- `userController.js`: 用户管理
|
||||
- `productController.js`: 产品管理
|
||||
- `orderController.js`: 订单管理
|
||||
- `models/`: 数据模型定义(Sequelize ORM)
|
||||
- `Farm.js`: 农场模型
|
||||
- `Animal.js`: 动物模型
|
||||
- `Device.js`: 设备模型
|
||||
- `Alert.js`: 告警模型
|
||||
- `User.js`: 用户模型
|
||||
- `Role.js`: 角色模型
|
||||
- `Product.js`: 产品模型
|
||||
- `Order.js`: 订单模型
|
||||
- `OrderItem.js`: 订单项模型
|
||||
- `UserRole.js`: 用户角色关联模型
|
||||
- `SensorData.js`: 传感器数据模型
|
||||
- `BaseModel.js`: 基础模型
|
||||
- `index.js`: 模型入口文件
|
||||
- `routes/`: API路由定义
|
||||
- `auth.js`: 认证路由
|
||||
- `users.js`: 用户管理路由
|
||||
- `products.js`: 产品管理路由
|
||||
- `orders.js`: 订单管理路由
|
||||
- `farms.js`: 农场管理路由
|
||||
- `animals.js`: 动物管理路由
|
||||
- `devices.js`: 设备管理路由
|
||||
- `alerts.js`: 告警管理路由
|
||||
- `stats.js`: 统计分析路由
|
||||
- `map.js`: 地图服务路由
|
||||
- `performance-routes.js`: 性能监控路由
|
||||
- `middleware/`: 中间件
|
||||
- `auth.js`: 认证中间件
|
||||
- `performance-middleware.js`: 性能监控中间件
|
||||
- `utils/`: 工具类
|
||||
- `logger.js`: 日志工具
|
||||
- `performance-monitor.js`: 性能监控
|
||||
- `db-monitor.js`: 数据库监控
|
||||
- `query-optimizer.js`: 查询优化器
|
||||
- `migrations/`: 数据库迁移文件
|
||||
- `seeds/`: 种子数据文件
|
||||
- `logs/`: 日志文件目录
|
||||
|
||||
### 2.2 管理后台 (`admin-system/`)
|
||||
- `frontend/`: 管理后台前端项目
|
||||
- `src/components/`: 可复用的UI组件
|
||||
- `BaiduMap.vue`: 百度地图组件
|
||||
- `EChart.vue`: 图表组件
|
||||
- `Menu.vue`: 导航菜单
|
||||
- `Dashboard.vue`: 仪表盘组件
|
||||
- `AlertStats.vue`: 告警统计组件
|
||||
- `AnimalStats.vue`: 动物统计组件
|
||||
- `DeviceStats.vue`: 设备统计组件
|
||||
- `FarmDetail.vue`: 农场详情组件
|
||||
- `MonitorChart.vue`: 监控图表组件
|
||||
- `ChartPerformanceMonitor.vue`: 性能监控图表
|
||||
- `VirtualScrollChart.vue`: 虚拟滚动图表
|
||||
- `src/views/`: 页面级组件
|
||||
- `Home.vue`: 首页
|
||||
- `Dashboard.vue`: 系统概览
|
||||
- `MapView.vue`: 地图监控
|
||||
- `Analytics.vue`: 数据分析
|
||||
- `Monitor.vue`: 实时监控
|
||||
- `Login.vue`: 登录页面
|
||||
- `Users.vue`: 用户管理
|
||||
- `Products.vue`: 产品管理
|
||||
- `Orders.vue`: 订单管理
|
||||
- `Devices.vue`: 设备管理
|
||||
- `Animals.vue`: 动物管理
|
||||
- `Alerts.vue`: 预警管理
|
||||
- `TestAnalytics.vue`: 测试分析页面
|
||||
- `MapZoomDemo.vue`: 地图缩放演示
|
||||
- `NotFound.vue`: 404页面
|
||||
- `src/stores/`: 状态管理(Pinia)
|
||||
- `user.js`: 用户状态管理
|
||||
- `data.js`: 数据状态管理
|
||||
- `settings.js`: 设置状态管理
|
||||
- `index.js`: 状态管理入口
|
||||
- `src/router/`: 路由配置
|
||||
- `index.js`: 路由实例和守卫
|
||||
- `routes.js`: 路由定义
|
||||
- `src/utils/`: 工具类(API调用、图表服务等)
|
||||
- `api.js`: API请求封装
|
||||
- `src/config/`: 配置文件
|
||||
- `public/`: 静态资源和测试页面
|
||||
- `debug-devices.html`: 设备调试页面
|
||||
- `debug-users.html`: 用户调试页面
|
||||
- `map-test.html`: 地图测试页面
|
||||
- `test-auto-login.html`: 自动登录测试
|
||||
- `test-users-display.html`: 用户显示测试
|
||||
|
||||
### 2.3 官网 (`website/`)
|
||||
- `data-screen/`: 官网前端项目
|
||||
- 包含官网展示页面和数据大屏功能
|
||||
|
||||
### 2.4 微信小程序 (`mini_program/`)
|
||||
- `farm-monitor-dashboard/`: 微信小程序项目
|
||||
- 包含移动端监控仪表盘功能
|
||||
|
||||
### 2.5 脚本目录 (`scripts/`)
|
||||
- `init-db.js`: 数据库初始化
|
||||
- `migration-manager.js`: 迁移管理
|
||||
- `seed-manager.js`: 种子数据管理
|
||||
- `test-connection.js`: 连接测试
|
||||
- `test-map-api.js`: 地图API测试
|
||||
|
||||
### 2.6 文档目录 (`docs/`)
|
||||
- `API.md`: API 文档
|
||||
- `DEPLOYMENT.md`: 部署指南
|
||||
- `DEVELOPMENT.md`: 开发指南
|
||||
- `TROUBLESHOOTING.md`: 故障排除
|
||||
- `CHANGELOG.md`: 更新日志
|
||||
- `CONTRIBUTING.md`: 贡献指南
|
||||
- `SECURITY.md`: 安全指南
|
||||
- `PRD.md`: 产品需求文档
|
||||
- `baidu-map-license.md`: 百度地图许可文档
|
||||
- `performance-monitoring.md`: 性能监控文档
|
||||
- `FINAL_STRUCTURE_REPORT.md`: 项目结构报告
|
||||
- `PROJECT_CLEANUP_REPORT.md`: 项目清理报告
|
||||
- `arch.md`: 架构文档
|
||||
- `design.md`: 详细设计
|
||||
- `schema.sql`: 数据库架构脚本
|
||||
- `create_tables.sql`: 数据库表创建脚本
|
||||
|
||||
### 2.7 测试目录 (`test/`)
|
||||
- `performance-monitor-test.js`: 性能监控测试
|
||||
|
||||
### 2.8 其他文件
|
||||
- `examples/`: 示例代码
|
||||
- `performance-monitor-integration.js`: 性能监控集成示例
|
||||
- `create_tables.sql`: 数据库表创建脚本
|
||||
- `schema.sql`: 数据库架构脚本
|
||||
- `design.md`: 详细设计文档
|
||||
- `dev-plan.md`: 开发计划文档
|
||||
- `task.md`: 任务列表文档
|
||||
|
||||
## 3. 模块划分
|
||||
### 3.1 后端模块
|
||||
- **农场管理模块**: 农场信息管理、地理位置管理
|
||||
- **设备管理模块**: 监控农场设备状态、设备数据采集
|
||||
- **动物管理模块**: 跟踪动物健康数据、动物档案管理
|
||||
- **告警管理模块**: 系统告警处理、告警规则配置
|
||||
- **用户管理模块**: 用户认证、角色权限管理
|
||||
- **订单管理模块**: 产品销售、订单处理流程
|
||||
- **统计分析模块**: 数据统计、报表生成
|
||||
- **地图服务模块**: 地理信息服务、位置数据处理
|
||||
- **性能监控模块**: 系统性能监控、API性能分析
|
||||
|
||||
### 3.2 前端模块
|
||||
- **首页模块**: 系统入口、快速导航
|
||||
- **仪表盘模块**: 关键指标展示、数据概览
|
||||
- **地图模块**: 基于百度地图的可视化展示、地图缩放演示
|
||||
- **数据分析模块**: 图表展示、数据分析工具、测试分析功能
|
||||
- **实时监控模块**: 实时数据监控、告警展示、性能监控图表
|
||||
- **用户管理模块**: 用户信息管理、权限配置
|
||||
- **产品管理模块**: 产品信息维护、库存管理
|
||||
- **订单管理模块**: 订单处理、订单状态跟踪
|
||||
- **设备管理模块**: 设备状态监控、设备信息管理
|
||||
- **动物管理模块**: 动物健康档案、动物信息管理
|
||||
- **预警管理模块**: 告警规则配置、预警信息处理
|
||||
- **认证模块**: 用户登录、权限验证、自动登录
|
||||
|
||||
## 4. 核心架构
|
||||
### 4.1 技术栈
|
||||
**后端技术栈:**
|
||||
- **运行环境**: Node.js 18.0+
|
||||
- **Web框架**: Express.js 4.18+
|
||||
- **API风格**: RESTful API
|
||||
- **ORM框架**: Sequelize 6.30+
|
||||
- **数据库**: MySQL 8.0+ (mysql2 3.0+)
|
||||
- **认证授权**: JWT (jsonwebtoken 9.0+)
|
||||
- **密码加密**: bcrypt 5.1+
|
||||
- **API文档**: Swagger (swagger-jsdoc + swagger-ui-express)
|
||||
- **日志管理**: Winston 3.17+
|
||||
- **开发工具**: nodemon 3.0+
|
||||
- **跨域处理**: CORS 2.8+
|
||||
- **数据验证**: express-validator 7.2+
|
||||
- **环境变量**: dotenv 16.0+
|
||||
- **HTTP客户端**: Axios 1.4+
|
||||
- **服务器端口**: 5350
|
||||
|
||||
**前端技术栈:**
|
||||
- **框架**: Vue.js 3.4+
|
||||
- **构建工具**: Vite 5.0+
|
||||
- **路由管理**: Vue Router 4.0+
|
||||
- **状态管理**: Pinia 2.0+
|
||||
- **UI组件库**: Ant Design Vue 4.0+
|
||||
- **图表库**: ECharts 5.4+
|
||||
- **地图服务**: 百度地图API
|
||||
- **HTTP客户端**: Axios 1.11+
|
||||
- **响应式设计**: 支持Chrome、Firefox、Safari最新版本
|
||||
- **分辨率支持**: 1920x1080及以上
|
||||
|
||||
### 4.2 性能要求
|
||||
- **页面加载时间**: <3秒
|
||||
- **API响应时间**: <500ms
|
||||
- **并发用户支持**: 1000+用户
|
||||
- **数据查询性能**: 复杂查询<2秒
|
||||
- **系统可用性**: 99.9%
|
||||
|
||||
### 4.3 安全要求
|
||||
- **数据传输**: HTTPS加密
|
||||
- **身份认证**: JWT令牌机制
|
||||
- **密码存储**: bcrypt加密
|
||||
- **SQL注入防护**: ORM参数化查询
|
||||
- **XSS防护**: 输入验证和转义
|
||||
- **访问控制**: 基于角色的权限管理(RBAC)
|
||||
- **会话管理**: Token过期机制
|
||||
|
||||
### 4.4 可靠性要求
|
||||
- **数据备份**: 每日自动备份
|
||||
- **故障恢复**: 30分钟内恢复
|
||||
- **监控告警**: 关键指标监控
|
||||
- **日志记录**: 完整的操作日志和错误日志
|
||||
- **开发服务器**: Vite Dev Server (端口: 5300)
|
||||
- **代理配置**: API代理到后端服务器
|
||||
|
||||
**数据库设计:**
|
||||
- **主数据库**: MySQL (生产环境)
|
||||
- **连接池**: 数据库连接池管理
|
||||
- **字符集**: UTF8MB4
|
||||
- **时区**: +08:00 (北京时间)
|
||||
|
||||
### 4.2 数据流架构
|
||||
1. **前端请求流程**:
|
||||
- 用户操作 → Vue组件 → Pinia状态管理 → API调用
|
||||
2. **后端处理流程**:
|
||||
- API路由 → 中间件验证 → 控制器处理 → 模型操作 → 数据库
|
||||
3. **响应返回流程**:
|
||||
- 数据库结果 → 模型封装 → 控制器响应 → 前端状态更新 → UI渲染
|
||||
4. **实时数据流**:
|
||||
- 设备数据采集 → 后端处理 → 数据库存储 → 前端轮询/推送更新
|
||||
|
||||
## 5. 数据模型关系
|
||||
### 5.1 核心实体关系
|
||||
- **Farm (农场)** ← 一对多 → **Animal (动物)**
|
||||
- **Farm (农场)** ← 一对多 → **Device (设备)**
|
||||
- **Farm (农场)** ← 一对多 → **Alert (告警)**
|
||||
- **Device (设备)** ← 一对多 → **Alert (告警)**
|
||||
- **User (用户)** ← 多对多 → **Role (角色)** (通过UserRole中间表)
|
||||
- **User (用户)** ← 一对多 → **Order (订单)**
|
||||
- **Order (订单)** ← 一对多 → **OrderItem (订单项)**
|
||||
- **Product (产品)** ← 一对多 → **OrderItem (订单项)**
|
||||
|
||||
### 5.2 数据库约束
|
||||
- **外键约束**: 确保数据完整性
|
||||
- **级联删除**: Farm删除时级联删除相关Animal、Device、Alert
|
||||
- **级联更新**: 主键更新时自动更新外键
|
||||
- **限制删除**: Product被OrderItem引用时限制删除
|
||||
|
||||
## 6. API设计规范
|
||||
### 6.1 RESTful API结构
|
||||
```
|
||||
/api/farms - 农场管理
|
||||
/api/animals - 动物管理
|
||||
/api/devices - 设备管理
|
||||
/api/alerts - 告警管理
|
||||
/api/users - 用户管理
|
||||
/api/products - 产品管理
|
||||
/api/orders - 订单管理
|
||||
/api/stats - 统计数据
|
||||
/api/map - 地图服务
|
||||
/api/auth - 认证服务
|
||||
```
|
||||
|
||||
### 6.2 响应格式标准
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {},
|
||||
"message": "操作成功",
|
||||
"timestamp": "2025-01-18T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
## 7. 安全架构
|
||||
### 7.1 认证与授权
|
||||
- **JWT Token**: 无状态身份验证
|
||||
- **角色权限**: 基于RBAC的权限控制
|
||||
- **路由守卫**: 前端路由级别的权限验证
|
||||
- **API中间件**: 后端接口级别的权限验证
|
||||
|
||||
### 7.2 数据安全
|
||||
- **密码加密**: bcrypt哈希加密
|
||||
- **SQL注入防护**: Sequelize ORM参数化查询
|
||||
- **XSS防护**: 前端输入验证和转义
|
||||
- **CORS配置**: 跨域请求安全控制
|
||||
|
||||
## 8. 性能优化
|
||||
### 8.1 后端性能
|
||||
- **数据库连接池**: 优化数据库连接管理
|
||||
- **查询优化**: 数据库查询性能监控
|
||||
- **API性能监控**: 接口响应时间监控
|
||||
- **内存监控**: 系统资源使用监控
|
||||
|
||||
### 8.2 前端性能
|
||||
- **组件懒加载**: 路由级别的代码分割
|
||||
- **图表优化**: ECharts按需加载
|
||||
- **状态管理**: Pinia轻量级状态管理
|
||||
- **构建优化**: Vite快速构建和热更新
|
||||
|
||||
## 9. 部署架构
|
||||
### 9.1 开发环境
|
||||
- **前端**: Vite开发服务器 (http://localhost:5300)
|
||||
- **后端**: Node.js开发服务器 (http://localhost:5350)
|
||||
- **数据库**: MySQL本地实例
|
||||
|
||||
### 9.2 生产环境建议
|
||||
- **前端**: 静态文件部署 (Nginx)
|
||||
- **后端**: PM2进程管理
|
||||
- **数据库**: MySQL主从复制
|
||||
- **负载均衡**: Nginx反向代理
|
||||
- **容器化**: Docker部署支持
|
||||
|
||||
## 10. 依赖关系
|
||||
### 10.1 后端主要依赖
|
||||
```json
|
||||
{
|
||||
"express": "^4.18.0",
|
||||
"sequelize": "^6.30.0",
|
||||
"mysql2": "^3.0.0",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"bcrypt": "^5.1.0",
|
||||
"swagger-ui-express": "^5.0.0",
|
||||
"swagger-jsdoc": "^6.2.8",
|
||||
"winston": "^3.17.0",
|
||||
"cors": "^2.8.5",
|
||||
"express-validator": "^7.2.1",
|
||||
"dotenv": "^16.0.0",
|
||||
"axios": "^1.4.0",
|
||||
"nodemon": "^3.0.0"
|
||||
}
|
||||
```
|
||||
|
||||
### 10.2 前端主要依赖
|
||||
```json
|
||||
{
|
||||
"vue": "^3.4.0",
|
||||
"vue-router": "^4.0.0",
|
||||
"pinia": "^2.0.0",
|
||||
"ant-design-vue": "^4.0.0",
|
||||
"echarts": "^5.4.0",
|
||||
"axios": "^1.11.0",
|
||||
"@vitejs/plugin-vue": "^5.0.0",
|
||||
"vite": "^5.0.0"
|
||||
}
|
||||
```
|
||||
|
||||
### 10.3 外部服务
|
||||
- **百度地图API**: 地理信息可视化服务
|
||||
- **MySQL数据库**: 数据持久化存储
|
||||
|
||||
## 11. 扩展性设计
|
||||
### 11.1 模块化架构
|
||||
- **前端组件化**: 可复用的Vue组件
|
||||
- **后端模块化**: 控制器、模型、路由分离
|
||||
- **配置外部化**: 环境变量配置管理
|
||||
|
||||
### 11.2 未来扩展方向
|
||||
- **微服务架构**: 服务拆分和独立部署
|
||||
- **消息队列**: 异步任务处理
|
||||
- **缓存系统**: Redis缓存优化
|
||||
- **实时通信**: WebSocket实时数据推送
|
||||
- **移动端支持**: 响应式设计和PWA
|
||||
|
||||
## 12. 项目特色功能
|
||||
|
||||
### 12.1 性能监控系统
|
||||
- **实时性能监控**: 监控API响应时间、系统资源使用情况
|
||||
- **性能分析图表**: 基于ECharts的性能数据可视化
|
||||
- **虚拟滚动优化**: 大数据量图表的性能优化
|
||||
- **数据库查询优化**: 查询性能监控和优化建议
|
||||
|
||||
### 12.2 地图可视化系统
|
||||
- **百度地图集成**: 农场地理位置可视化展示
|
||||
- **地图缩放演示**: 多级缩放功能演示
|
||||
- **地理信息服务**: 位置数据处理和展示
|
||||
|
||||
### 12.3 数据分析系统
|
||||
- **多维度统计**: 设备、动物、告警等多维度数据统计
|
||||
- **实时图表**: 基于ECharts的实时数据图表
|
||||
- **测试分析功能**: 专门的测试分析页面
|
||||
|
||||
### 12.4 认证与权限系统
|
||||
- **JWT无状态认证**: 基于Token的身份验证
|
||||
- **自动登录功能**: 智能的自动登录和Token验证
|
||||
- **路由权限守卫**: 前端路由级别的权限控制
|
||||
- **角色权限管理**: 基于RBAC的权限控制
|
||||
|
||||
### 12.5 开发与调试工具
|
||||
- **API调试页面**: 专门的API测试和调试页面
|
||||
- **性能测试工具**: 内置的性能测试和监控工具
|
||||
- **数据库管理脚本**: 完整的数据库管理和维护脚本
|
||||
|
||||
---
|
||||
*最后更新: 2025-01-18*
|
||||
*版本: v2.1*
|
||||
*分析基于实际代码结构*
|
||||
1779
docs/development/API接口文档.md
Normal file
1779
docs/development/API接口文档.md
Normal file
File diff suppressed because it is too large
Load Diff
599
docs/development/代码规范.md
Normal file
599
docs/development/代码规范.md
Normal file
@@ -0,0 +1,599 @@
|
||||
# 宁夏智慧养殖监管平台代码规范
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| v1.0 | 2024-01-20 | 初始版本,制定基础代码规范 | 开发团队 |
|
||||
|
||||
## 1. 概述
|
||||
|
||||
本文档规定了宁夏智慧养殖监管平台项目的代码编写规范,旨在提高代码质量、可读性和可维护性。
|
||||
|
||||
## 2. 通用规范
|
||||
|
||||
### 2.1 文件命名
|
||||
- **文件名**: 使用小写字母和连字符,如 `user-service.js`
|
||||
- **目录名**: 使用小写字母和连字符,如 `user-management`
|
||||
- **组件文件**: 使用 PascalCase,如 `UserProfile.vue`
|
||||
|
||||
### 2.2 编码格式
|
||||
- **字符编码**: UTF-8
|
||||
- **换行符**: LF (Unix)
|
||||
- **缩进**: 2个空格
|
||||
- **行尾**: 不允许有多余空格
|
||||
|
||||
### 2.3 注释规范
|
||||
```javascript
|
||||
/**
|
||||
* 函数功能描述
|
||||
* @param {string} param1 - 参数1描述
|
||||
* @param {number} param2 - 参数2描述
|
||||
* @returns {boolean} 返回值描述
|
||||
* @author 作者名
|
||||
* @since 版本号
|
||||
*/
|
||||
function exampleFunction(param1, param2) {
|
||||
// 单行注释说明
|
||||
return true;
|
||||
}
|
||||
```
|
||||
|
||||
## 3. JavaScript/Node.js 规范
|
||||
|
||||
### 3.1 变量命名
|
||||
```javascript
|
||||
// 使用 camelCase
|
||||
const userName = 'admin';
|
||||
const userAge = 25;
|
||||
|
||||
// 常量使用 UPPER_SNAKE_CASE
|
||||
const MAX_RETRY_COUNT = 3;
|
||||
const API_BASE_URL = 'https://api.example.com';
|
||||
|
||||
// 私有变量使用下划线前缀
|
||||
const _privateVariable = 'private';
|
||||
```
|
||||
|
||||
### 3.2 函数定义
|
||||
```javascript
|
||||
// 优先使用箭头函数
|
||||
const getUserInfo = (userId) => {
|
||||
return userService.findById(userId);
|
||||
};
|
||||
|
||||
// 异步函数
|
||||
const fetchUserData = async (userId) => {
|
||||
try {
|
||||
const user = await userService.findById(userId);
|
||||
return user;
|
||||
} catch (error) {
|
||||
logger.error('获取用户数据失败', error);
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### 3.3 对象和数组
|
||||
```javascript
|
||||
// 对象属性换行
|
||||
const userConfig = {
|
||||
name: 'admin',
|
||||
role: 'administrator',
|
||||
permissions: ['read', 'write', 'delete'],
|
||||
settings: {
|
||||
theme: 'dark',
|
||||
language: 'zh-CN'
|
||||
}
|
||||
};
|
||||
|
||||
// 数组解构
|
||||
const [first, second, ...rest] = items;
|
||||
|
||||
// 对象解构
|
||||
const { name, age, ...otherProps } = user;
|
||||
```
|
||||
|
||||
### 3.4 错误处理
|
||||
```javascript
|
||||
// 统一错误处理
|
||||
const handleApiError = (error) => {
|
||||
if (error.response) {
|
||||
// 服务器响应错误
|
||||
logger.error('API响应错误', {
|
||||
status: error.response.status,
|
||||
data: error.response.data
|
||||
});
|
||||
} else if (error.request) {
|
||||
// 请求发送失败
|
||||
logger.error('请求发送失败', error.request);
|
||||
} else {
|
||||
// 其他错误
|
||||
logger.error('未知错误', error.message);
|
||||
}
|
||||
throw error;
|
||||
};
|
||||
```
|
||||
|
||||
## 4. Vue.js 规范
|
||||
|
||||
### 4.1 组件命名
|
||||
```javascript
|
||||
// 组件名使用 PascalCase
|
||||
export default {
|
||||
name: 'UserProfile',
|
||||
// ...
|
||||
}
|
||||
|
||||
// 文件名: UserProfile.vue
|
||||
```
|
||||
|
||||
### 4.2 组件结构
|
||||
```vue
|
||||
<template>
|
||||
<div class="user-profile">
|
||||
<!-- 模板内容 -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
|
||||
export default {
|
||||
name: 'UserProfile',
|
||||
props: {
|
||||
userId: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
emits: ['update', 'delete'],
|
||||
setup(props, { emit }) {
|
||||
// 响应式数据
|
||||
const user = ref(null)
|
||||
|
||||
// 计算属性
|
||||
const displayName = computed(() => {
|
||||
return user.value ? user.value.name : '未知用户'
|
||||
})
|
||||
|
||||
// 方法
|
||||
const loadUser = async () => {
|
||||
try {
|
||||
user.value = await userApi.getById(props.userId)
|
||||
} catch (error) {
|
||||
console.error('加载用户失败', error)
|
||||
}
|
||||
}
|
||||
|
||||
// 生命周期
|
||||
onMounted(() => {
|
||||
loadUser()
|
||||
})
|
||||
|
||||
return {
|
||||
user,
|
||||
displayName,
|
||||
loadUser
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.user-profile {
|
||||
padding: 16px;
|
||||
}
|
||||
</style>
|
||||
```
|
||||
|
||||
### 4.3 Props 定义
|
||||
```javascript
|
||||
props: {
|
||||
// 基础类型检查
|
||||
title: String,
|
||||
count: Number,
|
||||
isActive: Boolean,
|
||||
|
||||
// 复杂类型检查
|
||||
user: {
|
||||
type: Object,
|
||||
required: true,
|
||||
validator: (value) => {
|
||||
return value && typeof value.id === 'string'
|
||||
}
|
||||
},
|
||||
|
||||
// 带默认值
|
||||
size: {
|
||||
type: String,
|
||||
default: 'medium',
|
||||
validator: (value) => {
|
||||
return ['small', 'medium', 'large'].includes(value)
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4.4 事件命名
|
||||
```javascript
|
||||
// 使用 kebab-case
|
||||
this.$emit('user-updated', userData)
|
||||
this.$emit('form-submitted', formData)
|
||||
|
||||
// 在模板中
|
||||
<UserForm @user-updated="handleUserUpdate" />
|
||||
```
|
||||
|
||||
## 5. CSS/SCSS 规范
|
||||
|
||||
### 5.1 类名命名
|
||||
```css
|
||||
/* 使用 BEM 命名法 */
|
||||
.user-profile {
|
||||
/* 块 */
|
||||
}
|
||||
|
||||
.user-profile__header {
|
||||
/* 元素 */
|
||||
}
|
||||
|
||||
.user-profile__header--large {
|
||||
/* 修饰符 */
|
||||
}
|
||||
|
||||
.user-profile__avatar {
|
||||
/* 元素 */
|
||||
}
|
||||
|
||||
.user-profile__avatar--round {
|
||||
/* 修饰符 */
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 样式组织
|
||||
```scss
|
||||
// 变量定义
|
||||
$primary-color: #1890ff;
|
||||
$success-color: #52c41a;
|
||||
$warning-color: #faad14;
|
||||
$error-color: #f5222d;
|
||||
|
||||
// 混入定义
|
||||
@mixin flex-center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
// 组件样式
|
||||
.user-profile {
|
||||
padding: 16px;
|
||||
border-radius: 4px;
|
||||
background-color: #fff;
|
||||
|
||||
&__header {
|
||||
@include flex-center;
|
||||
margin-bottom: 16px;
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
&__content {
|
||||
line-height: 1.6;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 6. API 接口规范
|
||||
|
||||
### 6.1 接口命名
|
||||
```javascript
|
||||
// RESTful API 命名
|
||||
GET /api/users // 获取用户列表
|
||||
GET /api/users/:id // 获取单个用户
|
||||
POST /api/users // 创建用户
|
||||
PUT /api/users/:id // 更新用户
|
||||
DELETE /api/users/:id // 删除用户
|
||||
|
||||
// 复杂操作使用动词
|
||||
POST /api/users/:id/reset-password // 重置密码
|
||||
POST /api/users/:id/change-status // 更改状态
|
||||
```
|
||||
|
||||
### 6.2 请求响应格式
|
||||
```javascript
|
||||
// 统一响应格式
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
// 具体数据
|
||||
},
|
||||
"timestamp": "2024-01-20T10:30:00Z"
|
||||
}
|
||||
|
||||
// 分页响应格式
|
||||
{
|
||||
"code": 200,
|
||||
"message": "获取成功",
|
||||
"data": {
|
||||
"list": [...],
|
||||
"pagination": {
|
||||
"current": 1,
|
||||
"pageSize": 10,
|
||||
"total": 100,
|
||||
"totalPages": 10
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 错误响应格式
|
||||
{
|
||||
"code": 400,
|
||||
"message": "参数错误",
|
||||
"error": {
|
||||
"field": "email",
|
||||
"reason": "邮箱格式不正确"
|
||||
},
|
||||
"timestamp": "2024-01-20T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
## 7. 数据库规范
|
||||
|
||||
### 7.1 表命名
|
||||
```sql
|
||||
-- 表名使用复数形式,下划线分隔
|
||||
users
|
||||
farm_devices
|
||||
alert_records
|
||||
user_roles
|
||||
|
||||
-- 关联表使用两个表名组合
|
||||
user_farm_bindings
|
||||
device_alert_configs
|
||||
```
|
||||
|
||||
### 7.2 字段命名
|
||||
```sql
|
||||
-- 字段名使用下划线分隔
|
||||
CREATE TABLE users (
|
||||
id VARCHAR(36) PRIMARY KEY,
|
||||
user_name VARCHAR(50) NOT NULL,
|
||||
email VARCHAR(100) UNIQUE,
|
||||
phone_number VARCHAR(20),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
is_active BOOLEAN DEFAULT TRUE
|
||||
);
|
||||
```
|
||||
|
||||
## 8. Git 提交规范
|
||||
|
||||
### 8.1 提交信息格式
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
<body>
|
||||
|
||||
<footer>
|
||||
```
|
||||
|
||||
### 8.2 类型说明
|
||||
- **feat**: 新功能
|
||||
- **fix**: 修复bug
|
||||
- **docs**: 文档更新
|
||||
- **style**: 代码格式调整
|
||||
- **refactor**: 代码重构
|
||||
- **test**: 测试相关
|
||||
- **chore**: 构建过程或辅助工具的变动
|
||||
|
||||
### 8.3 提交示例
|
||||
```
|
||||
feat(user): 添加用户头像上传功能
|
||||
|
||||
- 支持jpg、png格式图片上传
|
||||
- 添加图片压缩和裁剪功能
|
||||
- 更新用户资料页面UI
|
||||
|
||||
Closes #123
|
||||
```
|
||||
|
||||
## 9. 测试规范
|
||||
|
||||
### 9.1 单元测试
|
||||
```javascript
|
||||
// 测试文件命名: *.test.js 或 *.spec.js
|
||||
describe('UserService', () => {
|
||||
describe('getUserById', () => {
|
||||
it('应该返回正确的用户信息', async () => {
|
||||
// Arrange
|
||||
const userId = '123';
|
||||
const expectedUser = { id: '123', name: 'Test User' };
|
||||
|
||||
// Act
|
||||
const result = await userService.getUserById(userId);
|
||||
|
||||
// Assert
|
||||
expect(result).toEqual(expectedUser);
|
||||
});
|
||||
|
||||
it('用户不存在时应该抛出错误', async () => {
|
||||
// Arrange
|
||||
const userId = 'nonexistent';
|
||||
|
||||
// Act & Assert
|
||||
await expect(userService.getUserById(userId))
|
||||
.rejects.toThrow('用户不存在');
|
||||
});
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 9.2 集成测试
|
||||
```javascript
|
||||
describe('User API', () => {
|
||||
beforeEach(async () => {
|
||||
await setupTestDatabase();
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await cleanupTestDatabase();
|
||||
});
|
||||
|
||||
it('POST /api/users 应该创建新用户', async () => {
|
||||
const userData = {
|
||||
name: 'Test User',
|
||||
email: 'test@example.com'
|
||||
};
|
||||
|
||||
const response = await request(app)
|
||||
.post('/api/users')
|
||||
.send(userData)
|
||||
.expect(201);
|
||||
|
||||
expect(response.body.data).toMatchObject(userData);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 10. 性能优化规范
|
||||
|
||||
### 10.1 前端优化
|
||||
```javascript
|
||||
// 懒加载组件
|
||||
const UserProfile = () => import('./components/UserProfile.vue');
|
||||
|
||||
// 防抖处理
|
||||
import { debounce } from 'lodash-es';
|
||||
|
||||
const handleSearch = debounce((keyword) => {
|
||||
// 搜索逻辑
|
||||
}, 300);
|
||||
|
||||
// 虚拟滚动
|
||||
<VirtualList
|
||||
:items="largeDataSet"
|
||||
:item-height="50"
|
||||
:visible-count="10"
|
||||
/>
|
||||
```
|
||||
|
||||
### 10.2 后端优化
|
||||
```javascript
|
||||
// 数据库查询优化
|
||||
const users = await User.findAll({
|
||||
attributes: ['id', 'name', 'email'], // 只查询需要的字段
|
||||
include: [{
|
||||
model: Role,
|
||||
attributes: ['name']
|
||||
}],
|
||||
limit: 10,
|
||||
offset: (page - 1) * 10
|
||||
});
|
||||
|
||||
// 缓存使用
|
||||
const cacheKey = `user:${userId}`;
|
||||
let user = await redis.get(cacheKey);
|
||||
|
||||
if (!user) {
|
||||
user = await User.findById(userId);
|
||||
await redis.setex(cacheKey, 3600, JSON.stringify(user));
|
||||
} else {
|
||||
user = JSON.parse(user);
|
||||
}
|
||||
```
|
||||
|
||||
## 11. 安全规范
|
||||
|
||||
### 11.1 输入验证
|
||||
```javascript
|
||||
// 使用验证库
|
||||
const Joi = require('joi');
|
||||
|
||||
const userSchema = Joi.object({
|
||||
name: Joi.string().min(2).max(50).required(),
|
||||
email: Joi.string().email().required(),
|
||||
password: Joi.string().min(8).pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/)
|
||||
});
|
||||
|
||||
const { error, value } = userSchema.validate(req.body);
|
||||
if (error) {
|
||||
return res.status(400).json({ message: error.details[0].message });
|
||||
}
|
||||
```
|
||||
|
||||
### 11.2 SQL 注入防护
|
||||
```javascript
|
||||
// 使用参数化查询
|
||||
const user = await User.findOne({
|
||||
where: {
|
||||
email: req.body.email // Sequelize 自动转义
|
||||
}
|
||||
});
|
||||
|
||||
// 原生查询使用占位符
|
||||
const result = await sequelize.query(
|
||||
'SELECT * FROM users WHERE email = ?',
|
||||
{
|
||||
replacements: [email],
|
||||
type: QueryTypes.SELECT
|
||||
}
|
||||
);
|
||||
```
|
||||
|
||||
## 12. 代码审查清单
|
||||
|
||||
### 12.1 功能性检查
|
||||
- [ ] 功能是否按需求实现
|
||||
- [ ] 边界条件是否处理
|
||||
- [ ] 错误处理是否完善
|
||||
- [ ] 性能是否满足要求
|
||||
|
||||
### 12.2 代码质量检查
|
||||
- [ ] 命名是否清晰明确
|
||||
- [ ] 代码结构是否合理
|
||||
- [ ] 是否有重复代码
|
||||
- [ ] 注释是否充分
|
||||
|
||||
### 12.3 安全性检查
|
||||
- [ ] 输入验证是否完整
|
||||
- [ ] 权限控制是否正确
|
||||
- [ ] 敏感信息是否泄露
|
||||
- [ ] SQL注入防护是否到位
|
||||
|
||||
## 13. 工具配置
|
||||
|
||||
### 13.1 ESLint 配置
|
||||
```javascript
|
||||
// .eslintrc.js
|
||||
module.exports = {
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'@vue/eslint-config-prettier'
|
||||
],
|
||||
rules: {
|
||||
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
|
||||
'vue/multi-word-component-names': 'off'
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### 13.2 Prettier 配置
|
||||
```javascript
|
||||
// .prettierrc.js
|
||||
module.exports = {
|
||||
semi: true,
|
||||
singleQuote: true,
|
||||
tabWidth: 2,
|
||||
trailingComma: 'es5',
|
||||
printWidth: 80,
|
||||
endOfLine: 'lf'
|
||||
};
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**注意**: 本规范会根据项目发展持续更新,请团队成员定期查看最新版本。
|
||||
1322
docs/development/开发指南.md
Normal file
1322
docs/development/开发指南.md
Normal file
File diff suppressed because it is too large
Load Diff
570
docs/development/测试文档.md
Normal file
570
docs/development/测试文档.md
Normal file
@@ -0,0 +1,570 @@
|
||||
# 宁夏智慧养殖监管平台 测试文档
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 作者 | 描述 |
|
||||
|------|------|------|------|
|
||||
| v1.0 | 2025-01-20 | 测试团队 | 初始版本 |
|
||||
|
||||
## 1. 测试概述
|
||||
|
||||
### 1.1 测试目标
|
||||
|
||||
本文档旨在为宁夏智慧养殖监管平台提供全面的测试指导,确保系统的功能性、性能、安全性和可靠性满足产品需求。
|
||||
|
||||
### 1.2 测试范围
|
||||
|
||||
**包含的测试内容:**
|
||||
- 前端应用测试(Vue 3 + Vite)
|
||||
- 后端API测试(Node.js + Express)
|
||||
- 数据库测试(MySQL)
|
||||
- 小程序测试(uni-app)
|
||||
- 集成测试
|
||||
- 性能测试
|
||||
- 安全测试
|
||||
|
||||
**不包含的测试内容:**
|
||||
- 第三方服务测试(百度地图API等)
|
||||
- 硬件设备测试
|
||||
- 网络基础设施测试
|
||||
|
||||
## 2. 测试策略
|
||||
|
||||
### 2.1 测试类型
|
||||
|
||||
#### 2.1.1 单元测试
|
||||
- **目标覆盖率**: ≥80%
|
||||
- **测试框架**: Jest (后端), Vitest (前端)
|
||||
- **测试内容**: 函数、组件、工具类
|
||||
- **执行频率**: 每次代码提交
|
||||
|
||||
#### 2.1.2 集成测试
|
||||
- **测试框架**: Supertest (API), Vue Test Utils (组件)
|
||||
- **测试内容**: API接口、组件交互、数据流
|
||||
- **执行频率**: 每日构建
|
||||
|
||||
#### 2.1.3 端到端测试
|
||||
- **测试框架**: Cypress
|
||||
- **测试内容**: 完整业务流程、用户交互
|
||||
- **执行频率**: 版本发布前
|
||||
|
||||
#### 2.1.4 性能测试
|
||||
- **测试工具**: Jest (单元性能), 自定义脚本
|
||||
- **测试内容**: 响应时间、并发处理、资源使用
|
||||
- **执行频率**: 版本发布前
|
||||
|
||||
### 2.2 测试环境
|
||||
|
||||
#### 2.2.1 开发环境
|
||||
- **用途**: 开发人员自测
|
||||
- **数据**: 模拟数据
|
||||
- **配置**: 本地开发配置
|
||||
|
||||
#### 2.2.2 测试环境
|
||||
- **用途**: QA团队测试
|
||||
- **数据**: 测试数据集
|
||||
- **配置**: 接近生产环境
|
||||
|
||||
#### 2.2.3 预生产环境
|
||||
- **用途**: 用户验收测试
|
||||
- **数据**: 生产数据副本
|
||||
- **配置**: 生产环境配置
|
||||
|
||||
## 3. 测试工具和框架
|
||||
|
||||
### 3.1 后端测试工具
|
||||
|
||||
#### 3.1.1 Jest 配置
|
||||
```json
|
||||
{
|
||||
"testEnvironment": "node",
|
||||
"collectCoverageFrom": [
|
||||
"controllers/**/*.js",
|
||||
"models/**/*.js",
|
||||
"routes/**/*.js",
|
||||
"utils/**/*.js",
|
||||
"!**/node_modules/**",
|
||||
"!**/migrations/**",
|
||||
"!**/seeds/**"
|
||||
],
|
||||
"coverageDirectory": "coverage",
|
||||
"coverageReporters": ["text", "lcov", "html"]
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.1.2 Supertest API测试
|
||||
```javascript
|
||||
const request = require('supertest');
|
||||
const app = require('../app');
|
||||
|
||||
describe('API Tests', () => {
|
||||
test('GET /api/farms', async () => {
|
||||
const response = await request(app)
|
||||
.get('/api/farms')
|
||||
.expect(200);
|
||||
|
||||
expect(response.body).toHaveProperty('data');
|
||||
expect(Array.isArray(response.body.data)).toBe(true);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 3.2 前端测试工具
|
||||
|
||||
#### 3.2.1 Vitest 配置
|
||||
```typescript
|
||||
import { defineConfig } from 'vitest/config'
|
||||
import vue from '@vitejs/plugin-vue'
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [vue()],
|
||||
test: {
|
||||
environment: 'jsdom',
|
||||
coverage: {
|
||||
reporter: ['text', 'json', 'html']
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
#### 3.2.2 Vue Test Utils 组件测试
|
||||
```typescript
|
||||
import { mount } from '@vue/test-utils'
|
||||
import StatusTag from '@/components/StatusTag.vue'
|
||||
|
||||
describe('StatusTag.vue', () => {
|
||||
it('renders correctly', () => {
|
||||
const wrapper = mount(StatusTag, {
|
||||
props: {
|
||||
status: 'success',
|
||||
text: '正常'
|
||||
}
|
||||
})
|
||||
|
||||
expect(wrapper.text()).toContain('正常')
|
||||
expect(wrapper.classes()).toContain('status-success')
|
||||
})
|
||||
})
|
||||
```
|
||||
|
||||
### 3.3 小程序测试工具
|
||||
|
||||
#### 3.3.1 uni-app 测试配置
|
||||
```typescript
|
||||
// jest.config.ts
|
||||
export default {
|
||||
preset: 'ts-jest',
|
||||
testEnvironment: 'jsdom',
|
||||
moduleNameMapping: {
|
||||
'^@/(.*)$': '<rootDir>/src/$1'
|
||||
},
|
||||
transform: {
|
||||
'^.+\\.vue$': '@vue/vue3-jest'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 4. 测试用例设计
|
||||
|
||||
### 4.1 功能测试用例
|
||||
|
||||
#### 4.1.1 用户认证测试
|
||||
```javascript
|
||||
describe('用户认证', () => {
|
||||
test('正确的用户名密码应该登录成功', async () => {
|
||||
const loginData = {
|
||||
username: 'testuser',
|
||||
password: 'testpass123'
|
||||
};
|
||||
|
||||
const response = await request(app)
|
||||
.post('/api/auth/login')
|
||||
.send(loginData)
|
||||
.expect(200);
|
||||
|
||||
expect(response.body).toHaveProperty('token');
|
||||
expect(response.body.user.username).toBe('testuser');
|
||||
});
|
||||
|
||||
test('错误的密码应该返回401', async () => {
|
||||
const loginData = {
|
||||
username: 'testuser',
|
||||
password: 'wrongpass'
|
||||
};
|
||||
|
||||
await request(app)
|
||||
.post('/api/auth/login')
|
||||
.send(loginData)
|
||||
.expect(401);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
#### 4.1.2 数据CRUD测试
|
||||
```javascript
|
||||
describe('养殖场管理', () => {
|
||||
let farmId;
|
||||
|
||||
test('创建养殖场', async () => {
|
||||
const farmData = {
|
||||
name: '测试养殖场',
|
||||
location: '宁夏银川',
|
||||
type: 'cattle'
|
||||
};
|
||||
|
||||
const response = await request(app)
|
||||
.post('/api/farms')
|
||||
.send(farmData)
|
||||
.expect(201);
|
||||
|
||||
farmId = response.body.data.id;
|
||||
expect(response.body.data.name).toBe('测试养殖场');
|
||||
});
|
||||
|
||||
test('获取养殖场列表', async () => {
|
||||
const response = await request(app)
|
||||
.get('/api/farms')
|
||||
.expect(200);
|
||||
|
||||
expect(Array.isArray(response.body.data)).toBe(true);
|
||||
expect(response.body.data.length).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
test('更新养殖场信息', async () => {
|
||||
const updateData = {
|
||||
name: '更新后的养殖场'
|
||||
};
|
||||
|
||||
const response = await request(app)
|
||||
.put(`/api/farms/${farmId}`)
|
||||
.send(updateData)
|
||||
.expect(200);
|
||||
|
||||
expect(response.body.data.name).toBe('更新后的养殖场');
|
||||
});
|
||||
|
||||
test('删除养殖场', async () => {
|
||||
await request(app)
|
||||
.delete(`/api/farms/${farmId}`)
|
||||
.expect(204);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 4.2 性能测试用例
|
||||
|
||||
#### 4.2.1 响应时间测试
|
||||
```javascript
|
||||
describe('性能测试', () => {
|
||||
test('API响应时间应小于500ms', async () => {
|
||||
const startTime = Date.now();
|
||||
|
||||
await request(app)
|
||||
.get('/api/farms')
|
||||
.expect(200);
|
||||
|
||||
const responseTime = Date.now() - startTime;
|
||||
expect(responseTime).toBeLessThan(500);
|
||||
});
|
||||
|
||||
test('并发请求处理', async () => {
|
||||
const promises = [];
|
||||
|
||||
for (let i = 0; i < 10; i++) {
|
||||
promises.push(
|
||||
request(app)
|
||||
.get('/api/farms')
|
||||
.expect(200)
|
||||
);
|
||||
}
|
||||
|
||||
const results = await Promise.all(promises);
|
||||
expect(results.length).toBe(10);
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### 4.3 安全测试用例
|
||||
|
||||
#### 4.3.1 输入验证测试
|
||||
```javascript
|
||||
describe('安全测试', () => {
|
||||
test('SQL注入防护', async () => {
|
||||
const maliciousInput = {
|
||||
name: "'; DROP TABLE farms; --"
|
||||
};
|
||||
|
||||
await request(app)
|
||||
.post('/api/farms')
|
||||
.send(maliciousInput)
|
||||
.expect(400);
|
||||
});
|
||||
|
||||
test('XSS防护', async () => {
|
||||
const xssInput = {
|
||||
name: '<script>alert("xss")</script>'
|
||||
};
|
||||
|
||||
const response = await request(app)
|
||||
.post('/api/farms')
|
||||
.send(xssInput)
|
||||
.expect(201);
|
||||
|
||||
expect(response.body.data.name).not.toContain('<script>');
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## 5. 测试执行
|
||||
|
||||
### 5.1 测试命令
|
||||
|
||||
#### 5.1.1 后端测试
|
||||
```bash
|
||||
# 运行所有测试
|
||||
npm test
|
||||
|
||||
# 运行单元测试
|
||||
npm run test:unit
|
||||
|
||||
# 运行集成测试
|
||||
npm run test:integration
|
||||
|
||||
# 生成覆盖率报告
|
||||
npm run test:coverage
|
||||
|
||||
# 监听模式
|
||||
npm run test:watch
|
||||
```
|
||||
|
||||
#### 5.1.2 前端测试
|
||||
```bash
|
||||
# 运行所有测试
|
||||
npm run test
|
||||
|
||||
# 运行单元测试
|
||||
npm run test:unit
|
||||
|
||||
# 运行端到端测试
|
||||
npm run test:e2e
|
||||
|
||||
# 生成覆盖率报告
|
||||
npm run test:coverage
|
||||
```
|
||||
|
||||
#### 5.1.3 小程序测试
|
||||
```bash
|
||||
# 运行测试
|
||||
npm run test
|
||||
|
||||
# 监听模式
|
||||
npm run test:watch
|
||||
|
||||
# 覆盖率报告
|
||||
npm run test:coverage
|
||||
```
|
||||
|
||||
### 5.2 持续集成
|
||||
|
||||
#### 5.2.1 GitHub Actions 配置
|
||||
```yaml
|
||||
name: Test Suite
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: testpass
|
||||
MYSQL_DATABASE: test_db
|
||||
ports:
|
||||
- 3306:3306
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '18'
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Run tests
|
||||
run: npm test
|
||||
|
||||
- name: Upload coverage
|
||||
uses: codecov/codecov-action@v2
|
||||
```
|
||||
|
||||
## 6. 测试数据管理
|
||||
|
||||
### 6.1 测试数据准备
|
||||
|
||||
#### 6.1.1 种子数据
|
||||
```javascript
|
||||
// seeds/test-data.js
|
||||
module.exports = {
|
||||
farms: [
|
||||
{
|
||||
id: 1,
|
||||
name: '测试养殖场1',
|
||||
location: '宁夏银川',
|
||||
type: 'cattle',
|
||||
status: 'active'
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name: '测试养殖场2',
|
||||
location: '宁夏石嘴山',
|
||||
type: 'sheep',
|
||||
status: 'active'
|
||||
}
|
||||
],
|
||||
users: [
|
||||
{
|
||||
id: 1,
|
||||
username: 'testuser',
|
||||
email: 'test@example.com',
|
||||
role: 'admin'
|
||||
}
|
||||
]
|
||||
};
|
||||
```
|
||||
|
||||
#### 6.1.2 数据清理
|
||||
```javascript
|
||||
// 测试前清理数据
|
||||
beforeEach(async () => {
|
||||
await Farm.destroy({ where: {} });
|
||||
await User.destroy({ where: {} });
|
||||
});
|
||||
|
||||
// 测试后清理数据
|
||||
afterEach(async () => {
|
||||
await Farm.destroy({ where: {} });
|
||||
await User.destroy({ where: {} });
|
||||
});
|
||||
```
|
||||
|
||||
### 6.2 Mock数据
|
||||
|
||||
#### 6.2.1 API Mock
|
||||
```javascript
|
||||
// __mocks__/api.js
|
||||
export const mockFarmData = {
|
||||
id: 1,
|
||||
name: '模拟养殖场',
|
||||
location: '宁夏银川',
|
||||
animals: 100
|
||||
};
|
||||
|
||||
export const getFarms = jest.fn(() =>
|
||||
Promise.resolve({ data: [mockFarmData] })
|
||||
);
|
||||
```
|
||||
|
||||
## 7. 测试报告
|
||||
|
||||
### 7.1 覆盖率报告
|
||||
|
||||
测试覆盖率目标:
|
||||
- **整体覆盖率**: ≥80%
|
||||
- **函数覆盖率**: ≥85%
|
||||
- **分支覆盖率**: ≥75%
|
||||
- **行覆盖率**: ≥80%
|
||||
|
||||
### 7.2 测试结果分析
|
||||
|
||||
#### 7.2.1 成功标准
|
||||
- 所有测试用例通过
|
||||
- 覆盖率达到目标要求
|
||||
- 性能测试满足要求
|
||||
- 安全测试无漏洞
|
||||
|
||||
#### 7.2.2 失败处理
|
||||
- 记录失败原因
|
||||
- 分析根本原因
|
||||
- 修复问题
|
||||
- 重新执行测试
|
||||
|
||||
## 8. 最佳实践
|
||||
|
||||
### 8.1 测试编写原则
|
||||
|
||||
1. **独立性**: 测试用例之间相互独立
|
||||
2. **可重复性**: 测试结果可重复
|
||||
3. **快速执行**: 单元测试执行时间短
|
||||
4. **清晰命名**: 测试名称描述清楚
|
||||
5. **边界测试**: 包含边界值测试
|
||||
|
||||
### 8.2 测试维护
|
||||
|
||||
1. **定期更新**: 随代码变更更新测试
|
||||
2. **重构测试**: 消除重复代码
|
||||
3. **性能优化**: 提高测试执行效率
|
||||
4. **文档更新**: 保持测试文档最新
|
||||
|
||||
## 9. 故障排除
|
||||
|
||||
### 9.1 常见问题
|
||||
|
||||
#### 9.1.1 测试环境问题
|
||||
- 数据库连接失败
|
||||
- 依赖服务不可用
|
||||
- 环境变量配置错误
|
||||
|
||||
#### 9.1.2 测试用例问题
|
||||
- 异步测试超时
|
||||
- Mock数据不正确
|
||||
- 测试数据污染
|
||||
|
||||
### 9.2 解决方案
|
||||
|
||||
#### 9.2.1 环境检查
|
||||
```bash
|
||||
# 检查数据库连接
|
||||
npm run test:db-connection
|
||||
|
||||
# 检查服务状态
|
||||
npm run test:services
|
||||
|
||||
# 验证环境配置
|
||||
npm run test:config
|
||||
```
|
||||
|
||||
#### 9.2.2 调试技巧
|
||||
```javascript
|
||||
// 使用调试模式
|
||||
describe.only('特定测试', () => {
|
||||
// 只运行这个测试套件
|
||||
});
|
||||
|
||||
// 跳过测试
|
||||
test.skip('暂时跳过的测试', () => {
|
||||
// 这个测试不会执行
|
||||
});
|
||||
```
|
||||
|
||||
## 10. 联系信息
|
||||
|
||||
### 10.1 测试团队
|
||||
- **测试负责人**: 张三 (zhang.san@nxxmdata.com)
|
||||
- **自动化测试**: 李四 (li.si@nxxmdata.com)
|
||||
- **性能测试**: 王五 (wang.wu@nxxmdata.com)
|
||||
|
||||
### 10.2 支持渠道
|
||||
- **邮箱**: test-support@nxxmdata.com
|
||||
- **Slack**: #testing-support
|
||||
- **工作时间**: 周一至周五 9:00-18:00
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2025年1月20日
|
||||
**文档版本**: v1.0
|
||||
**维护团队**: 宁夏智慧养殖平台测试团队
|
||||
680
docs/development/环境配置文档.md
Normal file
680
docs/development/环境配置文档.md
Normal file
@@ -0,0 +1,680 @@
|
||||
# 宁夏智慧养殖监管平台 环境配置文档
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 作者 | 描述 |
|
||||
|------|------|------|------|
|
||||
| v1.0 | 2025-01-20 | 开发团队 | 初始版本 |
|
||||
|
||||
## 1. 环境概述
|
||||
|
||||
### 1.1 环境分类
|
||||
|
||||
本项目包含以下几种环境:
|
||||
|
||||
- **开发环境 (Development)**: 本地开发使用
|
||||
- **测试环境 (Testing)**: QA测试使用
|
||||
- **预生产环境 (Staging)**: 用户验收测试使用
|
||||
- **生产环境 (Production)**: 正式运行环境
|
||||
|
||||
### 1.2 技术栈要求
|
||||
|
||||
**基础环境:**
|
||||
- Node.js: 18.0+ (推荐 LTS 版本)
|
||||
- npm: 8.0+ 或 yarn: 1.22+ 或 pnpm: 7.0+
|
||||
- MySQL: 8.0+
|
||||
- Redis: 6.0+
|
||||
- Git: 2.25+
|
||||
|
||||
**开发工具:**
|
||||
- Visual Studio Code (推荐)
|
||||
- Postman (API测试)
|
||||
- MySQL Workbench (数据库管理)
|
||||
|
||||
## 2. 开发环境配置
|
||||
|
||||
### 2.1 Node.js 安装
|
||||
|
||||
#### 2.1.1 使用 nvm 管理 Node.js 版本
|
||||
|
||||
**macOS/Linux:**
|
||||
```bash
|
||||
# 安装 nvm
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
|
||||
|
||||
# 重启终端或执行
|
||||
source ~/.bashrc
|
||||
|
||||
# 安装并使用 Node.js 18
|
||||
nvm install 18
|
||||
nvm use 18
|
||||
nvm alias default 18
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
```bash
|
||||
# 下载并安装 nvm-windows
|
||||
# https://github.com/coreybutler/nvm-windows/releases
|
||||
|
||||
# 安装 Node.js
|
||||
nvm install 18.19.0
|
||||
nvm use 18.19.0
|
||||
```
|
||||
|
||||
#### 2.1.2 验证安装
|
||||
```bash
|
||||
node --version # 应显示 v18.x.x
|
||||
npm --version # 应显示 8.x.x 或更高
|
||||
```
|
||||
|
||||
### 2.2 数据库配置
|
||||
|
||||
#### 2.2.1 MySQL 安装
|
||||
|
||||
**macOS (使用 Homebrew):**
|
||||
```bash
|
||||
brew install mysql
|
||||
brew services start mysql
|
||||
```
|
||||
|
||||
**Ubuntu/Debian:**
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install mysql-server
|
||||
sudo systemctl start mysql
|
||||
sudo systemctl enable mysql
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
下载并安装 MySQL Community Server:
|
||||
https://dev.mysql.com/downloads/mysql/
|
||||
|
||||
#### 2.2.2 数据库初始化
|
||||
```bash
|
||||
# 登录 MySQL
|
||||
mysql -u root -p
|
||||
|
||||
# 创建数据库
|
||||
CREATE DATABASE nxxm_farming_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
# 创建用户
|
||||
CREATE USER 'nxxm_dev'@'localhost' IDENTIFIED BY 'dev_password_123';
|
||||
GRANT ALL PRIVILEGES ON nxxm_farming_dev.* TO 'nxxm_dev'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
|
||||
### 2.3 Redis 配置
|
||||
|
||||
#### 2.3.1 Redis 安装
|
||||
|
||||
**macOS:**
|
||||
```bash
|
||||
brew install redis
|
||||
brew services start redis
|
||||
```
|
||||
|
||||
**Ubuntu/Debian:**
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install redis-server
|
||||
sudo systemctl start redis-server
|
||||
sudo systemctl enable redis-server
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
下载并安装 Redis for Windows:
|
||||
https://github.com/microsoftarchive/redis/releases
|
||||
|
||||
#### 2.3.2 验证 Redis
|
||||
```bash
|
||||
redis-cli ping
|
||||
# 应返回 PONG
|
||||
```
|
||||
|
||||
### 2.4 项目配置
|
||||
|
||||
#### 2.4.1 克隆项目
|
||||
```bash
|
||||
git clone https://github.com/nxxmdata/smart-farming-platform.git
|
||||
cd smart-farming-platform
|
||||
```
|
||||
|
||||
#### 2.4.2 安装依赖
|
||||
|
||||
**后端依赖:**
|
||||
```bash
|
||||
cd backend
|
||||
npm install
|
||||
```
|
||||
|
||||
**前端依赖:**
|
||||
```bash
|
||||
cd admin-system
|
||||
npm install
|
||||
```
|
||||
|
||||
**小程序依赖:**
|
||||
```bash
|
||||
cd bank_mini_program
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 2.4.3 环境变量配置
|
||||
|
||||
**后端环境变量 (.env):**
|
||||
```bash
|
||||
# 复制环境变量模板
|
||||
cp backend/.env.example backend/.env
|
||||
|
||||
# 编辑环境变量
|
||||
vim backend/.env
|
||||
```
|
||||
|
||||
```env
|
||||
# 服务器配置
|
||||
NODE_ENV=development
|
||||
PORT=5350
|
||||
|
||||
# 数据库配置
|
||||
DB_HOST=localhost
|
||||
DB_PORT=3306
|
||||
DB_NAME=nxxm_farming_dev
|
||||
DB_USER=nxxm_dev
|
||||
DB_PASSWORD=dev_password_123
|
||||
DB_DIALECT=mysql
|
||||
|
||||
# Redis 配置
|
||||
REDIS_HOST=localhost
|
||||
REDIS_PORT=6379
|
||||
REDIS_PASSWORD=
|
||||
|
||||
# JWT 配置
|
||||
JWT_SECRET=your_jwt_secret_key_here
|
||||
JWT_EXPIRES_IN=24h
|
||||
|
||||
# 文件上传配置
|
||||
UPLOAD_PATH=./uploads
|
||||
UPLOAD_MAX_SIZE=10485760
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL=debug
|
||||
LOG_FILE=logs/app.log
|
||||
```
|
||||
|
||||
**前端环境变量 (.env.development):**
|
||||
```env
|
||||
# API 配置
|
||||
VITE_API_BASE_URL=http://localhost:5350/api
|
||||
VITE_API_TIMEOUT=10000
|
||||
|
||||
# 百度地图配置
|
||||
VITE_BAIDU_MAP_AK=your_baidu_map_ak
|
||||
|
||||
# 上传配置
|
||||
VITE_UPLOAD_URL=http://localhost:5350/api/upload
|
||||
```
|
||||
|
||||
## 3. 数据库迁移
|
||||
|
||||
### 3.1 运行迁移
|
||||
```bash
|
||||
cd backend
|
||||
npm run migrate
|
||||
```
|
||||
|
||||
### 3.2 填充种子数据
|
||||
```bash
|
||||
npm run seed
|
||||
```
|
||||
|
||||
### 3.3 重置数据库
|
||||
```bash
|
||||
npm run db:reset
|
||||
```
|
||||
|
||||
## 4. 启动项目
|
||||
|
||||
### 4.1 启动后端服务
|
||||
```bash
|
||||
cd backend
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 4.2 启动前端服务
|
||||
```bash
|
||||
cd admin-system
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### 4.3 启动小程序开发
|
||||
```bash
|
||||
cd bank_mini_program
|
||||
npm run dev:mp-weixin
|
||||
```
|
||||
|
||||
### 4.4 验证服务
|
||||
```bash
|
||||
# 检查后端服务
|
||||
curl http://localhost:5350/api/health
|
||||
|
||||
# 检查前端服务
|
||||
# 浏览器访问 http://localhost:3000
|
||||
```
|
||||
|
||||
## 5. 测试环境配置
|
||||
|
||||
### 5.1 环境变量
|
||||
|
||||
**后端测试环境 (.env.test):**
|
||||
```env
|
||||
NODE_ENV=test
|
||||
PORT=5351
|
||||
|
||||
# 测试数据库
|
||||
DB_NAME=nxxm_farming_test
|
||||
DB_USER=nxxm_test
|
||||
DB_PASSWORD=test_password_123
|
||||
|
||||
# 其他配置保持与开发环境一致
|
||||
```
|
||||
|
||||
### 5.2 测试数据库初始化
|
||||
```bash
|
||||
# 创建测试数据库
|
||||
mysql -u root -p -e "CREATE DATABASE nxxm_farming_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||
|
||||
# 运行测试迁移
|
||||
NODE_ENV=test npm run migrate
|
||||
```
|
||||
|
||||
### 5.3 运行测试
|
||||
```bash
|
||||
# 后端测试
|
||||
cd backend
|
||||
npm test
|
||||
|
||||
# 前端测试
|
||||
cd admin-system
|
||||
npm run test
|
||||
|
||||
# 小程序测试
|
||||
cd bank_mini_program
|
||||
npm test
|
||||
```
|
||||
|
||||
## 6. 生产环境配置
|
||||
|
||||
### 6.1 服务器要求
|
||||
|
||||
**最低配置:**
|
||||
- CPU: 2核
|
||||
- 内存: 4GB
|
||||
- 存储: 50GB SSD
|
||||
- 网络: 10Mbps
|
||||
|
||||
**推荐配置:**
|
||||
- CPU: 4核
|
||||
- 内存: 8GB
|
||||
- 存储: 100GB SSD
|
||||
- 网络: 100Mbps
|
||||
|
||||
### 6.2 环境变量
|
||||
|
||||
**生产环境 (.env.production):**
|
||||
```env
|
||||
NODE_ENV=production
|
||||
PORT=5350
|
||||
|
||||
# 数据库配置
|
||||
DB_HOST=your_production_db_host
|
||||
DB_PORT=3306
|
||||
DB_NAME=nxxm_farming_prod
|
||||
DB_USER=nxxm_prod
|
||||
DB_PASSWORD=your_secure_password
|
||||
|
||||
# Redis 配置
|
||||
REDIS_HOST=your_redis_host
|
||||
REDIS_PORT=6379
|
||||
REDIS_PASSWORD=your_redis_password
|
||||
|
||||
# JWT 配置
|
||||
JWT_SECRET=your_very_secure_jwt_secret
|
||||
JWT_EXPIRES_IN=24h
|
||||
|
||||
# HTTPS 配置
|
||||
HTTPS_ENABLED=true
|
||||
SSL_CERT_PATH=/path/to/cert.pem
|
||||
SSL_KEY_PATH=/path/to/key.pem
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL=info
|
||||
LOG_FILE=/var/log/nxxm-farming/app.log
|
||||
```
|
||||
|
||||
### 6.3 部署脚本
|
||||
|
||||
**部署脚本 (deploy.sh):**
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# 拉取最新代码
|
||||
git pull origin main
|
||||
|
||||
# 安装依赖
|
||||
npm ci --production
|
||||
|
||||
# 运行数据库迁移
|
||||
npm run migrate
|
||||
|
||||
# 构建前端
|
||||
cd admin-system
|
||||
npm run build
|
||||
cd ..
|
||||
|
||||
# 重启服务
|
||||
pm2 restart nxxm-farming-backend
|
||||
pm2 restart nxxm-farming-frontend
|
||||
|
||||
echo "部署完成"
|
||||
```
|
||||
|
||||
## 7. Docker 配置
|
||||
|
||||
### 7.1 Dockerfile
|
||||
|
||||
**后端 Dockerfile:**
|
||||
```dockerfile
|
||||
FROM node:18-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
|
||||
COPY . .
|
||||
|
||||
EXPOSE 5350
|
||||
|
||||
CMD ["npm", "start"]
|
||||
```
|
||||
|
||||
**前端 Dockerfile:**
|
||||
```dockerfile
|
||||
FROM node:18-alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM nginx:alpine
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
EXPOSE 80
|
||||
```
|
||||
|
||||
### 7.2 Docker Compose
|
||||
|
||||
**docker-compose.yml:**
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
backend:
|
||||
build: ./backend
|
||||
ports:
|
||||
- "5350:5350"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- DB_HOST=mysql
|
||||
- REDIS_HOST=redis
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
|
||||
frontend:
|
||||
build: ./admin-system
|
||||
ports:
|
||||
- "80:80"
|
||||
depends_on:
|
||||
- backend
|
||||
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
MYSQL_DATABASE: nxxm_farming_prod
|
||||
MYSQL_USER: nxxm_prod
|
||||
MYSQL_PASSWORD: prodpassword
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
|
||||
redis:
|
||||
image: redis:6-alpine
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
redis_data:
|
||||
```
|
||||
|
||||
## 8. 监控和日志
|
||||
|
||||
### 8.1 日志配置
|
||||
|
||||
**Winston 日志配置:**
|
||||
```javascript
|
||||
const winston = require('winston');
|
||||
|
||||
const logger = winston.createLogger({
|
||||
level: process.env.LOG_LEVEL || 'info',
|
||||
format: winston.format.combine(
|
||||
winston.format.timestamp(),
|
||||
winston.format.errors({ stack: true }),
|
||||
winston.format.json()
|
||||
),
|
||||
transports: [
|
||||
new winston.transports.File({
|
||||
filename: 'logs/error.log',
|
||||
level: 'error'
|
||||
}),
|
||||
new winston.transports.File({
|
||||
filename: 'logs/combined.log'
|
||||
})
|
||||
]
|
||||
});
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
logger.add(new winston.transports.Console({
|
||||
format: winston.format.simple()
|
||||
}));
|
||||
}
|
||||
```
|
||||
|
||||
### 8.2 健康检查
|
||||
|
||||
**健康检查端点:**
|
||||
```javascript
|
||||
app.get('/api/health', async (req, res) => {
|
||||
try {
|
||||
// 检查数据库连接
|
||||
await sequelize.authenticate();
|
||||
|
||||
// 检查 Redis 连接
|
||||
await redis.ping();
|
||||
|
||||
res.json({
|
||||
status: 'healthy',
|
||||
timestamp: new Date().toISOString(),
|
||||
services: {
|
||||
database: 'connected',
|
||||
redis: 'connected'
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
res.status(503).json({
|
||||
status: 'unhealthy',
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## 9. 故障排除
|
||||
|
||||
### 9.1 常见问题
|
||||
|
||||
#### 9.1.1 端口占用
|
||||
```bash
|
||||
# 查看端口占用
|
||||
lsof -i :5350
|
||||
|
||||
# 杀死进程
|
||||
kill -9 <PID>
|
||||
```
|
||||
|
||||
#### 9.1.2 数据库连接失败
|
||||
```bash
|
||||
# 检查 MySQL 服务状态
|
||||
sudo systemctl status mysql
|
||||
|
||||
# 重启 MySQL 服务
|
||||
sudo systemctl restart mysql
|
||||
|
||||
# 检查数据库连接
|
||||
mysql -u nxxm_dev -p -h localhost
|
||||
```
|
||||
|
||||
#### 9.1.3 Redis 连接失败
|
||||
```bash
|
||||
# 检查 Redis 服务状态
|
||||
sudo systemctl status redis
|
||||
|
||||
# 重启 Redis 服务
|
||||
sudo systemctl restart redis
|
||||
|
||||
# 测试 Redis 连接
|
||||
redis-cli ping
|
||||
```
|
||||
|
||||
### 9.2 性能优化
|
||||
|
||||
#### 9.2.1 数据库优化
|
||||
```sql
|
||||
-- 添加索引
|
||||
CREATE INDEX idx_farm_status ON farms(status);
|
||||
CREATE INDEX idx_animal_farm_id ON animals(farm_id);
|
||||
|
||||
-- 查看慢查询
|
||||
SHOW VARIABLES LIKE 'slow_query_log';
|
||||
SET GLOBAL slow_query_log = 'ON';
|
||||
```
|
||||
|
||||
#### 9.2.2 Redis 缓存优化
|
||||
```javascript
|
||||
// 缓存配置
|
||||
const redis = new Redis({
|
||||
host: process.env.REDIS_HOST,
|
||||
port: process.env.REDIS_PORT,
|
||||
maxRetriesPerRequest: 3,
|
||||
retryDelayOnFailover: 100,
|
||||
lazyConnect: true
|
||||
});
|
||||
```
|
||||
|
||||
## 10. 安全配置
|
||||
|
||||
### 10.1 HTTPS 配置
|
||||
|
||||
**Nginx HTTPS 配置:**
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name api.nxxmdata.com;
|
||||
|
||||
ssl_certificate /path/to/cert.pem;
|
||||
ssl_certificate_key /path/to/key.pem;
|
||||
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:5350;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 10.2 防火墙配置
|
||||
|
||||
**UFW 防火墙配置:**
|
||||
```bash
|
||||
# 启用防火墙
|
||||
sudo ufw enable
|
||||
|
||||
# 允许 SSH
|
||||
sudo ufw allow ssh
|
||||
|
||||
# 允许 HTTP/HTTPS
|
||||
sudo ufw allow 80
|
||||
sudo ufw allow 443
|
||||
|
||||
# 允许应用端口(仅内网)
|
||||
sudo ufw allow from 10.0.0.0/8 to any port 5350
|
||||
```
|
||||
|
||||
## 11. 备份和恢复
|
||||
|
||||
### 11.1 数据库备份
|
||||
|
||||
**自动备份脚本:**
|
||||
```bash
|
||||
#!/bin/bash
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/backup/mysql"
|
||||
DB_NAME="nxxm_farming_prod"
|
||||
|
||||
# 创建备份目录
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# 备份数据库
|
||||
mysqldump -u root -p$MYSQL_ROOT_PASSWORD $DB_NAME > $BACKUP_DIR/backup_$DATE.sql
|
||||
|
||||
# 压缩备份文件
|
||||
gzip $BACKUP_DIR/backup_$DATE.sql
|
||||
|
||||
# 删除7天前的备份
|
||||
find $BACKUP_DIR -name "backup_*.sql.gz" -mtime +7 -delete
|
||||
```
|
||||
|
||||
### 11.2 文件备份
|
||||
|
||||
**文件备份脚本:**
|
||||
```bash
|
||||
#!/bin/bash
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/backup/files"
|
||||
SOURCE_DIR="/app/uploads"
|
||||
|
||||
# 创建备份目录
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# 备份文件
|
||||
tar -czf $BACKUP_DIR/files_$DATE.tar.gz -C $SOURCE_DIR .
|
||||
|
||||
# 删除30天前的备份
|
||||
find $BACKUP_DIR -name "files_*.tar.gz" -mtime +30 -delete
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**最后更新**: 2025年1月20日
|
||||
**文档版本**: v1.0
|
||||
**维护团队**: 宁夏智慧养殖平台开发团队
|
||||
597
docs/operations/监控运维文档.md
Normal file
597
docs/operations/监控运维文档.md
Normal file
@@ -0,0 +1,597 @@
|
||||
# 宁夏智慧养殖监管平台监控运维文档
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| v1.0 | 2025-01-19 | 初始版本 | 运维团队 |
|
||||
|
||||
## 1. 监控概述
|
||||
|
||||
### 1.1 监控目标
|
||||
- 确保系统7x24小时稳定运行
|
||||
- 及时发现和处理系统异常
|
||||
- 提供性能数据支持系统优化
|
||||
- 保障用户体验和业务连续性
|
||||
|
||||
### 1.2 监控范围
|
||||
- **基础设施监控**: 服务器、网络、存储
|
||||
- **应用监控**: 后端服务、前端应用、数据库
|
||||
- **业务监控**: 关键业务指标、用户行为
|
||||
- **安全监控**: 安全事件、异常访问
|
||||
|
||||
## 2. 监控架构
|
||||
|
||||
### 2.1 监控组件
|
||||
```mermaid
|
||||
graph TB
|
||||
A[应用服务] --> B[日志收集]
|
||||
A --> C[指标收集]
|
||||
B --> D[日志分析]
|
||||
C --> E[监控平台]
|
||||
D --> F[告警系统]
|
||||
E --> F
|
||||
F --> G[运维人员]
|
||||
```
|
||||
|
||||
### 2.2 技术栈
|
||||
- **监控平台**: Prometheus + Grafana
|
||||
- **日志收集**: ELK Stack (Elasticsearch + Logstash + Kibana)
|
||||
- **告警系统**: AlertManager + 钉钉/邮件
|
||||
- **APM**: Node.js 应用性能监控
|
||||
- **健康检查**: 自定义健康检查接口
|
||||
|
||||
## 3. 基础设施监控
|
||||
|
||||
### 3.1 服务器监控
|
||||
|
||||
#### 3.1.1 监控指标
|
||||
- **CPU使用率**: 平均负载、使用率分布
|
||||
- **内存使用**: 内存使用率、可用内存
|
||||
- **磁盘空间**: 磁盘使用率、I/O性能
|
||||
- **网络流量**: 入站/出站流量、连接数
|
||||
|
||||
#### 3.1.2 告警阈值
|
||||
| 指标 | 警告阈值 | 严重阈值 | 处理方式 |
|
||||
|------|----------|----------|----------|
|
||||
| CPU使用率 | 70% | 85% | 自动扩容/人工介入 |
|
||||
| 内存使用率 | 75% | 90% | 重启服务/扩容 |
|
||||
| 磁盘使用率 | 80% | 95% | 清理日志/扩容 |
|
||||
| 网络延迟 | 100ms | 500ms | 检查网络/切换节点 |
|
||||
|
||||
### 3.2 数据库监控
|
||||
|
||||
#### 3.2.1 MySQL监控指标
|
||||
- **连接数**: 当前连接数、最大连接数
|
||||
- **查询性能**: 慢查询、QPS、TPS
|
||||
- **锁状态**: 死锁、锁等待时间
|
||||
- **复制状态**: 主从延迟、复制错误
|
||||
|
||||
#### 3.2.2 监控配置
|
||||
```sql
|
||||
-- 开启慢查询日志
|
||||
SET GLOBAL slow_query_log = 'ON';
|
||||
SET GLOBAL long_query_time = 2;
|
||||
|
||||
-- 监控连接数
|
||||
SHOW STATUS LIKE 'Threads_connected';
|
||||
SHOW STATUS LIKE 'Max_used_connections';
|
||||
|
||||
-- 监控查询性能
|
||||
SHOW STATUS LIKE 'Questions';
|
||||
SHOW STATUS LIKE 'Uptime';
|
||||
```
|
||||
|
||||
## 4. 应用监控
|
||||
|
||||
### 4.1 后端服务监控
|
||||
|
||||
#### 4.1.1 Node.js应用监控
|
||||
```javascript
|
||||
// 健康检查接口
|
||||
app.get('/health', (req, res) => {
|
||||
const healthCheck = {
|
||||
uptime: process.uptime(),
|
||||
message: 'OK',
|
||||
timestamp: Date.now(),
|
||||
memory: process.memoryUsage(),
|
||||
cpu: process.cpuUsage()
|
||||
};
|
||||
|
||||
res.status(200).json(healthCheck);
|
||||
});
|
||||
|
||||
// 性能监控中间件
|
||||
const performanceMonitor = (req, res, next) => {
|
||||
const start = Date.now();
|
||||
|
||||
res.on('finish', () => {
|
||||
const duration = Date.now() - start;
|
||||
console.log(`${req.method} ${req.path} - ${res.statusCode} - ${duration}ms`);
|
||||
});
|
||||
|
||||
next();
|
||||
};
|
||||
```
|
||||
|
||||
#### 4.1.2 关键指标
|
||||
- **响应时间**: API接口响应时间分布
|
||||
- **错误率**: HTTP错误状态码统计
|
||||
- **吞吐量**: 每秒请求数(RPS)
|
||||
- **内存使用**: 堆内存、非堆内存使用情况
|
||||
|
||||
### 4.2 前端应用监控
|
||||
|
||||
#### 4.2.1 性能监控
|
||||
```javascript
|
||||
// 页面加载性能监控
|
||||
window.addEventListener('load', () => {
|
||||
const perfData = performance.getEntriesByType('navigation')[0];
|
||||
const loadTime = perfData.loadEventEnd - perfData.fetchStart;
|
||||
|
||||
// 发送性能数据到监控系统
|
||||
sendMetrics({
|
||||
type: 'page_load',
|
||||
duration: loadTime,
|
||||
url: window.location.href
|
||||
});
|
||||
});
|
||||
|
||||
// 错误监控
|
||||
window.addEventListener('error', (event) => {
|
||||
sendError({
|
||||
message: event.error.message,
|
||||
stack: event.error.stack,
|
||||
url: window.location.href,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
#### 4.2.2 用户体验监控
|
||||
- **页面加载时间**: 首屏加载、完全加载时间
|
||||
- **JavaScript错误**: 运行时错误、资源加载错误
|
||||
- **用户行为**: 页面访问量、用户停留时间
|
||||
- **浏览器兼容性**: 不同浏览器的使用情况
|
||||
|
||||
## 5. 业务监控
|
||||
|
||||
### 5.1 关键业务指标
|
||||
|
||||
#### 5.1.1 用户相关指标
|
||||
- **注册用户数**: 日新增、月活跃用户
|
||||
- **登录成功率**: 登录成功/失败比例
|
||||
- **用户留存率**: 日留存、周留存、月留存
|
||||
|
||||
#### 5.1.2 业务功能指标
|
||||
- **养殖场管理**: 新增养殖场数量、更新频率
|
||||
- **监控数据**: 数据上报成功率、数据完整性
|
||||
- **报表生成**: 报表生成成功率、生成时间
|
||||
|
||||
### 5.2 业务告警规则
|
||||
```yaml
|
||||
# 业务告警配置示例
|
||||
alerts:
|
||||
- name: 登录失败率过高
|
||||
condition: login_failure_rate > 0.1
|
||||
duration: 5m
|
||||
severity: warning
|
||||
|
||||
- name: 数据上报中断
|
||||
condition: data_upload_count == 0
|
||||
duration: 10m
|
||||
severity: critical
|
||||
|
||||
- name: 报表生成失败
|
||||
condition: report_generation_failure_rate > 0.05
|
||||
duration: 3m
|
||||
severity: warning
|
||||
```
|
||||
|
||||
## 6. 日志管理
|
||||
|
||||
### 6.1 日志分类
|
||||
|
||||
#### 6.1.1 应用日志
|
||||
- **访问日志**: HTTP请求记录
|
||||
- **错误日志**: 应用异常和错误
|
||||
- **业务日志**: 关键业务操作记录
|
||||
- **性能日志**: 性能相关数据
|
||||
|
||||
#### 6.1.2 系统日志
|
||||
- **系统日志**: 操作系统级别日志
|
||||
- **数据库日志**: 数据库操作和错误日志
|
||||
- **安全日志**: 安全相关事件记录
|
||||
|
||||
### 6.2 日志格式规范
|
||||
```javascript
|
||||
// 统一日志格式
|
||||
const logFormat = {
|
||||
timestamp: '2025-01-19T10:30:00.000Z',
|
||||
level: 'INFO',
|
||||
service: 'backend-api',
|
||||
module: 'user-management',
|
||||
message: 'User login successful',
|
||||
userId: '12345',
|
||||
ip: '192.168.1.100',
|
||||
userAgent: 'Mozilla/5.0...',
|
||||
requestId: 'req-uuid-12345',
|
||||
duration: 150
|
||||
};
|
||||
```
|
||||
|
||||
### 6.3 日志收集配置
|
||||
```yaml
|
||||
# Logstash配置示例
|
||||
input {
|
||||
file {
|
||||
path => "/var/log/nxxmdata/*.log"
|
||||
start_position => "beginning"
|
||||
codec => json
|
||||
}
|
||||
}
|
||||
|
||||
filter {
|
||||
if [level] == "ERROR" {
|
||||
mutate {
|
||||
add_tag => ["error"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
output {
|
||||
elasticsearch {
|
||||
hosts => ["localhost:9200"]
|
||||
index => "nxxmdata-logs-%{+YYYY.MM.dd}"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 7. 告警系统
|
||||
|
||||
### 7.1 告警级别
|
||||
|
||||
#### 7.1.1 告警分级
|
||||
- **P0 - 紧急**: 系统完全不可用,需要立即处理
|
||||
- **P1 - 严重**: 核心功能异常,影响用户使用
|
||||
- **P2 - 警告**: 性能下降或非核心功能异常
|
||||
- **P3 - 信息**: 需要关注但不影响正常使用
|
||||
|
||||
#### 7.1.2 告警通知方式
|
||||
| 级别 | 通知方式 | 响应时间 |
|
||||
|------|----------|----------|
|
||||
| P0 | 电话 + 短信 + 钉钉 | 5分钟内 |
|
||||
| P1 | 短信 + 钉钉 + 邮件 | 15分钟内 |
|
||||
| P2 | 钉钉 + 邮件 | 30分钟内 |
|
||||
| P3 | 邮件 | 2小时内 |
|
||||
|
||||
### 7.2 告警规则配置
|
||||
```yaml
|
||||
# Prometheus告警规则
|
||||
groups:
|
||||
- name: system.rules
|
||||
rules:
|
||||
- alert: HighCPUUsage
|
||||
expr: cpu_usage_percent > 85
|
||||
for: 5m
|
||||
labels:
|
||||
severity: critical
|
||||
annotations:
|
||||
summary: "CPU使用率过高"
|
||||
description: "服务器CPU使用率超过85%,持续5分钟"
|
||||
|
||||
- alert: DatabaseConnectionHigh
|
||||
expr: mysql_connections_current / mysql_connections_max > 0.8
|
||||
for: 2m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
summary: "数据库连接数过高"
|
||||
description: "数据库连接数超过最大连接数的80%"
|
||||
```
|
||||
|
||||
## 8. 性能优化
|
||||
|
||||
### 8.1 性能监控指标
|
||||
|
||||
#### 8.1.1 响应时间优化
|
||||
- **API响应时间**: 目标 < 200ms
|
||||
- **数据库查询时间**: 目标 < 100ms
|
||||
- **页面加载时间**: 目标 < 3s
|
||||
|
||||
#### 8.1.2 并发性能
|
||||
- **最大并发用户数**: 1000+
|
||||
- **数据库连接池**: 合理配置连接数
|
||||
- **缓存命中率**: 目标 > 90%
|
||||
|
||||
### 8.2 优化策略
|
||||
```javascript
|
||||
// Redis缓存配置
|
||||
const redis = require('redis');
|
||||
const client = redis.createClient({
|
||||
host: 'localhost',
|
||||
port: 6379,
|
||||
retry_strategy: (options) => {
|
||||
if (options.error && options.error.code === 'ECONNREFUSED') {
|
||||
return new Error('Redis服务器拒绝连接');
|
||||
}
|
||||
if (options.total_retry_time > 1000 * 60 * 60) {
|
||||
return new Error('重试时间超时');
|
||||
}
|
||||
return Math.min(options.attempt * 100, 3000);
|
||||
}
|
||||
});
|
||||
|
||||
// 数据库连接池配置
|
||||
const pool = mysql.createPool({
|
||||
connectionLimit: 10,
|
||||
host: 'localhost',
|
||||
user: 'root',
|
||||
password: 'password',
|
||||
database: 'nxxmdata',
|
||||
acquireTimeout: 60000,
|
||||
timeout: 60000
|
||||
});
|
||||
```
|
||||
|
||||
## 9. 故障处理
|
||||
|
||||
### 9.1 故障分类
|
||||
|
||||
#### 9.1.1 常见故障类型
|
||||
- **服务不可用**: 应用崩溃、服务器宕机
|
||||
- **性能问题**: 响应慢、超时
|
||||
- **数据问题**: 数据丢失、数据不一致
|
||||
- **安全问题**: 攻击、数据泄露
|
||||
|
||||
#### 9.1.2 故障处理流程
|
||||
1. **故障发现**: 监控告警、用户反馈
|
||||
2. **故障确认**: 验证故障范围和影响
|
||||
3. **应急处理**: 快速恢复服务
|
||||
4. **根因分析**: 分析故障原因
|
||||
5. **永久修复**: 实施根本性解决方案
|
||||
6. **总结改进**: 更新监控和预防措施
|
||||
|
||||
### 9.2 应急预案
|
||||
|
||||
#### 9.2.1 服务不可用处理
|
||||
```bash
|
||||
# 检查服务状态
|
||||
systemctl status nxxmdata-backend
|
||||
systemctl status nginx
|
||||
systemctl status mysql
|
||||
|
||||
# 重启服务
|
||||
systemctl restart nxxmdata-backend
|
||||
systemctl restart nginx
|
||||
|
||||
# 检查日志
|
||||
tail -f /var/log/nxxmdata/error.log
|
||||
tail -f /var/log/nginx/error.log
|
||||
```
|
||||
|
||||
#### 9.2.2 数据库故障处理
|
||||
```bash
|
||||
# 检查数据库状态
|
||||
mysql -u root -p -e "SHOW PROCESSLIST;"
|
||||
mysql -u root -p -e "SHOW ENGINE INNODB STATUS;"
|
||||
|
||||
# 检查磁盘空间
|
||||
df -h
|
||||
du -sh /var/lib/mysql/
|
||||
|
||||
# 数据库备份恢复
|
||||
mysqldump -u root -p nxxmdata > backup.sql
|
||||
mysql -u root -p nxxmdata < backup.sql
|
||||
```
|
||||
|
||||
## 10. 运维自动化
|
||||
|
||||
### 10.1 自动化部署
|
||||
|
||||
#### 10.1.1 CI/CD流程
|
||||
```yaml
|
||||
# GitHub Actions配置
|
||||
name: Deploy to Production
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '18'
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
- name: Run tests
|
||||
run: npm test
|
||||
- name: Build application
|
||||
run: npm run build
|
||||
- name: Deploy to server
|
||||
run: |
|
||||
ssh user@server 'cd /app && git pull && npm install && pm2 restart all'
|
||||
```
|
||||
|
||||
#### 10.1.2 自动化脚本
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 自动化部署脚本
|
||||
|
||||
set -e
|
||||
|
||||
echo "开始部署..."
|
||||
|
||||
# 备份当前版本
|
||||
cp -r /app/current /app/backup/$(date +%Y%m%d_%H%M%S)
|
||||
|
||||
# 更新代码
|
||||
cd /app/current
|
||||
git pull origin main
|
||||
|
||||
# 安装依赖
|
||||
npm install --production
|
||||
|
||||
# 构建应用
|
||||
npm run build
|
||||
|
||||
# 重启服务
|
||||
pm2 restart all
|
||||
|
||||
# 健康检查
|
||||
sleep 10
|
||||
curl -f http://localhost:3000/health || exit 1
|
||||
|
||||
echo "部署完成!"
|
||||
```
|
||||
|
||||
### 10.2 自动化监控
|
||||
|
||||
#### 10.2.1 健康检查脚本
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 系统健康检查脚本
|
||||
|
||||
# 检查服务状态
|
||||
services=("nxxmdata-backend" "nginx" "mysql")
|
||||
for service in "${services[@]}"; do
|
||||
if ! systemctl is-active --quiet $service; then
|
||||
echo "警告: $service 服务未运行"
|
||||
systemctl restart $service
|
||||
fi
|
||||
done
|
||||
|
||||
# 检查磁盘空间
|
||||
disk_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
|
||||
if [ $disk_usage -gt 80 ]; then
|
||||
echo "警告: 磁盘使用率超过80%"
|
||||
# 清理日志文件
|
||||
find /var/log -name "*.log" -mtime +7 -delete
|
||||
fi
|
||||
|
||||
# 检查内存使用
|
||||
memory_usage=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')
|
||||
if [ $memory_usage -gt 85 ]; then
|
||||
echo "警告: 内存使用率超过85%"
|
||||
fi
|
||||
```
|
||||
|
||||
## 11. 备份与恢复
|
||||
|
||||
### 11.1 备份策略
|
||||
|
||||
#### 11.1.1 数据备份
|
||||
- **全量备份**: 每日凌晨2点执行
|
||||
- **增量备份**: 每4小时执行一次
|
||||
- **备份保留**: 本地保留7天,远程保留30天
|
||||
|
||||
#### 11.1.2 备份脚本
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 数据库备份脚本
|
||||
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/backup/mysql"
|
||||
DB_NAME="nxxmdata"
|
||||
|
||||
# 创建备份目录
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# 执行备份
|
||||
mysqldump -u root -p$MYSQL_PASSWORD \
|
||||
--single-transaction \
|
||||
--routines \
|
||||
--triggers \
|
||||
$DB_NAME > $BACKUP_DIR/nxxmdata_$DATE.sql
|
||||
|
||||
# 压缩备份文件
|
||||
gzip $BACKUP_DIR/nxxmdata_$DATE.sql
|
||||
|
||||
# 上传到云存储
|
||||
aws s3 cp $BACKUP_DIR/nxxmdata_$DATE.sql.gz s3://nxxmdata-backup/
|
||||
|
||||
# 清理本地旧备份
|
||||
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
|
||||
|
||||
echo "备份完成: nxxmdata_$DATE.sql.gz"
|
||||
```
|
||||
|
||||
### 11.2 恢复流程
|
||||
|
||||
#### 11.2.1 数据库恢复
|
||||
```bash
|
||||
# 停止应用服务
|
||||
systemctl stop nxxmdata-backend
|
||||
|
||||
# 恢复数据库
|
||||
gunzip -c backup_file.sql.gz | mysql -u root -p nxxmdata
|
||||
|
||||
# 验证数据完整性
|
||||
mysql -u root -p -e "SELECT COUNT(*) FROM nxxmdata.users;"
|
||||
|
||||
# 重启服务
|
||||
systemctl start nxxmdata-backend
|
||||
```
|
||||
|
||||
## 12. 安全运维
|
||||
|
||||
### 12.1 安全监控
|
||||
|
||||
#### 12.1.1 安全事件监控
|
||||
- **异常登录**: 异地登录、暴力破解
|
||||
- **SQL注入**: 恶意SQL查询检测
|
||||
- **XSS攻击**: 跨站脚本攻击检测
|
||||
- **文件上传**: 恶意文件上传检测
|
||||
|
||||
#### 12.1.2 安全日志分析
|
||||
```bash
|
||||
# 分析访问日志中的异常请求
|
||||
awk '$9 >= 400 {print $1, $7, $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
|
||||
|
||||
# 检查失败的登录尝试
|
||||
grep "authentication failure" /var/log/auth.log
|
||||
|
||||
# 监控文件系统变化
|
||||
find /app -type f -mtime -1 -ls
|
||||
```
|
||||
|
||||
### 12.2 安全加固
|
||||
|
||||
#### 12.2.1 系统安全配置
|
||||
```bash
|
||||
# 防火墙配置
|
||||
ufw enable
|
||||
ufw allow 22/tcp
|
||||
ufw allow 80/tcp
|
||||
ufw allow 443/tcp
|
||||
|
||||
# SSH安全配置
|
||||
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
|
||||
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
|
||||
systemctl restart sshd
|
||||
|
||||
# 自动安全更新
|
||||
apt install unattended-upgrades
|
||||
dpkg-reconfigure -plow unattended-upgrades
|
||||
```
|
||||
|
||||
## 13. 联系方式
|
||||
|
||||
### 13.1 运维团队
|
||||
- **运维负责人**: 张三 (zhangsan@nxxmdata.com)
|
||||
- **系统管理员**: 李四 (lisi@nxxmdata.com)
|
||||
- **安全专员**: 王五 (wangwu@nxxmdata.com)
|
||||
|
||||
### 13.2 紧急联系
|
||||
- **24小时值班电话**: 400-xxx-xxxx
|
||||
- **紧急邮箱**: emergency@nxxmdata.com
|
||||
- **钉钉群**: 宁夏智慧养殖运维群
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 本文档将根据系统运维情况定期更新
|
||||
**最后更新**: 2025-01-19
|
||||
841
docs/operations/部署文档.md
Normal file
841
docs/operations/部署文档.md
Normal file
@@ -0,0 +1,841 @@
|
||||
# 宁夏智慧养殖监管平台部署文档
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| v1.0 | 2024-01-15 | 初始版本,基础部署流程 | 开发团队 |
|
||||
| v2.0 | 2024-01-20 | 全面重构,增加多端部署和容器化支持 | 开发团队 |
|
||||
|
||||
## 1. 部署概述
|
||||
|
||||
### 1.1 部署架构
|
||||
本平台采用前后端分离架构,支持多端部署:
|
||||
- **后端服务**: Node.js + Express + MySQL
|
||||
- **管理后台**: Vue.js 3 + Ant Design Vue
|
||||
- **官网大屏**: Vue.js 3 + ECharts
|
||||
- **微信小程序**: 原生小程序开发
|
||||
- **移动端应用**: 基于 Vue.js 的响应式设计
|
||||
|
||||
### 1.2 部署环境
|
||||
- **开发环境**: 本地开发调试
|
||||
- **测试环境**: 功能测试和集成测试
|
||||
- **预生产环境**: 性能测试和用户验收
|
||||
- **生产环境**: 正式运行环境
|
||||
|
||||
## 2. 系统要求
|
||||
|
||||
### 2.1 基础要求
|
||||
- **操作系统**: Linux (推荐 Ubuntu 20.04+), CentOS 8+, macOS 11+, Windows 10+
|
||||
- **Node.js**: 18.0+ (推荐 18.17.0)
|
||||
- **MySQL**: 8.0+ (推荐 8.0.33)
|
||||
- **Redis**: 6.0+ (推荐 7.0.11)
|
||||
- **Nginx**: 1.18+ (生产环境)
|
||||
|
||||
### 2.2 硬件要求
|
||||
|
||||
#### 开发环境
|
||||
- **CPU**: 2核心
|
||||
- **内存**: 8GB RAM
|
||||
- **存储**: 50GB 可用空间
|
||||
- **网络**: 10Mbps
|
||||
|
||||
#### 生产环境
|
||||
- **CPU**: 8核心或更高
|
||||
- **内存**: 32GB RAM
|
||||
- **存储**: 500GB SSD
|
||||
- **网络**: 100Mbps 专线
|
||||
- **负载均衡**: 支持高可用部署
|
||||
|
||||
### 2.3 软件依赖
|
||||
```bash
|
||||
# 必需软件
|
||||
- Node.js 18.17.0+
|
||||
- MySQL 8.0.33+
|
||||
- Redis 7.0.11+
|
||||
- PM2 (生产环境进程管理)
|
||||
- Nginx (反向代理和静态文件服务)
|
||||
|
||||
# 可选软件
|
||||
- Docker & Docker Compose (容器化部署)
|
||||
- Git (版本控制)
|
||||
- SSL证书 (HTTPS支持)
|
||||
```
|
||||
|
||||
## 3. 环境准备
|
||||
|
||||
### 3.1 系统环境检查
|
||||
```bash
|
||||
# 检查 Node.js 版本
|
||||
node --version # 应显示 v18.17.0 或更高
|
||||
|
||||
# 检查 npm 版本
|
||||
npm --version # 应显示 9.0.0 或更高
|
||||
|
||||
# 检查 MySQL 版本
|
||||
mysql --version # 应显示 8.0.33 或更高
|
||||
|
||||
# 检查 Redis 版本
|
||||
redis-server --version # 应显示 7.0.11 或更高
|
||||
```
|
||||
|
||||
### 3.2 数据库初始化
|
||||
```sql
|
||||
-- 创建主数据库
|
||||
CREATE DATABASE nxxmdata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 创建测试数据库
|
||||
CREATE DATABASE nxxmdata_test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 创建专用用户
|
||||
CREATE USER 'nxxmdata_user'@'%' IDENTIFIED BY 'NxxmData2024!@#';
|
||||
GRANT ALL PRIVILEGES ON nxxmdata.* TO 'nxxmdata_user'@'%';
|
||||
GRANT ALL PRIVILEGES ON nxxmdata_test.* TO 'nxxmdata_user'@'%';
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
-- 优化配置
|
||||
SET GLOBAL innodb_buffer_pool_size = 2147483648; -- 2GB
|
||||
SET GLOBAL max_connections = 1000;
|
||||
SET GLOBAL query_cache_size = 268435456; -- 256MB
|
||||
```
|
||||
|
||||
### 3.3 Redis 配置
|
||||
```bash
|
||||
# Redis 配置文件 /etc/redis/redis.conf
|
||||
bind 127.0.0.1
|
||||
port 6379
|
||||
timeout 300
|
||||
tcp-keepalive 60
|
||||
maxmemory 1gb
|
||||
maxmemory-policy allkeys-lru
|
||||
save 900 1
|
||||
save 300 10
|
||||
save 60 10000
|
||||
```
|
||||
|
||||
## 4. 源码部署
|
||||
|
||||
### 4.1 获取源码
|
||||
```bash
|
||||
# 方式1: Git克隆
|
||||
git clone https://github.com/your-org/nxxmdata.git
|
||||
cd nxxmdata
|
||||
|
||||
# 方式2: 下载压缩包
|
||||
wget https://github.com/your-org/nxxmdata/archive/main.zip
|
||||
unzip main.zip
|
||||
cd nxxmdata-main
|
||||
|
||||
# 检查项目结构
|
||||
ls -la
|
||||
# 应该看到: backend/, admin-system/, website/, mini-app/, docs/
|
||||
```
|
||||
|
||||
### 4.2 后端服务部署
|
||||
|
||||
#### 4.2.1 安装依赖
|
||||
```bash
|
||||
cd backend
|
||||
npm install --production
|
||||
|
||||
# 安装全局依赖
|
||||
npm install -g pm2 nodemon
|
||||
```
|
||||
|
||||
#### 4.2.2 环境配置
|
||||
创建 `backend/.env` 文件:
|
||||
```bash
|
||||
# 应用配置
|
||||
NODE_ENV=production
|
||||
PORT=5350
|
||||
APP_NAME=宁夏智慧养殖监管平台
|
||||
|
||||
# 数据库配置
|
||||
DB_HOST=localhost
|
||||
DB_PORT=3306
|
||||
DB_NAME=nxxmdata
|
||||
DB_USER=nxxmdata_user
|
||||
DB_PASSWORD=NxxmData2024!@#
|
||||
DB_POOL_MIN=5
|
||||
DB_POOL_MAX=20
|
||||
|
||||
# Redis配置
|
||||
REDIS_HOST=localhost
|
||||
REDIS_PORT=6379
|
||||
REDIS_PASSWORD=
|
||||
REDIS_DB=0
|
||||
|
||||
# JWT配置
|
||||
JWT_SECRET=nxxmdata_jwt_secret_2024_very_secure_key
|
||||
JWT_EXPIRES_IN=24h
|
||||
JWT_REFRESH_EXPIRES_IN=7d
|
||||
|
||||
# 文件上传配置
|
||||
UPLOAD_PATH=/var/www/nxxmdata/uploads
|
||||
MAX_FILE_SIZE=10485760
|
||||
ALLOWED_FILE_TYPES=jpg,jpeg,png,gif,pdf,doc,docx,xls,xlsx
|
||||
|
||||
# 第三方服务配置
|
||||
BAIDU_MAP_AK=your_baidu_map_api_key
|
||||
WECHAT_APPID=your_wechat_appid
|
||||
WECHAT_SECRET=your_wechat_secret
|
||||
|
||||
# 邮件配置
|
||||
SMTP_HOST=smtp.qq.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=your_email@qq.com
|
||||
SMTP_PASS=your_email_password
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL=info
|
||||
LOG_PATH=/var/log/nxxmdata
|
||||
```
|
||||
|
||||
#### 4.2.3 数据库迁移
|
||||
```bash
|
||||
# 运行数据库迁移
|
||||
npm run migrate
|
||||
|
||||
# 初始化基础数据
|
||||
npm run seed
|
||||
|
||||
# 验证数据库连接
|
||||
npm run db:check
|
||||
```
|
||||
|
||||
#### 4.2.4 启动后端服务
|
||||
```bash
|
||||
# 开发环境
|
||||
npm run dev
|
||||
|
||||
# 生产环境
|
||||
npm run start
|
||||
|
||||
# 使用PM2管理进程
|
||||
pm2 start ecosystem.config.js
|
||||
pm2 save
|
||||
pm2 startup
|
||||
```
|
||||
|
||||
### 4.3 管理后台部署
|
||||
|
||||
#### 4.3.1 安装依赖
|
||||
```bash
|
||||
cd admin-system
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 4.3.2 环境配置
|
||||
创建 `admin-system/.env.production` 文件:
|
||||
```bash
|
||||
# API配置
|
||||
VITE_API_BASE_URL=https://api.nxxmdata.com
|
||||
VITE_API_TIMEOUT=30000
|
||||
|
||||
# 应用配置
|
||||
VITE_APP_TITLE=宁夏智慧养殖监管平台
|
||||
VITE_APP_VERSION=2.0.0
|
||||
VITE_APP_ENV=production
|
||||
|
||||
# 地图配置
|
||||
VITE_BAIDU_MAP_AK=your_baidu_map_api_key
|
||||
|
||||
# 文件上传配置
|
||||
VITE_UPLOAD_URL=https://api.nxxmdata.com/api/upload
|
||||
VITE_MAX_FILE_SIZE=10485760
|
||||
|
||||
# 功能开关
|
||||
VITE_ENABLE_MOCK=false
|
||||
VITE_ENABLE_DEBUG=false
|
||||
```
|
||||
|
||||
#### 4.3.3 构建和部署
|
||||
```bash
|
||||
# 构建生产版本
|
||||
npm run build
|
||||
|
||||
# 检查构建结果
|
||||
ls -la dist/
|
||||
|
||||
# 部署到Web服务器
|
||||
sudo cp -r dist/* /var/www/nxxmdata/admin/
|
||||
sudo chown -R www-data:www-data /var/www/nxxmdata/admin/
|
||||
```
|
||||
|
||||
### 4.4 官网大屏部署
|
||||
|
||||
#### 4.4.1 安装依赖
|
||||
```bash
|
||||
cd website
|
||||
npm install
|
||||
```
|
||||
|
||||
#### 4.4.2 环境配置
|
||||
创建 `website/.env.production` 文件:
|
||||
```bash
|
||||
# API配置
|
||||
VITE_API_BASE_URL=https://api.nxxmdata.com
|
||||
VITE_WS_URL=wss://api.nxxmdata.com/ws
|
||||
|
||||
# 大屏配置
|
||||
VITE_SCREEN_WIDTH=1920
|
||||
VITE_SCREEN_HEIGHT=1080
|
||||
VITE_AUTO_REFRESH_INTERVAL=30000
|
||||
|
||||
# 地图配置
|
||||
VITE_BAIDU_MAP_AK=your_baidu_map_api_key
|
||||
VITE_MAP_CENTER_LNG=106.2309
|
||||
VITE_MAP_CENTER_LAT=38.4872
|
||||
```
|
||||
|
||||
#### 4.4.3 构建和部署
|
||||
```bash
|
||||
# 构建生产版本
|
||||
npm run build
|
||||
|
||||
# 部署到Web服务器
|
||||
sudo cp -r dist/* /var/www/nxxmdata/screen/
|
||||
sudo chown -R www-data:www-data /var/www/nxxmdata/screen/
|
||||
```
|
||||
|
||||
### 4.5 微信小程序部署
|
||||
|
||||
#### 4.5.1 配置小程序
|
||||
编辑 `mini-app/project.config.json`:
|
||||
```json
|
||||
{
|
||||
"appid": "your_wechat_miniprogram_appid",
|
||||
"projectname": "宁夏智慧养殖监管平台",
|
||||
"setting": {
|
||||
"urlCheck": true,
|
||||
"es6": true,
|
||||
"enhance": true,
|
||||
"postcss": true,
|
||||
"minified": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.5.2 配置API地址
|
||||
编辑 `mini-app/config/index.js`:
|
||||
```javascript
|
||||
const config = {
|
||||
development: {
|
||||
baseURL: 'https://dev-api.nxxmdata.com'
|
||||
},
|
||||
production: {
|
||||
baseURL: 'https://api.nxxmdata.com'
|
||||
}
|
||||
}
|
||||
|
||||
export default config[process.env.NODE_ENV || 'production']
|
||||
```
|
||||
|
||||
#### 4.5.3 上传发布
|
||||
```bash
|
||||
# 使用微信开发者工具上传代码
|
||||
# 或使用命令行工具
|
||||
npm install -g miniprogram-ci
|
||||
npm run upload
|
||||
```
|
||||
|
||||
## 5. Nginx 配置
|
||||
|
||||
### 5.1 安装 Nginx
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt update
|
||||
sudo apt install nginx
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo yum install nginx
|
||||
```
|
||||
|
||||
### 5.2 配置文件
|
||||
创建 `/etc/nginx/sites-available/nxxmdata` 文件:
|
||||
```nginx
|
||||
# 管理后台配置
|
||||
server {
|
||||
listen 80;
|
||||
server_name admin.nxxmdata.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name admin.nxxmdata.com;
|
||||
|
||||
ssl_certificate /etc/ssl/certs/nxxmdata.crt;
|
||||
ssl_certificate_key /etc/ssl/private/nxxmdata.key;
|
||||
|
||||
root /var/www/nxxmdata/admin;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api {
|
||||
proxy_pass http://localhost:5350;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location /uploads {
|
||||
alias /var/www/nxxmdata/uploads;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
|
||||
# 大屏展示配置
|
||||
server {
|
||||
listen 80;
|
||||
server_name screen.nxxmdata.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name screen.nxxmdata.com;
|
||||
|
||||
ssl_certificate /etc/ssl/certs/nxxmdata.crt;
|
||||
ssl_certificate_key /etc/ssl/private/nxxmdata.key;
|
||||
|
||||
root /var/www/nxxmdata/screen;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api {
|
||||
proxy_pass http://localhost:5350;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location /ws {
|
||||
proxy_pass http://localhost:5350;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
|
||||
# API服务配置
|
||||
server {
|
||||
listen 80;
|
||||
server_name api.nxxmdata.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name api.nxxmdata.com;
|
||||
|
||||
ssl_certificate /etc/ssl/certs/nxxmdata.crt;
|
||||
ssl_certificate_key /etc/ssl/private/nxxmdata.key;
|
||||
|
||||
location / {
|
||||
proxy_pass http://localhost:5350;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# CORS配置
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
|
||||
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
|
||||
|
||||
if ($request_method = 'OPTIONS') {
|
||||
return 204;
|
||||
}
|
||||
}
|
||||
|
||||
location /uploads {
|
||||
alias /var/www/nxxmdata/uploads;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 启用配置
|
||||
```bash
|
||||
# 创建软链接
|
||||
sudo ln -s /etc/nginx/sites-available/nxxmdata /etc/nginx/sites-enabled/
|
||||
|
||||
# 测试配置
|
||||
sudo nginx -t
|
||||
|
||||
# 重启Nginx
|
||||
sudo systemctl restart nginx
|
||||
sudo systemctl enable nginx
|
||||
```
|
||||
|
||||
## 6. 容器化部署
|
||||
|
||||
### 6.1 Docker 配置
|
||||
|
||||
#### 6.1.1 后端 Dockerfile
|
||||
创建 `backend/Dockerfile`:
|
||||
```dockerfile
|
||||
FROM node:18-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
|
||||
COPY . .
|
||||
|
||||
EXPOSE 5350
|
||||
|
||||
CMD ["npm", "start"]
|
||||
```
|
||||
|
||||
#### 6.1.2 前端 Dockerfile
|
||||
创建 `admin-system/Dockerfile`:
|
||||
```dockerfile
|
||||
FROM node:18-alpine as builder
|
||||
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci
|
||||
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM nginx:alpine
|
||||
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
EXPOSE 80
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
```
|
||||
|
||||
### 6.2 Docker Compose 配置
|
||||
创建 `docker-compose.yml`:
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
container_name: nxxmdata-mysql
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: root_password
|
||||
MYSQL_DATABASE: nxxmdata
|
||||
MYSQL_USER: nxxmdata_user
|
||||
MYSQL_PASSWORD: NxxmData2024!@#
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
- ./backend/database/init.sql:/docker-entrypoint-initdb.d/init.sql
|
||||
ports:
|
||||
- "3306:3306"
|
||||
restart: unless-stopped
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
container_name: nxxmdata-redis
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
restart: unless-stopped
|
||||
|
||||
backend:
|
||||
build: ./backend
|
||||
container_name: nxxmdata-backend
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
DB_HOST: mysql
|
||||
REDIS_HOST: redis
|
||||
ports:
|
||||
- "5350:5350"
|
||||
depends_on:
|
||||
- mysql
|
||||
- redis
|
||||
volumes:
|
||||
- uploads_data:/app/uploads
|
||||
restart: unless-stopped
|
||||
|
||||
admin:
|
||||
build: ./admin-system
|
||||
container_name: nxxmdata-admin
|
||||
ports:
|
||||
- "8080:80"
|
||||
restart: unless-stopped
|
||||
|
||||
screen:
|
||||
build: ./website
|
||||
container_name: nxxmdata-screen
|
||||
ports:
|
||||
- "8081:80"
|
||||
restart: unless-stopped
|
||||
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
container_name: nxxmdata-nginx
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
|
||||
- ./nginx/ssl:/etc/ssl
|
||||
- uploads_data:/var/www/uploads
|
||||
depends_on:
|
||||
- backend
|
||||
- admin
|
||||
- screen
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
redis_data:
|
||||
uploads_data:
|
||||
```
|
||||
|
||||
### 6.3 容器部署命令
|
||||
```bash
|
||||
# 构建和启动所有服务
|
||||
docker-compose up -d
|
||||
|
||||
# 查看服务状态
|
||||
docker-compose ps
|
||||
|
||||
# 查看日志
|
||||
docker-compose logs -f backend
|
||||
|
||||
# 停止服务
|
||||
docker-compose down
|
||||
|
||||
# 更新服务
|
||||
docker-compose pull
|
||||
docker-compose up -d --force-recreate
|
||||
```
|
||||
|
||||
## 7. 生产环境优化
|
||||
|
||||
### 7.1 性能优化
|
||||
```bash
|
||||
# PM2 集群模式
|
||||
pm2 start ecosystem.config.js --env production
|
||||
|
||||
# Nginx 缓存配置
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# 数据库连接池优化
|
||||
DB_POOL_MIN=10
|
||||
DB_POOL_MAX=50
|
||||
DB_POOL_IDLE=10000
|
||||
DB_POOL_ACQUIRE=60000
|
||||
```
|
||||
|
||||
### 7.2 安全配置
|
||||
```bash
|
||||
# 防火墙配置
|
||||
sudo ufw allow 22/tcp
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw enable
|
||||
|
||||
# SSL证书配置
|
||||
sudo certbot --nginx -d admin.nxxmdata.com -d api.nxxmdata.com -d screen.nxxmdata.com
|
||||
|
||||
# 定期更新证书
|
||||
sudo crontab -e
|
||||
0 12 * * * /usr/bin/certbot renew --quiet
|
||||
```
|
||||
|
||||
### 7.3 监控配置
|
||||
```bash
|
||||
# 安装监控工具
|
||||
npm install -g pm2-logrotate
|
||||
pm2 install pm2-server-monit
|
||||
|
||||
# 日志轮转
|
||||
pm2 set pm2-logrotate:max_size 10M
|
||||
pm2 set pm2-logrotate:retain 30
|
||||
pm2 set pm2-logrotate:compress true
|
||||
```
|
||||
|
||||
## 8. 备份与恢复
|
||||
|
||||
### 8.1 数据库备份
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 创建备份脚本 /opt/nxxmdata/backup.sh
|
||||
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_DIR="/opt/nxxmdata/backups"
|
||||
DB_NAME="nxxmdata"
|
||||
DB_USER="nxxmdata_user"
|
||||
DB_PASS="NxxmData2024!@#"
|
||||
|
||||
# 创建备份目录
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# 数据库备份
|
||||
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/db_backup_$DATE.sql
|
||||
|
||||
# 文件备份
|
||||
tar -czf $BACKUP_DIR/files_backup_$DATE.tar.gz /var/www/nxxmdata/uploads
|
||||
|
||||
# 清理7天前的备份
|
||||
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
|
||||
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
|
||||
|
||||
echo "Backup completed: $DATE"
|
||||
```
|
||||
|
||||
### 8.2 自动备份
|
||||
```bash
|
||||
# 添加到crontab
|
||||
sudo crontab -e
|
||||
0 2 * * * /opt/nxxmdata/backup.sh >> /var/log/nxxmdata-backup.log 2>&1
|
||||
```
|
||||
|
||||
### 8.3 数据恢复
|
||||
```bash
|
||||
# 恢复数据库
|
||||
mysql -u nxxmdata_user -p nxxmdata < /opt/nxxmdata/backups/db_backup_20240120_020000.sql
|
||||
|
||||
# 恢复文件
|
||||
tar -xzf /opt/nxxmdata/backups/files_backup_20240120_020000.tar.gz -C /
|
||||
```
|
||||
|
||||
## 9. 故障排除
|
||||
|
||||
### 9.1 常见问题
|
||||
|
||||
#### 9.1.1 数据库连接失败
|
||||
```bash
|
||||
# 检查MySQL服务状态
|
||||
sudo systemctl status mysql
|
||||
|
||||
# 检查端口占用
|
||||
netstat -tlnp | grep 3306
|
||||
|
||||
# 检查防火墙
|
||||
sudo ufw status
|
||||
|
||||
# 测试连接
|
||||
mysql -h localhost -u nxxmdata_user -p nxxmdata
|
||||
```
|
||||
|
||||
#### 9.1.2 Node.js 服务异常
|
||||
```bash
|
||||
# 查看PM2进程状态
|
||||
pm2 status
|
||||
|
||||
# 查看应用日志
|
||||
pm2 logs backend
|
||||
|
||||
# 重启应用
|
||||
pm2 restart backend
|
||||
|
||||
# 查看系统资源
|
||||
htop
|
||||
df -h
|
||||
```
|
||||
|
||||
#### 9.1.3 Nginx 配置错误
|
||||
```bash
|
||||
# 测试配置文件
|
||||
sudo nginx -t
|
||||
|
||||
# 查看错误日志
|
||||
sudo tail -f /var/log/nginx/error.log
|
||||
|
||||
# 重新加载配置
|
||||
sudo nginx -s reload
|
||||
```
|
||||
|
||||
### 9.2 性能监控
|
||||
```bash
|
||||
# 系统监控
|
||||
htop
|
||||
iotop
|
||||
nethogs
|
||||
|
||||
# 应用监控
|
||||
pm2 monit
|
||||
|
||||
# 数据库监控
|
||||
SHOW PROCESSLIST;
|
||||
SHOW STATUS LIKE 'Threads_connected';
|
||||
```
|
||||
|
||||
## 10. 维护计划
|
||||
|
||||
### 10.1 日常维护
|
||||
- **每日**: 检查系统日志和应用状态
|
||||
- **每周**: 检查磁盘空间和数据库性能
|
||||
- **每月**: 更新系统补丁和依赖包
|
||||
- **每季度**: 性能评估和容量规划
|
||||
|
||||
### 10.2 更新流程
|
||||
```bash
|
||||
# 1. 备份当前版本
|
||||
./backup.sh
|
||||
|
||||
# 2. 下载新版本
|
||||
git pull origin main
|
||||
|
||||
# 3. 更新依赖
|
||||
cd backend && npm install
|
||||
cd ../admin-system && npm install && npm run build
|
||||
|
||||
# 4. 数据库迁移
|
||||
npm run migrate
|
||||
|
||||
# 5. 重启服务
|
||||
pm2 restart all
|
||||
|
||||
# 6. 验证功能
|
||||
curl -f http://localhost:5350/api/health
|
||||
```
|
||||
|
||||
### 10.3 回滚计划
|
||||
```bash
|
||||
# 1. 停止服务
|
||||
pm2 stop all
|
||||
|
||||
# 2. 恢复代码
|
||||
git checkout previous-stable-tag
|
||||
|
||||
# 3. 恢复数据库
|
||||
mysql -u nxxmdata_user -p nxxmdata < backup.sql
|
||||
|
||||
# 4. 重启服务
|
||||
pm2 start all
|
||||
```
|
||||
|
||||
## 11. 联系支持
|
||||
|
||||
### 11.1 技术支持
|
||||
- **邮箱**: support@nxxmdata.com
|
||||
- **电话**: 400-xxx-xxxx
|
||||
- **工作时间**: 周一至周五 9:00-18:00
|
||||
|
||||
### 11.2 紧急联系
|
||||
- **24小时热线**: 138-xxxx-xxxx
|
||||
- **微信群**: 宁夏智慧养殖技术支持群
|
||||
|
||||
---
|
||||
|
||||
**注意**: 本文档会根据系统更新持续维护,请定期查看最新版本。
|
||||
474
docs/project/项目管理文档.md
Normal file
474
docs/project/项目管理文档.md
Normal file
@@ -0,0 +1,474 @@
|
||||
# 宁夏智慧养殖监管平台项目管理文档
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| v1.0 | 2025-01-19 | 初始版本 | 项目经理 |
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
### 1.1 项目背景
|
||||
宁夏智慧养殖监管平台是一个综合性的数字化养殖监管系统,旨在通过现代信息技术提升宁夏地区养殖业的管理水平和监管效率。
|
||||
|
||||
### 1.2 项目目标
|
||||
- **业务目标**: 实现养殖全过程数字化监管
|
||||
- **技术目标**: 构建稳定、可扩展的技术平台
|
||||
- **管理目标**: 建立高效的项目管理体系
|
||||
|
||||
### 1.3 项目范围
|
||||
- 政府监管端系统
|
||||
- 保险业务管理系统
|
||||
- 银行风控管理系统
|
||||
- 官方网站和数据大屏
|
||||
- 移动端小程序矩阵
|
||||
|
||||
## 2. 项目组织架构
|
||||
|
||||
### 2.1 项目团队结构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[项目指导委员会] --> B[项目经理]
|
||||
B --> C[技术团队]
|
||||
B --> D[产品团队]
|
||||
B --> E[测试团队]
|
||||
B --> F[运维团队]
|
||||
|
||||
C --> C1[系统架构师]
|
||||
C --> C2[后端开发组]
|
||||
C --> C3[前端开发组]
|
||||
C --> C4[小程序开发组]
|
||||
|
||||
D --> D1[产品经理]
|
||||
D --> D2[UI/UX设计师]
|
||||
D --> D3[业务分析师]
|
||||
|
||||
E --> E1[测试经理]
|
||||
E --> E2[功能测试工程师]
|
||||
E --> E3[自动化测试工程师]
|
||||
|
||||
F --> F1[运维经理]
|
||||
F --> F2[系统管理员]
|
||||
F --> F3[安全专员]
|
||||
```
|
||||
|
||||
### 2.2 角色与职责
|
||||
|
||||
#### 2.2.1 项目管理层
|
||||
- **项目经理**: 整体项目协调、进度管理、风险控制
|
||||
- **技术负责人**: 技术架构设计、技术决策、代码质量把控
|
||||
- **产品经理**: 需求管理、产品规划、用户体验设计
|
||||
|
||||
#### 2.2.2 开发团队
|
||||
- **系统架构师**: 系统架构设计、技术选型、性能优化
|
||||
- **后端开发工程师**: API开发、数据库设计、业务逻辑实现
|
||||
- **前端开发工程师**: 用户界面开发、交互设计、性能优化
|
||||
- **小程序开发工程师**: 小程序开发、移动端适配
|
||||
|
||||
#### 2.2.3 质量保证团队
|
||||
- **测试经理**: 测试计划制定、测试流程管理
|
||||
- **测试工程师**: 功能测试、性能测试、安全测试
|
||||
- **运维工程师**: 环境部署、系统监控、故障处理
|
||||
|
||||
### 2.3 沟通机制
|
||||
|
||||
#### 2.3.1 定期会议
|
||||
| 会议类型 | 频率 | 参与人员 | 时长 | 目的 |
|
||||
|----------|------|----------|------|------|
|
||||
| 日常站会 | 每日 | 开发团队 | 15分钟 | 同步进度、识别阻塞 |
|
||||
| 周例会 | 每周 | 全体团队 | 1小时 | 进度汇报、问题讨论 |
|
||||
| 月度评审 | 每月 | 管理层+团队负责人 | 2小时 | 里程碑评审、风险评估 |
|
||||
| 季度规划 | 每季度 | 项目指导委员会 | 半天 | 战略规划、资源调配 |
|
||||
|
||||
#### 2.3.2 沟通工具
|
||||
- **即时通讯**: 钉钉群组
|
||||
- **项目管理**: Jira/Trello
|
||||
- **文档协作**: Confluence/飞书文档
|
||||
- **代码协作**: Git/GitHub
|
||||
|
||||
## 3. 项目计划管理
|
||||
|
||||
### 3.1 项目生命周期
|
||||
|
||||
```mermaid
|
||||
gantt
|
||||
title 宁夏智慧养殖监管平台开发计划
|
||||
dateFormat YYYY-MM-DD
|
||||
section 需求分析
|
||||
需求调研 :done, req1, 2025-01-01, 2025-01-15
|
||||
需求分析 :done, req2, 2025-01-15, 2025-01-25
|
||||
需求评审 :done, req3, 2025-01-25, 2025-01-30
|
||||
|
||||
section 设计阶段
|
||||
系统架构设计 :design1, 2025-01-30, 2025-02-10
|
||||
数据库设计 :design2, 2025-02-05, 2025-02-15
|
||||
UI/UX设计 :design3, 2025-02-10, 2025-02-25
|
||||
|
||||
section 开发阶段
|
||||
后端开发 :dev1, 2025-02-15, 2025-04-15
|
||||
前端开发 :dev2, 2025-03-01, 2025-04-20
|
||||
小程序开发 :dev3, 2025-03-15, 2025-04-25
|
||||
|
||||
section 测试阶段
|
||||
单元测试 :test1, 2025-04-01, 2025-04-30
|
||||
集成测试 :test2, 2025-04-20, 2025-05-10
|
||||
系统测试 :test3, 2025-05-01, 2025-05-20
|
||||
|
||||
section 部署上线
|
||||
预生产部署 :deploy1, 2025-05-15, 2025-05-25
|
||||
生产环境部署 :deploy2, 2025-05-25, 2025-06-01
|
||||
```
|
||||
|
||||
### 3.2 里程碑管理
|
||||
|
||||
| 里程碑 | 计划时间 | 交付物 | 成功标准 | 负责人 |
|
||||
|--------|----------|--------|----------|--------|
|
||||
| M1: 需求确认 | 2025-01-30 | PRD文档 | 需求评审通过 | 产品经理 |
|
||||
| M2: 架构设计 | 2025-02-15 | 架构文档 | 技术评审通过 | 系统架构师 |
|
||||
| M3: 数据库设计 | 2025-02-20 | 数据库设计文档 | 数据模型评审通过 | 数据库工程师 |
|
||||
| M4: 后端开发 | 2025-04-15 | 后端API服务 | API测试通过 | 后端团队负责人 |
|
||||
| M5: 前端开发 | 2025-04-20 | 前端应用 | 功能测试通过 | 前端团队负责人 |
|
||||
| M6: 小程序开发 | 2025-04-25 | 小程序应用 | 小程序审核通过 | 小程序开发负责人 |
|
||||
| M7: 系统测试 | 2025-05-20 | 测试报告 | 测试用例通过率>95% | 测试经理 |
|
||||
| M8: 生产上线 | 2025-06-01 | 生产环境 | 系统稳定运行 | 运维经理 |
|
||||
|
||||
### 3.3 任务分解结构(WBS)
|
||||
|
||||
#### 3.3.1 后端开发任务
|
||||
- **用户管理模块** (20人日)
|
||||
- 用户注册登录 (5人日)
|
||||
- 权限管理 (8人日)
|
||||
- 用户信息管理 (7人日)
|
||||
|
||||
- **养殖场管理模块** (30人日)
|
||||
- 养殖场信息管理 (10人日)
|
||||
- 地理位置服务 (8人日)
|
||||
- 档案管理 (12人日)
|
||||
|
||||
- **监控数据模块** (25人日)
|
||||
- 数据采集接口 (8人日)
|
||||
- 实时数据处理 (10人日)
|
||||
- 数据存储优化 (7人日)
|
||||
|
||||
#### 3.3.2 前端开发任务
|
||||
- **管理后台** (35人日)
|
||||
- 基础框架搭建 (8人日)
|
||||
- 用户管理界面 (10人日)
|
||||
- 数据展示界面 (12人日)
|
||||
- 报表系统 (5人日)
|
||||
|
||||
- **官方网站** (20人日)
|
||||
- 首页设计开发 (8人日)
|
||||
- 数据大屏 (12人日)
|
||||
|
||||
#### 3.3.3 小程序开发任务
|
||||
- **政府端小程序** (15人日)
|
||||
- **保险端小程序** (15人日)
|
||||
- **银行端小程序** (12人日)
|
||||
|
||||
## 4. 风险管理
|
||||
|
||||
### 4.1 风险识别与分类
|
||||
|
||||
#### 4.1.1 技术风险
|
||||
| 风险项 | 概率 | 影响 | 风险等级 | 应对策略 |
|
||||
|--------|------|------|----------|----------|
|
||||
| 第三方API不稳定 | 中 | 高 | 高 | 准备备用API,实现降级方案 |
|
||||
| 数据库性能瓶颈 | 中 | 中 | 中 | 提前性能测试,优化查询 |
|
||||
| 前端兼容性问题 | 低 | 中 | 低 | 制定浏览器支持标准 |
|
||||
| 小程序审核风险 | 中 | 中 | 中 | 提前了解审核规则 |
|
||||
|
||||
#### 4.1.2 项目风险
|
||||
| 风险项 | 概率 | 影响 | 风险等级 | 应对策略 |
|
||||
|--------|------|------|----------|----------|
|
||||
| 需求变更频繁 | 高 | 高 | 高 | 建立变更控制流程 |
|
||||
| 人员流动 | 中 | 高 | 高 | 知识传承,备用人员 |
|
||||
| 进度延期 | 中 | 中 | 中 | 缓冲时间,并行开发 |
|
||||
| 质量问题 | 低 | 高 | 中 | 完善测试体系 |
|
||||
|
||||
#### 4.1.3 业务风险
|
||||
| 风险项 | 概率 | 影响 | 风险等级 | 应对策略 |
|
||||
|--------|------|------|----------|----------|
|
||||
| 政策法规变化 | 中 | 高 | 高 | 密切关注政策动态 |
|
||||
| 用户接受度低 | 低 | 中 | 低 | 用户培训,界面优化 |
|
||||
| 竞品冲击 | 中 | 中 | 中 | 差异化功能,用户粘性 |
|
||||
|
||||
### 4.2 风险监控与应对
|
||||
|
||||
#### 4.2.1 风险监控机制
|
||||
- **周度风险评估**: 每周例会进行风险状态更新
|
||||
- **月度风险报告**: 向管理层汇报风险状况
|
||||
- **风险预警系统**: 建立风险指标监控
|
||||
|
||||
#### 4.2.2 应急预案
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[风险发生] --> B{风险等级}
|
||||
B -->|低| C[团队内部处理]
|
||||
B -->|中| D[项目经理介入]
|
||||
B -->|高| E[管理层决策]
|
||||
|
||||
C --> F[记录风险日志]
|
||||
D --> G[制定应对方案]
|
||||
E --> H[调整项目计划]
|
||||
|
||||
F --> I[风险关闭]
|
||||
G --> I
|
||||
H --> I
|
||||
```
|
||||
|
||||
## 5. 质量管理
|
||||
|
||||
### 5.1 质量标准
|
||||
|
||||
#### 5.1.1 代码质量标准
|
||||
- **代码覆盖率**: ≥80%
|
||||
- **代码审查**: 100%代码必须经过审查
|
||||
- **编码规范**: 严格遵循团队编码规范
|
||||
- **文档完整性**: API文档覆盖率100%
|
||||
|
||||
#### 5.1.2 功能质量标准
|
||||
- **功能完整性**: 100%需求功能实现
|
||||
- **用户体验**: 界面响应时间<3秒
|
||||
- **兼容性**: 支持主流浏览器和设备
|
||||
- **可用性**: 系统可用性≥99.5%
|
||||
|
||||
#### 5.1.3 性能质量标准
|
||||
- **响应时间**: API响应时间<200ms
|
||||
- **并发用户**: 支持1000+并发用户
|
||||
- **数据处理**: 支持百万级数据查询
|
||||
- **系统稳定性**: 7x24小时稳定运行
|
||||
|
||||
### 5.2 质量保证流程
|
||||
|
||||
#### 5.2.1 开发阶段质量控制
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[需求分析] --> B[设计评审]
|
||||
B --> C[编码实现]
|
||||
C --> D[代码审查]
|
||||
D --> E[单元测试]
|
||||
E --> F[集成测试]
|
||||
F --> G[系统测试]
|
||||
G --> H[用户验收]
|
||||
```
|
||||
|
||||
#### 5.2.2 质量检查点
|
||||
- **需求评审**: 确保需求完整性和可行性
|
||||
- **设计评审**: 验证技术方案合理性
|
||||
- **代码审查**: 保证代码质量和规范性
|
||||
- **测试评审**: 确保测试覆盖度和有效性
|
||||
|
||||
## 6. 沟通管理
|
||||
|
||||
### 6.1 干系人管理
|
||||
|
||||
#### 6.1.1 干系人识别
|
||||
| 干系人 | 角色 | 影响力 | 关注点 | 沟通策略 |
|
||||
|--------|------|--------|--------|----------|
|
||||
| 政府监管部门 | 最终用户 | 高 | 监管效率 | 定期演示,需求确认 |
|
||||
| 保险公司 | 业务用户 | 高 | 业务效率 | 业务流程对接 |
|
||||
| 银行机构 | 业务用户 | 高 | 风险控制 | 安全性保障 |
|
||||
| 项目投资方 | 决策者 | 高 | 投资回报 | 进度汇报,成本控制 |
|
||||
| 开发团队 | 执行者 | 中 | 技术实现 | 技术交流,问题解决 |
|
||||
|
||||
#### 6.1.2 沟通计划
|
||||
- **高层汇报**: 月度进度报告
|
||||
- **用户沟通**: 双周需求确认会议
|
||||
- **团队沟通**: 日常站会和周例会
|
||||
- **技术交流**: 技术分享和培训
|
||||
|
||||
### 6.2 信息管理
|
||||
|
||||
#### 6.2.1 文档管理
|
||||
- **文档分类**: 按模块和阶段分类管理
|
||||
- **版本控制**: Git版本控制,变更追踪
|
||||
- **访问权限**: 基于角色的文档访问控制
|
||||
- **更新机制**: 定期更新,及时同步
|
||||
|
||||
#### 6.2.2 知识管理
|
||||
- **技术知识库**: 技术方案和最佳实践
|
||||
- **业务知识库**: 业务流程和规则
|
||||
- **问题知识库**: 常见问题和解决方案
|
||||
- **培训材料**: 新人培训和技能提升
|
||||
|
||||
## 7. 成本管理
|
||||
|
||||
### 7.1 成本估算
|
||||
|
||||
#### 7.1.1 人力成本
|
||||
| 角色 | 人数 | 月薪(万元) | 项目周期(月) | 总成本(万元) |
|
||||
|------|------|------------|--------------|--------------|
|
||||
| 项目经理 | 1 | 2.5 | 6 | 15 |
|
||||
| 系统架构师 | 1 | 3.0 | 6 | 18 |
|
||||
| 后端开发 | 3 | 2.0 | 5 | 30 |
|
||||
| 前端开发 | 2 | 1.8 | 4 | 14.4 |
|
||||
| 小程序开发 | 1 | 1.5 | 3 | 4.5 |
|
||||
| 测试工程师 | 2 | 1.2 | 3 | 7.2 |
|
||||
| 运维工程师 | 1 | 1.8 | 6 | 10.8 |
|
||||
| **合计** | **11** | - | - | **99.9** |
|
||||
|
||||
#### 7.1.2 基础设施成本
|
||||
| 项目 | 规格 | 月费用(元) | 项目周期(月) | 总成本(元) |
|
||||
|------|------|------------|--------------|------------|
|
||||
| 云服务器 | 4核8G×3台 | 3000 | 12 | 36000 |
|
||||
| 数据库 | RDS高可用 | 2000 | 12 | 24000 |
|
||||
| CDN服务 | 100GB流量 | 500 | 12 | 6000 |
|
||||
| 域名SSL | 通配符证书 | 200 | 12 | 2400 |
|
||||
| 第三方服务 | 地图API等 | 1000 | 12 | 12000 |
|
||||
| **合计** | - | **6700** | - | **80400** |
|
||||
|
||||
#### 7.1.3 其他成本
|
||||
- **软件许可**: 开发工具、测试工具等 (2万元)
|
||||
- **培训费用**: 技术培训、认证等 (1万元)
|
||||
- **差旅费用**: 现场调研、部署等 (0.5万元)
|
||||
- **应急预算**: 风险应对预算 (5万元)
|
||||
|
||||
**项目总预算**: 108.44万元
|
||||
|
||||
### 7.2 成本控制
|
||||
|
||||
#### 7.2.1 成本监控
|
||||
- **月度成本报告**: 实际成本vs预算成本
|
||||
- **成本偏差分析**: 分析成本偏差原因
|
||||
- **成本预警机制**: 超预算10%触发预警
|
||||
|
||||
#### 7.2.2 成本优化
|
||||
- **资源复用**: 最大化现有资源利用
|
||||
- **云资源优化**: 按需调整云服务配置
|
||||
- **外包评估**: 评估部分工作外包可行性
|
||||
|
||||
## 8. 项目监控与控制
|
||||
|
||||
### 8.1 进度监控
|
||||
|
||||
#### 8.1.1 监控指标
|
||||
- **计划完成率**: 实际完成工作量/计划工作量
|
||||
- **里程碑达成率**: 按时完成的里程碑数量
|
||||
- **任务延期率**: 延期任务数量/总任务数量
|
||||
- **资源利用率**: 实际工作时间/计划工作时间
|
||||
|
||||
#### 8.1.2 监控工具
|
||||
- **甘特图**: 可视化项目进度
|
||||
- **燃尽图**: 跟踪剩余工作量
|
||||
- **仪表板**: 实时项目状态展示
|
||||
- **报告系统**: 自动生成进度报告
|
||||
|
||||
### 8.2 变更控制
|
||||
|
||||
#### 8.2.1 变更管理流程
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[变更请求] --> B[变更评估]
|
||||
B --> C{影响评估}
|
||||
C -->|低影响| D[项目经理审批]
|
||||
C -->|中影响| E[技术负责人审批]
|
||||
C -->|高影响| F[项目委员会审批]
|
||||
|
||||
D --> G[实施变更]
|
||||
E --> G
|
||||
F --> G
|
||||
|
||||
G --> H[更新项目文档]
|
||||
H --> I[通知相关人员]
|
||||
```
|
||||
|
||||
#### 8.2.2 变更控制委员会
|
||||
- **主席**: 项目经理
|
||||
- **成员**: 技术负责人、产品经理、用户代表
|
||||
- **职责**: 评估变更影响,决定是否批准变更
|
||||
|
||||
## 9. 项目收尾
|
||||
|
||||
### 9.1 交付管理
|
||||
|
||||
#### 9.1.1 交付清单
|
||||
- **软件系统**: 完整的应用系统
|
||||
- **技术文档**: 架构文档、API文档、部署文档
|
||||
- **用户文档**: 用户手册、操作指南
|
||||
- **培训材料**: 用户培训、管理员培训
|
||||
- **源代码**: 完整的源代码和版本历史
|
||||
|
||||
#### 9.1.2 验收标准
|
||||
- **功能验收**: 100%需求功能实现
|
||||
- **性能验收**: 满足性能指标要求
|
||||
- **安全验收**: 通过安全测试
|
||||
- **文档验收**: 文档完整性和准确性
|
||||
|
||||
### 9.2 项目总结
|
||||
|
||||
#### 9.2.1 经验教训
|
||||
- **成功经验**: 记录项目成功的关键因素
|
||||
- **失败教训**: 分析项目中的问题和改进点
|
||||
- **最佳实践**: 总结可复用的最佳实践
|
||||
- **改进建议**: 对未来项目的改进建议
|
||||
|
||||
#### 9.2.2 团队评估
|
||||
- **个人绩效**: 团队成员工作表现评估
|
||||
- **团队协作**: 团队协作效果评估
|
||||
- **技能提升**: 团队技能成长情况
|
||||
- **激励机制**: 项目奖励和认可
|
||||
|
||||
## 10. 附录
|
||||
|
||||
### 10.1 项目模板
|
||||
|
||||
#### 10.1.1 会议纪要模板
|
||||
```markdown
|
||||
# 会议纪要
|
||||
|
||||
**会议主题**:
|
||||
**会议时间**:
|
||||
**参会人员**:
|
||||
**会议主持**:
|
||||
|
||||
## 会议议程
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
|
||||
## 讨论内容
|
||||
|
||||
## 决策事项
|
||||
|
||||
## 行动计划
|
||||
| 任务 | 负责人 | 截止时间 | 状态 |
|
||||
|------|--------|----------|------|
|
||||
|
||||
## 下次会议安排
|
||||
```
|
||||
|
||||
#### 10.1.2 风险报告模板
|
||||
```markdown
|
||||
# 风险报告
|
||||
|
||||
**报告日期**:
|
||||
**报告人**:
|
||||
|
||||
## 新识别风险
|
||||
|
||||
## 风险状态更新
|
||||
|
||||
## 风险应对措施
|
||||
|
||||
## 风险趋势分析
|
||||
```
|
||||
|
||||
### 10.2 联系方式
|
||||
|
||||
#### 10.2.1 项目团队联系方式
|
||||
- **项目经理**: 张三 (zhangsan@nxxmdata.com, 138-xxxx-xxxx)
|
||||
- **技术负责人**: 李四 (lisi@nxxmdata.com, 139-xxxx-xxxx)
|
||||
- **产品经理**: 王五 (wangwu@nxxmdata.com, 137-xxxx-xxxx)
|
||||
|
||||
#### 10.2.2 紧急联系方式
|
||||
- **24小时值班**: 400-xxx-xxxx
|
||||
- **紧急邮箱**: emergency@nxxmdata.com
|
||||
- **项目群组**: 宁夏智慧养殖项目群
|
||||
|
||||
---
|
||||
|
||||
**文档维护**: 本文档将根据项目进展定期更新
|
||||
**最后更新**: 2025-01-19
|
||||
**文档状态**: 正式版本
|
||||
741
docs/requirements/PRD.md
Normal file
741
docs/requirements/PRD.md
Normal file
@@ -0,0 +1,741 @@
|
||||
# 宁夏智慧养殖监管平台产品需求文档
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 作者 | 描述 |
|
||||
|------|------|------|------|
|
||||
| v1.0 | 2025-01-18 | 产品经理 | 初始版本 |
|
||||
| v2.0 | 2025-01-19 | 产品经理 | 全面重构,增加多端支持 |
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
### 1.1 项目背景
|
||||
|
||||
宁夏回族自治区作为中国重要的畜牧业基地,养殖业在区域经济发展中占据重要地位。随着现代信息技术的快速发展和国家对食品安全、环境保护要求的不断提高,传统养殖业正面临数字化转型的迫切需求。
|
||||
|
||||
**行业痛点:**
|
||||
- 养殖过程缺乏有效监管,食品安全风险较高
|
||||
- 传统管理方式效率低下,数据记录不完整
|
||||
- 缺乏统一的信息化平台,各部门信息孤岛严重
|
||||
- 应急响应能力不足,疫情防控压力大
|
||||
- 金融保险服务与养殖业结合不够紧密
|
||||
|
||||
### 1.2 项目目标
|
||||
|
||||
**总体目标:** 构建一个现代化、智能化的养殖监管平台,实现养殖全过程数字化管理,提升监管效率,保障食品安全,促进产业升级。
|
||||
|
||||
**具体目标:**
|
||||
- 建立统一的养殖信息管理体系
|
||||
- 实现养殖环境实时监控和预警
|
||||
- 提供全程可追溯的养殖档案管理
|
||||
- 构建多部门协同的监管机制
|
||||
- 集成金融保险服务,支持产业发展
|
||||
|
||||
### 1.3 成功标准
|
||||
|
||||
**业务指标:**
|
||||
- 养殖场数字化覆盖率达到90%以上
|
||||
- 异常事件响应时间缩短至5分钟内
|
||||
- 养殖档案完整性达到95%以上
|
||||
- 用户满意度达到85%以上
|
||||
|
||||
**技术指标:**
|
||||
- 系统可用性达到99.9%
|
||||
- 接口响应时间小于500ms
|
||||
- 支持1000+并发用户访问
|
||||
- 数据准确性达到99.5%以上
|
||||
|
||||
### 1.4 范围界定
|
||||
|
||||
**本版本包含:**
|
||||
- 核心养殖监管平台(Web端)
|
||||
- 数据可视化大屏系统
|
||||
- 银行端小程序(金融服务)
|
||||
- 政府端小程序(监管服务)
|
||||
- 保险端小程序(保险服务)
|
||||
- 官方网站(信息展示)
|
||||
|
||||
**本版本不包含:**
|
||||
- 移动端原生APP(后续版本规划)
|
||||
- 人工智能预测分析(三期规划)
|
||||
- 区块链溯源功能(四期规划)
|
||||
- 国际化多语言支持(后续版本)
|
||||
|
||||
## 2. 用户角色与用例
|
||||
|
||||
### 2.1 用户角色定义
|
||||
|
||||
| 角色 | 描述 | 主要职责 | 权限范围 |
|
||||
|------|------|----------|----------|
|
||||
| **系统管理员** | 平台技术管理员 | 系统维护、用户管理、权限配置 | 全系统权限 |
|
||||
| **监管部门用户** | 政府监管人员 | 监管政策制定、数据审核、异常处理 | 监管数据查看、政策发布 |
|
||||
| **养殖场管理员** | 养殖场负责人 | 养殖场日常管理、数据录入、设备维护 | 本场数据管理权限 |
|
||||
| **养殖场员工** | 一线养殖人员 | 日常养殖操作、数据记录、设备操作 | 基础操作权限 |
|
||||
| **银行业务员** | 金融服务人员 | 贷款审批、风险评估、客户服务 | 金融数据查看权限 |
|
||||
| **保险专员** | 保险服务人员 | 保险承保、理赔处理、风险评估 | 保险相关数据权限 |
|
||||
| **技术支持** | 平台技术支持 | 系统维护、故障处理、用户培训 | 系统维护权限 |
|
||||
|
||||
### 2.2 核心用例场景
|
||||
|
||||
#### 2.2.1 养殖场管理场景
|
||||
**用例:** 新建养殖场档案
|
||||
- **参与者:** 养殖场管理员
|
||||
- **前置条件:** 用户已登录系统,具有养殖场管理权限
|
||||
- **主要流程:**
|
||||
1. 进入养殖场管理模块
|
||||
2. 填写基本信息(名称、地址、规模等)
|
||||
3. 上传相关证件和图片
|
||||
4. 设置地理围栏
|
||||
5. 配置设备信息
|
||||
6. 提交审核
|
||||
- **后置条件:** 养殖场档案创建成功,等待审核
|
||||
|
||||
#### 2.2.2 设备监控场景
|
||||
**用例:** 实时监控设备状态
|
||||
- **参与者:** 养殖场管理员、员工
|
||||
- **前置条件:** 设备已正常连接,用户有监控权限
|
||||
- **主要流程:**
|
||||
1. 进入设备监控界面
|
||||
2. 查看设备实时状态
|
||||
3. 接收异常告警
|
||||
4. 处理异常情况
|
||||
5. 记录处理结果
|
||||
- **后置条件:** 设备状态正常,异常已处理
|
||||
|
||||
#### 2.2.3 金融服务场景
|
||||
**用例:** 申请养殖贷款
|
||||
- **参与者:** 养殖场管理员、银行业务员
|
||||
- **前置条件:** 养殖场已认证,具备贷款条件
|
||||
- **主要流程:**
|
||||
1. 在银行小程序提交贷款申请
|
||||
2. 上传相关材料
|
||||
3. 系统自动评估风险
|
||||
4. 银行业务员审核
|
||||
5. 放款或拒绝
|
||||
- **后置条件:** 贷款申请处理完成
|
||||
|
||||
## 3. 功能需求
|
||||
|
||||
### 3.1 核心业务功能
|
||||
|
||||
#### 3.1.1 养殖场管理模块
|
||||
|
||||
**功能描述:** 提供养殖场全生命周期管理功能
|
||||
|
||||
**用户故事:**
|
||||
- As a 养殖场管理员, I want to 创建和管理养殖场档案, so that 可以规范化管理养殖场信息
|
||||
- As a 监管人员, I want to 查看和审核养殖场信息, so that 确保养殖场符合监管要求
|
||||
- As a 系统管理员, I want to 统计养殖场数据, so that 为决策提供数据支持
|
||||
|
||||
**验收标准:**
|
||||
```gherkin
|
||||
Given 用户是养殖场管理员
|
||||
When 用户填写完整的养殖场信息并提交
|
||||
Then 系统应该创建养殖场档案并生成唯一编号
|
||||
And 系统应该发送审核通知给监管人员
|
||||
And 养殖场状态应该设置为"待审核"
|
||||
```
|
||||
|
||||
**详细功能点:**
|
||||
- 养殖场基本信息管理(名称、地址、规模、类型等)
|
||||
- 证件管理(营业执照、养殖许可证等)
|
||||
- 地理位置标注和电子围栏设置
|
||||
- 圈舍信息管理(数量、面积、容量等)
|
||||
- 养殖场图片和视频管理
|
||||
- 审核流程管理(提交、审核、通过、拒绝)
|
||||
|
||||
#### 3.1.2 动物健康管理模块
|
||||
|
||||
**功能描述:** 提供动物全生命周期健康管理
|
||||
|
||||
**用户故事:**
|
||||
- As a 养殖场员工, I want to 记录动物健康信息, so that 及时发现和处理健康问题
|
||||
- As a 兽医, I want to 查看动物健康历史, so that 制定合适的治疗方案
|
||||
- As a 监管人员, I want to 监控疫情风险, so that 及时采取防控措施
|
||||
|
||||
**验收标准:**
|
||||
```gherkin
|
||||
Given 用户是养殖场员工
|
||||
When 用户录入动物健康检查数据
|
||||
Then 系统应该保存健康记录
|
||||
And 如果发现异常指标,系统应该自动生成告警
|
||||
And 系统应该更新动物健康状态
|
||||
```
|
||||
|
||||
**详细功能点:**
|
||||
- 动物档案管理(品种、年龄、来源、标识等)
|
||||
- 健康检查记录(体温、体重、食欲等)
|
||||
- 疫苗接种管理(疫苗类型、接种时间、有效期等)
|
||||
- 疾病诊疗记录(症状、诊断、治疗方案等)
|
||||
- 批次管理(进场、转移、出场记录)
|
||||
- 死亡和淘汰记录管理
|
||||
|
||||
#### 3.1.3 IoT设备监控模块
|
||||
|
||||
**功能描述:** 实时监控养殖环境和设备状态
|
||||
|
||||
**用户故事:**
|
||||
- As a 养殖场管理员, I want to 实时查看环境数据, so that 及时调整养殖环境
|
||||
- As a 设备维护员, I want to 监控设备运行状态, so that 预防设备故障
|
||||
- As a 系统管理员, I want to 管理设备配置, so that 确保监控系统正常运行
|
||||
|
||||
**验收标准:**
|
||||
```gherkin
|
||||
Given 设备已正常连接到系统
|
||||
When 设备传感器检测到异常数据
|
||||
Then 系统应该立即生成告警
|
||||
And 系统应该通知相关责任人
|
||||
And 系统应该记录异常事件
|
||||
```
|
||||
|
||||
**详细功能点:**
|
||||
- 环境监测(温度、湿度、氨气、二氧化碳等)
|
||||
- 设备状态监控(在线状态、运行参数、故障信息)
|
||||
- 实时数据展示(图表、仪表盘、趋势分析)
|
||||
- 告警管理(阈值设置、告警规则、通知方式)
|
||||
- 历史数据查询和分析
|
||||
- 设备远程控制(开关、参数调节等)
|
||||
|
||||
#### 3.1.4 数据可视化模块
|
||||
|
||||
**功能描述:** 提供丰富的数据分析和可视化功能
|
||||
|
||||
**用户故事:**
|
||||
- As a 管理者, I want to 查看数据统计报表, so that 了解养殖场运营状况
|
||||
- As a 决策者, I want to 分析趋势数据, so that 制定科学的管理策略
|
||||
- As a 监管人员, I want to 监控区域数据, so that 掌握整体监管情况
|
||||
|
||||
**验收标准:**
|
||||
```gherkin
|
||||
Given 用户有数据查看权限
|
||||
When 用户选择查看统计报表
|
||||
Then 系统应该展示相应的图表和数据
|
||||
And 数据应该实时更新
|
||||
And 用户应该能够导出报表
|
||||
```
|
||||
|
||||
**详细功能点:**
|
||||
- 实时数据大屏展示
|
||||
- 统计报表生成(日报、周报、月报)
|
||||
- 趋势分析图表(折线图、柱状图、饼图等)
|
||||
- 地图可视化(养殖场分布、区域统计)
|
||||
- 数据导出功能(Excel、PDF、图片)
|
||||
- 自定义报表配置
|
||||
|
||||
### 3.2 多端应用功能
|
||||
|
||||
#### 3.2.1 银行端小程序
|
||||
|
||||
**功能描述:** 为银行提供养殖业金融服务支持
|
||||
|
||||
**核心功能:**
|
||||
- 客户信息管理和风险评估
|
||||
- 贷款申请和审批流程
|
||||
- 还款管理和逾期提醒
|
||||
- 养殖数据查看和分析
|
||||
- 金融产品推荐
|
||||
|
||||
**用户故事:**
|
||||
- As a 银行业务员, I want to 查看客户养殖数据, so that 评估贷款风险
|
||||
- As a 养殖场主, I want to 在线申请贷款, so that 快速获得资金支持
|
||||
|
||||
#### 3.2.2 政府端小程序
|
||||
|
||||
**功能描述:** 为政府监管部门提供移动监管工具
|
||||
|
||||
**核心功能:**
|
||||
- 养殖场监管和检查记录
|
||||
- 政策发布和通知推送
|
||||
- 应急事件处理和上报
|
||||
- 统计数据查看和分析
|
||||
- 证件审批和管理
|
||||
|
||||
**用户故事:**
|
||||
- As a 监管人员, I want to 移动端查看监管数据, so that 随时掌握监管情况
|
||||
- As a 政策制定者, I want to 发布政策通知, so that 及时传达政策信息
|
||||
|
||||
#### 3.2.3 保险端小程序
|
||||
|
||||
**功能描述:** 为保险公司提供养殖保险服务支持
|
||||
|
||||
**核心功能:**
|
||||
- 保险产品展示和销售
|
||||
- 投保申请和承保管理
|
||||
- 理赔申请和处理流程
|
||||
- 风险评估和定价
|
||||
- 客户服务和咨询
|
||||
|
||||
**用户故事:**
|
||||
- As a 保险专员, I want to 评估养殖风险, so that 制定合理的保险方案
|
||||
- As a 养殖场主, I want to 在线申请理赔, so that 快速获得理赔服务
|
||||
|
||||
## 4. 非功能需求
|
||||
|
||||
### 4.1 性能需求
|
||||
|
||||
**响应时间要求:**
|
||||
- 页面加载时间:≤ 3秒
|
||||
- API接口响应时间:≤ 500ms
|
||||
- 数据库查询时间:≤ 200ms
|
||||
- 大屏数据刷新间隔:≤ 5秒
|
||||
|
||||
**并发性能要求:**
|
||||
- 支持1000+并发用户访问
|
||||
- 支持10000+设备同时在线
|
||||
- 支持100万+历史数据查询
|
||||
- 峰值QPS:1000+
|
||||
|
||||
**吞吐量要求:**
|
||||
- 数据处理能力:10000条/秒
|
||||
- 文件上传速度:≥ 1MB/s
|
||||
- 数据导出速度:≥ 500KB/s
|
||||
|
||||
### 4.2 可靠性需求
|
||||
|
||||
**可用性要求:**
|
||||
- 系统可用性:99.9%
|
||||
- 计划内停机时间:≤ 4小时/月
|
||||
- 故障恢复时间:≤ 30分钟
|
||||
- 数据备份频率:每日备份
|
||||
|
||||
**容错性要求:**
|
||||
- 支持服务降级和熔断
|
||||
- 支持数据库主从切换
|
||||
- 支持负载均衡和故障转移
|
||||
- 支持异常情况下的数据恢复
|
||||
|
||||
### 4.3 安全性需求
|
||||
|
||||
**身份认证:**
|
||||
- 支持多因子认证(MFA)
|
||||
- 密码复杂度要求
|
||||
- 登录失败锁定机制
|
||||
- 会话超时管理
|
||||
|
||||
**数据安全:**
|
||||
- 敏感数据加密存储
|
||||
- 数据传输加密(HTTPS/TLS)
|
||||
- 数据访问权限控制
|
||||
- 数据脱敏和匿名化
|
||||
|
||||
**系统安全:**
|
||||
- SQL注入防护
|
||||
- XSS攻击防护
|
||||
- CSRF攻击防护
|
||||
- API访问频率限制
|
||||
|
||||
### 4.4 可扩展性需求
|
||||
|
||||
**水平扩展:**
|
||||
- 支持微服务架构改造
|
||||
- 支持容器化部署
|
||||
- 支持云原生架构
|
||||
- 支持多数据中心部署
|
||||
|
||||
**功能扩展:**
|
||||
- 支持插件化架构
|
||||
- 支持第三方系统集成
|
||||
- 支持多租户模式
|
||||
- 支持国际化扩展
|
||||
|
||||
## 5. 技术约束
|
||||
|
||||
### 5.1 技术栈要求
|
||||
|
||||
**后端技术栈:**
|
||||
- 运行环境:Node.js 16.20.2+
|
||||
- Web框架:Express.js 4.18+
|
||||
- 数据库:MySQL 8.0+
|
||||
- ORM框架:Sequelize 6.0+
|
||||
- 缓存:Redis 6.0+
|
||||
|
||||
**前端技术栈:**
|
||||
- 框架:Vue 3.4+ + Vite
|
||||
- UI组件库:Ant Design Vue 4.0+
|
||||
- 状态管理:Pinia 2.1+
|
||||
- 图表库:ECharts 5.4+
|
||||
- 地图服务:百度地图API
|
||||
|
||||
**小程序技术栈:**
|
||||
- 框架:uni-app 3.0+
|
||||
- UI组件库:uni-ui
|
||||
- 状态管理:Pinia
|
||||
- HTTP客户端:uni.request
|
||||
|
||||
### 5.2 部署环境要求
|
||||
|
||||
**硬件要求:**
|
||||
- CPU:8核心以上
|
||||
- 内存:16GB以上
|
||||
- 存储:500GB SSD以上
|
||||
- 网络:千兆网络
|
||||
|
||||
**软件环境:**
|
||||
- 操作系统:Ubuntu 20.04 LTS / CentOS 8
|
||||
- 容器:Docker 20.10+
|
||||
- 反向代理:Nginx 1.20+
|
||||
- 进程管理:PM2 5.0+
|
||||
|
||||
### 5.3 第三方服务依赖
|
||||
|
||||
**地图服务:**
|
||||
- 百度地图API(主要)
|
||||
- 高德地图API(备用)
|
||||
|
||||
**消息推送:**
|
||||
- 微信公众号推送
|
||||
- 短信服务(阿里云)
|
||||
- 邮件服务(腾讯企业邮)
|
||||
|
||||
**文件存储:**
|
||||
- 阿里云OSS(主要)
|
||||
- 腾讯云COS(备用)
|
||||
|
||||
## 6. 数据模型设计
|
||||
|
||||
### 6.1 核心实体关系
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
Farm ||--o{ Animal : contains
|
||||
Farm ||--o{ Device : has
|
||||
Farm ||--o{ Pen : includes
|
||||
Farm ||--o{ User : manages
|
||||
Animal }o--|| CattleType : belongs_to
|
||||
Animal }o--|| CattleBatch : belongs_to
|
||||
Device ||--o{ SensorData : generates
|
||||
Device ||--o{ Alert : triggers
|
||||
User }o--|| Role : has
|
||||
Order ||--o{ OrderItem : contains
|
||||
Product ||--o{ OrderItem : includes
|
||||
```
|
||||
|
||||
### 6.2 主要数据表
|
||||
|
||||
#### 6.2.1 养殖场表 (farms)
|
||||
| 字段名 | 类型 | 长度 | 必填 | 说明 |
|
||||
|--------|------|------|------|------|
|
||||
| id | INT | - | 是 | 主键ID |
|
||||
| name | VARCHAR | 100 | 是 | 养殖场名称 |
|
||||
| address | VARCHAR | 200 | 是 | 详细地址 |
|
||||
| latitude | DECIMAL | 10,8 | 否 | 纬度 |
|
||||
| longitude | DECIMAL | 11,8 | 否 | 经度 |
|
||||
| scale | ENUM | - | 是 | 规模(小型/中型/大型) |
|
||||
| type | VARCHAR | 50 | 是 | 养殖类型 |
|
||||
| status | ENUM | - | 是 | 状态(正常/停用/审核中) |
|
||||
| created_at | TIMESTAMP | - | 是 | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | 是 | 更新时间 |
|
||||
|
||||
#### 6.2.2 动物表 (animals)
|
||||
| 字段名 | 类型 | 长度 | 必填 | 说明 |
|
||||
|--------|------|------|------|------|
|
||||
| id | INT | - | 是 | 主键ID |
|
||||
| farm_id | INT | - | 是 | 养殖场ID |
|
||||
| ear_tag | VARCHAR | 50 | 是 | 耳标号 |
|
||||
| breed | VARCHAR | 50 | 是 | 品种 |
|
||||
| gender | ENUM | - | 是 | 性别 |
|
||||
| birth_date | DATE | - | 否 | 出生日期 |
|
||||
| weight | DECIMAL | 8,2 | 否 | 体重(kg) |
|
||||
| health_status | ENUM | - | 是 | 健康状态 |
|
||||
| created_at | TIMESTAMP | - | 是 | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | 是 | 更新时间 |
|
||||
|
||||
#### 6.2.3 设备表 (devices)
|
||||
| 字段名 | 类型 | 长度 | 必填 | 说明 |
|
||||
|--------|------|------|------|------|
|
||||
| id | INT | - | 是 | 主键ID |
|
||||
| farm_id | INT | - | 是 | 养殖场ID |
|
||||
| device_id | VARCHAR | 100 | 是 | 设备编号 |
|
||||
| device_name | VARCHAR | 100 | 是 | 设备名称 |
|
||||
| device_type | VARCHAR | 50 | 是 | 设备类型 |
|
||||
| location | VARCHAR | 100 | 否 | 安装位置 |
|
||||
| status | ENUM | - | 是 | 设备状态 |
|
||||
| last_online | TIMESTAMP | - | 否 | 最后在线时间 |
|
||||
| created_at | TIMESTAMP | - | 是 | 创建时间 |
|
||||
| updated_at | TIMESTAMP | - | 是 | 更新时间 |
|
||||
|
||||
## 7. API设计规范
|
||||
|
||||
### 7.1 API设计原则
|
||||
|
||||
**RESTful设计:**
|
||||
- 使用标准HTTP方法(GET、POST、PUT、DELETE)
|
||||
- 资源导向的URL设计
|
||||
- 统一的响应格式
|
||||
- 合理的HTTP状态码使用
|
||||
|
||||
**版本控制:**
|
||||
- URL路径版本控制:`/api/v1/`
|
||||
- 向后兼容性保证
|
||||
- 版本废弃通知机制
|
||||
|
||||
**安全性:**
|
||||
- JWT Token认证
|
||||
- API访问频率限制
|
||||
- 请求参数验证
|
||||
- 响应数据脱敏
|
||||
|
||||
### 7.2 核心API接口
|
||||
|
||||
#### 7.2.1 认证相关API
|
||||
```
|
||||
POST /api/v1/auth/login # 用户登录
|
||||
POST /api/v1/auth/logout # 用户登出
|
||||
POST /api/v1/auth/refresh # 刷新Token
|
||||
GET /api/v1/auth/profile # 获取用户信息
|
||||
PUT /api/v1/auth/profile # 更新用户信息
|
||||
POST /api/v1/auth/change-password # 修改密码
|
||||
```
|
||||
|
||||
#### 7.2.2 养殖场管理API
|
||||
```
|
||||
GET /api/v1/farms # 获取养殖场列表
|
||||
GET /api/v1/farms/{id} # 获取养殖场详情
|
||||
POST /api/v1/farms # 创建养殖场
|
||||
PUT /api/v1/farms/{id} # 更新养殖场信息
|
||||
DELETE /api/v1/farms/{id} # 删除养殖场
|
||||
GET /api/v1/farms/{id}/stats # 获取养殖场统计数据
|
||||
```
|
||||
|
||||
#### 7.2.3 动物管理API
|
||||
```
|
||||
GET /api/v1/animals # 获取动物列表
|
||||
GET /api/v1/animals/{id} # 获取动物详情
|
||||
POST /api/v1/animals # 添加动物
|
||||
PUT /api/v1/animals/{id} # 更新动物信息
|
||||
DELETE /api/v1/animals/{id} # 删除动物记录
|
||||
GET /api/v1/animals/{id}/health # 获取健康记录
|
||||
POST /api/v1/animals/{id}/health # 添加健康记录
|
||||
```
|
||||
|
||||
#### 7.2.4 设备监控API
|
||||
```
|
||||
GET /api/v1/devices # 获取设备列表
|
||||
GET /api/v1/devices/{id} # 获取设备详情
|
||||
POST /api/v1/devices # 添加设备
|
||||
PUT /api/v1/devices/{id} # 更新设备信息
|
||||
DELETE /api/v1/devices/{id} # 删除设备
|
||||
GET /api/v1/devices/{id}/data # 获取设备数据
|
||||
POST /api/v1/devices/{id}/control # 设备控制
|
||||
```
|
||||
|
||||
### 7.3 响应格式规范
|
||||
|
||||
**成功响应格式:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
// 具体数据内容
|
||||
},
|
||||
"timestamp": "2025-01-19T10:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
**错误响应格式:**
|
||||
```json
|
||||
{
|
||||
"code": 400,
|
||||
"message": "参数错误",
|
||||
"error": {
|
||||
"type": "VALIDATION_ERROR",
|
||||
"details": [
|
||||
{
|
||||
"field": "name",
|
||||
"message": "名称不能为空"
|
||||
}
|
||||
]
|
||||
},
|
||||
"timestamp": "2025-01-19T10:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
**分页响应格式:**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"items": [],
|
||||
"pagination": {
|
||||
"page": 1,
|
||||
"pageSize": 20,
|
||||
"total": 100,
|
||||
"totalPages": 5
|
||||
}
|
||||
},
|
||||
"timestamp": "2025-01-19T10:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
## 8. 用户界面设计要求
|
||||
|
||||
### 8.1 设计原则
|
||||
|
||||
**用户体验原则:**
|
||||
- 简洁直观的界面设计
|
||||
- 一致的交互体验
|
||||
- 快速响应的操作反馈
|
||||
- 友好的错误提示
|
||||
|
||||
**可访问性原则:**
|
||||
- 支持键盘导航
|
||||
- 合理的颜色对比度
|
||||
- 清晰的文字大小
|
||||
- 响应式设计适配
|
||||
|
||||
### 8.2 界面布局要求
|
||||
|
||||
**管理后台布局:**
|
||||
- 左侧导航菜单
|
||||
- 顶部用户信息栏
|
||||
- 主内容区域
|
||||
- 底部状态栏
|
||||
|
||||
**数据大屏布局:**
|
||||
- 全屏显示模式
|
||||
- 多区域数据展示
|
||||
- 实时数据更新
|
||||
- 自适应屏幕尺寸
|
||||
|
||||
**小程序界面:**
|
||||
- 底部Tab导航
|
||||
- 顶部标题栏
|
||||
- 主内容滚动区域
|
||||
- 浮动操作按钮
|
||||
|
||||
### 8.3 交互设计要求
|
||||
|
||||
**操作反馈:**
|
||||
- 加载状态提示
|
||||
- 操作成功/失败提示
|
||||
- 确认对话框
|
||||
- 进度条显示
|
||||
|
||||
**数据展示:**
|
||||
- 表格分页和排序
|
||||
- 图表交互和筛选
|
||||
- 搜索和过滤功能
|
||||
- 数据导出功能
|
||||
|
||||
## 9. 测试要求
|
||||
|
||||
### 9.1 测试策略
|
||||
|
||||
**测试类型:**
|
||||
- 单元测试:覆盖率≥80%
|
||||
- 集成测试:API接口测试
|
||||
- 系统测试:端到端功能测试
|
||||
- 性能测试:负载和压力测试
|
||||
- 安全测试:漏洞扫描和渗透测试
|
||||
|
||||
**测试环境:**
|
||||
- 开发环境:开发人员自测
|
||||
- 测试环境:QA团队测试
|
||||
- 预生产环境:用户验收测试
|
||||
- 生产环境:监控和回归测试
|
||||
|
||||
### 9.2 测试用例要求
|
||||
|
||||
**功能测试用例:**
|
||||
- 正常流程测试
|
||||
- 异常流程测试
|
||||
- 边界值测试
|
||||
- 兼容性测试
|
||||
|
||||
**性能测试用例:**
|
||||
- 响应时间测试
|
||||
- 并发用户测试
|
||||
- 数据量测试
|
||||
- 资源使用测试
|
||||
|
||||
## 10. 部署和运维要求
|
||||
|
||||
### 10.1 部署架构
|
||||
|
||||
**生产环境架构:**
|
||||
- 负载均衡器:Nginx
|
||||
- 应用服务器:Node.js集群
|
||||
- 数据库:MySQL主从架构
|
||||
- 缓存:Redis集群
|
||||
- 文件存储:云存储服务
|
||||
|
||||
**容器化部署:**
|
||||
- Docker容器化
|
||||
- Docker Compose编排
|
||||
- Kubernetes集群管理(可选)
|
||||
|
||||
### 10.2 监控和运维
|
||||
|
||||
**系统监控:**
|
||||
- 服务器资源监控
|
||||
- 应用性能监控
|
||||
- 数据库性能监控
|
||||
- 网络状态监控
|
||||
|
||||
**日志管理:**
|
||||
- 应用日志收集
|
||||
- 错误日志告警
|
||||
- 访问日志分析
|
||||
- 审计日志记录
|
||||
|
||||
**备份策略:**
|
||||
- 数据库定时备份
|
||||
- 文件定时备份
|
||||
- 配置文件备份
|
||||
- 灾难恢复预案
|
||||
|
||||
## 11. 项目里程碑
|
||||
|
||||
### 11.1 开发计划
|
||||
|
||||
| 阶段 | 时间节点 | 交付物 | 负责人 |
|
||||
|------|----------|--------|--------|
|
||||
| 需求确认 | 2025-01-25 | 需求规格说明书 | 产品经理 |
|
||||
| 架构设计 | 2025-02-05 | 技术架构文档 | 架构师 |
|
||||
| 数据库设计 | 2025-02-10 | 数据库设计文档 | 数据库工程师 |
|
||||
| 后端开发 | 2025-03-15 | 后端API服务 | 后端团队 |
|
||||
| 前端开发 | 2025-03-20 | 前端管理界面 | 前端团队 |
|
||||
| 小程序开发 | 2025-03-25 | 三端小程序 | 小程序团队 |
|
||||
| 集成测试 | 2025-04-05 | 测试报告 | 测试团队 |
|
||||
| 用户验收 | 2025-04-15 | 验收报告 | 产品经理 |
|
||||
| 上线部署 | 2025-04-20 | 生产环境 | 运维团队 |
|
||||
|
||||
### 11.2 风险管控
|
||||
|
||||
**技术风险:**
|
||||
- 第三方API服务不稳定
|
||||
- 数据库性能瓶颈
|
||||
- 前端兼容性问题
|
||||
- 小程序审核风险
|
||||
|
||||
**业务风险:**
|
||||
- 需求变更频繁
|
||||
- 用户接受度不高
|
||||
- 竞品冲击
|
||||
- 政策法规变化
|
||||
|
||||
**项目风险:**
|
||||
- 人员流动
|
||||
- 进度延期
|
||||
- 质量问题
|
||||
- 预算超支
|
||||
|
||||
**应对措施:**
|
||||
- 制定详细的风险应对预案
|
||||
- 建立风险监控机制
|
||||
- 定期进行风险评估
|
||||
- 及时调整项目计划
|
||||
|
||||
---
|
||||
|
||||
**文档维护说明:**
|
||||
- 本文档将根据项目进展定期更新
|
||||
- 所有变更需经过评审和批准
|
||||
- 文档版本控制采用Git管理
|
||||
- 相关干系人需及时同步文档变更
|
||||
|
||||
*最后更新时间:2025-01-19*
|
||||
*文档版本:v2.0*
|
||||
*维护人员:产品经理*
|
||||
@@ -5,7 +5,7 @@
|
||||
|------|------|------|------|
|
||||
| v1.2 | 2025-01-19 | 产品经理 | 增加养殖管理系统、银行监管系统、保险监管系统、政府监管系统入口需求 |
|
||||
| v1.1 | 2025-01-19 | 产品经理 | 增加小程序二维码入口需求 |
|
||||
| v1.0 | 2025-01-18 | 产品经理 | 初版PRD文档创建 |官网初始版本 |
|
||||
| v1.0 | 2025-01-18 | 产品经理 | 初版PRD文档创建 |
|
||||
|
||||
## 1. 项目概述
|
||||
|
||||
439
docs/文档维护规范.md
Normal file
439
docs/文档维护规范.md
Normal file
@@ -0,0 +1,439 @@
|
||||
# 宁夏智慧养殖监管平台文档维护规范
|
||||
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| v1.0 | 2024-01-20 | 初始版本,制定文档维护规范 | 开发团队 |
|
||||
|
||||
## 1. 概述
|
||||
|
||||
本文档规定了宁夏智慧养殖监管平台项目文档的维护规范和更新流程,旨在确保文档的准确性、时效性和一致性。
|
||||
|
||||
## 2. 文档维护原则
|
||||
|
||||
### 2.1 准确性原则
|
||||
- 文档内容必须与实际代码和系统功能保持一致
|
||||
- 发现错误或过时信息时,应立即更新
|
||||
- 所有技术细节必须经过验证后才能发布
|
||||
|
||||
### 2.2 时效性原则
|
||||
- 代码变更后,相关文档必须在24小时内更新
|
||||
- 新功能上线前,必须完成相关文档的编写
|
||||
- 定期审查文档内容,确保信息最新
|
||||
|
||||
### 2.3 一致性原则
|
||||
- 所有文档必须遵循统一的格式和风格
|
||||
- 术语使用必须保持一致
|
||||
- 文档结构和组织方式必须标准化
|
||||
|
||||
### 2.4 可访问性原则
|
||||
- 文档必须易于查找和理解
|
||||
- 提供清晰的导航和索引
|
||||
- 支持多种访问方式(在线、离线)
|
||||
|
||||
## 3. 文档分类与责任
|
||||
|
||||
### 3.1 需求文档 (requirements/)
|
||||
**责任人**: 产品经理
|
||||
**更新频率**: 需求变更时
|
||||
**审核流程**: 产品经理 → 技术负责人 → 项目经理
|
||||
|
||||
- PRD.md - 核心产品需求文档
|
||||
- 各端产品需求文档 - 多端功能需求
|
||||
|
||||
### 3.2 系统架构 (architecture/)
|
||||
**责任人**: 架构师/技术负责人
|
||||
**更新频率**: 架构变更时
|
||||
**审核流程**: 架构师 → 开发团队 → 技术负责人
|
||||
|
||||
- 系统架构文档.md - 整体架构设计
|
||||
- 数据库设计文档.md - 数据库结构设计
|
||||
- 设计文档.md - UI/UX设计规范
|
||||
|
||||
### 3.3 开发文档 (development/)
|
||||
**责任人**: 开发团队
|
||||
**更新频率**: 代码变更时
|
||||
**审核流程**: 开发者 → 团队负责人 → 技术负责人
|
||||
|
||||
- 开发指南.md - 开发环境和规范
|
||||
- API接口文档.md - 接口定义和示例
|
||||
- 代码规范.md - 编码标准
|
||||
- CONTRIBUTING.md - 贡献指南
|
||||
|
||||
### 3.4 运维部署 (operations/)
|
||||
**责任人**: 运维工程师
|
||||
**更新频率**: 部署流程变更时
|
||||
**审核流程**: 运维工程师 → 技术负责人 → 项目经理
|
||||
|
||||
- 部署文档.md - 部署流程和配置
|
||||
- SECURITY.md - 安全配置
|
||||
- TROUBLESHOOTING.md - 故障排除
|
||||
- 各类运维报告
|
||||
|
||||
### 3.5 项目管理 (project/)
|
||||
**责任人**: 项目经理
|
||||
**更新频率**: 项目进展变化时
|
||||
**审核流程**: 项目经理 → 相关负责人
|
||||
|
||||
- 开发计划文档.md - 项目规划
|
||||
- 任务文档.md - 任务跟踪
|
||||
- 变更日志.md - 版本记录
|
||||
|
||||
## 4. 文档更新流程
|
||||
|
||||
### 4.1 常规更新流程
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[发现需要更新] --> B[确定责任人]
|
||||
B --> C[创建更新任务]
|
||||
C --> D[编写/修改文档]
|
||||
D --> E[内部审核]
|
||||
E --> F{审核通过?}
|
||||
F -->|否| D
|
||||
F -->|是| G[提交变更]
|
||||
G --> H[发布通知]
|
||||
H --> I[更新完成]
|
||||
```
|
||||
|
||||
### 4.2 紧急更新流程
|
||||
|
||||
对于安全漏洞、重大bug修复等紧急情况:
|
||||
|
||||
1. **立即更新**: 责任人直接更新相关文档
|
||||
2. **事后审核**: 24小时内完成审核流程
|
||||
3. **通知团队**: 立即通知所有相关人员
|
||||
|
||||
### 4.3 版本发布更新流程
|
||||
|
||||
每次版本发布时:
|
||||
|
||||
1. **文档冻结**: 发布前3天冻结文档修改
|
||||
2. **全面审核**: 对所有文档进行全面审核
|
||||
3. **版本标记**: 为文档添加版本标记
|
||||
4. **发布同步**: 与代码版本同步发布
|
||||
|
||||
## 5. 文档质量标准
|
||||
|
||||
### 5.1 内容质量标准
|
||||
|
||||
#### 5.1.1 完整性
|
||||
- [ ] 包含所有必要的信息
|
||||
- [ ] 覆盖所有相关的使用场景
|
||||
- [ ] 提供充分的示例和说明
|
||||
|
||||
#### 5.1.2 准确性
|
||||
- [ ] 技术信息准确无误
|
||||
- [ ] 代码示例可以正常运行
|
||||
- [ ] 配置参数正确有效
|
||||
|
||||
#### 5.1.3 清晰性
|
||||
- [ ] 语言表达清晰明确
|
||||
- [ ] 逻辑结构合理
|
||||
- [ ] 避免歧义和模糊表述
|
||||
|
||||
### 5.2 格式质量标准
|
||||
|
||||
#### 5.2.1 Markdown 格式
|
||||
```markdown
|
||||
# 一级标题
|
||||
## 二级标题
|
||||
### 三级标题
|
||||
|
||||
- 无序列表项
|
||||
1. 有序列表项
|
||||
|
||||
**粗体文本**
|
||||
*斜体文本*
|
||||
`代码片段`
|
||||
|
||||
```代码块
|
||||
代码内容
|
||||
```
|
||||
|
||||
[链接文本](链接地址)
|
||||

|
||||
```
|
||||
|
||||
#### 5.2.2 代码示例格式
|
||||
```javascript
|
||||
// 注释说明功能
|
||||
const exampleFunction = (param) => {
|
||||
// 实现逻辑
|
||||
return result;
|
||||
};
|
||||
```
|
||||
|
||||
#### 5.2.3 表格格式
|
||||
| 列标题1 | 列标题2 | 列标题3 |
|
||||
|---------|---------|---------|
|
||||
| 内容1 | 内容2 | 内容3 |
|
||||
|
||||
### 5.3 版本信息标准
|
||||
|
||||
每个文档必须包含版本历史表:
|
||||
|
||||
```markdown
|
||||
## 版本历史
|
||||
|
||||
| 版本 | 日期 | 修改内容 | 修改人 |
|
||||
|------|------|----------|--------|
|
||||
| v1.1 | 2024-01-20 | 添加新功能说明 | 张三 |
|
||||
| v1.0 | 2024-01-15 | 初始版本 | 李四 |
|
||||
```
|
||||
|
||||
## 6. 文档审核机制
|
||||
|
||||
### 6.1 审核角色与职责
|
||||
|
||||
#### 6.1.1 一级审核(内容审核)
|
||||
- **审核人**: 文档责任人的直接上级
|
||||
- **审核内容**: 技术准确性、内容完整性
|
||||
- **审核时间**: 2个工作日内
|
||||
|
||||
#### 6.1.2 二级审核(质量审核)
|
||||
- **审核人**: 技术负责人或项目经理
|
||||
- **审核内容**: 整体质量、规范遵循
|
||||
- **审核时间**: 1个工作日内
|
||||
|
||||
#### 6.1.3 终审(发布审核)
|
||||
- **审核人**: 项目经理
|
||||
- **审核内容**: 发布准备、影响评估
|
||||
- **审核时间**: 1个工作日内
|
||||
|
||||
### 6.2 审核检查清单
|
||||
|
||||
#### 6.2.1 内容检查
|
||||
- [ ] 信息准确性验证
|
||||
- [ ] 代码示例测试
|
||||
- [ ] 链接有效性检查
|
||||
- [ ] 图片显示正常
|
||||
|
||||
#### 6.2.2 格式检查
|
||||
- [ ] Markdown语法正确
|
||||
- [ ] 标题层级合理
|
||||
- [ ] 代码块格式规范
|
||||
- [ ] 表格格式正确
|
||||
|
||||
#### 6.2.3 规范检查
|
||||
- [ ] 命名规范遵循
|
||||
- [ ] 版本信息完整
|
||||
- [ ] 文档结构标准
|
||||
- [ ] 术语使用一致
|
||||
|
||||
## 7. 文档发布与分发
|
||||
|
||||
### 7.1 发布渠道
|
||||
|
||||
#### 7.1.1 内部发布
|
||||
- **Git仓库**: 主要发布渠道,所有文档存储在docs目录
|
||||
- **内部Wiki**: 重要文档的在线版本
|
||||
- **团队邮件**: 重大更新通知
|
||||
|
||||
#### 7.1.2 外部发布
|
||||
- **官方网站**: 公开文档的发布平台
|
||||
- **开发者文档**: API文档和开发指南
|
||||
- **用户手册**: 面向最终用户的使用说明
|
||||
|
||||
### 7.2 版本管理
|
||||
|
||||
#### 7.2.1 版本号规则
|
||||
- **主版本号**: 重大架构变更或功能重构
|
||||
- **次版本号**: 新功能添加或重要更新
|
||||
- **修订版本号**: 错误修复或小幅改进
|
||||
|
||||
示例: v2.1.3
|
||||
|
||||
#### 7.2.2 分支管理
|
||||
- **main分支**: 稳定版本文档
|
||||
- **develop分支**: 开发中的文档
|
||||
- **feature分支**: 特性文档开发
|
||||
|
||||
### 7.3 通知机制
|
||||
|
||||
#### 7.3.1 更新通知
|
||||
```markdown
|
||||
## 文档更新通知
|
||||
|
||||
**更新时间**: 2024-01-20 14:30
|
||||
**更新文档**: API接口文档.md
|
||||
**更新内容**: 新增用户认证接口
|
||||
**影响范围**: 前端开发团队
|
||||
**责任人**: 张三
|
||||
```
|
||||
|
||||
#### 7.3.2 通知渠道
|
||||
- 团队邮件列表
|
||||
- 项目管理工具通知
|
||||
- 即时通讯工具群组
|
||||
|
||||
## 8. 文档工具与环境
|
||||
|
||||
### 8.1 编辑工具
|
||||
|
||||
#### 8.1.1 推荐工具
|
||||
- **VS Code**: 主要编辑器,支持Markdown预览
|
||||
- **Typora**: 专业Markdown编辑器
|
||||
- **GitBook**: 在线文档编辑平台
|
||||
|
||||
#### 8.1.2 插件推荐
|
||||
- Markdown All in One (VS Code)
|
||||
- Markdown Preview Enhanced (VS Code)
|
||||
- markdownlint (代码规范检查)
|
||||
|
||||
### 8.2 协作工具
|
||||
|
||||
#### 8.2.1 版本控制
|
||||
- **Git**: 文档版本控制
|
||||
- **GitHub/GitLab**: 代码托管和协作
|
||||
- **Pull Request**: 文档审核流程
|
||||
|
||||
#### 8.2.2 项目管理
|
||||
- **Jira**: 任务跟踪和管理
|
||||
- **Confluence**: 知识库管理
|
||||
- **Slack/钉钉**: 团队沟通
|
||||
|
||||
### 8.3 自动化工具
|
||||
|
||||
#### 8.3.1 文档生成
|
||||
```yaml
|
||||
# GitHub Actions 示例
|
||||
name: Generate Docs
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
jobs:
|
||||
docs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Generate API Docs
|
||||
run: npm run docs:generate
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
```
|
||||
|
||||
#### 8.3.2 质量检查
|
||||
```yaml
|
||||
# 文档质量检查
|
||||
name: Docs Quality Check
|
||||
on: [pull_request]
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Lint Markdown
|
||||
run: markdownlint docs/**/*.md
|
||||
- name: Check Links
|
||||
run: markdown-link-check docs/**/*.md
|
||||
```
|
||||
|
||||
## 9. 培训与支持
|
||||
|
||||
### 9.1 培训计划
|
||||
|
||||
#### 9.1.1 新员工培训
|
||||
- 文档规范介绍 (1小时)
|
||||
- 工具使用培训 (2小时)
|
||||
- 实践操作指导 (1小时)
|
||||
|
||||
#### 9.1.2 定期培训
|
||||
- 月度文档质量回顾 (30分钟)
|
||||
- 季度规范更新培训 (1小时)
|
||||
- 年度最佳实践分享 (2小时)
|
||||
|
||||
### 9.2 支持资源
|
||||
|
||||
#### 9.2.1 文档模板
|
||||
- [需求文档模板](./templates/requirement-template.md)
|
||||
- [API文档模板](./templates/api-template.md)
|
||||
- [部署文档模板](./templates/deployment-template.md)
|
||||
|
||||
#### 9.2.2 参考资料
|
||||
- [Markdown语法指南](https://markdown.com.cn/)
|
||||
- [技术写作最佳实践](https://developers.google.com/tech-writing)
|
||||
- [文档工程化实践](https://docusaurus.io/)
|
||||
|
||||
## 10. 监控与改进
|
||||
|
||||
### 10.1 质量监控
|
||||
|
||||
#### 10.1.1 监控指标
|
||||
- 文档更新及时性 (目标: 24小时内)
|
||||
- 文档准确性 (目标: 错误率 < 1%)
|
||||
- 用户满意度 (目标: 评分 > 4.5/5)
|
||||
|
||||
#### 10.1.2 监控方法
|
||||
- 自动化检查工具
|
||||
- 用户反馈收集
|
||||
- 定期质量审计
|
||||
|
||||
### 10.2 持续改进
|
||||
|
||||
#### 10.2.1 改进流程
|
||||
1. **问题识别**: 通过监控和反馈发现问题
|
||||
2. **原因分析**: 分析问题根本原因
|
||||
3. **方案制定**: 制定改进方案
|
||||
4. **实施验证**: 实施并验证效果
|
||||
5. **标准更新**: 更新相关规范和流程
|
||||
|
||||
#### 10.2.2 改进记录
|
||||
```markdown
|
||||
## 改进记录
|
||||
|
||||
| 日期 | 问题描述 | 改进措施 | 效果评估 | 负责人 |
|
||||
|------|----------|----------|----------|--------|
|
||||
| 2024-01-20 | API文档更新不及时 | 增加自动化检查 | 及时性提升50% | 张三 |
|
||||
```
|
||||
|
||||
## 11. 应急处理
|
||||
|
||||
### 11.1 文档错误应急处理
|
||||
|
||||
#### 11.1.1 严重错误(影响生产)
|
||||
1. **立即响应**: 15分钟内开始处理
|
||||
2. **临时措施**: 添加警告标识
|
||||
3. **紧急修复**: 2小时内完成修复
|
||||
4. **通知发布**: 立即通知所有相关人员
|
||||
|
||||
#### 11.1.2 一般错误
|
||||
1. **确认错误**: 1个工作日内确认
|
||||
2. **制定计划**: 2个工作日内制定修复计划
|
||||
3. **完成修复**: 5个工作日内完成修复
|
||||
|
||||
### 11.2 文档丢失应急处理
|
||||
|
||||
#### 11.2.1 备份恢复
|
||||
1. **Git历史恢复**: 从版本控制系统恢复
|
||||
2. **本地备份恢复**: 从团队成员本地恢复
|
||||
3. **云端备份恢复**: 从云端备份恢复
|
||||
|
||||
#### 11.2.2 重建流程
|
||||
1. **评估损失**: 确定丢失内容范围
|
||||
2. **分工重建**: 分配重建任务
|
||||
3. **质量验证**: 重建内容质量检查
|
||||
4. **发布更新**: 重新发布文档
|
||||
|
||||
## 12. 联系方式
|
||||
|
||||
### 12.1 文档维护团队
|
||||
|
||||
| 角色 | 姓名 | 邮箱 | 电话 | 负责范围 |
|
||||
|------|------|------|------|----------|
|
||||
| 文档负责人 | 张三 | zhangsan@example.com | 138xxxx0001 | 整体协调 |
|
||||
| 技术文档 | 李四 | lisi@example.com | 138xxxx0002 | 开发文档 |
|
||||
| 产品文档 | 王五 | wangwu@example.com | 138xxxx0003 | 需求文档 |
|
||||
| 运维文档 | 赵六 | zhaoliu@example.com | 138xxxx0004 | 部署文档 |
|
||||
|
||||
### 12.2 支持渠道
|
||||
|
||||
- **邮件支持**: docs-support@example.com
|
||||
- **即时支持**: 钉钉群 "文档维护支持群"
|
||||
- **问题反馈**: GitHub Issues
|
||||
- **改进建议**: docs-feedback@example.com
|
||||
|
||||
---
|
||||
|
||||
**注意**: 本规范会根据项目发展和团队反馈持续优化,请定期查看最新版本。
|
||||
278
migrations/20250118000013_create_iot_cattle_table.js
Normal file
278
migrations/20250118000013_create_iot_cattle_table.js
Normal file
@@ -0,0 +1,278 @@
|
||||
/**
|
||||
* 创建iot_cattle表
|
||||
*
|
||||
* 问题描述:
|
||||
* - 数据库中缺少iot_cattle表
|
||||
* - 需要创建该表并正确设置外键约束
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
up: async (queryInterface, Sequelize) => {
|
||||
await queryInterface.createTable('iot_cattle', {
|
||||
id: {
|
||||
type: Sequelize.INTEGER,
|
||||
primaryKey: true,
|
||||
autoIncrement: true,
|
||||
allowNull: false,
|
||||
comment: '牛只ID'
|
||||
},
|
||||
org_id: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '组织ID'
|
||||
},
|
||||
ear_number: {
|
||||
type: Sequelize.BIGINT,
|
||||
allowNull: false,
|
||||
comment: '耳标号'
|
||||
},
|
||||
sex: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '性别'
|
||||
},
|
||||
strain: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '品系'
|
||||
},
|
||||
varieties: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '品种'
|
||||
},
|
||||
cate: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '类别'
|
||||
},
|
||||
birth_weight: {
|
||||
type: Sequelize.DECIMAL(10,2),
|
||||
allowNull: false,
|
||||
comment: '出生体重'
|
||||
},
|
||||
birthday: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '出生日期'
|
||||
},
|
||||
pen_id: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: true,
|
||||
comment: '栏舍ID'
|
||||
},
|
||||
into_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '入栏时间'
|
||||
},
|
||||
parity: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '胎次'
|
||||
},
|
||||
source: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '来源'
|
||||
},
|
||||
source_day: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '来源天数'
|
||||
},
|
||||
source_weight: {
|
||||
type: Sequelize.DECIMAL(10,2),
|
||||
allowNull: false,
|
||||
comment: '来源体重'
|
||||
},
|
||||
weight: {
|
||||
type: Sequelize.DOUBLE,
|
||||
allowNull: false,
|
||||
comment: '当前体重'
|
||||
},
|
||||
event: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '事件'
|
||||
},
|
||||
event_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '事件时间'
|
||||
},
|
||||
lactation_day: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '泌乳天数'
|
||||
},
|
||||
semen_num: {
|
||||
type: Sequelize.STRING(30),
|
||||
allowNull: false,
|
||||
comment: '精液编号'
|
||||
},
|
||||
is_wear: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否佩戴设备'
|
||||
},
|
||||
batch_id: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '批次ID'
|
||||
},
|
||||
imgs: {
|
||||
type: Sequelize.STRING(800),
|
||||
allowNull: false,
|
||||
comment: '图片'
|
||||
},
|
||||
is_ele_auth: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否电子认证'
|
||||
},
|
||||
is_qua_auth: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否质量认证'
|
||||
},
|
||||
is_delete: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '是否删除'
|
||||
},
|
||||
is_out: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '是否出栏'
|
||||
},
|
||||
create_uid: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '创建人ID'
|
||||
},
|
||||
create_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '创建时间'
|
||||
},
|
||||
algebra: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '代数'
|
||||
},
|
||||
colour: {
|
||||
type: Sequelize.TEXT,
|
||||
allowNull: false,
|
||||
comment: '毛色'
|
||||
},
|
||||
info_weight: {
|
||||
type: Sequelize.DECIMAL(10,2),
|
||||
allowNull: false,
|
||||
comment: '信息体重'
|
||||
},
|
||||
descent: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '血统'
|
||||
},
|
||||
is_vaccin: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否接种疫苗'
|
||||
},
|
||||
is_insemination: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否人工授精'
|
||||
},
|
||||
is_insure: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否投保'
|
||||
},
|
||||
is_mortgage: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '是否抵押'
|
||||
},
|
||||
update_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '更新时间'
|
||||
},
|
||||
breed_bull_time: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: false,
|
||||
comment: '配种时间'
|
||||
},
|
||||
level: {
|
||||
type: Sequelize.TINYINT,
|
||||
allowNull: false,
|
||||
comment: '等级'
|
||||
},
|
||||
six_weight: {
|
||||
type: Sequelize.DECIMAL(10,2),
|
||||
allowNull: false,
|
||||
comment: '6月龄体重'
|
||||
},
|
||||
eighteen_weight: {
|
||||
type: Sequelize.DECIMAL(10,2),
|
||||
allowNull: false,
|
||||
comment: '18月龄体重'
|
||||
},
|
||||
twelve_day_weight: {
|
||||
type: Sequelize.DECIMAL(10,2),
|
||||
allowNull: false,
|
||||
comment: '12日龄体重'
|
||||
},
|
||||
eighteen_day_weight: {
|
||||
type: Sequelize.DECIMAL(10,2),
|
||||
allowNull: false,
|
||||
comment: '18日龄体重'
|
||||
},
|
||||
xxiv_day_weight: {
|
||||
type: Sequelize.DECIMAL(10,2),
|
||||
allowNull: false,
|
||||
comment: '24日龄体重'
|
||||
},
|
||||
semen_breed_imgs: {
|
||||
type: Sequelize.STRING(800),
|
||||
allowNull: false,
|
||||
comment: '精液配种图片'
|
||||
},
|
||||
sell_status: {
|
||||
type: Sequelize.SMALLINT,
|
||||
allowNull: false,
|
||||
comment: '销售状态'
|
||||
},
|
||||
weight_calculate_time: {
|
||||
type: Sequelize.DATE,
|
||||
allowNull: true,
|
||||
comment: '体重计算时间'
|
||||
},
|
||||
day_of_birthday: {
|
||||
type: Sequelize.INTEGER,
|
||||
allowNull: true,
|
||||
comment: '出生天数'
|
||||
}
|
||||
}, {
|
||||
charset: 'utf8mb4',
|
||||
comment: '物联网牛只表'
|
||||
});
|
||||
|
||||
// 添加索引
|
||||
await queryInterface.addIndex('iot_cattle', ['org_id']);
|
||||
await queryInterface.addIndex('iot_cattle', ['strain']);
|
||||
await queryInterface.addIndex('iot_cattle', ['varieties']);
|
||||
await queryInterface.addIndex('iot_cattle', ['pen_id']);
|
||||
await queryInterface.addIndex('iot_cattle', ['batch_id']);
|
||||
|
||||
console.log('✅ 成功创建iot_cattle表');
|
||||
},
|
||||
|
||||
down: async (queryInterface, Sequelize) => {
|
||||
await queryInterface.dropTable('iot_cattle');
|
||||
console.log('✅ 成功删除iot_cattle表');
|
||||
}
|
||||
};
|
||||
31
migrations/20250118000014_add_iot_cattle_foreign_keys.js
Normal file
31
migrations/20250118000014_add_iot_cattle_foreign_keys.js
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* 为iot_cattle表添加外键约束
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
up: async (queryInterface, Sequelize) => {
|
||||
await queryInterface.sequelize.query(`
|
||||
ALTER TABLE iot_cattle
|
||||
ADD CONSTRAINT fk_iot_cattle_pen_id
|
||||
FOREIGN KEY (pen_id) REFERENCES cattle_pens (id)
|
||||
ON DELETE SET NULL ON UPDATE CASCADE
|
||||
`);
|
||||
|
||||
await queryInterface.sequelize.query(`
|
||||
ALTER TABLE iot_cattle
|
||||
ADD CONSTRAINT fk_iot_cattle_batch_id
|
||||
FOREIGN KEY (batch_id) REFERENCES cattle_batches (id)
|
||||
ON DELETE SET NULL ON UPDATE CASCADE
|
||||
`);
|
||||
|
||||
console.log('✅ 成功为iot_cattle表添加外键约束');
|
||||
},
|
||||
|
||||
down: async (queryInterface, Sequelize) => {
|
||||
// 删除外键约束
|
||||
await queryInterface.sequelize.query('ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS fk_iot_cattle_pen_id');
|
||||
await queryInterface.sequelize.query('ALTER TABLE iot_cattle DROP FOREIGN KEY IF EXISTS fk_iot_cattle_batch_id');
|
||||
|
||||
console.log('✅ 成功删除iot_cattle表的外键约束');
|
||||
}
|
||||
};
|
||||
137
migrations/20250118000015_add_missing_animal_fields.js
Normal file
137
migrations/20250118000015_add_missing_animal_fields.js
Normal file
@@ -0,0 +1,137 @@
|
||||
/**
|
||||
* 为animals表添加缺失的字段
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
up: async (queryInterface, Sequelize) => {
|
||||
const { DataTypes } = require('sequelize');
|
||||
|
||||
// 添加项圈编号字段
|
||||
await queryInterface.addColumn('animals', 'collar_number', {
|
||||
type: DataTypes.STRING(50),
|
||||
allowNull: false,
|
||||
comment: '项圈编号'
|
||||
});
|
||||
|
||||
// 添加动物耳号字段
|
||||
await queryInterface.addColumn('animals', 'ear_tag', {
|
||||
type: DataTypes.STRING(50),
|
||||
allowNull: true,
|
||||
comment: '动物耳号'
|
||||
});
|
||||
|
||||
// 添加动物类型字段
|
||||
await queryInterface.addColumn('animals', 'animal_type', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
defaultValue: 1,
|
||||
comment: '动物类型:1-牛,2-羊,3-猪,4-马'
|
||||
});
|
||||
|
||||
// 添加品种字段
|
||||
await queryInterface.addColumn('animals', 'breed', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
defaultValue: 1,
|
||||
comment: '品种:1-西藏高山牦牛,2-荷斯坦奶牛,3-西门塔尔牛,4-安格斯牛,5-小尾寒羊,6-波尔山羊'
|
||||
});
|
||||
|
||||
// 添加品类字段
|
||||
await queryInterface.addColumn('animals', 'category', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
defaultValue: 1,
|
||||
comment: '品类:1-乳肉兼用,2-肉用,3-乳用,4-种用'
|
||||
});
|
||||
|
||||
// 添加来源类型字段
|
||||
await queryInterface.addColumn('animals', 'source_type', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
defaultValue: 1,
|
||||
comment: '来源类型:1-合作社,2-农户,3-养殖场,4-进口'
|
||||
});
|
||||
|
||||
// 添加出生日期字段
|
||||
await queryInterface.addColumn('animals', 'birth_date', {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: true,
|
||||
comment: '出生日期'
|
||||
});
|
||||
|
||||
// 添加出生体重字段
|
||||
await queryInterface.addColumn('animals', 'birth_weight', {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: true,
|
||||
defaultValue: 0.00,
|
||||
comment: '出生体重'
|
||||
});
|
||||
|
||||
// 添加断奶体重字段
|
||||
await queryInterface.addColumn('animals', 'weaning_weight', {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: true,
|
||||
defaultValue: 0.00,
|
||||
comment: '断奶体重'
|
||||
});
|
||||
|
||||
// 添加断奶日龄字段
|
||||
await queryInterface.addColumn('animals', 'weaning_age', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
defaultValue: 0,
|
||||
comment: '断奶日龄'
|
||||
});
|
||||
|
||||
// 添加入场日期字段
|
||||
await queryInterface.addColumn('animals', 'entry_date', {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: true,
|
||||
comment: '入场日期'
|
||||
});
|
||||
|
||||
// 添加历史已产胎次字段
|
||||
await queryInterface.addColumn('animals', 'calving_count', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
defaultValue: 0,
|
||||
comment: '历史已产胎次'
|
||||
});
|
||||
|
||||
// 添加乳头数(左)字段
|
||||
await queryInterface.addColumn('animals', 'left_teat_count', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
comment: '乳头数(左)'
|
||||
});
|
||||
|
||||
// 添加乳头数(右)字段
|
||||
await queryInterface.addColumn('animals', 'right_teat_count', {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: true,
|
||||
comment: '乳头数(右)'
|
||||
});
|
||||
|
||||
console.log('✅ 成功为animals表添加缺失的字段');
|
||||
},
|
||||
|
||||
down: async (queryInterface, Sequelize) => {
|
||||
// 删除添加的字段
|
||||
await queryInterface.removeColumn('animals', 'collar_number');
|
||||
await queryInterface.removeColumn('animals', 'ear_tag');
|
||||
await queryInterface.removeColumn('animals', 'animal_type');
|
||||
await queryInterface.removeColumn('animals', 'breed');
|
||||
await queryInterface.removeColumn('animals', 'category');
|
||||
await queryInterface.removeColumn('animals', 'source_type');
|
||||
await queryInterface.removeColumn('animals', 'birth_date');
|
||||
await queryInterface.removeColumn('animals', 'birth_weight');
|
||||
await queryInterface.removeColumn('animals', 'weaning_weight');
|
||||
await queryInterface.removeColumn('animals', 'weaning_age');
|
||||
await queryInterface.removeColumn('animals', 'entry_date');
|
||||
await queryInterface.removeColumn('animals', 'calving_count');
|
||||
await queryInterface.removeColumn('animals', 'left_teat_count');
|
||||
await queryInterface.removeColumn('animals', 'right_teat_count');
|
||||
|
||||
console.log('✅ 成功回滚animals表字段添加操作');
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user