diff --git a/government-admin/src/router/index.js b/government-admin/src/router/index.js
index eb6badc..d64c9bc 100644
--- a/government-admin/src/router/index.js
+++ b/government-admin/src/router/index.js
@@ -338,7 +338,7 @@ const routes = [
]
const router = createRouter({
- history: createWebHistory(),
+ history: createWebHistory('/government/'), // 设置基础路径
routes
})
diff --git a/government-admin/src/views/Login.vue b/government-admin/src/views/Login.vue
index 67589c3..58277dd 100644
--- a/government-admin/src/views/Login.vue
+++ b/government-admin/src/views/Login.vue
@@ -123,10 +123,10 @@ const captchaUrl = ref('')
// 表单数据
const formData = reactive({
- username: 'admin',
- password: '123456',
+ username: '',
+ password: '',
captcha: '',
- remember: true
+ remember: false
})
// 表单验证规则
@@ -212,20 +212,7 @@ onMounted(() => {
left: 0;
width: 100%;
height: 100%;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-
- &::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- background-image:
- radial-gradient(circle at 20% 80%, rgba(120, 119, 198, 0.3) 0%, transparent 50%),
- radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.1) 0%, transparent 50%),
- radial-gradient(circle at 40% 40%, rgba(120, 119, 198, 0.2) 0%, transparent 50%);
- }
+ background: #f5f5f5;
.background-overlay {
position: absolute;
@@ -233,7 +220,7 @@ onMounted(() => {
left: 0;
width: 100%;
height: 100%;
- background: rgba(0, 0, 0, 0.1);
+ background: rgba(0, 0, 0, 0.02);
}
}
diff --git a/government-admin/test-admin-staff-api.mjs b/government-admin/test-admin-staff-api.mjs
deleted file mode 100644
index 6e5089a..0000000
--- a/government-admin/test-admin-staff-api.mjs
+++ /dev/null
@@ -1,65 +0,0 @@
-// 测试行政人员管理API接口
-import axios from 'axios';
-
-// 创建axios实例
-const instance = axios.create({
- baseURL: 'http://localhost:5352/api',
- timeout: 10000,
- headers: {
- 'Content-Type': 'application/json'
- }
-});
-
-// 登录获取token
-const login = async () => {
- try {
- const response = await instance.post('/auth/login', {
- username: 'admin',
- password: '123456'
- });
- console.log('登录成功,获取到token');
- return response.data.token;
- } catch (error) {
- console.error('登录失败:', error.message);
- throw error;
- }
-};
-
-// 测试获取行政人员列表
-const testGetAdminStaffList = async (token) => {
- try {
- instance.defaults.headers.common['Authorization'] = `Bearer ${token}`;
- const response = await instance.get('/personnel');
- console.log('\n获取行政人员列表成功:');
- console.log('- 状态码:', response.status);
- console.log('- 返回数据结构:', Object.keys(response.data));
- console.log('- 行政人员总数:', response.data.total);
- console.log('- 返回的行政人员列表长度:', response.data.data.length);
- if (response.data.data.length > 0) {
- console.log('- 第一条行政人员数据:', response.data.data[0]);
- }
- return response.data;
- } catch (error) {
- console.error('获取行政人员列表失败:', error.message);
- throw error;
- }
-};
-
-// 主测试函数
-const runTests = async () => {
- console.log('开始测试行政人员管理API...');
- try {
- // 1. 登录获取token
- const token = await login();
-
- // 2. 测试获取行政人员列表
- await testGetAdminStaffList(token);
-
- console.log('\n所有测试完成!');
- } catch (error) {
- console.error('测试失败:', error);
- }
-};
-
-// 运行测试
-runTests();
\ No newline at end of file
diff --git a/government-admin/test-admin-staff-component.mjs b/government-admin/test-admin-staff-component.mjs
deleted file mode 100644
index a39f413..0000000
--- a/government-admin/test-admin-staff-component.mjs
+++ /dev/null
@@ -1,152 +0,0 @@
-// 前端组件API测试脚本 - ES模块格式
-import axios from 'axios';
-
-// 创建axios实例
-const instance = axios.create({
- baseURL: 'http://localhost:5352/api',
- timeout: 10000,
- headers: {
- 'Content-Type': 'application/json'
- }
-});
-
-// 登录获取token
-async function login() {
- try {
- const response = await instance.post('/auth/login', {
- username: 'admin',
- password: '123456'
- });
- console.log('登录成功:', response.data);
- // 修正token获取路径 - 正确路径是response.data.data.token
- return response.data.data?.token || null;
- } catch (error) {
- console.error('登录失败:', error);
- console.error('错误详情:', error.response?.data || error.message);
- return null;
- }
-}
-
-// 测试获取行政人员列表
-async function testGetAdminStaffList(token) {
- try {
- const response = await instance.get('/personnel', {
- headers: {
- 'Authorization': `Bearer ${token}`
- },
- params: {
- page: 1,
- pageSize: 10
- }
- });
- console.log('行政人员列表获取成功:');
- console.log('- 数据结构:', Object.keys(response.data));
- console.log('- 行政人员总数:', response.data.total);
- console.log('- 行政人员列表数据长度:', response.data.data?.length || 0);
- if (response.data.data && response.data.data.length > 0) {
- console.log('- 第一条数据示例:', response.data.data[0]);
- }
- return response.data;
- } catch (error) {
- console.error('行政人员列表获取失败:', error);
- console.error('错误详情:', error.response?.data || error.message);
- return null;
- }
-}
-
-// 测试获取部门列表
-async function testGetDepartmentsList(token) {
- try {
- const response = await instance.get('/government/departments', {
- headers: {
- 'Authorization': `Bearer ${token}`
- }
- });
- console.log('部门列表获取成功:');
- console.log('- 数据结构:', Object.keys(response.data));
- console.log('- 部门列表数据长度:', response.data.data?.length || 0);
- if (response.data.data && response.data.data.length > 0) {
- console.log('- 第一条数据示例:', response.data.data[0]);
- }
- return response.data;
- } catch (error) {
- console.error('部门列表获取失败:', error);
- console.error('错误详情:', error.response?.data || error.message);
- return null;
- }
-}
-
-// 测试获取岗位列表
-async function testGetPositionsList(token) {
- try {
- const response = await instance.get('/government/positions', {
- headers: {
- 'Authorization': `Bearer ${token}`
- }
- });
- console.log('岗位列表获取成功:');
- console.log('- 数据结构:', Object.keys(response.data));
- console.log('- 岗位列表数据长度:', response.data.data?.length || 0);
- if (response.data.data && response.data.data.length > 0) {
- console.log('- 第一条数据示例:', response.data.data[0]);
- }
- return response.data;
- } catch (error) {
- console.error('岗位列表获取失败:', error);
- console.error('错误详情:', error.response?.data || error.message);
- return null;
- }
-}
-
-// 主测试函数 - 模拟AdminStaff组件的初始化流程
-async function runComponentTest() {
- console.log('开始模拟AdminStaff组件初始化测试...');
-
- // 1. 登录获取token
- console.log('\n1. 登录认证');
- const token = await login();
- if (!token) {
- console.error('测试失败: 无法获取登录token');
- return;
- }
-
- // 2. 测试获取部门列表 - 对应组件中的fetchDepartments()
- console.log('\n2. 获取部门列表');
- const departmentsData = await testGetDepartmentsList(token);
-
- // 3. 测试获取岗位列表 - 对应组件中的fetchPositions()
- console.log('\n3. 获取岗位列表');
- const positionsData = await testGetPositionsList(token);
-
- // 4. 测试获取行政人员列表 - 对应组件中的fetchAdminStaffList()
- console.log('\n4. 获取行政人员列表');
- const staffListData = await testGetAdminStaffList(token);
-
- console.log('\n测试完成!');
- console.log('----------------------------------------');
- console.log('测试结果总结:');
- console.log('- 登录:', token ? '成功' : '失败');
- console.log('- 部门列表:', departmentsData ? '成功' : '失败');
- console.log('- 岗位列表:', positionsData ? '成功' : '失败');
- console.log('- 行政人员列表:', staffListData ? '成功' : '失败');
-
- // 分析可能的组件渲染问题
- if (staffListData && departmentsData && positionsData) {
- console.log('\n所有API调用成功,但页面仍显示空白可能的原因:');
- console.log('1. 数据格式不匹配 - 检查返回数据结构是否与组件期望的一致');
- console.log('2. 组件生命周期问题 - 检查onMounted中是否正确调用initData()');
- console.log('3. 数据处理逻辑错误 - 检查staffData.value的赋值和转换逻辑');
- console.log('4. 权限问题 - 检查用户角色和权限是否正确');
- console.log('5. 前端控制台错误 - 检查浏览器控制台是否有详细错误信息');
- } else {
- console.log('\nAPI调用失败是页面空白的可能原因,请检查:');
- console.log('1. 后端接口是否正确实现');
- console.log('2. 认证token是否有效');
- console.log('3. 网络连接是否正常');
- }
-}
-
-// 运行测试
-runComponentTest().catch(err => {
- console.error('测试过程中发生错误:', err);
-});
\ No newline at end of file
diff --git a/government-admin/test-api.js b/government-admin/test-api.js
deleted file mode 100644
index c848578..0000000
--- a/government-admin/test-api.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// 从前端目录测试API访问
-const axios = require('axios');
-
-// 创建axios实例,使用与前端相同的配置
-const api = axios.create({
- baseURL: 'http://localhost:5352/api',
- timeout: 5000,
- headers: {
- 'Content-Type': 'application/json'
- }
-});
-
-async function testApi() {
- try {
- console.log('开始从前端目录测试API...');
-
- // 测试行政人员列表API
- console.log('\n测试行政人员列表API:');
- const adminStaffResponse = await api.get('/government/admin-staff');
- console.log(`✅ 行政人员列表API调用成功,返回${adminStaffResponse.data.length}条数据`);
-
- // 测试部门列表API
- console.log('\n测试部门列表API:');
- const departmentResponse = await api.get('/government/departments');
- console.log(`✅ 部门列表API调用成功,返回${departmentResponse.data.length}条数据`);
-
- // 测试岗位列表API
- console.log('\n测试岗位列表API:');
- const positionResponse = await api.get('/government/positions');
- console.log(`✅ 岗位列表API调用成功,返回${positionResponse.data.length}条数据`);
-
- // 测试带有查询参数的API
- console.log('\n测试带查询参数的API:');
- const filteredResponse = await api.get('/government/admin-staff?page=1&pageSize=3');
- console.log(`✅ 带查询参数的API调用成功,返回${filteredResponse.data.length}条数据`);
-
- console.log('\n✅ 所有API测试成功完成!');
- } catch (error) {
- console.error('❌ API测试失败:', error.message);
- if (error.response) {
- console.error('错误状态码:', error.response.status);
- console.error('错误数据:', error.response.data);
- } else if (error.request) {
- console.error('没有收到响应:', error.request);
- } else {
- console.error('请求配置错误:', error.message);
- }
- console.error('错误详情:', error);
- }
-}
-
-testApi();
\ No newline at end of file
diff --git a/government-admin/test-index.html b/government-admin/test-index.html
deleted file mode 100644
index d75d448..0000000
--- a/government-admin/test-index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- TextArea 测试页面
-
-
-
-
-
-
\ No newline at end of file
diff --git a/government-admin/testAuthFix.js b/government-admin/testAuthFix.js
deleted file mode 100644
index 6f760aa..0000000
--- a/government-admin/testAuthFix.js
+++ /dev/null
@@ -1,86 +0,0 @@
-// 测试前端认证修复效果的脚本
-import axios from 'axios';
-import fs from 'fs';
-import path from 'path';
-
-// 配置
-const BASE_URL = 'http://localhost:5352/api';
-const USERNAME = 'admin';
-const PASSWORD = '123456';
-
-// 测试函数
-async function runTest() {
- console.log('===== 开始测试智慧耳标页面认证问题 =====');
-
- try {
- // 1. 尝试登录获取token
- console.log('1. 尝试登录...');
- const loginResponse = await axios.post(`${BASE_URL}/auth/login`, {
- username: USERNAME,
- password: PASSWORD
- });
-
- if (loginResponse.data && loginResponse.data.token) {
- const token = loginResponse.data.token;
- console.log('登录成功,获取到token:', token);
-
- // 2. 使用获取的token尝试访问智能耳标API
- console.log('2. 使用token访问智能耳标API...');
- const headers = { 'Authorization': `Bearer ${token}` };
- const smartEarmarkResponse = await axios.get(`${BASE_URL}/smart-earmark`, { headers });
-
- console.log('智能耳标API访问成功,返回状态:', smartEarmarkResponse.status);
- console.log('返回数据示例:', JSON.stringify(smartEarmarkResponse.data.slice(0, 1), null, 2));
-
- console.log('\n===== 测试成功!智慧耳标页面认证问题已修复 =====');
- } else {
- console.error('登录失败,未获取到token:', loginResponse.data);
-
- // 如果后端使用模拟数据,我们也创建一个模拟token来测试
- console.log('\n3. 尝试使用模拟token访问API(适用于前端模拟登录场景)...');
- const mockToken = 'mock-jwt-token-' + Date.now();
- const headers = { 'Authorization': `Bearer ${mockToken}` };
-
- try {
- const smartEarmarkResponse = await axios.get(`${BASE_URL}/smart-earmark`, {
- headers,
- timeout: 5000
- });
- console.log('使用模拟token访问成功,状态:', smartEarmarkResponse.status);
- } catch (error) {
- console.error('使用模拟token访问失败:', error.code || error.message);
- if (error.response) {
- console.error('错误详情:', error.response.status, error.response.data);
- }
-
- // 记录问题以便后续分析
- const errorInfo = {
- timestamp: new Date().toISOString(),
- error: error.message,
- response: error.response ? {
- status: error.response.status,
- data: error.response.data
- } : null
- };
-
- fs.writeFileSync(
- path.join(__dirname, 'auth_error.log'),
- JSON.stringify(errorInfo, null, 2) + '\n',
- { flag: 'a' }
- );
- }
- }
- } catch (error) {
- console.error('测试过程中发生错误:', error.message);
- if (error.response) {
- console.error('错误状态码:', error.response.status);
- console.error('错误详情:', error.response.data);
- } else if (error.request) {
- console.error('未收到响应:', error.request);
- console.error('请检查后端服务是否正常运行在端口5352');
- }
- }
-}
-
-// 运行测试
-runTest();
\ No newline at end of file
diff --git a/government-admin/testEarmarkApi.js b/government-admin/testEarmarkApi.js
deleted file mode 100644
index a8996f6..0000000
--- a/government-admin/testEarmarkApi.js
+++ /dev/null
@@ -1,66 +0,0 @@
-// 简化的测试脚本:专门验证智慧耳标API访问
-import axios from 'axios';
-
-// 配置
-const API_BASE_URL = 'http://localhost:5352/api';
-const TEST_USERNAME = 'admin';
-const TEST_PASSWORD = '123456';
-
-// 创建axios实例
-const apiClient = axios.create({
- baseURL: API_BASE_URL,
- timeout: 10000,
- headers: {
- 'Content-Type': 'application/json',
- },
-});
-
-// 测试函数
-async function testEarmarkApi() {
- try {
- console.log('===== 开始测试智慧耳标API =====');
-
- // 1. 尝试登录获取真实token
- console.log('1. 登录获取token...');
- const loginResponse = await apiClient.post('/auth/login', {
- username: TEST_USERNAME,
- password: TEST_PASSWORD
- });
-
- if (loginResponse.status === 200 && loginResponse.data.code === 200) {
- const token = loginResponse.data.data.token;
- console.log('登录成功,获取到token');
-
- // 2. 使用获取的token访问智慧耳标API
- console.log('2. 使用token访问智慧耳标API...');
- apiClient.defaults.headers.common['Authorization'] = `Bearer ${token}`;
-
- const earmarkResponse = await apiClient.get('/smart-earmark');
-
- if (earmarkResponse.status === 200) {
- console.log('智慧耳标API访问成功!');
- console.log('响应状态码:', earmarkResponse.status);
- console.log('数据总量:', earmarkResponse.data.data?.length || '无数据');
- console.log('\n===== 测试成功 =====');
- console.log('修复总结:');
- console.log('1. 前端:修复了api.js中缺失的message组件导入');
- console.log('2. 前端:修复了authStore中认证状态判断问题');
- console.log('3. 后端:修复了auth.js中JWT验证相关的导入问题');
- console.log('4. 后端:修复了重复声明的变量问题');
- console.log('\n结论:点击智慧耳标页面自动退出到登录页的问题已解决!');
- } else {
- console.error('智慧耳标API访问失败,状态码:', earmarkResponse.status);
- }
- } else {
- console.error('登录失败:', loginResponse.data?.message || '未知错误');
- }
- } catch (error) {
- console.error('测试过程中发生错误:', error.message);
- if (error.response) {
- console.error('错误详情:', error.response.status, error.response.data);
- }
- }
-}
-
-// 运行测试
-testEarmarkApi();
\ No newline at end of file
diff --git a/government-admin/vite.config.js b/government-admin/vite.config.js
index 76bd297..82a3056 100644
--- a/government-admin/vite.config.js
+++ b/government-admin/vite.config.js
@@ -4,6 +4,7 @@ import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
+ base: '/government/', // 设置基础路径
resolve: {
alias: {
'@': '/src',
@@ -18,5 +19,18 @@ export default defineConfig({
changeOrigin: true
}
}
+ },
+ build: {
+ outDir: 'dist',
+ assetsDir: 'assets',
+ sourcemap: false,
+ rollupOptions: {
+ output: {
+ manualChunks: {
+ vendor: ['vue', 'vue-router', 'ant-design-vue'],
+ echarts: ['echarts', 'vue-echarts']
+ }
+ }
+ }
}
})
\ No newline at end of file
diff --git a/government-backend/check-export.js b/government-backend/check-export.js
deleted file mode 100644
index 5198d1f..0000000
--- a/government-backend/check-export.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// 直接检查slaughter路由模块的导出内容
-const slaughterRoutes = require('./routes/slaughter');
-
-console.log('模块类型:', typeof slaughterRoutes);
-console.log('是否为Express Router:', slaughterRoutes && slaughterRoutes.constructor && slaughterRoutes.constructor.name);
-console.log('是否有stack属性:', 'stack' in slaughterRoutes);
-
-if (slaughterRoutes && slaughterRoutes.stack) {
- console.log('stack长度:', slaughterRoutes.stack.length);
- slaughterRoutes.stack.forEach((layer, index) => {
- console.log(`Layer ${index}:`, layer);
- });
-}
-
-// 也检查另一个已知正常的路由模块,比如auth.js
-const authRoutes = require('./routes/auth');
-console.log('\nauth路由模块类型:', typeof authRoutes);
-console.log('auth路由模块构造函数:', authRoutes && authRoutes.constructor && authRoutes.constructor.name);
\ No newline at end of file
diff --git a/government-backend/check-harmless-place-model.js b/government-backend/check-harmless-place-model.js
deleted file mode 100644
index 03a8e6f..0000000
--- a/government-backend/check-harmless-place-model.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// 测试HarmlessPlace模型的导出和方法
-const HarmlessPlace = require('./models/HarmlessPlace');
-const User = require('./models/User');
-
-console.log('=== 检查HarmlessPlace模型 ===');
-console.log('HarmlessPlace的类型:', typeof HarmlessPlace);
-console.log('HarmlessPlace是否为对象:', typeof HarmlessPlace === 'object' && HarmlessPlace !== null);
-console.log('HarmlessPlace是否有findAndCountAll方法:', typeof HarmlessPlace.findAndCountAll !== 'undefined');
-if (HarmlessPlace.findAndCountAll) {
- console.log('findAndCountAll的类型:', typeof HarmlessPlace.findAndCountAll);
-}
-console.log('\nHarmlessPlace对象的所有属性和方法:');
-console.log(Object.keys(HarmlessPlace));
-
-console.log('\n=== 检查User模型(作为对比)===');
-console.log('User的类型:', typeof User);
-console.log('User是否为对象:', typeof User === 'object' && User !== null);
-console.log('User是否有findAndCountAll方法:', typeof User.findAndCountAll !== 'undefined');
-if (User.findAndCountAll) {
- console.log('findAndCountAll的类型:', typeof User.findAndCountAll);
-}
-console.log('\nUser对象的所有属性和方法:');
-console.log(Object.keys(User));
-
-// 检查是否存在循环引用或其他问题
-console.log('\n=== 检查模型实例化 ===');
-try {
- console.log('尝试实例化HarmlessPlace:', new HarmlessPlace());
-} catch (error) {
- console.log('实例化HarmlessPlace错误:', error.message);
-}
\ No newline at end of file
diff --git a/government-backend/controllers/deviceWarningController.js b/government-backend/controllers/deviceWarningController.js
index 6df9e28..63ffd3a 100644
--- a/government-backend/controllers/deviceWarningController.js
+++ b/government-backend/controllers/deviceWarningController.js
@@ -1,6 +1,6 @@
const DeviceWarning = require('../models/DeviceWarning');
const { Op, fn, col } = require('sequelize');
-const sequelize = require('../config/database');
+const { QueryTypes } = require('sequelize');
// 获取设备预警列表
exports.getDeviceWarnings = async (req, res) => {
@@ -9,25 +9,52 @@ exports.getDeviceWarnings = async (req, res) => {
const limit = parseInt(pageSize);
const offset = (parseInt(page) - 1) * limit;
- const where = {};
+ // 构建WHERE条件
+ let whereConditions = [];
+ let whereParams = {};
+
if (deviceType) {
- where.deviceType = deviceType;
+ whereConditions.push('deviceType = :deviceType');
+ whereParams.deviceType = deviceType;
}
if (alertType) {
- where.alertType = alertType;
+ whereConditions.push('alertType = :alertType');
+ whereParams.alertType = alertType;
}
if (status) {
- where.status = status;
+ whereConditions.push('status = :status');
+ whereParams.status = status;
}
if (farmerName) {
- where.farmerName = { [Op.like]: `%${farmerName}%` };
+ whereConditions.push('farmerName LIKE :farmerName');
+ whereParams.farmerName = `%${farmerName}%`;
}
- const { count, rows } = await DeviceWarning.findAndCountAll({
- where,
- limit,
- offset,
- order: [['alertTime', 'DESC']],
+ const whereClause = whereConditions.length > 0 ? 'WHERE ' + whereConditions.join(' AND ') : '';
+
+ // 查询总数
+ const countQuery = `SELECT COUNT(*) as count FROM device_warnings ${whereClause}`;
+ const countResult = await DeviceWarning.sequelize.query(countQuery, {
+ replacements: whereParams,
+ type: QueryTypes.SELECT
+ });
+ const total = countResult[0].count;
+
+ // 查询数据
+ const dataQuery = `
+ SELECT id, farmName, farmerName, phone, deviceType, deviceNumber,
+ alertType, alertLevel, alertTime, status, description,
+ location, batteryLevel, signalStrength, temperature,
+ resolvedBy, resolvedAt, remarks, createdAt, updatedAt
+ FROM device_warnings
+ ${whereClause}
+ ORDER BY alertTime DESC
+ LIMIT :limit OFFSET :offset
+ `;
+
+ const rows = await DeviceWarning.sequelize.query(dataQuery, {
+ replacements: { ...whereParams, limit, offset },
+ type: QueryTypes.SELECT
});
res.status(200).json({
@@ -35,7 +62,7 @@ exports.getDeviceWarnings = async (req, res) => {
message: '获取成功',
data: {
list: rows,
- total: count,
+ total: total,
page: parseInt(page),
pageSize: limit,
},
@@ -50,13 +77,26 @@ exports.getDeviceWarnings = async (req, res) => {
exports.getDeviceWarningById = async (req, res) => {
try {
const { id } = req.params;
- const warning = await DeviceWarning.findByPk(id);
+
+ const query = `
+ SELECT id, farmName, farmerName, phone, deviceType, deviceNumber,
+ alertType, alertLevel, alertTime, status, description,
+ location, batteryLevel, signalStrength, temperature,
+ resolvedBy, resolvedAt, remarks, createdAt, updatedAt
+ FROM device_warnings
+ WHERE id = :id
+ `;
+
+ const results = await DeviceWarning.sequelize.query(query, {
+ replacements: { id },
+ type: QueryTypes.SELECT
+ });
- if (!warning) {
+ if (results.length === 0) {
return res.status(404).json({ code: 404, message: '设备预警未找到' });
}
- res.status(200).json({ code: 200, message: '获取成功', data: warning });
+ res.status(200).json({ code: 200, message: '获取成功', data: results[0] });
} catch (error) {
console.error('获取设备预警详情失败:', error);
res.status(500).json({ code: 500, message: '获取设备预警详情失败', error: error.message });
@@ -66,8 +106,53 @@ exports.getDeviceWarningById = async (req, res) => {
// 创建新的设备预警
exports.createDeviceWarning = async (req, res) => {
try {
- const newWarning = await DeviceWarning.create(req.body);
- res.status(201).json({ code: 201, message: '创建成功', data: newWarning });
+ const {
+ farmName, farmerName, phone, deviceType, deviceNumber,
+ alertType, alertLevel = 'medium', description, location, batteryLevel,
+ signalStrength, temperature, remarks
+ } = req.body;
+
+ const insertQuery = `
+ INSERT INTO device_warnings
+ (farmName, farmerName, phone, deviceType, deviceNumber, alertType, alertLevel,
+ description, location, batteryLevel, signalStrength, temperature, remarks,
+ alertTime, status, createdAt, updatedAt)
+ VALUES
+ (:farmName, :farmerName, :phone, :deviceType, :deviceNumber, :alertType, :alertLevel,
+ :description, :location, :batteryLevel, :signalStrength, :temperature, :remarks,
+ NOW(), 'active', NOW(), NOW())
+ `;
+
+ await DeviceWarning.sequelize.query(insertQuery, {
+ replacements: {
+ farmName, farmerName, phone, deviceType, deviceNumber,
+ alertType, alertLevel,
+ description: description || null,
+ location: location || null,
+ batteryLevel: batteryLevel || null,
+ signalStrength: signalStrength || null,
+ temperature: temperature || null,
+ remarks: remarks || null
+ },
+ type: QueryTypes.INSERT
+ });
+
+ // 获取刚插入的记录
+ const selectQuery = `
+ SELECT id, farmName, farmerName, phone, deviceType, deviceNumber,
+ alertType, alertLevel, alertTime, status, description,
+ location, batteryLevel, signalStrength, temperature,
+ resolvedBy, resolvedAt, remarks, createdAt, updatedAt
+ FROM device_warnings
+ ORDER BY id DESC
+ LIMIT 1
+ `;
+
+ const results = await DeviceWarning.sequelize.query(selectQuery, {
+ type: QueryTypes.SELECT
+ });
+
+ res.status(201).json({ code: 201, message: '创建成功', data: results[0] });
} catch (error) {
console.error('创建设备预警失败:', error);
res.status(500).json({ code: 500, message: '创建设备预警失败', error: error.message });
@@ -78,16 +163,60 @@ exports.createDeviceWarning = async (req, res) => {
exports.updateDeviceWarning = async (req, res) => {
try {
const { id } = req.params;
- const [updatedRows] = await DeviceWarning.update(req.body, {
- where: { id },
+ const updateFields = [];
+ const replacements = { id };
+
+ // 动态构建更新字段
+ const allowedFields = [
+ 'farmName', 'farmerName', 'phone', 'deviceType', 'deviceNumber',
+ 'alertType', 'alertLevel', 'description', 'location', 'batteryLevel',
+ 'signalStrength', 'temperature', 'remarks', 'status', 'resolvedBy', 'resolvedAt'
+ ];
+
+ for (const field of allowedFields) {
+ if (req.body[field] !== undefined) {
+ updateFields.push(`${field} = :${field}`);
+ replacements[field] = req.body[field];
+ }
+ }
+
+ if (updateFields.length === 0) {
+ return res.status(400).json({ code: 400, message: '没有需要更新的字段' });
+ }
+
+ updateFields.push('updatedAt = NOW()');
+
+ const updateQuery = `
+ UPDATE device_warnings
+ SET ${updateFields.join(', ')}
+ WHERE id = :id
+ `;
+
+ const [result] = await DeviceWarning.sequelize.query(updateQuery, {
+ replacements,
+ type: QueryTypes.UPDATE
});
- if (updatedRows === 0) {
+ if (result === 0) {
return res.status(404).json({ code: 404, message: '设备预警未找到或无更新' });
}
- const updatedWarning = await DeviceWarning.findByPk(id);
- res.status(200).json({ code: 200, message: '更新成功', data: updatedWarning });
+ // 获取更新后的记录
+ const selectQuery = `
+ SELECT id, farmName, farmerName, phone, deviceType, deviceNumber,
+ alertType, alertLevel, alertTime, status, description,
+ location, batteryLevel, signalStrength, temperature,
+ resolvedBy, resolvedAt, remarks, createdAt, updatedAt
+ FROM device_warnings
+ WHERE id = :id
+ `;
+
+ const results = await DeviceWarning.sequelize.query(selectQuery, {
+ replacements: { id },
+ type: QueryTypes.SELECT
+ });
+
+ res.status(200).json({ code: 200, message: '更新成功', data: results[0] });
} catch (error) {
console.error('更新设备预警失败:', error);
res.status(500).json({ code: 500, message: '更新设备预警失败', error: error.message });
@@ -98,11 +227,14 @@ exports.updateDeviceWarning = async (req, res) => {
exports.deleteDeviceWarning = async (req, res) => {
try {
const { id } = req.params;
- const deletedRows = await DeviceWarning.destroy({
- where: { id },
+
+ const deleteQuery = 'DELETE FROM device_warnings WHERE id = :id';
+ const [result] = await DeviceWarning.sequelize.query(deleteQuery, {
+ replacements: { id },
+ type: QueryTypes.DELETE
});
- if (deletedRows === 0) {
+ if (result === 0) {
return res.status(404).json({ code: 404, message: '设备预警未找到' });
}
@@ -141,32 +273,27 @@ exports.updateWarningStatus = async (req, res) => {
// 获取预警统计
exports.getWarningStats = async (req, res) => {
try {
- // 分别查询每种设备类型的活跃预警数量
- const earTagCount = await DeviceWarning.count({
- where: {
- deviceType: '智能耳标',
- status: 'active'
- }
+ // 使用原始SQL查询每种设备类型的活跃预警数量
+ const earTagQuery = 'SELECT COUNT(*) as count FROM device_warnings WHERE deviceType = :deviceType AND status = :status';
+ const earTagResult = await DeviceWarning.sequelize.query(earTagQuery, {
+ replacements: { deviceType: '智能耳标', status: 'active' },
+ type: QueryTypes.SELECT
});
- const neckbandCount = await DeviceWarning.count({
- where: {
- deviceType: '智能项圈',
- status: 'active'
- }
+ const neckbandResult = await DeviceWarning.sequelize.query(earTagQuery, {
+ replacements: { deviceType: '智能项圈', status: 'active' },
+ type: QueryTypes.SELECT
});
- const hostCount = await DeviceWarning.count({
- where: {
- deviceType: '智能主机',
- status: 'active'
- }
+ const hostResult = await DeviceWarning.sequelize.query(earTagQuery, {
+ replacements: { deviceType: '智能主机', status: 'active' },
+ type: QueryTypes.SELECT
});
const result = {
- earTag: earTagCount,
- neckband: neckbandCount,
- host: hostCount
+ earTag: earTagResult[0].count,
+ neckband: neckbandResult[0].count,
+ host: hostResult[0].count
};
res.status(200).json({ code: 200, message: '获取成功', data: result });
diff --git a/government-backend/full-model-test.js b/government-backend/full-model-test.js
deleted file mode 100644
index 83da073..0000000
--- a/government-backend/full-model-test.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// 完整模型测试脚本
-const sequelize = require('./config/database');
-
-// 确保先导入所有依赖模型
-const Department = require('./models/Department');
-const Position = require('./models/Position');
-const AdminStaff = require('./models/AdminStaff');
-
-async function fullModelTest() {
- try {
- console.log('开始完整模型测试...');
-
- // 测试数据库连接
- await sequelize.authenticate();
- console.log('✅ 数据库连接成功');
-
- // 检查模型是否被正确导入
- console.log('\n检查模型导入状态:');
- console.log('Department 模型:', Department ? '✅ 已导入' : '❌ 未导入');
- console.log('Position 模型:', Position ? '✅ 已导入' : '❌ 未导入');
- console.log('AdminStaff 模型:', AdminStaff ? '✅ 已导入' : '❌ 未导入');
-
- // 测试基本的查询功能
- console.log('\n测试基本查询功能:');
-
- // 查询部门表
- console.log('\n查询部门表:');
- try {
- const departments = await Department.findAll({ limit: 5 });
- console.log(`找到 ${departments.length} 个部门`);
- if (departments.length > 0) {
- console.log('示例部门:', departments[0].dataValues);
- }
- } catch (error) {
- console.error('部门查询失败:', error.message);
- }
-
- // 查询岗位表
- console.log('\n查询岗位表:');
- try {
- const positions = await Position.findAll({ limit: 5 });
- console.log(`找到 ${positions.length} 个岗位`);
- if (positions.length > 0) {
- console.log('示例岗位:', positions[0].dataValues);
- }
- } catch (error) {
- console.error('岗位查询失败:', error.message);
- }
-
- // 查询行政人员表
- console.log('\n查询行政人员表:');
- try {
- const adminStaffs = await AdminStaff.findAll({ limit: 5 });
- console.log(`找到 ${adminStaffs.length} 个行政人员`);
- if (adminStaffs.length > 0) {
- console.log('示例行政人员:', adminStaffs[0].dataValues);
- }
- } catch (error) {
- console.error('行政人员查询失败:', error.message);
- console.error('错误详情:', error);
- }
-
- // 测试关联查询
- console.log('\n测试关联查询:');
- try {
- const adminStaffWithRelations = await AdminStaff.findAll({
- include: [
- { model: Department, as: 'department' },
- { model: Position, as: 'position' }
- ],
- limit: 1
- });
- console.log('关联查询结果数量:', adminStaffWithRelations.length);
- if (adminStaffWithRelations.length > 0) {
- console.log('关联查询成功,已获取到关联数据');
- // 只打印部分数据以避免输出过多
- const staff = adminStaffWithRelations[0];
- console.log('姓名:', staff.name);
- console.log('部门:', staff.department?.name || '未知');
- console.log('岗位:', staff.position?.name || '未知');
- }
- } catch (error) {
- console.error('关联查询失败:', error.message);
- console.error('错误详情:', error);
- }
-
- console.log('\n✅ 完整模型测试完成');
- } catch (error) {
- console.error('❌ 完整模型测试失败:', error.message);
- console.error('错误详情:', error);
- } finally {
- await sequelize.close();
- }
-}
-
-fullModelTest();
\ No newline at end of file
diff --git a/government-backend/model-import-test.js b/government-backend/model-import-test.js
deleted file mode 100644
index 35f2119..0000000
--- a/government-backend/model-import-test.js
+++ /dev/null
@@ -1,99 +0,0 @@
-// 模型导入测试脚本
-const sequelize = require('./config/database');
-const { DataTypes } = require('sequelize');
-
-async function modelImportTest() {
- try {
- console.log('开始模型导入测试...');
-
- // 测试数据库连接
- await sequelize.authenticate();
- console.log('✅ 数据库连接成功');
-
- // 测试直接导入模型
- console.log('\n测试直接导入模型:');
-
- // 先测试 Department 模型
- console.log('\n测试 Department 模型导入:');
- try {
- const Department = require('./models/Department');
- console.log('Department 模型导入:', Department ? '✅ 成功' : '❌ 失败');
-
- // 测试 Department 模型的结构
- if (Department) {
- console.log('Department 模型是否有 define 方法:', typeof Department.define === 'function' ? '✅ 是' : '❌ 否');
- console.log('Department 模型的 tableName:', Department.tableName || Department.options?.tableName || '未定义');
- }
- } catch (error) {
- console.error('Department 模型导入失败:', error.message);
- }
-
- // 测试 Position 模型
- console.log('\n测试 Position 模型导入:');
- try {
- const Position = require('./models/Position');
- console.log('Position 模型导入:', Position ? '✅ 成功' : '❌ 失败');
-
- // 测试 Position 模型的结构
- if (Position) {
- console.log('Position 模型是否有 define 方法:', typeof Position.define === 'function' ? '✅ 是' : '❌ 否');
- console.log('Position 模型的 tableName:', Position.tableName || Position.options?.tableName || '未定义');
- }
- } catch (error) {
- console.error('Position 模型导入失败:', error.message);
- }
-
- // 测试 AdminStaff 模型
- console.log('\n测试 AdminStaff 模型导入:');
- try {
- // 先导入依赖模型
- require('./models/Department');
- require('./models/Position');
-
- const AdminStaff = require('./models/AdminStaff');
- console.log('AdminStaff 模型导入:', AdminStaff ? '✅ 成功' : '❌ 失败');
-
- // 测试 AdminStaff 模型的结构
- if (AdminStaff) {
- console.log('AdminStaff 模型是否有 define 方法:', typeof AdminStaff.define === 'function' ? '✅ 是' : '❌ 否');
- console.log('AdminStaff 模型的 tableName:', AdminStaff.tableName || AdminStaff.options?.tableName || '未定义');
- }
- } catch (error) {
- console.error('AdminStaff 模型导入失败:', error.message);
- console.error('错误详情:', error);
- }
-
- // 测试创建一个简单的新模型
- console.log('\n测试创建新模型:');
- try {
- const TestModel = sequelize.define('TestModel', {
- id: {
- type: DataTypes.INTEGER,
- primaryKey: true,
- autoIncrement: true
- },
- name: {
- type: DataTypes.STRING,
- allowNull: false
- }
- }, {
- tableName: 'test_models',
- timestamps: false,
- paranoid: false
- });
-
- console.log('新模型创建:', TestModel ? '✅ 成功' : '❌ 失败');
- } catch (error) {
- console.error('新模型创建失败:', error.message);
- }
-
- console.log('\n✅ 模型导入测试完成');
- } catch (error) {
- console.error('❌ 模型导入测试失败:', error.message);
- console.error('错误详情:', error);
- } finally {
- await sequelize.close();
- }
-}
-
-modelImportTest();
\ No newline at end of file
diff --git a/government-backend/models/DeviceWarning.js b/government-backend/models/DeviceWarning.js
index 57802d7..0d6d86c 100644
--- a/government-backend/models/DeviceWarning.js
+++ b/government-backend/models/DeviceWarning.js
@@ -1,5 +1,25 @@
-const { DataTypes } = require('sequelize');
-const sequelize = require('../config/database');
+const { DataTypes, Sequelize } = require('sequelize');
+const config = require('../config/index.js');
+
+// 创建专门的Sequelize实例,不使用underscored
+const sequelize = new Sequelize(
+ config.DB_CONFIG.database,
+ config.DB_CONFIG.user,
+ config.DB_CONFIG.password,
+ {
+ host: config.DB_CONFIG.host,
+ port: config.DB_CONFIG.port,
+ dialect: config.DB_CONFIG.dialect,
+ logging: console.log,
+ define: {
+ timestamps: true,
+ paranoid: false,
+ underscored: false, // 明确设置为false
+ freezeTableName: true
+ },
+ timezone: '+08:00'
+ }
+);
const DeviceWarning = sequelize.define('DeviceWarning', {
id: {
@@ -67,34 +87,42 @@ const DeviceWarning = sequelize.define('DeviceWarning', {
description: {
type: DataTypes.TEXT,
comment: '预警描述',
+ field: 'description'
},
location: {
type: DataTypes.STRING,
comment: '设备位置',
+ field: 'location'
},
batteryLevel: {
type: DataTypes.INTEGER,
comment: '电池电量百分比',
+ field: 'batteryLevel'
},
signalStrength: {
type: DataTypes.INTEGER,
comment: '信号强度',
+ field: 'signalStrength'
},
temperature: {
type: DataTypes.FLOAT,
comment: '温度值',
+ field: 'temperature'
},
resolvedBy: {
type: DataTypes.STRING,
comment: '解决人',
+ field: 'resolvedBy'
},
resolvedAt: {
type: DataTypes.DATE,
comment: '解决时间',
+ field: 'resolvedAt'
},
remarks: {
type: DataTypes.TEXT,
comment: '备注',
+ field: 'remarks'
},
}, {
tableName: 'device_warnings',
@@ -102,6 +130,7 @@ const DeviceWarning = sequelize.define('DeviceWarning', {
createdAt: 'createdAt',
updatedAt: 'updatedAt',
paranoid: false,
+ underscored: false, // 覆盖全局配置,不使用下划线命名
});
module.exports = DeviceWarning;
diff --git a/government-backend/nginx-ad.ningmuyun.com.conf b/government-backend/nginx-ad.ningmuyun.com.conf
new file mode 100644
index 0000000..5e541e0
--- /dev/null
+++ b/government-backend/nginx-ad.ningmuyun.com.conf
@@ -0,0 +1,119 @@
+server {
+ listen 443 ssl http2;
+ server_name ad.ningmuyun.com;
+
+ # SSL证书配置(需要替换为实际的证书路径)
+ ssl_certificate /etc/ssl/certs/ad.ningmuyun.com.crt;
+ ssl_certificate_key /etc/ssl/private/ad.ningmuyun.com.key;
+
+ # SSL配置
+ ssl_protocols TLSv1.2 TLSv1.3;
+ ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
+ ssl_prefer_server_ciphers off;
+
+ # 政府端前端静态文件
+ location /government/ {
+ alias /var/www/government-admin-system/dist/;
+ try_files $uri $uri/ /government/index.html;
+
+ # 静态资源缓存
+ location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
+ expires 1y;
+ add_header Cache-Control "public, immutable";
+ }
+ }
+
+ # 政府端后端API代理
+ location /api/government/ {
+ proxy_pass http://127.0.0.1:5352/api/government/;
+ 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;
+ proxy_cache_bypass $http_upgrade;
+
+ # CORS headers
+ add_header Access-Control-Allow-Origin https://ad.ningmuyun.com;
+ add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
+ add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With";
+ add_header Access-Control-Allow-Credentials true;
+
+ # 处理预检请求
+ if ($request_method = 'OPTIONS') {
+ add_header Access-Control-Allow-Origin https://ad.ningmuyun.com;
+ add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
+ add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With";
+ add_header Access-Control-Allow-Credentials true;
+ add_header Content-Length 0;
+ add_header Content-Type text/plain;
+ return 204;
+ }
+ }
+
+ # 保险端前端静态文件
+ location /insurance/ {
+ alias /var/www/insurance-admin-system/dist/;
+ try_files $uri $uri/ /insurance/index.html;
+
+ # 静态资源缓存
+ location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
+ expires 1y;
+ add_header Cache-Control "public, immutable";
+ }
+ }
+
+ # 保险端后端API代理
+ location /insurance/api/ {
+ proxy_pass http://127.0.0.1:3000/api/;
+ 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;
+ proxy_cache_bypass $http_upgrade;
+
+ # CORS headers
+ add_header Access-Control-Allow-Origin https://ad.ningmuyun.com;
+ add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
+ add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With";
+ add_header Access-Control-Allow-Credentials true;
+
+ # 处理预检请求
+ if ($request_method = 'OPTIONS') {
+ add_header Access-Control-Allow-Origin https://ad.ningmuyun.com;
+ add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
+ add_header Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With";
+ add_header Access-Control-Allow-Credentials true;
+ add_header Content-Length 0;
+ add_header Content-Type text/plain;
+ return 204;
+ }
+ }
+
+ # 健康检查
+ location /health {
+ proxy_pass http://127.0.0.1:5352/health;
+ 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 = / {
+ return 301 /government/;
+ }
+}
+
+# HTTP重定向到HTTPS
+server {
+ listen 80;
+ server_name ad.ningmuyun.com;
+ return 301 https://$server_name$request_uri;
+}
+
diff --git a/government-backend/simple-check.js b/government-backend/simple-check.js
deleted file mode 100644
index 0fe92de..0000000
--- a/government-backend/simple-check.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// 简洁地检查路由模块的基本信息
-const express = require('express');
-const slaughterRoutes = require('./routes/slaughter');
-const authRoutes = require('./routes/auth');
-
-console.log('=== slaughter路由模块 ===');
-console.log('类型:', typeof slaughterRoutes);
-console.log('构造函数:', slaughterRoutes && slaughterRoutes.constructor && slaughterRoutes.constructor.name);
-console.log('是否有stack:', 'stack' in slaughterRoutes);
-console.log('是否有get方法:', 'get' in slaughterRoutes);
-
-console.log('\n=== auth路由模块 ===');
-console.log('类型:', typeof authRoutes);
-console.log('构造函数:', authRoutes && authRoutes.constructor && authRoutes.constructor.name);
-console.log('是否有stack:', 'stack' in authRoutes);
-console.log('是否有get方法:', 'get' in authRoutes);
-
-// 创建一个新的Router实例进行比较
-const newRouter = express.Router();
-console.log('\n=== 新创建的Router实例 ===');
-console.log('类型:', typeof newRouter);
-console.log('构造函数:', newRouter && newRouter.constructor && newRouter.constructor.name);
-console.log('是否有stack:', 'stack' in newRouter);
-console.log('是否有get方法:', 'get' in newRouter);
\ No newline at end of file
diff --git a/government-backend/simple-test.js b/government-backend/simple-test.js
deleted file mode 100644
index 4b1f32e..0000000
--- a/government-backend/simple-test.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// 简单测试脚本
-const sequelize = require('./config/database');
-const { DataTypes } = require('sequelize');
-
-async function simpleTest() {
- try {
- console.log('开始简单测试...');
-
- // 测试数据库连接
- await sequelize.authenticate();
- console.log('✅ 数据库连接成功');
-
- // 测试DataTypes是否可用
- console.log('\n测试DataTypes:');
- console.log('DataTypes.INTEGER:', DataTypes.INTEGER ? '✅ 可用' : '❌ 不可用');
- console.log('DataTypes.STRING:', DataTypes.STRING ? '✅ 可用' : '❌ 不可用');
- console.log('DataTypes.BOOLEAN:', DataTypes.BOOLEAN ? '✅ 可用' : '❌ 不可用');
-
- // 测试sequelize实例是否可用
- console.log('\n测试sequelize实例:');
- console.log('sequelize实例:', sequelize ? '✅ 可用' : '❌ 不可用');
-
- // 测试直接查询数据库
- console.log('\n测试直接查询数据库:');
- const [results] = await sequelize.query('SELECT 1+1 AS result');
- console.log('查询结果:', results);
-
- console.log('\n✅ 简单测试完成');
- } catch (error) {
- console.error('❌ 简单测试失败:', error.message);
- console.error('错误详情:', error);
- } finally {
- await sequelize.close();
- }
-}
-
-simpleTest();
\ No newline at end of file
diff --git a/government-backend/test-api.js b/government-backend/test-api.js
deleted file mode 100644
index e62b84d..0000000
--- a/government-backend/test-api.js
+++ /dev/null
@@ -1,27 +0,0 @@
-const http = require('http');
-
-const options = {
- hostname: 'localhost',
- port: 5352,
- path: '/api/slaughter/slaughterhouses',
- method: 'GET',
- headers: {
- 'Authorization': 'Bearer mock-jwt-token-test',
- 'Content-Type': 'application/json'
- }
-};
-
-const req = http.request(options, (res) => {
- console.log(`状态码: ${res.statusCode}`);
- console.log(`响应头: ${JSON.stringify(res.headers)}`);
-
- res.on('data', (d) => {
- process.stdout.write(d);
- });
-});
-
-req.on('error', (error) => {
- console.error(error);
-});
-
-req.end();
\ No newline at end of file
diff --git a/government-backend/test-cattle-academy-api.js b/government-backend/test-cattle-academy-api.js
deleted file mode 100644
index e64437e..0000000
--- a/government-backend/test-cattle-academy-api.js
+++ /dev/null
@@ -1,132 +0,0 @@
-const axios = require('axios');
-
-// 创建axios实例
-const api = axios.create({
- baseURL: 'http://localhost:5352/api/cattle-academy',
- timeout: 10000,
- headers: {
- 'Content-Type': 'application/json',
- 'Authorization': 'Bearer test-token'
- }
-});
-
-// 测试获取养牛学院资讯列表
-async function testGetCattleAcademyList() {
- try {
- console.log('测试获取养牛学院资讯列表...');
- const response = await api.get('/');
- console.log('获取列表成功:', response.data);
- } catch (error) {
- console.error('获取列表失败:', error.response?.data || error.message);
- }
-}
-
-// 测试获取单个养牛学院资讯详情
-async function testGetCattleAcademyById() {
- try {
- console.log('测试获取养牛学院资讯详情...');
- const response = await api.get('/1');
- console.log('获取详情成功:', response.data);
- } catch (error) {
- console.error('获取详情失败:', error.response?.data || error.message);
- }
-}
-
-// 测试创建养牛学院资讯
-async function testCreateCattleAcademy() {
- try {
- console.log('测试创建养牛学院资讯...');
- const data = {
- title: '测试养牛学院资讯',
- coverImage: 'https://via.placeholder.com/100x50',
- content: '测试内容...',
- summary: '测试摘要',
- category: '技术资讯',
- sort: 50,
- status: true,
- author: '测试作者',
- publishTime: new Date().toISOString(),
- isTop: false,
- isRecommend: false,
- remarks: '测试备注'
- };
- const response = await api.post('/', data);
- console.log('创建成功:', response.data);
- } catch (error) {
- console.error('创建失败:', error.response?.data || error.message);
- }
-}
-
-// 测试更新养牛学院资讯
-async function testUpdateCattleAcademy() {
- try {
- console.log('测试更新养牛学院资讯...');
- const data = {
- title: '更新测试养牛学院资讯',
- coverImage: 'https://via.placeholder.com/100x50',
- content: '更新测试内容...',
- summary: '更新测试摘要',
- category: '养殖技术',
- sort: 60,
- status: true,
- author: '更新测试作者',
- publishTime: new Date().toISOString(),
- isTop: true,
- isRecommend: true,
- remarks: '更新测试备注'
- };
- const response = await api.put('/1', data);
- console.log('更新成功:', response.data);
- } catch (error) {
- console.error('更新失败:', error.response?.data || error.message);
- }
-}
-
-// 测试切换资讯状态
-async function testToggleStatus() {
- try {
- console.log('测试切换资讯状态...');
- const response = await api.patch('/1/status', { status: false });
- console.log('状态切换成功:', response.data);
- } catch (error) {
- console.error('状态切换失败:', error.response?.data || error.message);
- }
-}
-
-// 测试删除养牛学院资讯
-async function testDeleteCattleAcademy() {
- try {
- console.log('测试删除养牛学院资讯...');
- const response = await api.delete('/1');
- console.log('删除成功:', response.data);
- } catch (error) {
- console.error('删除失败:', error.response?.data || error.message);
- }
-}
-
-// 运行所有测试
-async function runAllTests() {
- console.log('开始测试养牛学院API...\n');
-
- await testGetCattleAcademyList();
- console.log('\n');
-
- await testGetCattleAcademyById();
- console.log('\n');
-
- await testCreateCattleAcademy();
- console.log('\n');
-
- await testUpdateCattleAcademy();
- console.log('\n');
-
- await testToggleStatus();
- console.log('\n');
-
- await testDeleteCattleAcademy();
- console.log('\n');
-
- console.log('所有测试完成');
-}
-
-runAllTests();
diff --git a/government-backend/test-client.js b/government-backend/test-client.js
deleted file mode 100644
index 89b8aab..0000000
--- a/government-backend/test-client.js
+++ /dev/null
@@ -1,84 +0,0 @@
-const http = require('http');
-
-// 测试函数
-function testRoute(path, description) {
- return new Promise((resolve, reject) => {
- const options = {
- hostname: 'localhost',
- port: 5353,
- path: path,
- method: 'GET',
- headers: {
- 'Authorization': 'Bearer mock-jwt-token-test',
- 'Content-Type': 'application/json'
- }
- };
-
- const req = http.request(options, (res) => {
- let data = '';
- res.on('data', (chunk) => {
- data += chunk;
- });
-
- res.on('end', () => {
- resolve({
- path: path,
- description: description,
- statusCode: res.statusCode,
- headers: res.headers,
- body: data
- });
- });
- });
-
- req.on('error', (error) => {
- reject({
- path: path,
- description: description,
- error: error.message
- });
- });
-
- req.end();
- });
-}
-
-// 运行所有测试
-async function runTests() {
- console.log('开始测试路由...\n');
-
- try {
- // 测试健康检查路由
- const healthResult = await testRoute('/health', '健康检查');
- console.log(`${healthResult.description} - 状态码: ${healthResult.statusCode}`);
- console.log(`响应: ${healthResult.body}\n`);
-
- // 测试测试路由
- const testResult = await testRoute('/api/test/test', '测试路由');
- console.log(`${testResult.description} - 状态码: ${testResult.statusCode}`);
- console.log(`响应: ${testResult.body}\n`);
-
- // 测试slaughter路由
- const slaughterResult = await testRoute('/api/slaughter/slaughterhouses', 'Slaughter路由');
- console.log(`${slaughterResult.description} - 状态码: ${slaughterResult.statusCode}`);
- console.log(`响应: ${slaughterResult.body}\n`);
-
- // 测试不存在的路由
- const notFoundResult = await testRoute('/api/not-exist', '不存在的路由');
- console.log(`${notFoundResult.description} - 状态码: ${notFoundResult.statusCode}`);
- console.log(`响应: ${notFoundResult.body}\n`);
-
- } catch (error) {
- console.error('测试失败:', error);
- }
-}
-
-// 等待一会儿再运行测试,给服务器启动时间
-sleep(2000).then(() => {
- runTests();
-});
-
-// 简单的sleep函数
-function sleep(ms) {
- return new Promise(resolve => setTimeout(resolve, ms));
-}
\ No newline at end of file
diff --git a/government-backend/test-connection.js b/government-backend/test-connection.js
deleted file mode 100644
index 25ea155..0000000
--- a/government-backend/test-connection.js
+++ /dev/null
@@ -1,45 +0,0 @@
-require('dotenv').config();
-
-const mysql = require('mysql2/promise');
-
-async function testConnection() {
- try {
- // 从环境变量获取数据库配置
- const config = {
- host: process.env.DB_HOST || '129.211.213.226',
- port: process.env.DB_PORT || 9527,
- user: process.env.DB_USER || 'root',
- password: process.env.DB_PASSWORD || 'aiotAiot123!',
- database: process.env.DB_NAME || 'ningxia_zhengfu'
- };
-
- console.log('正在连接数据库...');
- console.log('📋 数据库配置信息:');
- console.log(` 主机: ${config.host}`);
- console.log(` 端口: ${config.port}`);
- console.log(` 数据库名: ${config.database}`);
- console.log(` 用户名: ${config.user}`);
-
- // 创建数据库连接
- const connection = await mysql.createConnection(config);
- console.log('✅ 政府端后端数据库连接成功');
-
- // 查询数据库中的表
- const [tables] = await connection.query(
- "SELECT table_name FROM information_schema.tables WHERE table_schema = ?",
- [config.database]
- );
- console.log(`📚 数据库表数量: ${tables.length}`);
-
- // 关闭连接
- await connection.end();
- console.log('🔒 数据库连接已关闭');
-
- process.exit(0);
- } catch (error) {
- console.error('❌ 政府端后端数据库连接失败:', error.message);
- process.exit(1);
- }
-}
-
-testConnection();
\ No newline at end of file
diff --git a/government-backend/test-data-center-api.js b/government-backend/test-data-center-api.js
new file mode 100644
index 0000000..624b31d
--- /dev/null
+++ b/government-backend/test-data-center-api.js
@@ -0,0 +1,50 @@
+const axios = require('axios');
+
+const API_BASE_URL = 'http://localhost:5352/api/government';
+
+const api = axios.create({
+ baseURL: API_BASE_URL,
+ timeout: 10000,
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer test-token'
+ }
+});
+
+async function testDataCenterAPI() {
+ console.log('开始测试数据中心API...\n');
+
+ try {
+ // 测试获取数据中心统计数据
+ console.log('1. 测试获取数据中心统计数据...');
+ const response = await api.get('/data-center');
+ console.log('数据中心统计:', JSON.stringify(response.data, null, 2));
+ console.log('✅ 获取数据中心统计数据成功\n');
+
+ // 测试获取市场价格信息
+ console.log('2. 测试获取市场价格信息...');
+ const priceResponse = await api.get('/market-price?type=beef');
+ console.log('市场价格信息:', JSON.stringify(priceResponse.data, null, 2));
+ console.log('✅ 获取市场价格信息成功\n');
+
+ // 测试获取部门列表
+ console.log('3. 测试获取部门列表...');
+ const deptResponse = await api.get('/departments');
+ console.log('部门列表:', JSON.stringify(deptResponse.data, null, 2));
+ console.log('✅ 获取部门列表成功\n');
+
+ // 测试获取行政人员列表
+ console.log('4. 测试获取行政人员列表...');
+ const staffResponse = await api.get('/admin-staff');
+ console.log('行政人员列表:', JSON.stringify(staffResponse.data, null, 2));
+ console.log('✅ 获取行政人员列表成功\n');
+
+ console.log('🎉 所有数据中心API测试通过!');
+
+ } catch (error) {
+ console.error('❌ API测试失败:', error.response ? error.response.data : error.message);
+ }
+}
+
+testDataCenterAPI();
+
diff --git a/government-backend/test-db-connection.js b/government-backend/test-db-connection.js
deleted file mode 100644
index 690ff6d..0000000
--- a/government-backend/test-db-connection.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// 测试数据库连接
-const sequelize = require('./config/database');
-
-async function testDbConnection() {
- try {
- console.log('正在尝试连接数据库...');
- console.log('连接配置:', {
- host: sequelize.config.host,
- port: sequelize.config.port,
- database: sequelize.config.database,
- username: sequelize.config.username,
- dialect: sequelize.config.dialect
- });
-
- await sequelize.authenticate();
- console.log('✅ 数据库连接成功!');
-
- // 尝试查询数据库版本信息
- const [results] = await sequelize.query('SELECT VERSION() AS version');
- console.log('数据库版本:', results[0].version);
-
- // 关闭连接
- await sequelize.close();
- console.log('数据库连接已关闭');
- } catch (error) {
- console.error('❌ 数据库连接失败:', error.message);
- console.error('详细错误:', error);
- }
-}
-
-testDbConnection();
\ No newline at end of file
diff --git a/government-backend/test-device-warning-api.js b/government-backend/test-device-warning-api.js
deleted file mode 100644
index 1d8b00c..0000000
--- a/government-backend/test-device-warning-api.js
+++ /dev/null
@@ -1,99 +0,0 @@
-const axios = require('axios');
-
-const API_BASE_URL = 'http://localhost:5352/api/device-warning';
-
-const api = axios.create({
- baseURL: API_BASE_URL,
- timeout: 10000,
- headers: {
- 'Content-Type': 'application/json',
- 'Authorization': 'Bearer test-token'
- }
-});
-
-async function testDeviceWarningAPI() {
- console.log('开始测试设备预警API...\n');
-
- try {
- // 测试获取预警统计
- console.log('1. 测试获取预警统计...');
- const statsResponse = await api.get('/stats');
- console.log('预警统计:', statsResponse.data);
- console.log('✅ 获取预警统计成功\n');
-
- // 测试获取设备预警列表
- console.log('2. 测试获取设备预警列表...');
- const listResponse = await api.get('/', {
- params: {
- page: 1,
- pageSize: 10,
- deviceType: '智能项圈'
- }
- });
- console.log('设备预警列表:', listResponse.data);
- console.log('✅ 获取设备预警列表成功\n');
-
- // 测试根据ID获取详情
- if (listResponse.data.data && listResponse.data.data.list.length > 0) {
- const firstWarning = listResponse.data.data.list[0];
- console.log('3. 测试获取设备预警详情...');
- const detailResponse = await api.get(`/${firstWarning.id}`);
- console.log('设备预警详情:', detailResponse.data);
- console.log('✅ 获取设备预警详情成功\n');
-
- // 测试更新预警状态
- console.log('4. 测试更新预警状态...');
- const updateResponse = await api.patch(`/${firstWarning.id}/status`, {
- status: 'resolved',
- resolvedBy: '测试用户'
- });
- console.log('更新预警状态:', updateResponse.data);
- console.log('✅ 更新预警状态成功\n');
- }
-
- // 测试创建新的设备预警
- console.log('5. 测试创建设备预警...');
- const createData = {
- farmName: '测试养殖场',
- farmerName: '测试养殖户',
- phone: '138****8888',
- deviceType: '智能耳标',
- deviceNumber: 'TEST001',
- alertType: '设备离线',
- alertLevel: 'high',
- description: '测试预警',
- location: '测试位置',
- batteryLevel: 20,
- signalStrength: 30,
- temperature: 25.5
- };
- const createResponse = await api.post('/', createData);
- console.log('创建设备预警:', createResponse.data);
- console.log('✅ 创建设备预警成功\n');
-
- // 测试更新设备预警
- if (createResponse.data.data) {
- console.log('6. 测试更新设备预警...');
- const updateData = {
- description: '更新后的测试预警',
- batteryLevel: 15
- };
- const updateResponse = await api.put(`/${createResponse.data.data.id}`, updateData);
- console.log('更新设备预警:', updateResponse.data);
- console.log('✅ 更新设备预警成功\n');
-
- // 测试删除设备预警
- console.log('7. 测试删除设备预警...');
- const deleteResponse = await api.delete(`/${createResponse.data.data.id}`);
- console.log('删除设备预警:', deleteResponse.data);
- console.log('✅ 删除设备预警成功\n');
- }
-
- console.log('🎉 所有设备预警API测试通过!');
-
- } catch (error) {
- console.error('❌ API测试失败:', error.response ? error.response.data : error.message);
- }
-}
-
-testDeviceWarningAPI();
diff --git a/government-backend/test-epidemic-activity-api.js b/government-backend/test-epidemic-activity-api.js
deleted file mode 100644
index dcc24ef..0000000
--- a/government-backend/test-epidemic-activity-api.js
+++ /dev/null
@@ -1,124 +0,0 @@
-const axios = require('axios');
-
-const BASE_URL = 'http://localhost:5352/api/epidemic-activity';
-
-// 创建axios实例,添加认证头
-const api = axios.create({
- baseURL: BASE_URL,
- headers: {
- 'Authorization': 'Bearer test-token', // 测试用的token
- 'Content-Type': 'application/json'
- }
-});
-
-// 测试获取防疫活动列表
-async function testGetActivities() {
- try {
- console.log('测试获取防疫活动列表...');
- const response = await api.get('/');
- console.log('获取成功:', response.data);
- } catch (error) {
- console.error('获取失败:', error.response?.data || error.message);
- }
-}
-
-// 测试创建防疫活动
-async function testCreateActivity() {
- try {
- console.log('测试创建防疫活动...');
- const newActivity = {
- activityName: '测试防疫活动',
- livestockCategory: '牛',
- diseaseCategory: '口蹄疫',
- vaccineUsed: '测试疫苗',
- vaccineBatch: 'TEST001',
- preventionDate: '2023-12-01至2023-12-31',
- activityStatus: 'active'
- };
-
- const response = await api.post('/', newActivity);
- console.log('创建成功:', response.data);
- return response.data.data.id;
- } catch (error) {
- console.error('创建失败:', error.response?.data || error.message);
- }
-}
-
-// 测试更新防疫活动
-async function testUpdateActivity(id) {
- try {
- console.log('测试更新防疫活动...');
- const updateData = {
- activityName: '更新后的防疫活动',
- livestockCategory: '羊',
- diseaseCategory: '布鲁氏菌病',
- vaccineUsed: '更新疫苗',
- vaccineBatch: 'UPDATE001',
- preventionDate: '2023-12-15至2024-01-15',
- activityStatus: 'inactive'
- };
-
- const response = await api.put(`/${id}`, updateData);
- console.log('更新成功:', response.data);
- } catch (error) {
- console.error('更新失败:', error.response?.data || error.message);
- }
-}
-
-// 测试切换活动状态
-async function testToggleStatus(id) {
- try {
- console.log('测试切换活动状态...');
- const response = await api.patch(`/${id}/status`);
- console.log('状态切换成功:', response.data);
- } catch (error) {
- console.error('状态切换失败:', error.response?.data || error.message);
- }
-}
-
-// 测试删除防疫活动
-async function testDeleteActivity(id) {
- try {
- console.log('测试删除防疫活动...');
- const response = await api.delete(`/${id}`);
- console.log('删除成功:', response.data);
- } catch (error) {
- console.error('删除失败:', error.response?.data || error.message);
- }
-}
-
-// 运行所有测试
-async function runTests() {
- console.log('开始测试防疫活动管理API...\n');
-
- await testGetActivities();
- console.log('\n' + '='.repeat(50) + '\n');
-
- const createdId = await testCreateActivity();
- console.log('\n' + '='.repeat(50) + '\n');
-
- if (createdId) {
- await testUpdateActivity(createdId);
- console.log('\n' + '='.repeat(50) + '\n');
-
- await testToggleStatus(createdId);
- console.log('\n' + '='.repeat(50) + '\n');
-
- await testDeleteActivity(createdId);
- }
-
- console.log('\n测试完成!');
-}
-
-// 如果直接运行此文件
-if (require.main === module) {
- runTests();
-}
-
-module.exports = {
- testGetActivities,
- testCreateActivity,
- testUpdateActivity,
- testToggleStatus,
- testDeleteActivity
-};
diff --git a/government-backend/test-epidemic-api.js b/government-backend/test-epidemic-api.js
deleted file mode 100644
index 0c35d9d..0000000
--- a/government-backend/test-epidemic-api.js
+++ /dev/null
@@ -1,32 +0,0 @@
-const axios = require('axios')
-
-async function testEpidemicAPI() {
- try {
- console.log('测试防疫记录API...')
-
- // 测试获取列表
- const response = await axios.get('http://localhost:5352/api/epidemic-record/list?page=1&pageSize=5')
-
- console.log('API响应状态:', response.status)
- console.log('API响应数据:', JSON.stringify(response.data, null, 2))
-
- if (response.data.code === 200) {
- console.log('✅ API调用成功')
- console.log('记录数量:', response.data.data.list.length)
- if (response.data.data.list.length > 0) {
- console.log('第一条记录:', response.data.data.list[0])
- }
- } else {
- console.log('❌ API返回错误:', response.data.message)
- }
-
- } catch (error) {
- console.error('❌ API调用失败:', error.message)
- if (error.response) {
- console.error('响应状态:', error.response.status)
- console.error('响应数据:', error.response.data)
- }
- }
-}
-
-testEpidemicAPI()
diff --git a/government-backend/test-epidemic-fix.js b/government-backend/test-epidemic-fix.js
deleted file mode 100644
index 3113669..0000000
--- a/government-backend/test-epidemic-fix.js
+++ /dev/null
@@ -1,101 +0,0 @@
-// 测试修复后的epidemic agencies接口
-const axios = require('axios');
-
-// 政府后端服务地址
-const BASE_URL = 'http://localhost:5352/api';
-
-// 登录获取token
-async function login() {
- try {
- console.log('开始登录...');
- const response = await axios.post(`${BASE_URL}/auth/login`, {
- username: 'admin',
- password: '123456'
- });
-
- console.log('登录响应:', response.data);
-
- if (response.data.code === 200 && response.data.data && response.data.data.token) {
- console.log('登录成功,获取到token');
- return response.data.data.token;
- } else {
- console.log('登录失败,未获取到token');
- console.log('错误信息:', response.data.message || '未知错误');
- return null;
- }
- } catch (error) {
- console.error('登录请求失败:', error.message);
- if (error.response) {
- console.error('错误状态码:', error.response.status);
- console.error('错误数据:', error.response.data);
- }
- return null;
- }
-}
-
-// 测试新增防疫机构
-async function testCreateAgency(token) {
- try {
- console.log('\n开始测试新增防疫机构...');
- const testData = {
- name: '测试防疫机构' + Date.now(),
- code: 'TEST-' + Date.now(),
- type: 'station',
- level: 'county',
- manager: '测试负责人',
- phone: '13800138999',
- address: '测试地址',
- epidemicScope: '测试防疫范围',
- remarks: '测试备注',
- email: 'test@example.com',
- status: 'active',
- establishmentDate: '2024-01-01'
- };
-
- console.log('提交的数据:', testData);
-
- const response = await axios.post(`${BASE_URL}/epidemic/agencies`, testData, {
- headers: {
- 'Authorization': `Bearer ${token}`
- }
- });
-
- console.log('新增防疫机构成功');
- console.log(`- 状态码: ${response.status}`);
- console.log(`- 返回数据:`, response.data);
-
- return response.data;
- } catch (error) {
- console.error('测试新增防疫机构失败:', error.message);
- if (error.response) {
- console.error('错误状态码:', error.response.status);
- console.error('错误数据:', error.response.data);
- }
- return null;
- }
-}
-
-// 执行测试
-async function runTests() {
- try {
- console.log('开始测试修复后的epidemic agencies接口...');
-
- // 1. 登录获取token
- const token = await login();
- if (!token) {
- console.log('未获取到token,测试终止');
- return;
- }
-
- // 2. 测试新增防疫机构
- const createResult = await testCreateAgency(token);
-
- console.log('\n测试完成!');
-
- } catch (error) {
- console.error('测试过程中发生错误:', error);
- }
-}
-
-// 执行测试
-runTests();
\ No newline at end of file
diff --git a/government-backend/test-harmless-place-api.js b/government-backend/test-harmless-place-api.js
deleted file mode 100644
index 88df46e..0000000
--- a/government-backend/test-harmless-place-api.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// 测试无害化场所API
-const axios = require('axios');
-
-// 政府后端服务地址
-const BASE_URL = 'http://localhost:5352/api';
-
-// 登录获取token
-async function login() {
- try {
- console.log('开始登录...');
- const response = await axios.post(`${BASE_URL}/auth/login`, {
- username: 'admin',
- password: '123456'
- });
-
- console.log('登录响应:', response.data);
-
- if (response.data.code === 200 && response.data.data && response.data.data.token) {
- console.log('登录成功,获取到token');
- return response.data.data.token;
- } else {
- console.log('登录失败,未获取到token');
- console.log('错误信息:', response.data.message || '未知错误');
- return null;
- }
- } catch (error) {
- console.error('登录请求失败:', error.message);
- if (error.response) {
- console.error('错误状态码:', error.response.status);
- console.error('错误数据:', error.response.data);
- }
- return null;
- }
-}
-
-// 测试无害化场所列表API
-async function testHarmlessPlaceList(token) {
- try {
- console.log('\n测试无害化场所列表API...');
- const response = await axios.get(`${BASE_URL}/harmless-place/list`, {
- headers: {
- 'Authorization': `Bearer ${token}`
- },
- params: {
- page: 1,
- pageSize: 10
- }
- });
-
- console.log('API调用成功,状态码:', response.status);
- console.log('返回数据结构:', Object.keys(response.data));
- console.log('无害化场所总数:', response.data.total || '未知');
-
- if (response.data.data && Array.isArray(response.data.data)) {
- console.log('返回的无害化场所列表长度:', response.data.data.length);
- if (response.data.data.length > 0) {
- console.log('第一条无害化场所数据:');
- console.log(response.data.data[0]);
- }
- }
-
- return response.data;
- } catch (error) {
- console.error('无害化场所列表API调用失败:', error.message);
- if (error.response) {
- console.error('错误状态码:', error.response.status);
- console.error('错误数据:', error.response.data);
- }
- return null;
- }
-}
-
-// 主测试函数
-const runTests = async () => {
- console.log('开始测试无害化场所管理API...');
- try {
- // 1. 登录获取token
- const token = await login();
-
- if (!token) {
- console.error('无法继续测试,因为未获取到有效的token');
- return;
- }
-
- // 2. 测试获取无害化场所列表
- await testHarmlessPlaceList(token);
-
- console.log('\n所有测试完成!');
- } catch (error) {
- console.error('测试过程中发生错误:', error);
- }
-};
-
-// 运行测试
-runTests();
\ No newline at end of file
diff --git a/government-backend/test-harmless-place-cached.js b/government-backend/test-harmless-place-cached.js
deleted file mode 100644
index 5dafc56..0000000
--- a/government-backend/test-harmless-place-cached.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// 清除模块缓存
-function clearModuleCache() {
- const modulesToClear = Object.keys(require.cache).filter(key =>
- key.includes('HarmlessPlace') || key.includes('database')
- );
-
- console.log('清除以下模块的缓存:', modulesToClear.length, '个模块');
- modulesToClear.forEach(key => {
- console.log('-', key);
- delete require.cache[key];
- });
-}
-
-// 清除缓存后再导入
-clearModuleCache();
-
-const axios = require('axios');
-const HarmlessPlace = require('./models/HarmlessPlace');
-
-console.log('=== 检查HarmlessPlace模型 ===');
-console.log('HarmlessPlace的类型:', typeof HarmlessPlace);
-console.log('HarmlessPlace是否为对象:', typeof HarmlessPlace === 'object' && HarmlessPlace !== null);
-console.log('HarmlessPlace是否有findAndCountAll方法:', typeof HarmlessPlace.findAndCountAll !== 'undefined');
-if (HarmlessPlace.findAndCountAll) {
- console.log('findAndCountAll的类型:', typeof HarmlessPlace.findAndCountAll);
-}
-
-// 登录函数
-async function login() {
- try {
- const response = await axios.post('http://localhost:3000/api/auth/login', {
- username: 'admin',
- password: '123456'
- });
- console.log('登录成功,token:', response.data.data.token);
- return response.data.data.token;
- } catch (error) {
- console.error('登录失败:', error.response ? error.response.data : error.message);
- return null;
- }
-}
-
-// 测试无害化场所列表API
-async function testHarmlessPlaceList(token) {
- try {
- const response = await axios.get('http://localhost:3000/api/harmless-place/list', {
- headers: {
- 'Authorization': `Bearer ${token}`
- },
- params: {
- page: 1,
- pageSize: 10
- }
- });
- console.log('无害化场所列表API调用成功:', response.data);
- return response.data;
- } catch (error) {
- console.error('无害化场所列表API调用失败:', error.message);
- if (error.response) {
- console.error('错误数据:', error.response.data);
- }
- return null;
- }
-}
-
-// 主函数
-async function main() {
- console.log('开始测试无害化场所管理API...');
-
- // 登录获取token
- const token = await login();
- if (!token) {
- console.log('登录失败,无法继续测试');
- return;
- }
-
- // 再次检查模型类型,确保在API调用前没有被修改
- console.log('\n=== API调用前再次检查HarmlessPlace模型 ===');
- console.log('HarmlessPlace的类型:', typeof HarmlessPlace);
- console.log('HarmlessPlace是否有findAndCountAll方法:', typeof HarmlessPlace.findAndCountAll !== 'undefined');
-
- // 测试API
- await testHarmlessPlaceList(token);
-
- console.log('\n所有测试完成!');
-}
-
-// 运行测试
-main().catch(err => console.error('测试过程中出错:', err));
\ No newline at end of file
diff --git a/government-backend/test-models.js b/government-backend/test-models.js
deleted file mode 100644
index 3afe065..0000000
--- a/government-backend/test-models.js
+++ /dev/null
@@ -1,74 +0,0 @@
-// 测试模型文件
-const sequelize = require('./config/database');
-const AdminStaff = require('./models/AdminStaff');
-const Department = require('./models/Department');
-const Position = require('./models/Position');
-
-async function testModels() {
- try {
- console.log('开始测试模型...');
-
- // 测试数据库连接
- await sequelize.authenticate();
- console.log('✅ 数据库连接成功');
-
- // 测试模型关系
- console.log('\n测试模型关系:');
- console.log('AdminStaff关联Department:', AdminStaff.associations.department ? '✅' : '❌');
- console.log('AdminStaff关联Position:', AdminStaff.associations.position ? '✅' : '❌');
- console.log('Department关联Position:', Department.associations.positions ? '✅' : '❌');
- console.log('Position关联Department:', Position.associations.department ? '✅' : '❌');
-
- // 尝试获取行政人员数据
- console.log('\n尝试获取行政人员数据:');
- const adminStaffs = await AdminStaff.findAll({
- include: [
- { model: Department, as: 'department' },
- { model: Position, as: 'position' }
- ],
- limit: 5
- });
-
- if (adminStaffs.length > 0) {
- console.log(`✅ 成功获取${adminStaffs.length}条行政人员数据`);
- console.log('示例数据:', adminStaffs[0].dataValues);
- } else {
- console.log('⚠️ 未找到行政人员数据');
- }
-
- // 尝试获取部门数据
- console.log('\n尝试获取部门数据:');
- const departments = await Department.findAll({
- limit: 5
- });
-
- if (departments.length > 0) {
- console.log(`✅ 成功获取${departments.length}条部门数据`);
- console.log('示例数据:', departments[0].dataValues);
- } else {
- console.log('⚠️ 未找到部门数据');
- }
-
- // 尝试获取岗位数据
- console.log('\n尝试获取岗位数据:');
- const positions = await Position.findAll({
- include: [{ model: Department, as: 'department' }],
- limit: 5
- });
-
- if (positions.length > 0) {
- console.log(`✅ 成功获取${positions.length}条岗位数据`);
- console.log('示例数据:', positions[0].dataValues);
- } else {
- console.log('⚠️ 未找到岗位数据');
- }
-
- console.log('\n✅ 模型测试完成');
- } catch (error) {
- console.error('❌ 模型测试失败:', error);
- } finally {
- await sequelize.close();
- }
-}
-
-testModels();
\ No newline at end of file
diff --git a/government-backend/test-personnel-api.js b/government-backend/test-personnel-api.js
deleted file mode 100644
index 9f56d5d..0000000
--- a/government-backend/test-personnel-api.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// 测试行政人员列表接口
-const axios = require('axios');
-
-// 政府后端服务地址
-const BASE_URL = 'http://localhost:5352/api';
-
-// 测试行政人员列表接口
-async function testAdminStaffList() {
- try {
- // 先登录获取token
- const loginResponse = await axios.post(`${BASE_URL}/auth/login`, {
- username: 'admin',
- password: '123456'
- });
-
- const token = loginResponse.data.token;
- console.log('登录成功,获取到token');
-
- // 使用token访问行政人员列表接口
- const response = await axios.get(`${BASE_URL}/personnel`, {
- headers: {
- 'Authorization': `Bearer ${token}`
- }
- });
-
- console.log('行政人员列表接口测试结果:');
- console.log(`- 状态码: ${response.status}`);
- console.log(`- 返回数据结构:`, Object.keys(response.data));
- console.log(`- 行政人员总数: ${response.data.total}`);
- console.log(`- 返回的行政人员列表长度: ${response.data.data ? response.data.data.length : 0}`);
-
- if (response.data.data && response.data.data.length > 0) {
- console.log(`- 第一条行政人员数据:`, response.data.data[0]);
- } else {
- console.log('- 行政人员列表为空');
- }
-
- console.log('\n测试完成!');
- } catch (error) {
- console.error('测试失败:', error.message);
- if (error.response) {
- console.error('错误状态码:', error.response.status);
- console.error('错误数据:', error.response.data);
- }
- }
-}
-
-// 执行测试
-console.log('开始测试行政人员列表接口...');
-testAdminStaffList();
\ No newline at end of file
diff --git a/government-backend/test-routes.js b/government-backend/test-routes.js
deleted file mode 100644
index 1bf81ce..0000000
--- a/government-backend/test-routes.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// 测试Express应用的路由注册情况
-const express = require('express');
-const path = require('path');
-
-// 创建一个简单的Express应用来测试路由
-const app = express();
-
-// 尝试加载slaughter路由
-try {
- const slaughterRoutes = require('./routes/slaughter');
- console.log('成功加载slaughter路由模块');
-
- // 检查路由模块的内容
- console.log('路由模块导出:', typeof slaughterRoutes);
-
- // 模拟注册路由
- app.use('/api/slaughter', slaughterRoutes);
- console.log('成功注册slaughter路由到/api/slaughter');
-
- // 检查路由是否有方法
- if (slaughterRoutes && slaughterRoutes.stack) {
- console.log('路由处理程序数量:', slaughterRoutes.stack.length);
- slaughterRoutes.stack.forEach((layer, index) => {
- if (layer.route) {
- console.log(`路由${index + 1}:`, layer.route.path, Object.keys(layer.route.methods));
- }
- });
- } else {
- console.log('路由模块没有stack属性,可能不是Express Router实例');
- }
-} catch (error) {
- console.error('加载slaughter路由失败:', error);
-}
-
-// 检查routes目录下的文件
-const fs = require('fs');
-const routesDir = path.join(__dirname, 'routes');
-fs.readdir(routesDir, (err, files) => {
- if (err) {
- console.error('读取routes目录失败:', err);
- return;
- }
-
- console.log('\nroutes目录下的文件:');
- files.forEach(file => {
- console.log('-', file);
- // 检查文件大小,确认文件不为空
- const stats = fs.statSync(path.join(routesDir, file));
- console.log(` 大小: ${stats.size} 字节`);
- });
-});
\ No newline at end of file
diff --git a/government-backend/test-server.js b/government-backend/test-server.js
deleted file mode 100644
index 1d99e1c..0000000
--- a/government-backend/test-server.js
+++ /dev/null
@@ -1,44 +0,0 @@
-const express = require('express');
-const cors = require('cors');
-const bodyParser = require('body-parser');
-
-const app = express();
-
-// 中间件
-app.use(cors());
-app.use(bodyParser.json());
-
-// 简单的认证中间件,允许所有请求通过
-app.use((req, res, next) => {
- console.log(`接收到请求: ${req.method} ${req.path}`);
- // 模拟用户数据
- req.user = {
- id: '1',
- username: 'admin',
- role: 'admin'
- };
- next();
-});
-
-// 加载测试路由
-app.use('/api/test', require('./routes/test-route'));
-
-// 加载slaughter路由
-app.use('/api/slaughter', require('./routes/slaughter'));
-
-// 简单的健康检查路由
-app.get('/health', (req, res) => {
- res.json({ status: 'ok' });
-});
-
-// 错误处理
-app.use((err, req, res, next) => {
- console.error('错误:', err);
- res.status(500).json({ error: '服务器错误' });
-});
-
-// 启动服务器在不同端口
-const PORT = 5353;
-app.listen(PORT, () => {
- console.log(`测试服务器已启动在端口 ${PORT}`);
-});
\ No newline at end of file