修改大屏
This commit is contained in:
@@ -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
|
||||
@@ -60,7 +60,7 @@ export default defineConfig(({ mode }) => {
|
||||
__APP_ENV__: JSON.stringify(env),
|
||||
// 在生产环境中强制使用正确的API URL
|
||||
'import.meta.env.VITE_API_BASE_URL': JSON.stringify(
|
||||
mode === 'production' ? 'https://ad.ningmuyun.com/farm/api' : (env.VITE_API_BASE_URL || '/api')
|
||||
mode === 'production' ? 'https://ad.liaoniuyun.com/farm/api' : (env.VITE_API_BASE_URL || '/api')
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
374
bank-backend/node_manager.sh
Normal file
374
bank-backend/node_manager.sh
Normal 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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
@@ -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">
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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('权限设置成功')
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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/')`(本项目已配置)。
|
||||
@@ -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'));
|
||||
|
||||
@@ -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/ {
|
||||
|
||||
@@ -13,7 +13,7 @@ function initBaiduMap() {
|
||||
mapContainer.classList.add('map-loading');
|
||||
|
||||
// 百度地图API密钥
|
||||
const BAIDU_MAP_AK = 'SOawZTeQbxdgrKYYx0o2hn34G0DyU2uo';
|
||||
const BAIDU_MAP_AK = 'fLz8UwJSM3ayYl6dtsWYp7TQ8993R6kC';
|
||||
|
||||
// 动态加载百度地图API脚本
|
||||
const script = document.createElement('script');
|
||||
|
||||
@@ -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>© 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>
|
||||
|
||||
@@ -296,7 +296,7 @@
|
||||
<p>© 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>
|
||||
|
||||
@@ -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>© 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>
|
||||
|
||||
@@ -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>© 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>
|
||||
|
||||
@@ -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>© 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>
|
||||
|
||||
@@ -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>© 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>
|
||||
|
||||
Reference in New Issue
Block a user