diff --git a/packages/app/src/components/MemberProgress.vue b/packages/app/src/components/MemberProgress.vue
index 7526661..9e492d1 100644
--- a/packages/app/src/components/MemberProgress.vue
+++ b/packages/app/src/components/MemberProgress.vue
@@ -62,8 +62,8 @@
A MOMENT TO REMEMBER{{ n }}节{{ milestoneTitles[n] }}{{ archive.milestones.includes(n) ? '你已走过这段旅程' : '还差 ' + (n - archive.completedCount) + ' 节,一步步来' }}
-
- {{ editor === 'metrics' ? '记录身体刻度' : editor === 'notes' ? '写一份教练笔记' : '添加成长照片' }}
+
+ {{ editor === 'metrics' ? '记录身体刻度' : editor === 'notes' ? '写一份教练笔记' : '添加成长照片' }}
记录日期{{ recordDate }} ›
{{ field.label }}({{ field.unit }})柔韧度统一记录坐位体前屈,未触及脚尖可填写负值。
已关联本次完成课程{{ noteContent.length }} / 1000分享给学员{{ shared ? '这份评语将出现在学员档案' : '仅馆主自己可见' }}
@@ -94,10 +94,11 @@ const today = new Date(Date.now() + 8 * 3600000).toISOString().slice(0, 10), rec
const metricForm = ref>({}), photoUrls = ref>({}), selectedPhotos = ref([]), comparison = ref<{ id: string; url: string; date: string }[]>([])
const milestoneTitles: Record = { 10: '开始,与身体相识', 30: '坚持,找到自己的节奏', 50: '积累,看见自己的力量' }
const instance = getCurrentInstance()
-let sequence = 0, timer: ReturnType | undefined
+let sequence = 0, openedAt = 0, timer: ReturnType | undefined
async function load() {
if (props.admin && !props.userId) return
- const seq = ++sequence; loading.value = true; error.value = ''; photoUrls.value = {}; comparison.value = []; selectedPhotos.value = []
+ const seq = ++sequence; loading.value = true; error.value = ''
+ if (!editor.value) { photoUrls.value = {}; comparison.value = []; selectedPhotos.value = [] }
try { const result = await get(base.value); if (seq === sequence) archive.value = result }
catch (e) { if (seq === sequence) error.value = message(e) }
finally { if (seq === sequence) loading.value = false }
@@ -105,8 +106,20 @@ async function load() {
function previewComparison(url: string) { uni.previewImage({ urls: comparison.value.map(p => p.url), current: url }) }
function changeShared(event: Event) { shared.value = (event as unknown as { detail: { value: boolean } }).detail.value }
function message(e: unknown) { return e instanceof Error ? e.message : '操作失败,请重试' }
-function openEditor(kind: string) { editor.value = kind; saveError.value = ''; metricForm.value = {}; remark.value = ''; noteContent.value = ''; shared.value = false; caption.value = ''; photoPath.value = ''; recordDate.value = today }
+function openEditor(kind: string) {
+ openedAt = Date.now()
+ editor.value = kind
+ saveError.value = ''
+ metricForm.value = {}
+ remark.value = ''
+ noteContent.value = ''
+ shared.value = false
+ caption.value = ''
+ photoPath.value = ''
+ recordDate.value = today
+}
function closeEditor() { if (!busy.value) editor.value = '' }
+function onBackdropTap() { if (Date.now() - openedAt < 400) return; closeEditor() }
async function save() {
if (busy.value) return
busy.value = true; saveError.value = ''
@@ -162,7 +175,11 @@ async function saveMilestone(n: number) {
await uni.saveImageToPhotosAlbum({ filePath: result.tempFilePath }); uni.showToast({ title: '纪念卡已保存', icon: 'success' })
} catch { uni.showToast({ title: '保存失败,请允许保存到相册后重试', icon: 'none' }) } finally { busy.value = false }
}
-watch(() => [props.userId, props.refreshKey], () => { archive.value = null; void load() }, { immediate: true })
+watch(() => [props.userId, props.refreshKey], () => {
+ if (editor.value || busy.value) { void load(); return }
+ archive.value = null
+ void load()
+}, { immediate: true })
watch(() => props.bookingId, id => { if (id) { tab.value = 'notes'; openEditor('notes') } }, { immediate: true })
onBeforeUnmount(() => { sequence++; if (timer) clearTimeout(timer) })