chore: initialize frontend repo with teaching terminology updates

Add the current frontend codebase with a baseline .gitignore and update piano-specific UI terms to teaching-oriented terms for the current product context.

Made-with: Cursor
This commit is contained in:
2026-04-23 16:37:14 +08:00
commit a661e439a0
216 changed files with 50419 additions and 0 deletions
+148
View File
@@ -0,0 +1,148 @@
//index.js
//获取应用实例
const app = getApp()
const { uuid, warn } = require("../../utils/util")
const Upyun = require('../../utils/upyun-wxapp-sdk')
const upyun = new Upyun({
bucket: app.globalData.upyun.bucket,
operator: app.globalData.upyun.operator,
getSignatureUrl: `${app.globalData.server}/api/v1/uc/upyun_token`,
})
const upload = (src, callback) => {
let { host } = app.globalData.upyun;
let ext = src.split(".").reverse()[0]
let name = `${uuid()}.${ext}`;
let remotePath = `/daily-music/records/${name}`
upyun.upload({
localPath: src,
remotePath,
success: function (res) {
wx.hideLoading()
callback(host + remotePath)
},
fail: function ({ errMsg }) {
wx.hideLoading();
callback(false, errMsg)
console.log('upload fail, errMsg is', errMsg)
}
})
}
Page({
data: {
audio: null,
video: null,
recorder: null,
recording: false,
playing: false,
record: '',
replaying: false,
redo: false
},
//事件处理函数
bindRecord: function() {
let { recorder, video, recording } = this.data;
this.setData({record: '', redo: recording, playing: true}, () => {
if(recording) recorder.stop();
else {
video.seek(0)
video.play();
console.log('recorder start...')
recorder.start({format: 'mp3'})
}
})
},
bindPlayRecord(){
let { audio, record, video, playing } = this.data;
if(!record) {
warn("您还没有进行录音")
return;
}
if(playing) {
video.stop();
}
audio.src = record;
audio.play();
this.setData({replaying: true})
},
bindPlay(){
let { video, audio, replaying } = this.data;
if(replaying) {
audio.stop();
}
video.seek(0)
this.setData({playing: true}, () => {
video.play();
})
},
bindStop(){
let { video } = this.data;
video.stop()
this.setData({playing: false})
},
bindSubmit(){
wx.showLoading({
title: '正在提交数据...',
success(){
setTimeout(() => {
wx.hideLoading({
success: (res) => {
warn("您的录音已提交!")
},
})
}, 3000)
}
})
},
onVideoEnd(){
let { recording, recorder } = this.data;
if(recording){
wx.showLoading({
title: '正在处理录音,请稍候...',
})
recorder.stop();
}
},
onVideoPause(){
let { recording, recorder } = this.data;
if(recording){
recorder.pause();
}
},
onLoad: function () {
let audio = wx.createInnerAudioContext()
let video = wx.createVideoContext('sample')
let recorder = wx.getRecorderManager();
recorder.onError((err) => {
console.log('error...', err)
this.setData({recording: false})
})
recorder.onStart(() => {
console.log("...start....")
this.setData({recording: true})
})
recorder.onStop(({tempFilePath, duration, fileSize}) => {
this.setData({recording: false})
if(this.data.redo) {
video.seek(0)
video.play();
recorder.start({format: 'mp3'})
this.setData({redo: false})
return;
}
upload(tempFilePath, (filename, errorMsg) => {
if(!filename) {
warn("录音出现了问题,再来一遍吧~")
} else {
this.setData({record: filename})
}
})
})
this.setData({recorder, video, audio})
},
})