diff --git a/package.json b/package.json
index db47c8a..5708686 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,7 @@
"@microsoft/clarity": "^1.0.2",
"@sentry/vue": "^10.36.0",
"@vueuse/core": "^14.1.0",
+ "@wydev/noise-core": "^0.1.0",
"axios": "^1.13.2",
"idb": "^8.0.3",
"js-base64": "^3.7.8",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index eef1efb..fd87ea4 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -23,6 +23,9 @@ importers:
'@vueuse/core':
specifier: ^14.1.0
version: 14.1.0(vue@3.5.25(typescript@5.9.3))
+ '@wydev/noise-core':
+ specifier: ^0.1.0
+ version: 0.1.0
axios:
specifier: ^1.13.2
version: 1.13.2
@@ -1469,6 +1472,9 @@ packages:
peerDependencies:
vue: ^3.5.0
+ '@wydev/noise-core@0.1.0':
+ resolution: {integrity: sha512-gHPDPasN8Iy3lHjv/3yhev3rpkMUd/o4iIQQKAKwK2Sewqu76dXMxqCsw9gGEf5ZZBf0YhwClsS7lcDlRo0Qxw==}
+
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
@@ -5083,6 +5089,10 @@ snapshots:
dependencies:
vue: 3.5.25(typescript@5.9.3)
+ '@wydev/noise-core@0.1.0':
+ dependencies:
+ uuid: 13.0.0
+
acorn-jsx@5.3.2(acorn@8.15.0):
dependencies:
acorn: 8.15.0
diff --git a/src/components/NoiseMonitorCard.vue b/src/components/NoiseMonitorCard.vue
new file mode 100644
index 0000000..758a81d
--- /dev/null
+++ b/src/components/NoiseMonitorCard.vue
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+ mdi-microphone
+
+
+ 环境噪音监测
+
+
+
+ {{ statusLabel }}
+
+
+
+
+
+
+
+
+ {{ currentDb }}
+
+ dB
+
+
+ {{ noiseLevel }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentScore }}
+
+
+ 评分
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/NoiseMonitorDetail.vue b/src/components/NoiseMonitorDetail.vue
new file mode 100644
index 0000000..9e674b3
--- /dev/null
+++ b/src/components/NoiseMonitorDetail.vue
@@ -0,0 +1,1392 @@
+
+
+
+
+
+
+ mdi-waveform
+
+ 环境噪音监测
+
+
+
+ mdi-record-circle
+
+ {{ sessionData?.sessionName || '自习中' }}
+
+
+ {{ isMonitoring ? '监测中' : '已停止' }}
+
+
+
+
+
+
+
+
+ mdi-pulse
+
+ 实时监测
+
+
+
+ mdi-chart-bar
+
+ 统计报告
+
+
+
+ mdi-cog
+
+ 自习配置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentDb }}
+
+ dB
+
+
+
+ {{ noiseLevel }}
+
+
+
+
+
+
+
+ 0 dB
+ 50
+ 100 dB
+
+
+
+
+
+
+
+
+
+
+
+ mdi-chart-line
+
+ 噪音走势
+
+
+ 最近 {{ ringBuffer.length }} 个采样
+
+
+
+
+
+
+
+
+
+
+
+ mdi-star-circle
+
+ 实时评分
+
+
+
+
+
+ {{ currentScore }}
+
+
+
+ {{ scoreLabel }}
+
+
+ 综合评分 (0-100)
+
+
+
+
+
+
+
+
+ 扣分扣因
+
+
+
+
+ {{ item.icon }}
+
+ {{ item.label }}
+
+
+
+
+ {{ item.percent }}%
+
+
+
+
+
+
+
+
+ mdi-chart-arc
+
+
+ 开始监测后将显示评分
+
+
+
+
+
+
+
+
+
+ 开始监测
+
+
+ 停止监测
+
+
+
+ 校准({{ calibrateTarget }}dB)
+
+
+
+
+
+
+
+
+ mdi-chart-box-outline
+
+
+ 暂无统计报告
+
+
+ 在配置的晚自习时间段内,系统会自动记录并生成报告
+
+
+
+
+
+
+
+
+ mdi-calendar
+
+ 选择日期
+
+
+ 清空全部
+
+
+
+
+
+ mdi-calendar-blank
+
+ {{ formatDateLabel(dateKey) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ formatDateLabel(selectedDate) }}
+
+
+ 均分 {{ reportMeta.dates[selectedDate].avgScore }}
+
+
+ {{ reportMeta.dates[selectedDate].count }} 条记录
+
+
+
+ 清空当日
+
+
+
+
+
+
+
+ mdi-file-document-outline
+
+
+ 该日期暂无报告数据
+
+
+
+
+
+
+ {{ report.sessionName }}
+ {{ formatTime(report.startTime) }}
+
+
+
+
+
+
+
+
+
+
+ {{ selectedReport.sessionName }} 统计报告
+
+
+
+
+
+
+
+ 报告概览
+
+
+
+
+ 时长
+
+
+ {{ formatDuration(selectedReport.duration) }}
+
+
+
+
+ 表现
+
+
+ {{ selectedReport.score }} 分
+ ({{ reportScoreLabel(selectedReport.score) }})
+
+
+
+
+ 峰值
+
+
+ {{ selectedReport.maxDb }} dB
+
+
+
+
+ 平均
+
+
+ {{ selectedReport.avgDb }} dB
+
+
+
+
+ 超阈时长
+
+
+ {{ formatSeconds(selectedReport.overThresholdDuration) }}
+
+
+
+
+ 打断次数
+
+
+ {{ selectedReport.segmentCount }}
+
+
+
+
+
+
+
+
+
+ 噪音走势
+
+
+
+ 统计范围:{{ formatFullTime(selectedReport.startTime) }} - {{ formatFullTime(selectedReport.endTime) }};
+ 噪音报警阈值: {{ selectedReport.alertThresholdDb || 55 }} dB;
+ 覆盖率: {{ reportCoverage }}%
+
+
+
+
+
+
+
+ 更多统计
+
+
+
+
+
+
+ 噪音等级分布
+
+
+
+
+
+
+
+ {{ seg.label }} ({{ seg.percent }}%)
+
+
+
+
+
+
+
+
+
+
+
+ 扣分扣因 (越长扣分越多)
+
+
+ {{ item.label }}
+
+ {{ item.percent }}%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-clock-edit-outline
+
+ 晚自习时间段
+
+
+ 添加时段
+
+
+
+
+ 配置晚自习时间段后,系统会在对应时段内自动开启噪音监测并记录统计报告。时间段外不会长期记录。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 至 {{ sessionEndTime(session) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mdi-alert-decagram
+
+ 监测参数
+
+
+
+
+
+
+
+
+
+
+
+ 重置
+
+
+ 保存配置
+
+
+
+
+
+
+
+
+
+
+
+ 确认清空
+
+ {{ confirmClearMode === 'all'
+ ? '确定要清空所有日期的统计报告吗?此操作不可撤销。'
+ : `确定要清空 ${formatDateLabel(selectedDate)} 的统计报告吗?此操作不可撤销。`
+ }}
+
+
+
+
+ 取消
+
+
+ 确认清空
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/TimeCard.vue b/src/components/TimeCard.vue
index baa6b04..48ecf6e 100644
--- a/src/components/TimeCard.vue
+++ b/src/components/TimeCard.vue
@@ -12,25 +12,89 @@
class="pa-6 d-flex flex-column"
style="height: 100%"
>
-
-
- {{ timeString }}{{ secondsString }}
-
+
+
+
+
+ {{ timeString }}{{ secondsString }}
+
+
+ {{ dateString }} {{ weekdayString }} {{ periodOfDay }}
+
+
-
-
- {{ dateString }} {{ weekdayString }} {{ periodOfDay }}
+
+
+
+
+ {{ noiseDisplayDb }}
+
+
+ {{ noiseStatusText }}
+
+
+ 点击开启
+
+
+
+
+
@@ -487,6 +551,13 @@
@@ -885,6 +1368,22 @@ export default {
letter-spacing: 1px;
}
+/* 噪音侧栏 */
+.noise-side {
+ padding: 8px 12px;
+ border-radius: 12px;
+ background: rgba(var(--v-theme-surface-variant), 0.25);
+ transition: background 0.2s ease;
+ cursor: pointer;
+}
+.noise-side:hover {
+ background: rgba(var(--v-theme-surface-variant), 0.5);
+}
+.noise-side-db {
+ line-height: 1;
+ font-variant-numeric: tabular-nums;
+}
+
/* 全屏样式 */
.fullscreen-time-card {
position: relative;
diff --git a/src/components/home/HomeActions.vue b/src/components/home/HomeActions.vue
index f517616..620d38b 100644
--- a/src/components/home/HomeActions.vue
+++ b/src/components/home/HomeActions.vue
@@ -7,10 +7,11 @@
color="error"
size="large"
@click="$emit('upload')"
+ rounded="xl"
>
上传
-
+
同步完成
diff --git a/src/utils/settings.js b/src/utils/settings.js
index 6b3ae8f..9322da7 100644
--- a/src/utils/settings.js
+++ b/src/utils/settings.js
@@ -100,6 +100,20 @@ const settingsDefinitions = {
icon: "mdi-card-outline",
},
+ // 噪音监测设置
+ "noiseMonitor.enabled": {
+ type: "boolean",
+ default: false,
+ description: "启用环境噪音监测卡片",
+ icon: "mdi-microphone",
+ },
+ "noiseMonitor.autoStart": {
+ type: "boolean",
+ default: false,
+ description: "打开页面时自动开始监测",
+ icon: "mdi-play-circle-outline",
+ },
+
// 时间卡片设置
"timeCard.enabled": {
type: "boolean",