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 @@
今日安排
-