commit 8f673e0095ca1e0abcaa46b190222cf6f4e3c5b0 Author: feie9456 Date: Mon Jan 5 11:09:24 2026 +0800 first commit diff --git a/.env b/.env new file mode 100644 index 0000000..49eebe2 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +DATABASE_URL="postgresql://feie9454:zjh94544549OK%3F@100.64.0.5:5432/ssd" \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..11cef98 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "sound-speed-determination", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "vue": "^3.5.24" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.8.1", + "sass-embedded": "^1.97.1", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vue-tsc": "^3.1.4" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..b6c3c8e --- /dev/null +++ b/src/App.vue @@ -0,0 +1,973 @@ + + + + + diff --git a/src/assets/AF-LED7Seg-3.woff2 b/src/assets/AF-LED7Seg-3.woff2 new file mode 100644 index 0000000..c9a4fcb Binary files /dev/null and b/src/assets/AF-LED7Seg-3.woff2 differ diff --git a/src/assets/PIXymbolsDigitClocksW90-Bd.woff2 b/src/assets/PIXymbolsDigitClocksW90-Bd.woff2 new file mode 100644 index 0000000..65eb3ea Binary files /dev/null and b/src/assets/PIXymbolsDigitClocksW90-Bd.woff2 differ diff --git a/src/assets/sounds/index.ts b/src/assets/sounds/index.ts new file mode 100644 index 0000000..4ecfb33 --- /dev/null +++ b/src/assets/sounds/index.ts @@ -0,0 +1,14 @@ +import { EasyAudio } from "./utils"; + +import 电源按钮 from "./电源按钮.mp3"; +import 发生器按钮 from './发生器按钮.mp3' +import 换挡 from './换挡.mp3' +import 线缆插入 from './线缆插入.mp3' +const ea = new EasyAudio([ + { name: "电源按钮", audioUrl: 电源按钮, volume: 1 }, + { name: "发生器按钮", audioUrl: 发生器按钮, volume: 1 }, + { name: "换挡", audioUrl: 换挡, volume: 1 }, + { name: "线缆插入", audioUrl: 线缆插入, volume: 1 }, +]); + +export default ea; \ No newline at end of file diff --git a/src/assets/sounds/utils.ts b/src/assets/sounds/utils.ts new file mode 100644 index 0000000..f3475bc --- /dev/null +++ b/src/assets/sounds/utils.ts @@ -0,0 +1,114 @@ +export class EasyAudio { + private static audioCtx: AudioContext | null = null; + private buffers: Map = new Map(); + private sources: Map = new Map(); + private audioOptions: Map< + string, + { audioUrl: string; loop?: boolean; volume?: number } + > = new Map(); + + private get audioCtx(): AudioContext { + if (!EasyAudio.audioCtx) { + EasyAudio.audioCtx = new AudioContext(); + } + return EasyAudio.audioCtx; + } + + constructor( + audios?: + | { name: string; audioUrl: string | URL; loop?: boolean; volume?: number } + | { name: string; audioUrl: string | URL; loop?: boolean; volume?: number }[] + ) { + if (audios) { + this.add(audios); + } + } + + private async createAudioBuffer(audioUrl: string): Promise { + const response = await fetch(audioUrl); + const arrayBuffer = await response.arrayBuffer(); + return await this.audioCtx.decodeAudioData(arrayBuffer); + } + + private async loadAudio(name: string) { + const options = this.audioOptions.get(name); + if (!options) { + throw new Error(`音频 ${name} 未找到`); + } + const buffer = await this.createAudioBuffer(options.audioUrl); + this.buffers.set(name, buffer); + } + + async load(): Promise { + const promises = Array.from(this.audioOptions.keys()).map(name => + this.loadAudio(name) + ); + await Promise.all(promises); + } + + add( + audios: + | { name: string; audioUrl: string | URL; loop?: boolean; volume?: number } + | { name: string; audioUrl: string | URL; loop?: boolean; volume?: number }[] + ): void { + if (Array.isArray(audios)) { + audios.forEach(audio => { + this.audioOptions.set(audio.name, { + audioUrl: typeof (audio.audioUrl) === "string" ? audio.audioUrl : audio.audioUrl.href, + loop: audio.loop, + volume: audio.volume, + }); + }); + } else { + this.audioOptions.set(audios.name, { + audioUrl: typeof (audios.audioUrl) === "string" ? audios.audioUrl : audios.audioUrl.href, + loop: audios.loop, + volume: audios.volume, + }); + } + } + + async play(name: string) { + if (!this.buffers.has(name)) { + await this.loadAudio(name); + } + + const buffer = this.buffers.get(name); + const options = this.audioOptions.get(name); + if (!buffer || !options) { + throw new Error(`音频 ${name} 未找到`); + } + + const source = this.audioCtx.createBufferSource(); + source.buffer = buffer; + source.loop = options.loop || false; + + let gainNode: GainNode | null = null; + if (options.volume !== undefined) { + gainNode = this.audioCtx.createGain(); + gainNode.gain.value = options.volume; + source.connect(gainNode); + gainNode.connect(this.audioCtx.destination); + } else { + source.connect(this.audioCtx.destination); + } + + source.start(); + this.sources.set(name, source); + console.log(`音频 ${name} 播放`); + + } + + stop(name: string) { + const source = this.sources.get(name); + if (source) { + source.stop(); + this.sources.delete(name); + } + } + + stopAll() { + this.sources.forEach(source => source.stop()); + this.sources.clear(); + } +} diff --git a/src/assets/sounds/发生器按钮.mp3 b/src/assets/sounds/发生器按钮.mp3 new file mode 100644 index 0000000..944aece Binary files /dev/null and b/src/assets/sounds/发生器按钮.mp3 differ diff --git a/src/assets/sounds/换挡.mp3 b/src/assets/sounds/换挡.mp3 new file mode 100644 index 0000000..727f357 Binary files /dev/null and b/src/assets/sounds/换挡.mp3 differ diff --git a/src/assets/sounds/电源按钮.mp3 b/src/assets/sounds/电源按钮.mp3 new file mode 100644 index 0000000..c658887 Binary files /dev/null and b/src/assets/sounds/电源按钮.mp3 differ diff --git a/src/assets/sounds/线缆插入.mp3 b/src/assets/sounds/线缆插入.mp3 new file mode 100644 index 0000000..8a169a4 Binary files /dev/null and b/src/assets/sounds/线缆插入.mp3 differ diff --git a/src/assets/stylesheet.css b/src/assets/stylesheet.css new file mode 100644 index 0000000..915c984 --- /dev/null +++ b/src/assets/stylesheet.css @@ -0,0 +1,8 @@ +@font-face { + font-family: 'AF-LED7 Seg-3'; + src: url('AF-LED7Seg-3.woff2') format('woff2'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + diff --git a/src/assets/vue.svg b/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/仪器.png b/src/assets/仪器.png new file mode 100644 index 0000000..5614e04 Binary files /dev/null and b/src/assets/仪器.png differ diff --git a/src/assets/仪器.webp b/src/assets/仪器.webp new file mode 100644 index 0000000..1b5356b Binary files /dev/null and b/src/assets/仪器.webp differ diff --git a/src/assets/仪器臂.png b/src/assets/仪器臂.png new file mode 100644 index 0000000..890d9b0 Binary files /dev/null and b/src/assets/仪器臂.png differ diff --git a/src/assets/仪器臂.webp b/src/assets/仪器臂.webp new file mode 100644 index 0000000..e30374a Binary files /dev/null and b/src/assets/仪器臂.webp differ diff --git a/src/assets/信号发生.png b/src/assets/信号发生.png new file mode 100644 index 0000000..6280a7f Binary files /dev/null and b/src/assets/信号发生.png differ diff --git a/src/assets/信号发生.webp b/src/assets/信号发生.webp new file mode 100644 index 0000000..986a2f5 Binary files /dev/null and b/src/assets/信号发生.webp differ diff --git a/src/assets/入门引导.png b/src/assets/入门引导.png new file mode 100644 index 0000000..dfc8b9c Binary files /dev/null and b/src/assets/入门引导.png differ diff --git a/src/assets/入门引导.webp b/src/assets/入门引导.webp new file mode 100644 index 0000000..c9229b6 Binary files /dev/null and b/src/assets/入门引导.webp differ diff --git a/src/assets/按钮按下.png b/src/assets/按钮按下.png new file mode 100644 index 0000000..1d50eaa Binary files /dev/null and b/src/assets/按钮按下.png differ diff --git a/src/assets/按钮按下.webp b/src/assets/按钮按下.webp new file mode 100644 index 0000000..7a8e1e9 Binary files /dev/null and b/src/assets/按钮按下.webp differ diff --git a/src/assets/桌面.png b/src/assets/桌面.png new file mode 100644 index 0000000..40ba6c5 Binary files /dev/null and b/src/assets/桌面.png differ diff --git a/src/assets/桌面.webp b/src/assets/桌面.webp new file mode 100644 index 0000000..a123a47 Binary files /dev/null and b/src/assets/桌面.webp differ diff --git a/src/assets/示波器.png b/src/assets/示波器.png new file mode 100644 index 0000000..41f8eda Binary files /dev/null and b/src/assets/示波器.png differ diff --git a/src/assets/示波器.webp b/src/assets/示波器.webp new file mode 100644 index 0000000..defbd17 Binary files /dev/null and b/src/assets/示波器.webp differ diff --git a/src/components/DeterminationMachine.vue b/src/components/DeterminationMachine.vue new file mode 100644 index 0000000..597473d --- /dev/null +++ b/src/components/DeterminationMachine.vue @@ -0,0 +1,121 @@ + + + + + \ No newline at end of file diff --git a/src/components/MetalRuler.vue b/src/components/MetalRuler.vue new file mode 100644 index 0000000..a8960b7 --- /dev/null +++ b/src/components/MetalRuler.vue @@ -0,0 +1,186 @@ + + + + + \ No newline at end of file diff --git a/src/components/Notebook.vue b/src/components/Notebook.vue new file mode 100644 index 0000000..3fcd571 --- /dev/null +++ b/src/components/Notebook.vue @@ -0,0 +1,742 @@ + + +