diff --git a/mobile-uni/src/pages/user/exam/index.vue b/mobile-uni/src/pages/user/exam/index.vue index 72c8e974..f785e815 100644 --- a/mobile-uni/src/pages/user/exam/index.vue +++ b/mobile-uni/src/pages/user/exam/index.vue @@ -125,6 +125,11 @@ const speechLabel = (question: ExamQuestion) => speech.value.key === `q-${questi ? (speech.value.status === 'playing' ? '停止' : '生成中') : '播报题目'; const load = async () => { + // Direct visits without a valid exam id must not fire /exams/0 (server 500). + if (!id.value || id.value <= 0) { + message.value = '请从「学习中心 · 考试任务」进入具体考试'; + return; + } loading.value = true; try { exam.value = await getMyExam(id.value); diff --git a/mobile-uni/src/pages/user/learning/index.vue b/mobile-uni/src/pages/user/learning/index.vue index 4df2e1f4..f79e88d1 100644 --- a/mobile-uni/src/pages/user/learning/index.vue +++ b/mobile-uni/src/pages/user/learning/index.vue @@ -297,6 +297,7 @@ import { navigateBackToToday, resetPageScroll } from '@/services/navigation'; import { ensureEmployeePosition } from '@/services/position'; import { listMyExams } from '@/services/exam'; import { createPageRequestScope, currentAccountKey, type RequestScopeTicket } from '@/services/request-scope'; +import { stripInternalCodes } from '@/services/text'; const defaultScenarioId = 'complaint-water'; const pendingAssignmentKey = 'aihr_pending_assignment_id'; @@ -396,7 +397,7 @@ const assignmentDesc = (item: PracticeAssignment) => { if (item.status === '已完成' && item.feedback) return item.feedback; return '提交后显示反馈与参考答案'; } - return item.reason || item.feedback; + return stripInternalCodes(item.reason || item.feedback || ''); }; const assignmentSourceLabel = (source?: string) => { diff --git a/mobile-uni/src/pages/user/practice/index.vue b/mobile-uni/src/pages/user/practice/index.vue index 4a8fb0c1..d9da1663 100644 --- a/mobile-uni/src/pages/user/practice/index.vue +++ b/mobile-uni/src/pages/user/practice/index.vue @@ -358,6 +358,7 @@ import { resetPageScroll } from '@/services/navigation'; import { ensureEmployeePosition } from '@/services/position'; import { chooseSpeechAudio, createSpeechPlaybackController, measureAudioDuration, normalizeOssId, transcribeSpeechBlob, transcribeSpeechFile } from '@/services/speech'; import { createPageRequestScope, currentAccountKey, type RequestScopeTicket } from '@/services/request-scope'; +import { stripInternalCodes } from '@/services/text'; type PracticeStatus = 'idle' | 'starting' | 'active' | 'submitting' | 'finished'; type RecentPracticeItem = { @@ -668,9 +669,9 @@ const assignmentDesc = (item: PracticeAssignment) => { if (item.source === 'daily' && item.status === '已完成') { const score = typeof item.score === 'number' ? `得分 ${item.score} 分` : ''; const mode = item.scoreMode === 'LLM' ? 'AI语义评估' : '规则兜底'; - return [score, mode, item.feedback || item.reason].filter(Boolean).join(' · '); + return [score, mode, stripInternalCodes(item.feedback || item.reason || '')].filter(Boolean).join(' · '); } - return item.feedback || item.reason; + return stripInternalCodes(item.feedback || item.reason || ''); }; const assignmentSourceLabel = (source?: string) => { diff --git a/mobile-uni/src/pages/user/profile/index.vue b/mobile-uni/src/pages/user/profile/index.vue index ee2de42d..026ebb0a 100644 --- a/mobile-uni/src/pages/user/profile/index.vue +++ b/mobile-uni/src/pages/user/profile/index.vue @@ -120,6 +120,34 @@ › + + 常用功能 + + + + + 成长证据包(待人工复核) @@ -243,6 +271,19 @@ const openPoints = () => { uni.navigateTo({ url: '/pages/user/points/index' }); }; +const openLearning = () => { + uni.navigateTo({ url: '/pages/user/learning/index' }); +}; + +const openPracticeSummary = () => { + uni.setStorageSync('aihr_sop_pending_tool', 'MY_PRACTICE_SUMMARY'); + uni.switchTab({ url: '/pages/user/sop/index' }); +}; + +const openReport = () => { + uni.navigateTo({ url: `/pages/common/building/index?title=${encodeURIComponent('工作上报')}` }); +}; + const clearProfileData = () => { profile.value = null; history.value = []; @@ -765,4 +806,74 @@ onShow(() => { color: var(--employee-muted); font-size: 12px; } + +.feature-entries { + display: flex; + flex-direction: column; + gap: 4px; +} + +.feature-entry { + display: flex; + align-items: center; + gap: 12px; + width: 100%; + margin: 0; + padding: 12px 4px; + border: none; + background: transparent; + text-align: left; + line-height: 1.3; +} + +.feature-entry::after { + border: none; +} + +.feature-entry + .feature-entry { + border-top: 1px solid #f2f3f5; +} + +.feature-entry-icon { + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + width: 38px; + height: 38px; + border-radius: 10px; + color: #ffffff; + font-size: 16px; + font-weight: 700; +} + +.feature-entry-icon.learn { + background: #1f5c9d; +} + +.feature-entry-icon.summary { + background: #e70014; +} + +.feature-entry-icon.report { + background: #d98200; +} + +.feature-entry-copy { + flex: 1; + display: flex; + flex-direction: column; + gap: 2px; +} + +.feature-entry-title { + color: #18202b; + font-size: 15px; + font-weight: 700; +} + +.feature-entry-desc { + color: #8a93a0; + font-size: 12px; +} diff --git a/mobile-uni/src/pages/user/today/index.vue b/mobile-uni/src/pages/user/today/index.vue index cefead9d..17928664 100644 --- a/mobile-uni/src/pages/user/today/index.vue +++ b/mobile-uni/src/pages/user/today/index.vue @@ -46,7 +46,7 @@ 打字问 - 输入问题获得解答 + 输入文字提问 @@ -87,7 +87,7 @@ 今日安排 - @@ -134,30 +134,6 @@ - - - - 我的地图 - - - - - -