Compare commits

...

2 Commits

Author SHA1 Message Date
8d2bfd219a Merge branch 'master' of https://giee.aiotagro.com/aiotagro/nxxmdata 2025-11-18 10:35:53 +08:00
a23a828ea3 修改大屏 2025-11-18 10:34:38 +08:00
19 changed files with 496 additions and 64 deletions

View File

@@ -1,4 +1,4 @@
# 生产环境配置
VITE_API_BASE_URL=/api
VITE_API_FULL_URL=https://ad.ningmuyun.com/farm/api
VITE_API_FULL_URL=https://ad.liaoniuyun.com/farm/api
VITE_USE_PROXY=false

View File

@@ -0,0 +1,374 @@
#!/bin/bash
# Node.js 服务管理脚本 - 银行端后端bank-backend
# 使用方法: ./node_manager.sh [start|stop|restart|status]
# 配置区域
APP_NAME="bank-backend"
ENTRY_FILE="server.js"
APP_PORT="5351"
LOG_DIR="logs"
LOG_FILE="${LOG_DIR}/${APP_NAME}.log"
PID_FILE="pid.${APP_NAME}"
NODE_ENV="production"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 创建日志目录
if [ ! -d "$LOG_DIR" ]; then
mkdir -p "$LOG_DIR"
echo "已创建日志目录: $LOG_DIR"
fi
# 检查 Node.js 是否安装
if ! command -v node &> /dev/null; then
echo -e "${RED}错误: Node.js 未安装或不在 PATH 中${NC}"
exit 1
fi
# 检查入口文件是否存在
if [ ! -f "$ENTRY_FILE" ]; then
echo -e "${RED}错误: 入口文件 $ENTRY_FILE 不存在${NC}"
exit 1
fi
# 显示 Node.js 版本信息
NODE_VERSION=$(node --version)
echo -e "${GREEN}Node.js 版本: $NODE_VERSION${NC}"
# 使用 PM2 启动服务(如已安装)
function startPM2() {
if command -v pm2 &> /dev/null; then
echo -e "${YELLOW}检测到已安装 PM2使用 PM2 管理服务: $APP_NAME${NC}"
# 确保日志目录存在
[ -d "$LOG_DIR" ] || mkdir -p "$LOG_DIR"
pm2 start "$ENTRY_FILE" \
--name "$APP_NAME" \
--cwd "$(pwd)" \
--env "$NODE_ENV" \
--time \
--output "$LOG_DIR/${APP_NAME}.out.log" \
--error "$LOG_DIR/${APP_NAME}.err.log"
pm2 save
echo -e "${GREEN}PM2 已启动并保存进程列表pm2 save${NC}"
echo "如需开机自启,请执行(一次性):"
echo "pm2 startup systemd -u $(whoami) --hp $HOME; pm2 save"
echo "查看状态: pm2 status $APP_NAME"
return 0
else
return 1
fi
}
# 停止服务函数
function stopApp() {
echo -e "${YELLOW}正在停止服务: $APP_NAME${NC}"
# 从 PID 文件读取进程 ID
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo "找到进程 PID: $PID,正在停止..."
kill -TERM $PID
# 等待进程优雅退出
for i in {1..10}; do
if ! ps -p $PID > /dev/null 2>&1; then
echo -e "${GREEN}服务已优雅停止${NC}"
rm -f "$PID_FILE"
return 0
fi
sleep 1
done
# 如果优雅停止失败,强制杀死
echo -e "${YELLOW}优雅停止失败,强制终止进程${NC}"
kill -9 $PID
rm -f "$PID_FILE"
else
echo "PID 文件存在但进程不存在,清理 PID 文件"
rm -f "$PID_FILE"
fi
else
# 如果没有 PID 文件,尝试通过端口查找
PID=$(lsof -ti:$APP_PORT 2>/dev/null)
if [ -n "$PID" ]; then
echo "通过端口 $APP_PORT 找到 PID: $PID,正在停止..."
kill -TERM $PID
sleep 2
if ps -p $PID > /dev/null 2>&1; then
kill -9 $PID
fi
echo -e "${GREEN}服务已停止${NC}"
else
echo -e "${YELLOW}未找到运行中的服务: $APP_NAME${NC}"
fi
fi
}
# 启动服务函数
function startApp() {
echo -e "${YELLOW}正在启动服务: $APP_NAME${NC}"
# 优先使用 PM2 管理服务
if startPM2; then
echo -e "${GREEN}服务已通过 PM2 启动并托管,支持崩溃自动重启${NC}"
echo "日志: $LOG_DIR/${APP_NAME}.out.log 和 $LOG_DIR/${APP_NAME}.err.log"
return 0
fi
# 检查服务是否已经运行
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo -e "${YELLOW}服务已在运行中 (PID: $PID)${NC}"
return 0
else
echo "PID 文件存在但进程不存在,清理后重新启动"
rm -f "$PID_FILE"
fi
fi
# 检查端口是否被占用
if command -v lsof &> /dev/null; then
PORT_CHECK=$(lsof -ti:$APP_PORT 2>/dev/null)
if [ -n "$PORT_CHECK" ]; then
echo -e "${RED}错误: 端口 $APP_PORT 已被占用 (PID: $PORT_CHECK)${NC}"
echo "请先停止占用端口的进程或使用 restart 命令"
return 1
fi
fi
# 检查 .env 文件是否存在
if [ ! -f ".env" ]; then
echo -e "${YELLOW}警告: .env 文件不存在,将使用默认配置${NC}"
echo "建议从 env.example 复制并配置 .env 文件"
fi
# 检查 node_modules 是否存在
if [ ! -d "node_modules" ]; then
echo -e "${RED}错误: node_modules 目录不存在${NC}"
echo "请先运行: npm install"
return 1
fi
# 启动 Node.js 应用
echo "启动命令: NODE_ENV=$NODE_ENV nohup node $ENTRY_FILE > $LOG_FILE 2>&1 &"
NODE_ENV=$NODE_ENV nohup node $ENTRY_FILE > $LOG_FILE 2>&1 &
# 获取新进程的 PID
PID=$!
echo $PID > "$PID_FILE"
# 等待应用启动
echo "等待服务启动..."
sleep 3
# 验证启动是否成功
if ps -p $PID > /dev/null 2>&1; then
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}服务启动成功!${NC}"
echo -e "${GREEN}========================================${NC}"
echo "应用名称: $APP_NAME"
echo "进程 ID: $PID"
echo "监听端口: $APP_PORT"
echo "日志文件: $LOG_FILE"
echo "PID 文件: $PID_FILE"
echo "环境变量: NODE_ENV=$NODE_ENV"
echo -e "${GREEN}API 文档: http://localhost:$APP_PORT/api-docs${NC}"
echo ""
# 等待端口监听
echo "检查端口监听状态..."
sleep 2
if command -v lsof &> /dev/null; then
if lsof -ti:$APP_PORT > /dev/null 2>&1; then
echo -e "${GREEN}✓ 端口 $APP_PORT 正在监听${NC}"
else
echo -e "${YELLOW}⚠ 端口 $APP_PORT 尚未监听,请检查日志${NC}"
fi
fi
# 显示最近的日志
echo ""
echo "最近的启动日志:"
echo "------------------------"
tail -20 "$LOG_FILE"
else
echo -e "${RED}========================================${NC}"
echo -e "${RED}服务启动失败!${NC}"
echo -e "${RED}========================================${NC}"
echo "请检查日志文件: $LOG_FILE"
echo ""
echo "最近的错误日志:"
echo "------------------------"
tail -30 "$LOG_FILE"
rm -f "$PID_FILE"
exit 1
fi
}
# 重启服务函数
function restartApp() {
echo -e "${YELLOW}正在重启服务: $APP_NAME${NC}"
stopApp
sleep 3
startApp
}
# 状态检查函数
function statusApp() {
echo -e "${YELLOW}检查服务状态: $APP_NAME${NC}"
echo "========================================"
# 如果使用 PM2 托管,优先展示 PM2 状态
if command -v pm2 &> /dev/null; then
if pm2 describe "$APP_NAME" > /dev/null 2>&1; then
PM2_STATE=$(pm2 info "$APP_NAME" | grep -i "status" | awk -F":" '{print $2}' | xargs)
echo -e "PM2 状态: ${GREEN}${PM2_STATE}${NC}"
pm2 status "$APP_NAME"
echo ""
fi
fi
if [ -f "$PID_FILE" ]; then
PID=$(cat "$PID_FILE")
if ps -p $PID > /dev/null 2>&1; then
echo -e "${GREEN}✓ 服务正在运行${NC}"
echo "----------------------------------------"
echo "进程 ID: $PID"
echo "应用名称: $APP_NAME"
echo "监听端口: $APP_PORT"
# 启动时间
if command -v ps &> /dev/null; then
START_TIME=$(ps -o lstart= -p $PID 2>/dev/null)
if [ -n "$START_TIME" ]; then
echo "启动时间: $START_TIME"
fi
# 内存使用
MEM_USAGE=$(ps -o rss= -p $PID 2>/dev/null | awk '{printf "%.2f MB", $1/1024}')
if [ -n "$MEM_USAGE" ]; then
echo "内存使用: $MEM_USAGE"
fi
# CPU使用率
CPU_USAGE=$(ps -o %cpu= -p $PID 2>/dev/null)
if [ -n "$CPU_USAGE" ]; then
echo "CPU 使用: ${CPU_USAGE}%"
fi
fi
# 检查端口监听状态
if command -v lsof &> /dev/null; then
PORT_INFO=$(lsof -ti:$APP_PORT 2>/dev/null)
if [ -n "$PORT_INFO" ]; then
echo -e "端口状态: ${GREEN}监听中 ($APP_PORT)${NC}"
else
echo -e "端口状态: ${RED}未监听${NC}"
fi
fi
# 日志文件信息
if [ -f "$LOG_FILE" ]; then
LOG_SIZE=$(du -h "$LOG_FILE" | cut -f1)
echo "日志大小: $LOG_SIZE"
echo "日志文件: $LOG_FILE"
fi
echo ""
echo "最近的日志 (最后10行):"
echo "----------------------------------------"
tail -10 "$LOG_FILE" 2>/dev/null || echo "无法读取日志文件"
else
echo -e "${RED}✗ 服务未运行 (PID 文件存在但进程不存在)${NC}"
echo "建议清理 PID 文件: rm -f $PID_FILE"
fi
else
# 通过端口检查
if command -v lsof &> /dev/null; then
PID=$(lsof -ti:$APP_PORT 2>/dev/null)
if [ -n "$PID" ]; then
echo -e "${YELLOW}⚠ 服务正在运行但未通过脚本管理${NC}"
echo "进程 ID: $PID"
echo "监听端口: $APP_PORT"
echo "建议使用: ./node_manager.sh stop 停止服务后重新启动"
else
echo -e "${RED}✗ 服务未运行${NC}"
echo "使用以下命令启动: ./node_manager.sh start"
fi
else
echo -e "${RED}✗ 服务未运行 (PID 文件不存在)${NC}"
echo "使用以下命令启动: ./node_manager.sh start"
fi
fi
echo "========================================"
}
# 查看日志函数
function viewLogs() {
if [ -f "$LOG_FILE" ]; then
echo -e "${YELLOW}实时查看日志 (Ctrl+C 退出):${NC}"
tail -f "$LOG_FILE"
else
echo -e "${RED}日志文件不存在: $LOG_FILE${NC}"
fi
}
# 主逻辑
case "$1" in
start)
startApp
;;
stop)
stopApp
;;
restart)
restartApp
;;
status)
statusApp
;;
logs)
viewLogs
;;
*)
echo "========================================"
echo "银行端后端bank-backend - 服务管理脚本"
echo "========================================"
echo "使用方法: $0 {start|stop|restart|status|logs}"
echo ""
echo "命令说明:"
echo " start - 启动服务"
echo " stop - 停止服务"
echo " restart - 重启服务"
echo " status - 查看服务状态"
echo " logs - 实时查看日志"
echo ""
echo "增强说明:"
echo " 已优先使用 PM2 管理服务(如安装了 pm2自动重启更可靠"
echo " 配置 PM2 开机自启: pm2 startup systemd -u $(whoami) --hp $HOME; pm2 save"
echo ""
echo "配置信息:"
echo " 应用名称: $APP_NAME"
echo " 入口文件: $ENTRY_FILE"
echo " 监听端口: $APP_PORT"
echo " 日志文件: $LOG_FILE"
echo ""
echo "示例:"
echo " $0 start # 启动服务"
echo " $0 status # 查看状态"
echo " $0 logs # 查看日志"
exit 1
;;
esac
exit 0

View File

@@ -150,25 +150,25 @@
<div class="company-bar">
<div class="company-fill" style="width: 35%; background: #4169E1"></div>
</div>
<span class="company-name">中国人民财产保险公司平凉支公司</span>
<span class="company-name">中国人民财产保险公司宁夏支公司</span>
</div>
<div class="company-item">
<div class="company-bar">
<div class="company-fill" style="width: 25%; background: #00CED1"></div>
</div>
<span class="company-name">中国太平洋保险平凉支公司</span>
<span class="company-name">中国太平洋保险宁夏支公司</span>
</div>
<div class="company-item">
<div class="company-bar">
<div class="company-fill" style="width: 20%; background: #00CED1"></div>
</div>
<span class="company-name">中国人寿财产保险股份有限公司平凉支公司</span>
<span class="company-name">中国人寿财产保险股份有限公司宁夏支公司</span>
</div>
<div class="company-item">
<div class="company-bar">
<div class="company-fill" style="width: 20%; background: #708090"></div>
</div>
<span class="company-name">中国太平洋财产保险平凉支公司</span>
<span class="company-name">中国太平洋财产保险宁夏支公司</span>
</div>
</div>
</div>

View File

@@ -1,4 +1,4 @@
# 生产环境配置
VITE_API_BASE_URL=https://ad.ningmuyun.com/api/government
VITE_API_BASE_URL=https://ad.liaoniuyun.com/api/government
VITE_APP_TITLE=政府管理系统
VITE_APP_ENV=production

View File

@@ -8,17 +8,21 @@
@openChange="handleOpenChange"
class="sidebar-menu"
>
<!-- 数据览仓 -->
<!-- 数据览仓已注释 -->
<!--
<a-menu-item key="/index/data_center">
<template #icon><BarChartOutlined /></template>
<span>数据览仓</span>
</a-menu-item>
-->
<!-- 市场行情 -->
<!-- 市场行情已注释 -->
<!--
<a-menu-item key="/price/price_list">
<template #icon><LineChartOutlined /></template>
<span>市场行情</span>
</a-menu-item>
-->
<!-- 人员管理 -->
<a-sub-menu key="personnel">

View File

@@ -6,7 +6,7 @@ import axios from 'axios'
// 创建axios实例
const instance = axios.create({
baseURL: '/api',
baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
timeout: 10000,
headers: {
'Content-Type': 'application/json'

View File

@@ -84,7 +84,7 @@
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { message } from 'ant-design-vue'
import axios from 'axios'
import api from '@/utils/api-redesigned'
// 表格列定义
const columns = [
@@ -155,8 +155,8 @@ const editPositionRules = {
// 从API获取部门数据
const fetchDepartments = async () => {
try {
const response = await axios.get('/api/government/departments')
departments.value = response.data
const response = await api.government.departments.getList()
departments.value = response?.data || response
} catch (error) {
message.error('获取部门数据失败:' + error.message)
console.error('获取部门数据失败:', error)
@@ -209,7 +209,7 @@ const showSetPermissionModal = (record) => {
// 新增部门
const handleAddDepartment = async () => {
try {
await axios.post('/api/government/departments', {
await api.government.departments.create({
name: addDepartmentFormData.name,
description: addDepartmentFormData.description
})
@@ -226,7 +226,7 @@ const handleAddDepartment = async () => {
// 新增岗位
const handleAddPosition = async () => {
try {
await axios.post(`/api/government/departments/${addPositionFormData.department_id}/positions`, {
await api.government.positions.create({
department_id: addPositionFormData.department_id,
name: addPositionFormData.name
})
@@ -243,7 +243,7 @@ const handleAddPosition = async () => {
// 编辑岗位
const handleEditPosition = async () => {
try {
await axios.put(`/api/government/positions/${editPositionFormData.id}`, {
await api.government.positions.update(editPositionFormData.id, {
name: editPositionFormData.name
})
message.success('岗位编辑成功')
@@ -259,7 +259,7 @@ const handleEditPosition = async () => {
// 删除岗位
const handleDeletePosition = async (positionId) => {
try {
await axios.delete(`/api/government/positions/${positionId}`)
await api.government.positions.delete(positionId)
message.success('岗位删除成功')
// 重新获取数据
await fetchDepartments()
@@ -272,7 +272,7 @@ const handleDeletePosition = async (positionId) => {
// 删除部门
const handleDeleteDepartment = async (departmentId) => {
try {
await axios.delete(`/api/government/departments/${departmentId}`)
await api.government.departments.delete(departmentId)
message.success('部门删除成功')
// 重新获取数据
await fetchDepartments()
@@ -285,7 +285,7 @@ const handleDeleteDepartment = async (departmentId) => {
// 设置权限
const handleSetPermission = async () => {
try {
await axios.post(`/api/government/positions/${currentPosition.value.id}/permission`, {
await api.government.positions.setPermission(currentPosition.value.id, {
permission_details: { basic: ['view', 'edit', 'add'], advanced: ['delete'] }
})
message.success('权限设置成功')

View File

@@ -111,23 +111,25 @@ const formatTime = (time) => {
return dayjs(time).format('YYYY-MM-DD HH:mm:ss')
}
// 获取统计数据
import api from '@/utils/api-redesigned'
// 获取统计数据(统一封装)
const fetchStats = async () => {
try {
// 获取监管统计数据
const supervisionResponse = await axios.get('/api/supervision/stats')
if (supervisionResponse.data.code === 200) {
const supervisionData = supervisionResponse.data.data
stats.value.totalEntities = supervisionData.entityCount || 0
stats.value.inspectionCount = supervisionData.inspectionCount || 0
const supervisionResp = await api.supervision.getStats()
if (supervisionResp?.code === 200) {
const supervisionData = supervisionResp.data
stats.value.totalEntities = supervisionData?.entityCount || 0
stats.value.inspectionCount = supervisionData?.inspectionCount || 0
}
// 获取疫情统计数据
const epidemicResponse = await axios.get('/api/epidemic/stats')
if (epidemicResponse.data.code === 200) {
const epidemicData = epidemicResponse.data.data
stats.value.vaccinated = epidemicData.vaccinated || 0
stats.value.tested = epidemicData.tested || 0
const epidemicResp = await api.epidemic.getStats()
if (epidemicResp?.code === 200) {
const epidemicData = epidemicResp.data
stats.value.vaccinated = epidemicData?.vaccinated || 0
stats.value.tested = epidemicData?.tested || 0
}
} catch (error) {
console.error('获取统计数据失败:', error)

View File

@@ -365,11 +365,12 @@ const initScaleChart = () => {
})
}
// 从API获取数据
// 从API获取数据(统一封装)
import api from '@/utils/api-redesigned'
const fetchData = async () => {
try {
const response = await axios.get('/api/government/data-center');
const data = response.data;
const data = await api.dashboard.getDataCenter();
// 更新统计数据
养殖户总数.value = data.totalFarmers.toLocaleString();

View File

@@ -88,14 +88,12 @@ const productTypeText = computed(() => {
return map[activeProductTab.value] || '育肥牛'
})
// 从后端获取市场行情数据
// 从后端获取市场行情数据(统一封装)
import api from '@/utils/api-redesigned'
const fetchMarketPriceData = async (type = 'beef') => {
try {
const response = await axios.get('/api/government/market-price', {
params: { type }
})
const data = response.data
const data = await api.dashboard.getMarketPrice({ type })
// 更新数据
currentPrice.value = data.currentPrice

View File

@@ -132,4 +132,32 @@ pm2 status government-backend
# 测试API连通性
curl -k https://ad.ningmuyun.com/api/government/departments
```
```
---
## 附:历史路由刷新 404 修复
若在访问如 `https://ad.liaoniuyun.com/government/farmer` 并刷新后出现 404这是前端使用 `history` 路由模式时,服务器未对深链接进行回退到 `index.html` 导致。请在 Nginx 中为 `/government/` 增加路由回退:
```nginx
# 优先匹配政府端前端路径,并做历史路由回退
location ^~ /government/ {
# 推荐使用 root 方式,目录中应包含 government/index.html 与打包的 assets/
root /var/www/html;
index index.html;
try_files $uri $uri/ /government/index.html;
}
# 若使用 alias也请注意路径以 / 结尾,并保留回退
# location ^~ /government/ {
# alias /var/www/html/government/;
# index index.html;
# try_files $uri $uri/ /government/index.html;
# }
```
验证步骤:
- 访问并刷新:`https://ad.liaoniuyun.com/government/farmer` 应正常显示页面,不再 404。
- 如仍异常,检查是否有其它 `location` 块(例如 `/` 或正则)优先生效覆盖了 `/government/` 的回退配置;可通过 `^~` 提升优先级。
- 确认 `vite.config.js` 已设置 `base: '/government/'`,且路由为 `createWebHistory('/government/')`(本项目已配置)。

View File

@@ -48,6 +48,7 @@ app.use('/api/visualization', require('./routes/visualization'));
app.use('/api/system', require('./routes/system'));
app.use('/api/files', require('./routes/files'));
app.use('/api/government', require('./routes/government'));
app.use('/api/dashboard', require('./routes/dashboard'));
app.use('/api/smart-earmark', require('./routes/smartEarmark'));
app.use('/api/smart-host', require('./routes/smartHost'));
app.use('/api/slaughter', require('./routes/slaughter'));

View File

@@ -93,8 +93,8 @@ server {
access_log /var/log/nginx/wapi.ningmuyun.com.access.log;
error_log /var/log/nginx/wapi.ningmuyun.com.error.log;
# 养殖端API反向代理 - 使用更具体的路径匹配
location ^~ /farm-api/ {
# API反向代理
location /api/ {
proxy_pass http://localhost:5350/api/;
limit_except GET POST OPTIONS { # 确保包含 POST
deny all;
@@ -359,10 +359,11 @@ server {
}
}
# ==================== 政府项目API代理 ====================
# 政府端API统一代理 - 参考银行端设计模式
location ^~ /api/ {
proxy_pass http://localhost:5352/api/;
# location ^~ /government/api/ {
# proxy_pass http://localhost:5352/; # 政府后端服务端口
location ^~ /api/government/auth/ {
proxy_pass http://localhost:5352/api/auth/; # 政府后端认证服务端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -384,6 +385,29 @@ server {
return 204;
}
}
location ^~ /api/government/ {
proxy_pass http://localhost:5352/api/government/;
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' 'https://ad.ningmuyun.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-Requested-With' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' 'https://ad.ningmuyun.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, X-Requested-With';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Content-Type' 'text/plain; charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
}
# ==================== 养殖项目 (yangzhi) ====================
location ^~ /farm/ {

View File

@@ -31,7 +31,7 @@
<a class="nav-link" href="index.html">返回首页</a>
</li>
<li class="nav-item">
<a class="btn btn-outline-light ms-2" href="https://ad.ningmuyun.com/bank/" target="_blank">
<a class="btn btn-outline-light ms-2" href="https://ad.liaoniuyun.com/bank/" target="_blank">
进入系统
</a>
</li>
@@ -53,7 +53,7 @@
助力银行降低信贷风险,提高资产质量。
</p>
<div class="d-flex gap-3">
<a href="https://ad.ningmuyun.com/bank/" class="btn btn-light btn-lg" target="_blank">
<a href="https://ad.liaoniuyun.com/bank/" class="btn btn-light btn-lg" target="_blank">
<i class="bi bi-box-arrow-up-right me-2"></i>立即体验
</a>
<a href="index.html#contact" class="btn btn-outline-light btn-lg">
@@ -206,7 +206,7 @@
<h2 class="mb-4">立即提升银行风控能力</h2>
<p class="lead mb-4">选择专业的银行监管系统,让您的信贷风险管理更加智能、高效、可靠</p>
<div class="d-flex gap-3 justify-content-center">
<a href="https://ad.ningmuyun.com/bank/" class="btn btn-light btn-lg" target="_blank">
<a href="https://ad.liaoniuyun.com/bank/" class="btn btn-light btn-lg" target="_blank">
<i class="bi bi-box-arrow-up-right me-2"></i>免费试用
</a>
<a href="index.html#contact" class="btn btn-outline-light btn-lg">
@@ -224,7 +224,7 @@
<p>&copy; 2025 宁夏智慧养殖监管平台. 保留所有权利.</p>
</div>
<div class="col-md-6 text-md-end">
<p>备案号: 宁ICP备XXXXXXXX号</p>
<p>备案号: <a href="https://beiancx.miit.gov.cn/" target="_blank" rel="noopener">鄂ICP备15009094号-11</a></p>
</div>
</div>
</div>

View File

@@ -296,7 +296,7 @@
<p>&copy; 2025 宁夏智慧养殖监管平台. 保留所有权利.</p>
</div>
<div class="col-md-6 text-md-end">
<p>备案号: 宁ICP备XXXXXXXX号</p>
<p>备案号: <a href="https://beiancx.miit.gov.cn/" target="_blank" rel="noopener">鄂ICP备15009094号-11</a></p>
</div>
</div>
</div>

View File

@@ -31,7 +31,7 @@
<a class="nav-link" href="index.html">返回首页</a>
</li>
<li class="nav-item">
<a class="btn btn-outline-light ms-2" href="https://ad.ningmuyun.com/farm/" target="_blank">
<a class="btn btn-outline-light ms-2" href="https://ad.liaoniuyun.com/farm/" target="_blank">
<i class="bi bi-box-arrow-up-right me-1"></i>进入系统
</a>
</li>
@@ -53,7 +53,7 @@
实现养殖过程的智能化、精细化和标准化管理。
</p>
<div class="d-flex gap-3">
<a href="https://ad.ningmuyun.com/farm/" class="btn btn-light btn-lg" target="_blank">
<a href="https://ad.liaoniuyun.com/farm/" class="btn btn-light btn-lg" target="_blank">
<i class="bi bi-box-arrow-up-right me-2"></i>立即体验
</a>
<a href="index.html#contact" class="btn btn-outline-light btn-lg">
@@ -206,7 +206,7 @@
<h2 class="mb-4">立即开启数字化养殖管理之旅</h2>
<p class="lead mb-4">选择专业的养殖管理系统,让您的养殖业务更加高效、安全、智能</p>
<div class="d-flex gap-3 justify-content-center">
<a href="https://ad.ningmuyun.com/farm/" class="btn btn-light btn-lg" target="_blank">
<a href="https://ad.liaoniuyun.com/farm/" class="btn btn-light btn-lg" target="_blank">
<i class="bi bi-box-arrow-up-right me-2"></i>免费试用
</a>
<a href="index.html#contact" class="btn btn-outline-light btn-lg">
@@ -224,7 +224,7 @@
<p>&copy; 2025 宁夏智慧养殖监管平台. 保留所有权利.</p>
</div>
<div class="col-md-6 text-md-end">
<p>备案号: 宁ICP备XXXXXXXX号</p>
<p>备案号: <a href="https://beiancx.miit.gov.cn/" target="_blank" rel="noopener">鄂ICP备15009094号-11</a></p>
</div>
</div>
</div>

View File

@@ -31,7 +31,7 @@
<a class="nav-link" href="index.html">返回首页</a>
</li>
<li class="nav-item">
<a class="btn btn-outline-light ms-2" href="https://ad.ningmuyun.com/government/" target="_blank">
<a class="btn btn-outline-light ms-2" href="https://ad.liaoniuyun.com/government/" target="_blank">
进入系统
</a>
</li>
@@ -53,7 +53,7 @@
实现监管工作的智能化、规范化和高效化管理。
</p>
<div class="d-flex gap-3">
<a href="https://ad.ningmuyun.com/government/" class="btn btn-light btn-lg" target="_blank">
<a href="https://ad.liaoniuyun.com/government/" class="btn btn-light btn-lg" target="_blank">
<i class="bi bi-box-arrow-up-right me-2"></i>立即体验
</a>
<a href="index.html#contact" class="btn btn-outline-light btn-lg">
@@ -206,7 +206,7 @@
<h2 class="mb-4">立即提升政府监管效能</h2>
<p class="lead mb-4">选择专业的政府监管系统,让您的监管工作更加高效、精准、规范</p>
<div class="d-flex gap-3 justify-content-center">
<a href="https://ad.ningmuyun.com/government/" class="btn btn-light btn-lg" target="_blank">
<a href="https://ad.liaoniuyun.com/government/" class="btn btn-light btn-lg" target="_blank">
<i class="bi bi-box-arrow-up-right me-2"></i>免费试用
</a>
<a href="index.html#contact" class="btn btn-outline-light btn-lg">
@@ -224,7 +224,7 @@
<p>&copy; 2025 宁夏智慧养殖监管平台. 保留所有权利.</p>
</div>
<div class="col-md-6 text-md-end">
<p>备案号: 宁ICP备XXXXXXXX号</p>
<p>备案号: <a href="https://beiancx.miit.gov.cn/" target="_blank" rel="noopener">鄂ICP备15009094号-11</a></p>
</div>
</div>
</div>

View File

@@ -405,7 +405,7 @@
</div>
<div class="contact-bottom-item">
<i class="bi bi-globe"></i>
<span>官网www.ningmuyun.com</span>
<span>官网www.liaoniuyun.com</span>
</div>
</div>
</div>
@@ -419,7 +419,7 @@
<p>&copy; 2025 宁夏智慧养殖监管平台. 保留所有权利.</p>
</div>
<div class="col-md-6 text-md-end">
<p>备案号: 宁ICP备XXXXXXXX号</p>
<p>备案号: <a href="https://beiancx.miit.gov.cn/" target="_blank" rel="noopener">鄂ICP备15009094号-11</a></p>
</div>
</div>
</div>

View File

@@ -31,7 +31,7 @@
<a class="nav-link" href="index.html">返回首页</a>
</li>
<li class="nav-item">
<a class="btn btn-outline-light ms-2" href="https://ad.ningmuyun.com/insurance/" target="_blank">
<a class="btn btn-outline-light ms-2" href="https://ad.liaoniuyun.com/insurance/" target="_blank">
<i class="bi bi-box-arrow-up-right me-1"></i>进入系统
</a>
</li>
@@ -53,7 +53,7 @@
实现保险业务的智能化、规范化和高效化管理。
</p>
<div class="d-flex gap-3">
<a href="https://ad.ningmuyun.com/insurance/" class="btn btn-light btn-lg" target="_blank">
<a href="https://ad.liaoniuyun.com/insurance/" class="btn btn-light btn-lg" target="_blank">
<i class="bi bi-box-arrow-up-right me-2"></i>立即体验
</a>
<a href="index.html#contact" class="btn btn-outline-light btn-lg">
@@ -206,7 +206,7 @@
<h2 class="mb-4">立即优化保险业务管理</h2>
<p class="lead mb-4">选择专业的保险监管系统,让您的保险业务更加高效、精准、可靠</p>
<div class="d-flex gap-3 justify-content-center">
<a href="https://ad.ningmuyun.com/insurance/" class="btn btn-light btn-lg" target="_blank">
<a href="https://ad.liaoniuyun.com/insurance/" class="btn btn-light btn-lg" target="_blank">
<i class="bi bi-box-arrow-up-right me-2"></i>免费试用
</a>
<a href="index.html#contact" class="btn btn-outline-light btn-lg">
@@ -224,7 +224,7 @@
<p>&copy; 2025 宁夏智慧养殖监管平台. 保留所有权利.</p>
</div>
<div class="col-md-6 text-md-end">
<p>备案号: 宁ICP备XXXXXXXX号</p>
<p>备案号: <a href="https://beiancx.miit.gov.cn/" target="_blank" rel="noopener">鄂ICP备15009094号-11</a></p>
</div>
</div>
</div>