提交 cb77bc2f 作者: zhongye-dev

Initial commit: 植物检疫检测隔离中心智能管理平台 (Vue 3 + Vite)

上级
node_modules/
dist
.vite
.DS_Store
*.log
.env
.env.local

(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
vite v5.4.21 building for production...
transforming...
✓ 1641 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html  0.56 kB │ gzip: 0.41 kB
dist/assets/HomeView-K5NBGBX5.css  0.90 kB │ gzip: 0.43 kB
dist/assets/DatePicker-BJWEANDj.css  1.62 kB │ gzip: 0.60 kB
dist/assets/SampleRegister-cUCycDKY.css  3.77 kB │ gzip: 1.05 kB
dist/assets/EntrustList-BHctiG7M.css  4.14 kB │ gzip: 1.14 kB
dist/assets/index-Bfyqz0HH.css  369.78 kB │ gzip: 49.99 kB
dist/assets/Roles-8iRQ4jVO.js  0.22 kB │ gzip: 0.24 kB
dist/assets/Disposal-SX1a8GIJ.js  0.23 kB │ gzip: 0.25 kB
dist/assets/Users-DeZ6_LtC.js  0.23 kB │ gzip: 0.24 kB
dist/assets/Dict-Dhh9S-5e.js  0.23 kB │ gzip: 0.25 kB
dist/assets/Log-SLmu1Rki.js  0.23 kB │ gzip: 0.26 kB
dist/assets/SampleOut-BELh0L5H.js  0.23 kB │ gzip: 0.26 kB
dist/assets/SampleStorage-VG60SIPg.js  0.23 kB │ gzip: 0.26 kB
dist/assets/AuditCert-BSHGET5x.js  0.23 kB │ gzip: 0.26 kB
dist/assets/EntrustReg-CldFFKnf.js  0.24 kB │ gzip: 0.26 kB
dist/assets/RiskWarning-Brr7UYH6.js  0.24 kB │ gzip: 0.26 kB
dist/assets/ReportManage-DcSkYiAw.js  0.24 kB │ gzip: 0.26 kB
dist/assets/IsolationQuarantine-BlA192gW.js  0.24 kB │ gzip: 0.25 kB
dist/assets/EntrustArchive-p7YNut0M.js  0.24 kB │ gzip: 0.26 kB
dist/assets/EntrustAudit-DfZV14PR.js  0.24 kB │ gzip: 0.25 kB
dist/assets/DataAnalysis-tHh13l4Z.js  0.24 kB │ gzip: 0.26 kB
dist/assets/SampleQuarantine-DD7wstmi.js  0.25 kB │ gzip: 0.27 kB
dist/assets/PagePlaceholder-Diomz7UX.js  0.52 kB │ gzip: 0.40 kB
dist/assets/DatePicker-BFjOmIRQ.js  2.98 kB │ gzip: 1.43 kB
dist/assets/HomeView-CbRi-j9O.js  3.49 kB │ gzip: 1.62 kB
dist/assets/EntrustList-DqBiXNZl.js  10.13 kB │ gzip: 3.61 kB
dist/assets/SampleRegister-HRbdLZXo.js  12.02 kB │ gzip: 3.95 kB
dist/assets/index-wiGqx7ZU.js 1,213.78 kB │ gzip: 389.81 kB
✓ built in 1m 10s
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<title>植物检疫检测隔离中心智能管理平台</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
\ No newline at end of file
{
"name": "plant-quarantine-platform",
"private": true,
"version": "1.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.4.21",
"vue-router": "^4.3.0",
"pinia": "^2.1.7",
"element-plus": "^2.6.2",
"@element-plus/icons-vue": "^2.3.1"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.4",
"vite": "^5.2.0"
}
}
\ No newline at end of file
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>检疫数据统计</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📊</div><div class="ph-title">检疫数据统计</div><div class="ph-desc">检疫数据多维统计</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>有害生物分析</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🐛</div><div class="ph-title">有害生物分析</div><div class="ph-desc">有害生物检出情况分析</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>趋势分析</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📈</div><div class="ph-title">趋势分析</div><div class="ph-desc">历年趋势与季节性分析</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>证书申请受理</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📥</div><div class="ph-title">证书申请受理</div><div class="ph-desc">受理检疫证书申请</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>审核流程管理</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🔍</div><div class="ph-title">审核流程管理</div><div class="ph-desc">证书审核流程管理</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>证书签发</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🪪</div><div class="ph-title">证书签发</div><div class="ph-desc">检疫证书签发与打印</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>证书查询</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🔎</div><div class="ph-title">证书查询</div><div class="ph-desc">证书真伪与历史查询</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>处置执行登记</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">⚙️</div><div class="ph-title">处置执行登记</div><div class="ph-desc">处置过程执行情况登记</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>处置方案审批</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📐</div><div class="ph-title">处置方案审批</div><div class="ph-desc">除害处置方案制定与审批</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>处置档案管理</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🗂️</div><div class="ph-title">处置档案管理</div><div class="ph-desc">历史处置档案归档与查询</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>委托书归档</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📑</div><div class="ph-title">委托书归档</div><div class="ph-desc">已办结委托书归档管理</div></div></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>委托书审核</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📑</div><div class="ph-title">委托书审核</div><div class="ph-desc">委托书审核与流转</div></div></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>委托书登记</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📑</div><div class="ph-title">委托书登记</div><div class="ph-desc">新建委托书登记记录</div></div></body></html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<title>首页 - 植物检疫检测隔离中心</title>
<link rel="stylesheet" href="../styles/main.css?v=20260907" />
<style>
body { padding: 8px; background: #fff; }
.welcome {
background: linear-gradient(90deg, #fef2f2 0%, #fff 100%);
border-left: 4px solid #d71e1e;
padding: 8px 16px;
margin-bottom: 8px;
border-radius: 3px;
}
.welcome h2 { color: #d71e1e; font-size: 17px; margin-bottom: 2px; }
.welcome p { color: #666; font-size: 13px; }
.quick-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 8px;
margin-bottom: 8px;
}
.quick {
background: #fff;
border: 1px solid #f0f0f0;
border-radius: 4px;
padding: 6px 6px;
text-align: center;
cursor: pointer;
transition: all 0.15s;
}
.quick:hover { border-color: #d71e1e; box-shadow: 0 2px 8px rgba(215,30,30,0.08); }
.quick .qi { font-size: 18px; margin-bottom: 0; }
.quick .qn { font-size: 12px; color: #555; }
.badge {
display: inline-block;
min-width: 18px;
padding: 0 5px;
height: 16px;
line-height: 16px;
background: #d71e1e;
color: #fff;
border-radius: 8px;
font-size: 11px;
margin-left: 4px;
}
.status-tag {
display: inline-block;
padding: 1px 6px;
border-radius: 2px;
font-size: 12px;
}
.tag-red { background: #fef2f2; color: #d71e1e; }
.tag-orange { background: #fff4e6; color: #fa8c16; }
.tag-green { background: #f0f9eb; color: #52c41a; }
.tag-blue { background: #e6f4ff; color: #1890ff; }
/* 覆盖主样式,让首页更紧凑,完整显示无滚动条 */
.stat-row { gap: 6px; margin-bottom: 6px; }
.stat-card { padding: 6px 12px; }
.stat-icon { width: 32px; height: 32px; font-size: 15px; margin-right: 8px; }
.stat-label { font-size: 12px; margin-bottom: 2px; }
.stat-value { font-size: 18px; }
.stat-extra { font-size: 11px; }
.panel { margin-bottom: 6px; }
.panel-header { padding: 5px 10px; }
.panel-title { font-size: 14px; padding-left: 8px; }
.panel-title::before { width: 3px; height: 12px; }
.panel-body { padding: 6px 10px; }
.row-2 { gap: 6px; }
.chart-box { height: 110px; font-size: 11px; }
.simple-table th, .simple-table td { padding: 3px 6px; }
.simple-table { font-size: 12px; }
.simple-table th { font-size: 11px; }
</style>
</head>
<body>
<div class="welcome">
<h2>欢迎使用植物检疫检测隔离中心智能管理平台</h2>
<p>今日 <span style="color:#d71e1e;font-weight:bold;">12</span> 条新样本待接收,<span style="color:#fa8c16;font-weight:bold;">3</span> 项隔离即将到期,<span style="color:#d71e1e;font-weight:bold;">1</span> 项风险预警待处理。</p>
</div>
<!-- 快捷入口 -->
<div class="quick-grid">
<div class="quick"><div class="qi">🧪</div><div class="qn">样本接收</div></div>
<div class="quick"><div class="qi">🔬</div><div class="qn">检疫任务</div></div>
<div class="quick"><div class="qi">🏥</div><div class="qn">隔离分配</div></div>
<div class="quick"><div class="qi">🔥</div><div class="qn">除害处置</div></div>
<div class="quick"><div class="qi">📊</div><div class="qn">数据分析</div></div>
<div class="quick"><div class="qi">🪪</div><div class="qn">审核发证</div></div>
</div>
<!-- 统计指标 -->
<div class="stat-row">
<div class="stat-card">
<div class="stat-icon">🧪</div>
<div class="stat-info">
<div class="stat-label">本月样本接收</div>
<div class="stat-value">1,286</div>
<div class="stat-extra">较上月 <span style="color:#52c41a">↑ 8.4%</span></div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon">🔬</div>
<div class="stat-info">
<div class="stat-label">在检样本</div>
<div class="stat-value">342</div>
<div class="stat-extra">已完成 892 例</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon">🏥</div>
<div class="stat-info">
<div class="stat-label">隔离中样本</div>
<div class="stat-value">58</div>
<div class="stat-extra">隔离室使用率 72%</div>
</div>
</div>
<div class="stat-card">
<div class="stat-icon">⚠️</div>
<div class="stat-info">
<div class="stat-label">风险预警</div>
<div class="stat-value">7</div>
<div class="stat-extra">2 项待处理</div>
</div>
</div>
</div>
<div class="row-2">
<!-- 图表 -->
<div class="panel">
<div class="panel-header">
<div class="panel-title">本月样本检疫趋势</div>
<div class="panel-tools">
<button class="btn-link">日</button>
<button class="btn-link">周</button>
<button class="btn-link" style="font-weight:bold;">月</button>
</div>
</div>
<div class="panel-body"><div class="chart-box">📈 折线图占位(检疫数量 / 阳性检出率趋势)</div></div>
</div>
<div class="panel">
<div class="panel-header">
<div class="panel-title">有害生物检出分布</div>
<div class="panel-tools"><button class="btn-link">查看详情</button></div>
</div>
<div class="panel-body"><div class="chart-box">🥧 饼图占位(按种类/来源地区分布)</div></div>
</div>
</div>
<!-- 待办与预警 -->
<div class="row-2">
<div class="panel">
<div class="panel-header">
<div class="panel-title">待办事项 <span class="badge">5</span></div>
<div class="panel-tools"><button class="btn-link">更多</button></div>
</div>
<div class="panel-body" style="padding:0;">
<table class="simple-table">
<thead>
<tr><th>类型</th><th>内容</th><th>截止时间</th><th>状态</th></tr>
</thead>
<tbody>
<tr><td>样本接收</td><td>S2026-0015 水稻种子样品</td><td>今日 18:00</td><td><span class="status-tag tag-red">紧急</span></td></tr>
<tr><td>检疫任务</td><td>番茄果实检疫(编号 B2026-0088)</td><td>明日 10:00</td><td><span class="status-tag tag-orange">待办</span></td></tr>
<tr><td>隔离监测</td><td>隔离室 3# 第 14 天观察记录</td><td>09-05 09:00</td><td><span class="status-tag tag-orange">待办</span></td></tr>
<tr><td>报告审核</td><td>小麦产地检疫报告(HZ2026-0042)</td><td>09-06</td><td><span class="status-tag tag-blue">审核中</span></td></tr>
<tr><td>证书签发</td><td>出口检疫证书申请(3 份)</td><td>09-07</td><td><span class="status-tag tag-blue">审核中</span></td></tr>
</tbody>
</table>
</div>
</div>
<div class="panel">
<div class="panel-header">
<div class="panel-title">最新预警 <span class="badge" style="background:#fa8c16;">2</span></div>
<div class="panel-tools"><button class="btn-link">查看全部</button></div>
</div>
<div class="panel-body" style="padding:0;">
<table class="simple-table">
<thead>
<tr><th>级别</th><th>预警内容</th><th>触发时间</th><th>状态</th></tr>
</thead>
<tbody>
<tr><td><span class="status-tag tag-red">高</span></td><td>进口大豆检出疑似检疫性有害生物</td><td>10 分钟前</td><td><span class="status-tag tag-red">未处理</span></td></tr>
<tr><td><span class="status-tag tag-orange">中</span></td><td>隔离室 5# 温度异常 32℃</td><td>1 小时前</td><td><span class="status-tag tag-orange">处理中</span></td></tr>
<tr><td><span class="status-tag tag-orange">中</span></td><td>同批次样本连续阳性检出</td><td>2 小时前</td><td><span class="status-tag tag-blue">已派单</span></td></tr>
<tr><td><span class="status-tag tag-blue">低</span></td><td>除害药剂库存低于预警线</td><td>昨日 16:20</td><td><span class="status-tag tag-green">已处理</span></td></tr>
<tr><td><span class="status-tag tag-blue">低</span></td><td>证书签发审批超时</td><td>昨日 14:00</td><td><span class="status-tag tag-green">已处理</span></td></tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>检疫记录登记</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📑</div><div class="ph-title">检疫记录登记</div><div class="ph-desc">检疫过程与方法的详细记录</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>检疫报告生成</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📃</div><div class="ph-title">检疫报告生成</div><div class="ph-desc">生成与下载检疫报告</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>检疫结果录入</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">✅</div><div class="ph-title">检疫结果录入</div><div class="ph-desc">检疫结果数据录入与判定</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>检疫任务分配</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📝</div><div class="ph-title">检疫任务分配</div><div class="ph-desc">分配检疫任务给技术人员</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>隔离期满评估</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🏁</div><div class="ph-title">隔离期满评估</div><div class="ph-desc">隔离期满评估与放行决策</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>隔离期监测</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">👁️</div><div class="ph-title">隔离期监测</div><div class="ph-desc">隔离期内的日常监测记录</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>隔离计划制定</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📅</div><div class="ph-title">隔离计划制定</div><div class="ph-desc">制定样本隔离观察计划</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>隔离室分配</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🚪</div><div class="ph-title">隔离室分配</div><div class="ph-desc">隔离室使用情况与分配</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>报告归档</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🗄️</div><div class="ph-title">报告归档</div><div class="ph-desc">历史报告归档与检索</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>报告填报</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">✍️</div><div class="ph-title">报告填报</div><div class="ph-desc">填报各类检疫报告</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>报告模板管理</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📄</div><div class="ph-title">报告模板管理</div><div class="ph-desc">维护报告模板</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>预警处置跟踪</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🧯</div><div class="ph-title">预警处置跟踪</div><div class="ph-desc">预警处置流程跟踪</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>预警规则配置</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🛠️</div><div class="ph-title">预警规则配置</div><div class="ph-desc">配置风险预警规则与阈值</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>实时预警</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🚨</div><div class="ph-title">实时预警</div><div class="ph-desc">实时查看风险预警信息</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>样本出库登记</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">📤</div><div class="ph-title">样本出库登记</div><div class="ph-desc">样本出库、销毁与移交登记</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>样本存放管理</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">🏷️</div><div class="ph-title">样本存放管理</div><div class="ph-desc">样本存放位置与温湿度记录管理</div></div></body></html>
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>数据字典</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">⚙</div><div class="ph-title">数据字典</div><div class="ph-desc">维护系统下拉选项与枚举值</div></div></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>操作日志</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">⚙</div><div class="ph-title">操作日志</div><div class="ph-desc">查看用户操作审计日志</div></div></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>角色权限</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">⚙</div><div class="ph-title">角色权限</div><div class="ph-desc">角色定义与菜单/数据权限分配</div></div></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0"><title>用户管理</title><link rel="stylesheet" href="../styles/main.css"></head><body><div class="page-placeholder"><div class="ph-icon">⚙</div><div class="ph-title">用户管理</div><div class="ph-desc">系统用户的增删改查与状态管理</div></div></body></html>
\ No newline at end of file
<template>
<div class="app">
<AppHeader />
<div class="app-body">
<aside class="sidebar">
<Sidebar />
</aside>
<main class="content">
<div class="breadcrumb">{{ breadcrumb }}</div>
<TabsBar />
<div class="content-body">
<router-view v-slot="{ Component }">
<component :is="Component" />
</router-view>
</div>
</main>
</div>
</div>
</template>
<script setup>
import { computed } from "vue";
import { useRoute } from "vue-router";
import AppHeader from "@/components/AppHeader.vue";
import Sidebar from "@/components/Sidebar.vue";
import TabsBar from "@/components/TabsBar.vue";
const route = useRoute();
const breadcrumb = computed(() => "当前位置:" + (route.meta?.breadcrumb || "植物检疫检测隔离中心智能管理平台"));
</script>
\ No newline at end of file
<template>
<header class="app-header">
<div class="app-logo">
<span class="logo-icon">植</span>
<span class="logo-text">植物检疫检测隔离中心智能管理平台</span>
</div>
<div class="app-user">
<span class="user-avatar">管</span>
<span class="user-name">管理员</span>
<span class="user-action">消息</span>
<span class="user-action">设置</span>
<span class="user-action">退出</span>
</div>
</header>
</template>
<script setup></script>
\ No newline at end of file
<template>
<div class="dp-wrap">
<span class="dp-icon" @click="open">
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="#bbb" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="5" width="18" height="16" rx="2" />
<line x1="3" y1="10" x2="21" y2="10" />
<line x1="8" y1="3" x2="8" y2="7" />
<line x1="16" y1="3" x2="16" y2="7" />
</svg>
</span>
<input
class="dp-input"
:value="modelValue"
readonly
:placeholder="placeholder"
@click="open"
/>
<div v-if="visible" class="dp-panel" @click.stop>
<div class="dp-header">
<button type="button" class="dp-nav" @click="changeYear(-1)">«</button>
<button type="button" class="dp-nav" @click="changeMonth(-1)">‹</button>
<span class="dp-title">{{ year }} 年 {{ month + 1 }} 月</span>
<button type="button" class="dp-nav" @click="changeMonth(1)">›</button>
<button type="button" class="dp-nav" @click="changeYear(1)">»</button>
</div>
<div class="dp-weekdays">
<span v-for="w in weekdays" :key="w">{{ w }}</span>
</div>
<div class="dp-grid">
<span
v-for="cell in cells"
:key="cell.key"
class="dp-cell"
:class="{
'is-other': !cell.inMonth,
'is-today': cell.isToday,
'is-selected': cell.isSelected
}"
@click="pick(cell)"
>{{ cell.day }}</span>
</div>
</div>
</div>
</template>
<script setup>
import { ref, computed, onMounted, onBeforeUnmount } from "vue";
const props = defineProps({ modelValue: String, placeholder: { type: String, default: "请选择日期" } });
const emit = defineEmits(["update:modelValue"]);
const visible = ref(false);
const today = new Date();
const year = ref(today.getFullYear());
const month = ref(today.getMonth());
const weekdays = ["日", "一", "二", "三", "四", "五", "六"];
const fmt = (y, m, d) => `${y}-${String(m + 1).padStart(2, "0")}-${String(d).padStart(2, "0")}`;
const cells = computed(() => {
const first = new Date(year.value, month.value, 1);
const startDay = first.getDay();
const daysInMonth = new Date(year.value, month.value + 1, 0).getDate();
const daysInPrev = new Date(year.value, month.value, 0).getDate();
const arr = [];
for (let i = startDay - 1; i >= 0; i--) {
const d = daysInPrev - i;
const dt = new Date(year.value, month.value - 1, d);
arr.push({ key: `p${d}`, day: d, inMonth: false, date: dt, isToday: false, isSelected: false });
}
for (let d = 1; d <= daysInMonth; d++) {
const dt = new Date(year.value, month.value, d);
const iso = fmt(year.value, month.value, d);
arr.push({
key: iso,
day: d,
inMonth: true,
date: dt,
isToday: dt.toDateString() === today.toDateString(),
isSelected: props.modelValue === iso
});
}
while (arr.length % 7 !== 0) {
const d = arr.length - startDay - daysInMonth + 1;
const dt = new Date(year.value, month.value + 1, d);
arr.push({ key: `n${d}`, day: d, inMonth: false, date: dt, isToday: false, isSelected: false });
}
return arr;
});
const open = () => { visible.value = true; };
const close = () => { visible.value = false; };
const changeMonth = (delta) => {
let m = month.value + delta;
let y = year.value;
if (m < 0) { m = 11; y--; }
if (m > 11) { m = 0; y++; }
month.value = m;
year.value = y;
};
const changeYear = (delta) => { year.value += delta; };
const pick = (cell) => {
const y = cell.date.getFullYear();
const m = cell.date.getMonth();
const d = cell.date.getDate();
emit("update:modelValue", fmt(y, m, d));
visible.value = false;
};
const onDocClick = (e) => {
if (!e.target.closest(".dp-wrap")) close();
};
onMounted(() => document.addEventListener("click", onDocClick));
onBeforeUnmount(() => document.removeEventListener("click", onDocClick));
</script>
<style scoped>
.dp-wrap { position: relative; display: flex; align-items: center; width: 100%; height: 32px; border: 1px solid #d4d4d4; border-radius: 3px; background: #fff; cursor: pointer; }
.dp-wrap:hover { border-color: #b8b8b8; }
.dp-wrap:focus-within { border-color: #d71e1e; }
.dp-icon { display: flex; align-items: center; padding: 0 4px 0 6px; flex-shrink: 0; cursor: pointer; }
.dp-input {
flex: 1; min-width: 0;
height: 30px;
border: none; outline: none;
background: transparent;
font-size: 14px;
color: #555;
padding: 0 4px 0 0;
cursor: pointer;
}
.dp-input::placeholder { color: #999; }
.dp-panel {
position: absolute;
top: 38px; left: 0;
width: 240px;
background: #fff;
border: 1px solid #d4d4d4;
border-radius: 4px;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
z-index: 1000;
padding: 8px;
user-select: none;
}
.dp-header { display: flex; align-items: center; justify-content: space-between; padding: 4px 0; }
.dp-nav {
width: 24px; height: 24px;
border: none; background: transparent;
cursor: pointer; color: #555;
font-size: 14px;
}
.dp-nav:hover { color: #d71e1e; }
.dp-title { font-size: 14px; font-weight: bold; }
.dp-weekdays { display: grid; grid-template-columns: repeat(7, 1fr); padding: 6px 0; color: #999; font-size: 12px; }
.dp-weekdays span { text-align: center; }
.dp-grid { display: grid; grid-template-columns: repeat(7, 1fr); }
.dp-cell {
height: 28px;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
cursor: pointer;
border-radius: 3px;
}
.dp-cell:hover { background: #fef2f2; color: #d71e1e; }
.dp-cell.is-other { color: #ccc; }
.dp-cell.is-today { color: #d71e1e; font-weight: bold; }
.dp-cell.is-selected { background: #d71e1e; color: #fff; font-weight: bold; }
</style>
\ No newline at end of file
<template>
<div class="page-placeholder">
<el-icon class="ph-icon"><component :is="icon" /></el-icon>
<div class="ph-title">{{ title }}</div>
<div class="ph-desc">{{ desc }}</div>
</div>
</template>
<script setup>
defineProps({
title: { type: String, default: "模块开发中" },
desc: { type: String, default: "该模块页面正在搭建中,敬请期待。" },
icon: { type: String, default: "Box" }
});
</script>
\ No newline at end of file
<template>
<div class="menu-list">
<template v-for="item in menuConfig" :key="item.id">
<div
v-if="!item.children"
class="menu-item"
:class="{ active: isActive(item.path) }"
@click="go(item.path)"
>
<el-icon class="menu-icon"><component :is="item.icon" /></el-icon>
<span class="menu-text">{{ item.name }}</span>
</div>
<template v-else>
<div
class="menu-item has-sub"
:class="{ expanded: isExpanded(item), active: isChildActive(item) }"
@click="toggle(item)"
>
<el-icon class="menu-icon"><component :is="item.icon" /></el-icon>
<span class="menu-text">{{ item.name }}</span>
<span class="menu-arrow">▸</span>
</div>
<div class="sub-menu" :class="{ expanded: isExpanded(item) }">
<div
v-for="sub in item.children"
:key="sub.id"
class="sub-item"
:class="{ active: isActive(sub.path) }"
@click="go(sub.path)"
>{{ sub.name }}</div>
</div>
</template>
</template>
</div>
</template>
<script setup>
import { ref } from "vue";
import { useRoute, useRouter } from "vue-router";
import { menuConfig } from "@/data/menu";
const route = useRoute();
const router = useRouter();
const expanded = ref([]);
const isActive = (path) => route.path === path;
const isExpanded = (item) => expanded.value.includes(item.id);
const isChildActive = (item) => (item.children || []).some((c) => route.path === c.path);
const toggle = (item) => {
const idx = expanded.value.indexOf(item.id);
if (idx >= 0) expanded.value.splice(idx, 1);
else expanded.value.push(item.id);
};
const go = (path) => {
router.push(path);
};
</script>
\ No newline at end of file
<template>
<div class="tabs-bar">
<div
v-for="t in tabs.tabs"
:key="t.name"
class="tab"
:class="{ active: tabs.active === t.name }"
@click="onClick(t)"
>
<span>{{ t.title }}</span>
<span v-if="t.closable" class="tab-close" @click.stop="onClose(t)">×</span>
</div>
</div>
</template>
<script setup>
import { useTabsStore } from "@/store/tabs";
import { useRouter } from "vue-router";
const tabs = useTabsStore();
const router = useRouter();
const onClick = (t) => {
tabs.setActive(t.name);
router.push(t.path);
};
const onClose = (t) => {
tabs.closeTab(t.name);
};
</script>
\ No newline at end of file
// 委托书列表数据
// 检疫单证号 / 申报单位 / 植物名称 / 申报时间 / 受理日期 / 受理机构
export const entrustListData = [
{ id: 1, cert: "6204122022007095", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", declareDate: "2022-03-09", acceptDate: "2022-04-26", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 2, cert: "6205022022007347", unit: "甘肃富赢种子高新科技有限责任公司", plant: "莴苣", declareDate: "2022-02-21", acceptDate: "2022-05-09", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 3, cert: "6205022022007269", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜(西兰花)", declareDate: "2022-02-21", acceptDate: "2022-05-09", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 4, cert: "6204122022007087", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜(西兰花)", declareDate: "2022-02-21", acceptDate: "2022-05-09", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 5, cert: "6202442022007001", unit: "甘肃富赢种子高新科技有限责任公司", plant: "胡萝卜", declareDate: "2022-02-10", acceptDate: "2022-05-09", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 6, cert: "6203122022007067", unit: "甘肃杰尼尔种子有限公司", plant: "辣椒", declareDate: "2022-01-28", acceptDate: "2022-05-19", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 7, cert: "6204122022007065", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", declareDate: "2022-01-27", acceptDate: "2022-05-09", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 8, cert: "6203072022007093", unit: "酒泉市酒洲种子有限责任公司", plant: "番茄", declareDate: "2022-01-26", acceptDate: "2022-05-07", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 9, cert: "6203092022007071", unit: "张掖市瑞真种业有限公司", plant: "五色菊", declareDate: "2022-01-20", acceptDate: "2022-06-02", org: "甘肃省植保植检站", status: "待田间调查" },
{ id: 10, cert: "6201162022007023", unit: "张掖市亚太种业有限责任公司", plant: "南瓜", declareDate: "2022-01-17", acceptDate: "2022-05-06", org: "甘肃省植保植检站", status: "待田间调查" }
];
// 左侧导航菜单配置
export const menuConfig = [
{
id: "home", name: "首页", icon: "HomeFilled", path: "/home"
},
{
id: "entrust", name: "委托书管理", icon: "Document", path: "/entrust/list"
},
{
id: "sample", name: "样本管理", icon: "Box",
children: [
{ id: "sample-register", name: "样本登记入库", path: "/sample/register" },
{ id: "sample-storage", name: "样本存放管理", path: "/sample/storage" },
{ id: "sample-out", name: "样本出库登记", path: "/sample/out" }
]
},
{
id: "lab", name: "实验室检测", icon: "MagicStick",
children: [
{ id: "lab-sample-test", name: "样本抽检", path: "/lab/sample-test" },
{ id: "lab-experiment-test", name: "实验检验", path: "/lab/experiment-test" }
]
},
{
id: "isolation", name: "隔离检疫", icon: "Lock", path: "/isolation/quarantine"
},
{
id: "disposal", name: "除害处置", icon: "Delete", path: "/disposal"
},
{
id: "analysis", name: "数据分析", icon: "DataAnalysis", path: "/analysis"
},
{
id: "risk", name: "风险预警", icon: "Warning", path: "/risk"
},
{
id: "report", name: "报告管理", icon: "Notebook", path: "/report"
},
{
id: "audit", name: "审核发证", icon: "Stamp", path: "/audit/cert"
},
{
id: "settings", name: "系统设置", icon: "Setting",
children: [
{ id: "settings-users", name: "用户管理", path: "/settings/users" },
{ id: "settings-roles", name: "角色权限", path: "/settings/roles" },
{ id: "settings-dict", name: "数据字典", path: "/settings/dict" },
{ id: "settings-log", name: "操作日志", path: "/settings/log" }
]
}
];
\ No newline at end of file
// 样本接收登记数据
export const sampleRegisterData = [
{ id: 1, cert: "6204122022007095", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", variety: "翠菊", origin: "智利", qty: "0.0014 千克", approveQty: "40 千克", storeDate: "2022-03-01", contact: "刘玉堂", phone: "18993607501" },
{ id: 2, cert: "6205022022007347", unit: "甘肃富赢种子高新科技有限责任公司", plant: "莴苣", variety: "生菜", origin: "美国", qty: "0.2950 千克", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" },
{ id: 3, cert: "6205022022007269", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜 (西兰花)", variety: "西蓝花 VBR007", origin: "美国", qty: "2.3920 千克", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" },
{ id: 4, cert: "6204122022007087", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜 (西兰花)", variety: "西蓝花 VBR005", origin: "智利", qty: "0.3700 千克", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" },
{ id: 5, cert: "6202442022007001", unit: "甘肃富赢种子高新科技有限责任公司", plant: "胡萝卜", variety: "胡萝卜 VCR324", origin: "南非", qty: "0.6150 千克", approveQty: "50 千克", storeDate: "2022-03-20", contact: "刘玉堂", phone: "18993607501" },
{ id: 6, cert: "6203122022007067", unit: "甘肃杰尼尔种子有限公司", plant: "辣椒", variety: "80", origin: "西班牙", qty: "10.0 千克", approveQty: "10 千克", storeDate: "2022-04-01", contact: "赵文言", phone: "18993755577" },
{ id: 7, cert: "6204122022007065", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", variety: "翠菊", origin: "智利", qty: "0.0014 千克", approveQty: "40 千克", storeDate: "2022-02-18", contact: "刘玉堂", phone: "18993607501" },
{ id: 8, cert: "6203072022007093", unit: "酒泉市酒洲种子有限责任公司", plant: "番茄", variety: "番茄", origin: "意大利", qty: "1.9540 千克", approveQty: "50 千克", storeDate: "2022-03-10", contact: "马世锋", phone: "13993708175" },
{ id: 9, cert: "6203092022007071", unit: "张掖市瑞真种业有限公司", plant: "五色菊", variety: "五色菊", origin: "荷兰", qty: "2.0000 千克", approveQty: "5 千克", storeDate: "2022-03-20", contact: "吴多志", phone: "13993662953" },
{ id: 10, cert: "6201162022007023", unit: "张掖市亚太种业有限责任公司", plant: "南瓜", variety: "南瓜", origin: "日本", qty: "3.4000 千克", approveQty: "5 千克", storeDate: "2022-04-02", contact: "姚庆库", phone: "18919369888" }
];
// 样本抽检列表数据(与样本登记入库保持对应,每条 150 克抽检量)
export const sampleTestData = [
{ id: 1, cert: "6204122022007095", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", variety: "翠菊", origin: "智利", contact: "刘玉堂", phone: "18993607501", approveQty: "40 千克", qty: "150克", testDate: "2022-03-05", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-03-05" },
{ id: 2, cert: "6205022022007347", unit: "甘肃富赢种子高新科技有限责任公司", plant: "莴苣", variety: "生菜", origin: "美国", contact: "刘玉堂", phone: "18993607501", approveQty: "50 千克", qty: "150克", testDate: "2022-04-01", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-04-01" },
{ id: 3, cert: "6205022022007269", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜 (西兰花)", variety: "西蓝花 VBR007", origin: "美国", contact: "刘玉堂", phone: "18993607501", approveQty: "50 千克", qty: "150克", testDate: "2022-04-01", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-04-01" },
{ id: 4, cert: "6204122022007087", unit: "甘肃富赢种子高新科技有限责任公司", plant: "青花菜 (西兰花)", variety: "西蓝花 VBR005", origin: "智利", contact: "刘玉堂", phone: "18993607501", approveQty: "50 千克", qty: "150克", testDate: "2022-04-01", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-04-01" },
{ id: 5, cert: "6202442022007001", unit: "甘肃富赢种子高新科技有限责任公司", plant: "胡萝卜", variety: "胡萝卜 VCR324", origin: "南非", contact: "刘玉堂", phone: "18993607501", approveQty: "50 千克", qty: "150克", testDate: "2022-04-05", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-04-05" },
{ id: 6, cert: "6203122022007067", unit: "甘肃杰尼尔种子有限公司", plant: "辣椒", variety: "80", origin: "西班牙", contact: "刘玉堂", phone: "18993607501", approveQty: "10 千克", qty: "150克", testDate: "2022-04-15", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-04-15" },
{ id: 7, cert: "6204122022007065", unit: "甘肃富赢种子高新科技有限责任公司", plant: "翠菊", variety: "翠菊", origin: "智利", contact: "刘玉堂", phone: "18993607501", approveQty: "40 千克", qty: "150克", testDate: "2022-03-10", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-03-10" },
{ id: 8, cert: "6203072022007093", unit: "酒泉市酒洲种子有限责任公司", plant: "番茄", variety: "番茄", origin: "意大利", contact: "刘玉堂", phone: "18993607501", approveQty: "50 千克", qty: "150克", testDate: "2022-03-25", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-03-25" },
{ id: 9, cert: "6203092022007071", unit: "张掖市瑞真种业有限公司", plant: "五色菊", variety: "五色菊", origin: "荷兰", contact: "刘玉堂", phone: "18993607501", approveQty: "5 千克", qty: "150克", testDate: "2022-04-05", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-04-05" },
{ id: 10, cert: "6201162022007023", unit: "张掖市亚太种业有限责任公司", plant: "南瓜", variety: "南瓜", origin: "日本", contact: "刘玉堂", phone: "18993607501", approveQty: "5 千克", qty: "150克", testDate: "2022-04-10", testOrg: "甘州区农业技术推广中心", content: "现场对该批种苗进行抽样查验,按 GB/T 3543.2-2009 标准扦取检测样品 150 克,未发现植株携带可见检疫性有害生物症状,实验室镜检未见虫卵及病原孢子。", conclusion: "合格,未检出检疫性有害生物", inspector1: "胡琴", inspector2: "刘洋", inspectorPhone: "0931-8665155", entryDate: "2022-04-10" }
];
import { createApp } from "vue";
import { createPinia } from "pinia";
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import zhCn from "element-plus/dist/locale/zh-cn.mjs";
import * as ElementPlusIconsVue from "@element-plus/icons-vue";
import App from "./App.vue";
import router from "./router";
import "./assets/main.css";
const app = createApp(App);
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
app.component(key, component);
}
app.use(createPinia());
app.use(router);
app.use(ElementPlus, { locale: zhCn });
app.mount("#app");
\ No newline at end of file
import { createRouter, createWebHashHistory } from "vue-router";
import { useTabsStore } from "@/store/tabs";
const routes = [
{ path: "/", redirect: "/home" },
{ path: "/home", name: "home", component: () => import("@/views/HomeView.vue"), meta: { title: "首页", breadcrumb: "首页 / 数据看板" } },
{ path: "/entrust/reg", name: "entrust-reg", component: () => import("@/views/entrust/EntrustReg.vue"), meta: { title: "委托书登记", breadcrumb: "委托书管理 / 委托书登记" } },
{ path: "/entrust/list", name: "entrust-list", component: () => import("@/views/entrust/EntrustList.vue"), meta: { title: "委托书管理", breadcrumb: "委托书管理" } },
{ path: "/entrust/audit", name: "entrust-audit", component: () => import("@/views/entrust/EntrustAudit.vue"), meta: { title: "委托书审核", breadcrumb: "委托书管理 / 委托书审核" } },
{ path: "/entrust/archive", name: "entrust-archive", component: () => import("@/views/entrust/EntrustArchive.vue"), meta: { title: "委托书归档", breadcrumb: "委托书管理 / 委托书归档" } },
{ path: "/sample/register", name: "sample-register", component: () => import("@/views/sample/SampleRegister.vue"), meta: { title: "样本登记入库", breadcrumb: "样本管理 / 样本登记入库" } },
{ path: "/sample/storage", name: "sample-storage", component: () => import("@/views/sample/SampleStorage.vue"), meta: { title: "样本存放管理", breadcrumb: "样本管理 / 样本存放管理" } },
{ path: "/sample/out", name: "sample-out", component: () => import("@/views/sample/SampleOut.vue"), meta: { title: "样本出库登记", breadcrumb: "样本管理 / 样本出库登记" } },
{ path: "/lab/sample-test", name: "lab-sample-test", component: () => import("@/views/lab/SampleTest.vue"), meta: { title: "样本抽检", breadcrumb: "实验室检测 / 样本抽检" } },
{ path: "/lab/experiment-test", name: "lab-experiment-test", component: () => import("@/views/lab/ExperimentTest.vue"), meta: { title: "实验检验", breadcrumb: "实验室检测 / 实验检验" } },
{ path: "/isolation/quarantine", name: "isolation-quarantine", component: () => import("@/views/isolation/IsolationQuarantine.vue"), meta: { title: "隔离检疫", breadcrumb: "隔离检疫" } },
{ path: "/disposal", name: "disposal", component: () => import("@/views/disposal/Disposal.vue"), meta: { title: "除害处置", breadcrumb: "除害处置" } },
{ path: "/analysis", name: "analysis", component: () => import("@/views/analysis/DataAnalysis.vue"), meta: { title: "数据分析", breadcrumb: "数据分析" } },
{ path: "/risk", name: "risk", component: () => import("@/views/risk/RiskWarning.vue"), meta: { title: "风险预警", breadcrumb: "风险预警" } },
{ path: "/report", name: "report", component: () => import("@/views/report/ReportManage.vue"), meta: { title: "报告管理", breadcrumb: "报告管理" } },
{ path: "/audit/cert", name: "audit-cert", component: () => import("@/views/audit/AuditCert.vue"), meta: { title: "审核发证", breadcrumb: "审核发证" } },
{ path: "/settings/users", name: "settings-users", component: () => import("@/views/settings/Users.vue"), meta: { title: "用户管理", breadcrumb: "系统设置 / 用户管理" } },
{ path: "/settings/roles", name: "settings-roles", component: () => import("@/views/settings/Roles.vue"), meta: { title: "角色权限", breadcrumb: "系统设置 / 角色权限" } },
{ path: "/settings/dict", name: "settings-dict", component: () => import("@/views/settings/Dict.vue"), meta: { title: "数据字典", breadcrumb: "系统设置 / 数据字典" } },
{ path: "/settings/log", name: "settings-log", component: () => import("@/views/settings/Log.vue"), meta: { title: "操作日志", breadcrumb: "系统设置 / 操作日志" } }
];
const router = createRouter({
history: createWebHashHistory(),
routes
});
router.afterEach((to) => {
if (to.meta?.title) {
const tabs = useTabsStore();
tabs.openTab({ name: to.name, title: to.meta.title, path: to.fullPath });
}
});
export default router;
\ No newline at end of file
import { defineStore } from "pinia";
export const useTabsStore = defineStore("tabs", {
state: () => ({
tabs: [
{ name: "home", title: "首页", path: "/home", closable: false }
],
active: "home"
}),
actions: {
openTab({ name, title, path }) {
if (!this.tabs.find((t) => t.name === name)) {
this.tabs.push({ name, title, path, closable: true });
}
this.active = name;
},
closeTab(name) {
const idx = this.tabs.findIndex((t) => t.name === name);
if (idx < 0) return;
if (!this.tabs[idx].closable) return;
this.tabs.splice(idx, 1);
if (this.active === name) {
const next = this.tabs[idx] || this.tabs[idx - 1] || this.tabs[0];
if (next) {
this.active = next.name;
this.$router?.push(next.path);
}
}
},
setActive(name) {
this.active = name;
}
}
});
\ No newline at end of file
import { ref, watch } from "vue";
export function usePersistentRef(key, defaultValue) {
const K = "plant_quarantine_" + key;
const load = () => {
try {
const r = localStorage.getItem(K);
if (r) { const p = JSON.parse(r); if (Array.isArray(p) && p.length) return p; }
} catch (e) {}
return JSON.parse(JSON.stringify(defaultValue));
};
const data = ref(load());
watch(data, v => { try { localStorage.setItem(K, JSON.stringify(v)); } catch (e) {} }, { deep: true });
const reset = () => { data.value = JSON.parse(JSON.stringify(defaultValue)); try { localStorage.removeItem(K); } catch (e) {} };
return { data, reset };
}
\ No newline at end of file
<template>
<div class="page-home">
<div class="welcome-bar">
<span>欢迎进入植物检疫检测隔离中心智能管理平台</span>
</div>
<div class="quick-row">
<div class="quick-card" v-for="q in quicks" :key="q.id" @click="goTo(q.path)">
<el-icon class="q-icon"><component :is="q.icon" /></el-icon>
<span>{{ q.name }}</span>
</div>
</div>
<div class="stat-row">
<div class="stat-card" v-for="s in stats" :key="s.label">
<div class="stat-icon"><el-icon><component :is="s.icon" /></el-icon></div>
<div class="stat-info">
<div class="stat-label">{{ s.label }}</div>
<div class="stat-value">{{ s.value }}</div>
<div class="stat-extra">{{ s.extra }}</div>
</div>
</div>
</div>
<div class="row-2">
<div class="panel">
<div class="panel-header"><span class="panel-title">月度检疫统计</span></div>
<div class="panel-body"><div class="chart-box">图表占位 - 月度检疫趋势</div></div>
</div>
<div class="panel">
<div class="panel-header"><span class="panel-title">风险等级分布</span></div>
<div class="panel-body"><div class="chart-box">图表占位 - 风险等级分布</div></div>
</div>
</div>
<div class="row-2">
<div class="panel">
<div class="panel-header"><span class="panel-title">待办事项</span></div>
<div class="panel-body">
<table class="simple-table">
<thead><tr><th>单证号</th><th>类型</th><th>紧急度</th><th>操作</th></tr></thead>
<tbody>
<tr v-for="t in todos" :key="t.id">
<td>{{ t.cert }}</td><td>{{ t.type }}</td><td>{{ t.level }}</td>
<td><a class="op-link">办理</a></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="panel">
<div class="panel-header"><span class="panel-title">风险预警</span></div>
<div class="panel-body">
<table class="simple-table">
<thead><tr><th>预警编号</th><th>类型</th><th>时间</th><th>状态</th></tr></thead>
<tbody>
<tr v-for="w in warnings" :key="w.id">
<td>{{ w.id }}</td><td>{{ w.type }}</td><td>{{ w.time }}</td><td>{{ w.status }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { useRouter } from "vue-router";
const router = useRouter();
const quicks = [
{ id: 1, name: "委托书登记", path: "/entrust/reg", icon: "Document" },
{ id: 2, name: "样本接收", path: "/sample/register", icon: "Box" },
{ id: 3, name: "样本检疫", path: "/sample/quarantine", icon: "MagicStick" },
{ id: 4, name: "数据看板", path: "/analysis", icon: "DataAnalysis" },
{ id: 5, name: "风险预警", path: "/risk", icon: "Warning" },
{ id: 6, name: "审核发证", path: "/audit/cert", icon: "Stamp" }
];
const stats = [
{ label: "今日样本接收", value: "28", extra: "环比 +12%", icon: "Box" },
{ label: "在检样本", value: "142", extra: "较昨日 +6", icon: "MagicStick" },
{ label: "待办任务", value: "37", extra: "其中紧急 5", icon: "Bell" },
{ label: "本月报告", value: "23", extra: "已发证 19", icon: "Notebook" }
];
const todos = [
{ id: 1, cert: "6201122022007218", type: "田间调查", level: "紧急" },
{ id: 2, cert: "6201122022007080", type: "实验室检测", level: "普通" },
{ id: 3, cert: "6201162022007023", type: "结果审核", level: "普通" }
];
const warnings = [
{ id: "W001", type: "异常疫情", time: "2026-09-07 10:21", status: "未处理" },
{ id: "W002", type: "检疫超时", time: "2026-09-06 16:05", status: "处理中" }
];
const goTo = (p) => router.push(p);
</script>
<style scoped>
.welcome-bar {
background: linear-gradient(90deg, #fef2f2, #fff);
border: 1px solid #fde0e0;
border-left: 4px solid #d71e1e;
padding: 16px 20px;
border-radius: 4px;
font-size: 18px;
color: #333;
font-weight: bold;
margin-bottom: 16px;
}
.quick-row {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 12px;
margin-bottom: 16px;
}
.quick-card {
display: flex;
align-items: center;
gap: 10px;
padding: 16px;
background: #fff;
border: 1px solid #f0f0f0;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s;
}
.quick-card:hover { border-color: #d71e1e; color: #d71e1e; transform: translateY(-2px); }
.q-icon { font-size: 22px; color: #d71e1e; }
.chart-box {
height: 280px;
background: #fafafa;
border: 1px dashed #e0e0e0;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
color: #bbb;
font-size: 14px;
}
.op-link { color: #d71e1e; cursor: pointer; }
</style>
\ No newline at end of file
<template>
<PagePlaceholder title="数据分析" desc="检疫数据多维分析与可视化开发中" icon="DataAnalysis" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="审核发证" desc="检疫结果审核与证书签发开发中" icon="Stamp" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="除害处置" desc="除害处置流程与记录开发中" icon="Delete" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="委托书归档" desc="委托书归档与历史查询开发中" icon="Folder" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="委托书审核" desc="委托书审核工作台开发中" icon="CircleCheck" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="委托书登记" desc="新增委托书登记流程开发中" icon="Document" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="隔离检疫" desc="隔离区检疫流程开发中" icon="Lock" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<div class="page">
<div class="placeholder">该模块待开发</div>
</div>
</template>
<script setup>
</script>
<style scoped>
.page { padding: 16px 20px; }
.placeholder { padding: 60px 0; text-align: center; color: #999; font-size: 14px; background: #fafafa; border-radius: 4px; }
</style>
<template>
<PagePlaceholder title="报告管理" desc="检疫报告生成与管理开发中" icon="Notebook" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="风险预警" desc="疫情风险预警与监测看板开发中" icon="Warning" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="样本出库登记" desc="样本出库登记与流转记录开发中" icon="Upload" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="样本存放管理" desc="样本存放位置与状态管理开发中" icon="Box" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="数据字典" desc="系统数据字典维护开发中" icon="Collection" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="操作日志" desc="用户操作日志查询与审计开发中" icon="Document" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="角色权限" desc="角色与权限分配开发中" icon="UserFilled" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
<template>
<PagePlaceholder title="用户管理" desc="系统用户与账号管理开发中" icon="User" />
</template>
<script setup>
import PagePlaceholder from "@/components/PagePlaceholder.vue";
</script>
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { fileURLToPath, URL } from "node:url";
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url))
}
},
server: {
host: "0.0.0.0",
port: 5173,
open: true
}
});
\ No newline at end of file
VITE v5.4.21 ready in 6984 ms
➜ Local: http://localhost:5173/
➜ Network: http://10.51.0.159:5173/
17:50:50 [vite] hmr update /src/assets/main.css
17:51:12 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css
17:51:34 [vite] hmr update /src/views/sample/SampleRegister.vue, /src/views/sample/SampleRegister.vue?vue&type=style&index=0&scoped=459b0eb1&lang.css
17:52:00 [vite] hmr update /src/assets/main.css
17:52:24 [vite] hmr update /src/assets/main.css
17:52:25 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css
17:52:25 [vite] hmr update /src/views/sample/SampleRegister.vue?vue&type=style&index=0&scoped=459b0eb1&lang.css
17:59:30 [vite] hmr update /src/components/Sidebar.vue
18:02:28 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css, /src/views/entrust/EntrustList.vue
18:02:47 [vite] hmr update /src/assets/main.css
18:05:02 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css, /src/views/entrust/EntrustList.vue
09:03:02 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css
09:13:56 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css
09:14:13 [vite] hmr update /src/views/entrust/EntrustList.vue
09:15:30 [vite] hmr update /src/views/entrust/EntrustList.vue
09:18:19 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css, /src/views/entrust/EntrustList.vue
09:21:20 [vite] hmr update /src/components/DatePicker.vue, /src/components/DatePicker.vue?vue&type=style&index=0&scoped=877fe5b5&lang.css
09:21:34 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css, /src/views/entrust/EntrustList.vue
09:23:20 [vite] hmr update /src/components/DatePicker.vue?vue&type=style&index=0&scoped=877fe5b5&lang.css, /src/components/DatePicker.vue
09:23:30 [vite] hmr update /src/views/entrust/EntrustList.vue?vue&type=style&index=0&scoped=d9669b28&lang.css
09:25:57 [vite] hmr update /src/views/entrust/EntrustList.vue
09:28:28 [vite] hmr update /src/components/Sidebar.vue
09:28:48 [vite] hmr update /src/views/sample/SampleRegister.vue?vue&type=style&index=0&scoped=459b0eb1&lang.css, /src/views/sample/SampleRegister.vue
09:30:21 [vite] hmr update /src/components/Sidebar.vue
09:34:33 [vite] hmr update /src/views/entrust/EntrustList.vue
09:34:43 [vite] hmr update /src/views/sample/SampleRegister.vue
09:38:20 [vite] hmr update /src/views/entrust/EntrustList.vue
09:38:27 [vite] hmr update /src/views/sample/SampleRegister.vue
09:38:39 [vite] hmr update /src/views/entrust/EntrustList.vue
09:38:39 [vite] hmr update /src/views/sample/SampleRegister.vue
09:45:37 [vite] hmr update /src/views/entrust/EntrustList.vue
09:46:52 [vite] hmr update /src/views/sample/SampleRegister.vue
09:56:18 [vite] hmr update /src/assets/main.css
10:12:32 [vite] hmr update /src/components/Sidebar.vue
10:12:32 [vite] hmr update /src/views/sample/SampleRegister.vue
10:12:32 [vite] hmr update /src/views/sample/SampleRegister.vue
10:12:32 [vite] hmr update /src/views/sample/SampleRegister.vue
10:13:04 [vite] hmr update /src/views/sample/SampleRegister.vue
10:14:40 [vite] page reload src/router/index.js
10:16:41 [vite] page reload src/router/index.js
10:17:51 [vite] page reload src/router/index.js
10:17:51 [vite] hmr update /src/views/entrust/EntrustList.vue
10:30:57 [vite] hmr update /src/views/sample/SampleRegister.vue
10:38:59 [vite] hmr update /src/views/sample/SampleRegister.vue
10:38:59 [vite] hmr update /src/views/sample/SampleRegister.vue
10:39:16 [vite] hmr update /src/views/sample/SampleRegister.vue
10:46:23 [vite] hmr update /src/views/sample/SampleRegister.vue
10:50:18 [vite] hmr update /src/views/sample/SampleRegister.vue?vue&type=style&index=0&scoped=459b0eb1&lang.css, /src/views/sample/SampleRegister.vue
10:50:34 [vite] hmr update /src/views/sample/SampleRegister.vue
10:51:45 [vite] hmr update /src/views/sample/SampleRegister.vue?vue&type=style&index=0&scoped=459b0eb1&lang.css, /src/views/sample/SampleRegister.vue
10:53:32 [vite] hmr update /src/views/sample/SampleRegister.vue?vue&type=style&index=0&scoped=459b0eb1&lang.css, /src/views/sample/SampleRegister.vue
10:54:24 [vite] hmr update /src/views/sample/SampleRegister.vue?vue&type=style&index=0&scoped=459b0eb1&lang.css, /src/views/sample/SampleRegister.vue
13:52:24 [vite] hmr update /src/components/Sidebar.vue
13:52:24 [vite] page reload src/router/index.js
13:52:24 [vite] hmr update /src/views/sample/SampleQuarantine.vue
14:01:25 [vite] hmr update /src/views/lab/SampleTest.vue, /src/views/lab/SampleTest.vue?vue&type=style&index=0&scoped=d5758afb&lang.css
14:08:15 [vite] hmr update /src/views/lab/SampleTest.vue?vue&type=style&index=0&scoped=d5758afb&lang.css, /src/views/lab/SampleTest.vue
14:08:35 [vite] hmr update /src/components/DatePicker.vue?vue&type=style&index=0&scoped=877fe5b5&lang.css
14:23:57 [vite] hmr update /src/views/lab/SampleTest.vue
14:24:10 [vite] hmr update /src/views/lab/SampleTest.vue?vue&type=style&index=0&scoped=d5758afb&lang.css, /src/views/lab/SampleTest.vue
14:29:05 [vite] hmr update /src/views/lab/SampleTest.vue
14:29:18 [vite] hmr update /src/views/lab/SampleTest.vue?vue&type=style&index=0&scoped=d5758afb&lang.css, /src/views/lab/SampleTest.vue
14:33:19 [vite] hmr update /src/views/lab/SampleTest.vue
14:35:49 [vite] hmr update /src/views/lab/SampleTest.vue?vue&type=style&index=0&scoped=d5758afb&lang.css
14:38:14 [vite] hmr update /src/views/lab/SampleTest.vue, /src/views/lab/SampleTest.vue?vue&type=style&index=0&scoped=d5758afb&lang.css
14:41:10 [vite] hmr update /src/views/lab/ExperimentTest.vue?vue&type=style&index=0&scoped=839bf691&lang.css
14:41:10 [vite] hmr update /src/views/lab/SampleTest.vue?vue&type=style&index=0&scoped=d5758afb&lang.css, /src/views/lab/SampleTest.vue
14:41:10 [vite] hmr update /src/views/sample/SampleRegister.vue?vue&type=style&index=0&scoped=459b0eb1&lang.css, /src/views/sample/SampleRegister.vue
14:43:46 [vite] hmr update /src/views/lab/ExperimentTest.vue
Markdown 格式
0% 或
您添加了 0 人 到此讨论。请谨慎行事。
请先完成此评论的编辑!
请 注册 或者 后发表评论