yangg il y a 1 jour
Parent
commit
ce384111d3

+ 6 - 1
manifest.json

@@ -54,7 +54,12 @@
         "setting" : {
             "urlCheck" : false
         },
-        "usingComponents" : true
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "你的位置信息将用于小程序位置接口的效果展示"
+            }
+        }
     },
     "mp-alipay" : {
         "usingComponents" : true

+ 96 - 8
pages/Personal/Personal.vue

@@ -121,11 +121,16 @@
 				<view class="form-row">
 					<view class="form-item" v-if="showHeightField">
 						<text class="label">身高(cm)</text>
-						<input type="digit" v-model="formData.height" placeholder="请输入身高" />
+						<input type="digit" step="0.01" v-model="formData.height"  
+						@input="handleInput($event, 'height', 2)"
+						@blur="handleBlur('height')" placeholder="请输入身高" />
 					</view>
 					<view class="form-item" v-if="showWeightField">
 						<text class="label">体重(kg)</text>
-						<input type="digit" v-model="formData.weight" placeholder="请输入体重" />
+						<input type="digit" step="0.01" v-model="formData.weight" 
+						@input="handleInput($event, 'weight', 2)" 
+						@blur="handleBlur('weight')" 
+						placeholder="请输入体重" />
 					</view>
 					<view class="form-item">
 						<text class="label required">现居住地址</text>
@@ -877,7 +882,7 @@ import { apiBaseUrl } from '@/common/config.js';
 				return Object.keys(this.safeProfileFieldsConfig).length === 0 || this.safeProfileFieldsConfig.id_card?.visible !== false;
 			},
 			showEthnicField() {
-				return Object.keys(this.safeProfileFieldsConfig).length === 0 || this.safeProfileFieldsConfig.ethnic?.visible !== false;
+				return Object.keys(this.safeProfileFieldsConfig).length === 0 || this.safeProfileFieldsConfig.ethnicity?.visible !== false;
 			},
 			showHeightField() {
 				return Object.keys(this.safeProfileFieldsConfig).length === 0 || this.safeProfileFieldsConfig.height?.visible !== false;
@@ -903,7 +908,7 @@ import { apiBaseUrl } from '@/common/config.js';
 			},
 			// 教育经历字段显示控制
 			showEducationTimeField() {
-				return Object.keys(this.safeEducationFieldsConfig).length === 0 || this.safeEducationFieldsConfig.start_time?.visible !== false;
+				return Object.keys(this.safeEducationFieldsConfig).length === 0 || (this.safeEducationFieldsConfig.start_date?.visible !== false && this.safeEducationFieldsConfig.end_date?.visible !== false);
 			},
 			showEducationSchoolField() {
 				return Object.keys(this.safeEducationFieldsConfig).length === 0 || this.safeEducationFieldsConfig.school_name?.visible !== false;
@@ -916,7 +921,7 @@ import { apiBaseUrl } from '@/common/config.js';
 			},
 			// 工作经历字段显示控制
 			showWorkTimeField() {
-				return Object.keys(this.safeWorkFieldsConfig).length === 0 || this.safeWorkFieldsConfig.start_time?.visible !== false;
+				return Object.keys(this.safeWorkFieldsConfig).length === 0 || (this.safeWorkFieldsConfig.start_date?.visible !== false && this.safeWorkFieldsConfig.end_date?.visible !== false);
 			},
 			showWorkCompanyField() {
 				return Object.keys(this.safeWorkFieldsConfig).length === 0 || this.safeWorkFieldsConfig.company_name?.visible !== false;
@@ -944,8 +949,53 @@ import { apiBaseUrl } from '@/common/config.js';
 			shouldShowSkillsStep() {
 				return this.showRequireTrainingInfoField || this.showRequireProfessionalSkillsField;
 			},
+			// 判断是否显示教育经历步骤
+			shouldShowEducationStep() {
+				// 如果没有配置数据,默认显示
+				if (Object.keys(this.safeEducationFieldsConfig).length === 0) {
+					return true;
+				}
+				// 检查所有教育经历字段是否都被隐藏
+				const fields = ['start_date', 'end_date', 'school_name', 'major', 'degree'];
+				return fields.some(field => this.safeEducationFieldsConfig[field]?.visible !== false);
+			},
 		},
 		methods: {
+			 // 输入时限制小数位数
+			 handleInput(event, field, maxDecimals) {
+				let value = event.detail.value;
+				
+				// 1. 过滤非法字符并限制小数位
+				value = value
+					.replace(/[^\d.-]/g, '')
+					.replace(/(\..*)\./g, '$1')
+					.replace(/(-\d*)-/g, '$1')
+					.replace(new RegExp(`^(-?\\d*\\.\\d{${maxDecimals}}).*$`), '$1');
+
+				// 2. 处理以小数点开头的情况
+				if (value.startsWith('.')) {
+					value = '0' + value;
+				}
+
+				// 3. 更新数据
+				this.formData[field] = value;
+
+				// 4. 强制同步输入框显示
+				this.$nextTick(() => {
+					event.target.value = value;
+				});
+			},
+			// 失焦时补全小数位
+			handleBlur(field, precision = 2) {
+				const val = this.formData[field];
+				if (val === '' || val === undefined || val === null) return;
+				const num = parseFloat(val);
+				if (!isNaN(num)) {
+					this.formData[field] = num.toFixed(precision);
+				} else {
+					this.formData[field] = '';
+				}
+			},
 			// 添加承诺书相关方法
 			togglePromiseChecked() {
 				this.promiseChecked = !this.promiseChecked;
@@ -1741,7 +1791,31 @@ import { apiBaseUrl } from '@/common/config.js';
 			prevStep() {
 				const prevIndex = this.currentStepIndex - 1;
 				if (prevIndex >= 0) {
-					this.currentStep = this.steps[prevIndex].id;
+					// 如果上一步是专业技能步骤且不需要显示
+					if (this.steps[prevIndex].id === 6 && !this.shouldShowSkillsStep) {
+						// 检查上上步是否是教育经历步骤
+						const skipIndex = prevIndex - 1;
+						if (skipIndex >= 0) {
+							// 如果上上步是教育经历步骤且也不需要显示,则继续跳过
+							if (this.steps[skipIndex].id === 5 && !this.shouldShowEducationStep) {
+								const skipIndex2 = skipIndex - 1;
+								if (skipIndex2 >= 0) {
+									this.currentStep = this.steps[skipIndex2].id;
+								}
+							} else {
+								this.currentStep = this.steps[skipIndex].id;
+							}
+						}
+					} else if (this.steps[prevIndex].id === 5 && !this.shouldShowEducationStep) {
+						// 如果上一步是教育经历步骤且不需要显示,则跳过
+						const skipIndex = prevIndex - 1;
+						if (skipIndex >= 0) {
+							this.currentStep = this.steps[skipIndex].id;
+						}
+					} else {
+						this.currentStep = this.steps[prevIndex].id;
+					}
+					
 					// 滚动到页面顶部
 					uni.pageScrollTo({
 						scrollTop: 0,
@@ -1763,8 +1837,22 @@ import { apiBaseUrl } from '@/common/config.js';
 				
 				const nextIndex = this.currentStepIndex + 1;
 				if (nextIndex < this.steps.length) {
-					// 如果下一步是专业技能步骤(第四步,currentStep === 6),且不需要显示,则跳过
-					if (this.steps[nextIndex].id === 6 && !this.shouldShowSkillsStep) {
+					// 如果下一步是教育经历步骤(currentStep === 5),且不需要显示,则跳过
+					if (this.steps[nextIndex].id === 5 && !this.shouldShowEducationStep) {
+						// 跳到下下一步
+						const skipIndex = nextIndex + 1;
+						if (skipIndex < this.steps.length) {
+							// 如果下下步是专业技能步骤且也不需要显示,则继续跳过
+							if (this.steps[skipIndex].id === 6 && !this.shouldShowSkillsStep) {
+								const skipIndex2 = skipIndex + 1;
+								if (skipIndex2 < this.steps.length) {
+									this.currentStep = this.steps[skipIndex2].id;
+								}
+							} else {
+								this.currentStep = this.steps[skipIndex].id;
+							}
+						}
+					} else if (this.steps[nextIndex].id === 6 && !this.shouldShowSkillsStep) {
 						// 跳到下下一步
 						const skipIndex = nextIndex + 1;
 						if (skipIndex < this.steps.length) {

+ 15 - 5
pages/agreement/agreement.vue

@@ -23,13 +23,15 @@
       </view>
       
       <!-- 使用v-else和v-html动态渲染协议内容 -->
-      <rich-text v-else :nodes="agreementContent"></rich-text>
+      <rich-text  :nodes="agreementContent"></rich-text>
     </scroll-view>
   </view>
 </template>
 
 <script>
 import { getUserAgreement } from '@/api/user';
+	import { apiBaseUrl } from '@/common/config.js';
+
 export default {
   data() {
     return {
@@ -46,11 +48,19 @@ export default {
     goBack() {
       uni.navigateBack();
     },
-    fetchAgreement() {
+    async fetchAgreement() {
       this.loading = true;
       this.error = false;
-      
-      getUserAgreement()
+       const res = await uni.request({
+          url: `${apiBaseUrl}/api/public/agreements/terms_of_service/`,
+          method: 'GET',
+        });
+      console.log(res);
+      if(res.statusCode==200){
+        this.loading = false;
+         this.agreementContent = res.data.content || '';
+      }
+      /* getUserAgreement()
         .then(res => {
           console.log(res);
           this.loading = false;
@@ -66,7 +76,7 @@ export default {
         })
         .finally(() => {
           this.loading = false;
-        });
+        }); */
     }
   }
 }

+ 14 - 4
pages/camera/camera.vue

@@ -182,7 +182,8 @@
 				personDetectionInterval: null, // 定时器对象
 				showCameraWarning: false, // 添加新的数据属性
 				showPageWarning: false, // 添加新的数据属性
-				statusBarHeight: 0
+				statusBarHeight: 0,
+				positionConfig:{}
 		  }
 		},
 		computed: {
@@ -192,6 +193,7 @@
 			}
 		},
 		onLoad(options) {
+			
 			// 从路由参数中获取面试ID
 			if (options && options.id) {
 				this.interviewId = options.id;
@@ -201,6 +203,7 @@
 				this.fetchInterviewList();
 			}
 			 this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0
+			 this.positionConfig = JSON.parse(uni.getStorageSync('configData'))
 		},
 		onReady() {
 			// 创建相机上下文
@@ -214,6 +217,7 @@
 			this.initDigitalHuman();
 		},
 		mounted() {
+			this.positionConfig = JSON.parse(uni.getStorageSync('configData'))
 			 // 添加截屏监听
 			 uni.onUserCaptureScreen(() => {
 			console.log('User captured screen');
@@ -1071,9 +1075,15 @@
 					}
 				} else {
 					// 所有组都完成了,跳转到下一个页面
-					uni.navigateTo({
-						url: '/pages/posture-guide/posture-guide'
-					});
+					if(this.positionConfig.enable_posture_check){
+						uni.navigateTo({
+							url: '/pages/posture-guide/posture-guide'
+						});
+					}else{
+						uni.navigateTo({
+							url: '/pages/interview-question/interview-question'
+						});
+					}
 				}
 			},
 

+ 26 - 2
pages/identity-verify/identity-verify.vue

@@ -3517,8 +3517,32 @@ export default {
       // 首先添加介绍视频
       this.videoList.push(this.introVideoUrl);
       
-      // 修改介绍视频的字幕,移除翻译
-      this.subtitles = [
+      // 获取配置数据中的开场白
+        const configStr = uni.getStorageSync('configData');
+        let openingSpeech = [];
+        
+        if (configStr) {
+          try {
+            const configData = JSON.parse(configStr);
+            if (configData && configData.digital_human_opening_speech && Array.isArray(configData.digital_human_opening_speech)) {
+              // 将配置数据转换为字幕格式
+              openingSpeech = configData.digital_human_opening_speech.map((item, index, arr) => {
+                const startTime = index === 0 ? 0 : arr[index - 1].end_time || index * 5;
+                const endTime = item.end_time || (index + 1) * 5;
+                return {
+                  startTime,
+                  endTime,
+                  text: item.content
+                };
+              });
+            }
+          } catch (error) {
+            console.error('解析configData失败:', error);
+          }
+        }
+  
+      // 如果成功获取到开场白配置则使用配置的内容,否则使用默认字幕
+      this.subtitles = openingSpeech.length > 0 ? openingSpeech : [
         {
           startTime: 0,
           endTime: 5,

+ 161 - 23
pages/interview-question/interview-question.vue

@@ -2282,7 +2282,7 @@ export default {
       
       // 添加延迟确保状态已更新
       setTimeout(() => {
-        uni.navigateTo({
+        uni.reLaunch({
           url: '/pages/success/success',
           success: () => {
             console.log('页面跳转成功');
@@ -2302,7 +2302,7 @@ export default {
     // 添加处理导航失败的方法
     handleNavigationFailure() {
       // 尝试跳转到其他页面
-      uni.navigateTo({
+      uni.reLaunch({
         url: '/pages/success/success',//'/pages/posture-guide/posture-guide',
         fail: (err2) => {
           console.error('备用跳转也失败:', err2);
@@ -3018,8 +3018,8 @@ export default {
     async playAiVoice() {
       console.log('开始播放AI语音:', this.aiVoiceUrl);
       
-      // 重置错误提示标记
-      this.hasShownTextFallbackToast = false;
+      // 重置所有状态
+      this.resetAudioState();
       
       // 标记正在播放AI语音
       this.isPlayingAiVoice = true;
@@ -3039,32 +3039,86 @@ export default {
       }
       
       try {
-      // 获取系统信息
-      const systemInfo = uni.getSystemInfoSync();
-      const isMiniProgram = systemInfo.uniPlatform && systemInfo.uniPlatform.startsWith('mp-');
-      const isIOS = systemInfo.platform === 'ios';
-      
-        // 根据平台选择播放方式并等待播放完成
-      if (isMiniProgram) {
-        if (isIOS) {
+        // 获取系统信息
+        const systemInfo = uni.getSystemInfoSync();
+        const isMiniProgram = systemInfo.uniPlatform && systemInfo.uniPlatform.startsWith('mp-');
+        const isIOS = systemInfo.platform === 'ios';
+        
+        // 设置播放超时保护
+        this.audioPlaybackTimer = setTimeout(() => {
+          console.log('音频播放超时,使用备选方案');
+          if (this.isPlayingAiVoice) {
+            this.handlePlaybackTimeout();
+          }
+        }, 30000); // 30秒超时
+        
+        // 根据平台选择播放方式
+        if (isMiniProgram) {
+          if (isIOS) {
             await this.playIOSMiniProgramAudio();
-        } else {
+          } else {
             await this.playMiniProgramAudio();
-        }
-      } else if (isIOS) {
+          }
+        } else if (isIOS) {
           await this.playAiVoiceForIOS();
-      } else {
+        } else {
           await this.playAiVoiceForAndroid();
         }
         
-        // 音频播放完成后再跳转
-        this.navigateToNextPage();
+        // 音频播放完成后,标记需要自动跳转
+        this.pendingAutoNavigation = true;
+        
       } catch (error) {
         console.error('音频播放失败:', error);
-        this.useTextFallbackAndNavigate();
+        this.handlePlaybackError(error);
       }
     },
 
+    // 添加新方法:处理播放超时
+    handlePlaybackTimeout() {
+      console.log('处理音频播放超时');
+      
+      // 重置状态
+      this.resetAudioState();
+      
+      // 显示提示
+      uni.showToast({
+        title: '音频播放超时,将显示文字回复',
+        icon: 'none',
+        duration: 2000
+      });
+      
+      // 使用文本回退
+      this.useTextFallbackAndNavigate();
+    },
+    
+    // 添加新方法:处理播放错误
+    handlePlaybackError(error) {
+      console.error('处理音频播放错误:', error);
+      
+      // 重置状态
+      this.resetAudioState();
+      
+      // 如果是iOS设备,尝试使用备选播放方法
+      const isIOS = uni.getSystemInfoSync().platform === 'ios';
+      if (isIOS && !this.hasTriedFallbackMethod) {
+        this.hasTriedFallbackMethod = true;
+        console.log('iOS设备尝试使用备选播放方法');
+        this.fallbackIOSAudioPlay();
+        return;
+      }
+      
+      // 显示错误提示
+      uni.showToast({
+        title: '音频播放失败,将显示文字回复',
+        icon: 'none',
+        duration: 2000
+      });
+      
+      // 使用文本回退
+      this.useTextFallbackAndNavigate();
+    },
+    
     // 新增方法:文本回退并导航
     useTextFallbackAndNavigate() {
       console.log('使用文本回退并准备导航');
@@ -3227,7 +3281,7 @@ export default {
       
       // 添加延迟确保状态已更新
       setTimeout(() => {
-        uni.navigateTo({
+        uni.reLaunch({
           url: '/pages/success/success',
           success: () => {
             console.log('页面跳转成功');
@@ -3500,9 +3554,14 @@ export default {
 
     // 添加新方法:iOS音频播放完成处理
     handleIOSAudioPlaybackComplete() {
+      console.log('iOS音频播放完成');
+      
       // 标记播放结束
       this.isPlayingAiVoice = false;
       
+      // 确保在主线程中执行UI更新
+      uni.hideLoading();
+      
       // 延迟清空字幕,让用户有时间阅读
       setTimeout(() => {
         this.currentSubtitle = '';
@@ -3518,13 +3577,43 @@ export default {
         this.aiAudioPlayer = null;
       }
       
-      // 显示继续提问选项
-      this.showContinueQuestionOptions();
+      // 确保状态重置
+      this.resetAudioState();
       
       // 检查是否需要自动跳转
-      this.checkPendingNavigation();
+      if (this.pendingAutoNavigation) {
+        console.log('执行待处理的自动跳转');
+        this.navigateToNextPage();
+      } else {
+        // 如果没有待处理的跳转,显示继续提问选项
+        this.showContinueQuestionOptions();
+      }
     },
 
+    // 添加新方法:重置音频状态
+    resetAudioState() {
+      // 重置所有音频相关状态
+      this.isPlayingAiVoice = false;
+      this.hasTriedFallbackMethod = false;
+      this.hasShownTextFallbackToast = false;
+      
+      // 确保音频播放器被正确销毁
+      if (this.aiAudioPlayer) {
+        try {
+          this.aiAudioPlayer.destroy();
+        } catch (e) {
+          console.error('销毁音频播放器失败:', e);
+        }
+        this.aiAudioPlayer = null;
+      }
+      
+      // 清除任何可能的计时器
+      if (this.audioPlaybackTimer) {
+        clearTimeout(this.audioPlaybackTimer);
+        this.audioPlaybackTimer = null;
+      }
+    },
+    
     // 添加新方法:iOS音频错误处理
     handleIOSAudioError(error) {
       console.error('iOS音频播放错误:', error);
@@ -3574,6 +3663,55 @@ export default {
       }, 1000);
     },
 
+    // 添加新方法:iOS专用音频播放
+    async playAiVoiceForIOS() {
+      console.log('使用iOS专用音频播放方法');
+      
+      return new Promise((resolve, reject) => {
+        try {
+          // 创建新的音频播放器
+          this.aiAudioPlayer = uni.createInnerAudioContext();
+          
+          // 配置播放器
+          this.aiAudioPlayer.autoplay = true;
+          this.aiAudioPlayer.obeyMuteSwitch = false; // 不遵循静音开关,确保播放
+          this.aiAudioPlayer.volume = 1.0;
+          
+          // 设置音频源
+          this.aiAudioPlayer.src = this.aiVoiceUrl;
+          
+          // 监听事件
+          this.aiAudioPlayer.onPlay(() => {
+            console.log('iOS音频开始播放');
+            this.currentSubtitle = this.aiText;
+          });
+          
+          this.aiAudioPlayer.onEnded(() => {
+            console.log('iOS音频播放完成');
+            this.handleIOSAudioPlaybackComplete();
+            resolve();
+          });
+          
+          this.aiAudioPlayer.onError((err) => {
+            console.error('iOS音频播放错误:', err);
+            reject(err);
+          });
+          
+          this.aiAudioPlayer.onWaiting(() => {
+            console.log('iOS音频加载中...');
+          });
+          
+          this.aiAudioPlayer.onCanplay(() => {
+            console.log('iOS音频准备就绪');
+          });
+          
+        } catch (error) {
+          console.error('创建iOS音频播放器失败:', error);
+          reject(error);
+        }
+      });
+    },
+    
     // 添加新方法:iOS备选音频播放
     fallbackIOSAudioPlay() {
       console.log('iOS备选音频播放方案');

+ 1 - 1
pages/interview_retake/interview_retake.vue

@@ -169,7 +169,7 @@ export default {
 		},
 		async uploadImage(tempFilePath) {
 			const tenant_id = uni.getStorageSync('tenant_id') || '1';
-			const description = `补拍-${this.currentStep.name}`;
+			const description = `${this.currentStep.name}`;
 
 			return new Promise((resolve, reject) => {
 				uni.uploadFile({

+ 14 - 14
pages/job-detail/job-detail.vue

@@ -203,9 +203,9 @@ export default {
       return true;
     },
 	// 获取当前职位配置
-	getConfig(){
+	getConfig(selectedJobId){
 		uni.request({
-			url: `${apiBaseUrl}/api/job/config/position/${this.selectedJobId}`,
+			url: `${apiBaseUrl}/api/job/config/position/${this.jobId}`,
 			method: 'GET',
 			data: {
 				openid: JSON.parse(uni.getStorageSync('userInfo')).openid
@@ -273,18 +273,18 @@ export default {
           } catch (e) {
             console.error('更新用户信息失败:', e);
           }
-		  this.getConfig()
+		  this.getConfig(userInfo.appId)
           // 导航到摄像头页面
-          uni.navigateTo({
-            url: '/pages/Personal/Personal',
-            fail: (err) => {
-              console.error('页面跳转失败:', err);
-              uni.showToast({
-                title: '页面跳转失败',
-                icon: 'none'
-              });
-            }
-          });
+          // uni.navigateTo({
+          //   url: '/pages/Personal/Personal',
+          //   fail: (err) => {
+          //     console.error('页面跳转失败:', err);
+          //     uni.showToast({
+          //       title: '页面跳转失败',
+          //       icon: 'none'
+          //     });
+          //   }
+          // });
         }
       } catch (err) {
         console.error('申请职位失败:', err);
@@ -350,7 +350,7 @@ export default {
           addressStr = location;
         }
 
-        // 使用微信小程序的地址解析接口
+        // 使用微信小程序的地址解析接口WJLBZ-SMQYZ-3RNX5-7J4LI-XTZD6-7IBZR
         uni.request({
           url: `https://apis.map.qq.com/ws/geocoder/v1/?address=${encodeURIComponent(addressStr)}&key=ZS4BZ-NKAA7-4VLXR-PHVI4-HAGPH-Z4FJ3`, // 需要替换为实际的地图Key
           success: (res) => {

+ 0 - 4
unpackage/dist/dev/mp-weixin/api/user.js

@@ -52,9 +52,6 @@ const fillUserInfo = (params) => {
 const applyJob = (params) => {
   return utils_request.http.post("/api/job/apply", params);
 };
-const getUserAgreement = () => {
-  return utils_request.http.get("/api/public/agreements/terms_of_service/");
-};
 const getQuestions = (params) => {
   return utils_request.http.get("/api/wechat/choice_questions/", params);
 };
@@ -62,7 +59,6 @@ exports.applyJob = applyJob;
 exports.fillUserInfo = fillUserInfo;
 exports.getJobList = getJobList;
 exports.getQuestions = getQuestions;
-exports.getUserAgreement = getUserAgreement;
 exports.getUserInfo = getUserInfo;
 exports.logout = logout;
 exports.wxLogin = wxLogin;

+ 5 - 0
unpackage/dist/dev/mp-weixin/app.json

@@ -48,5 +48,10 @@
       }
     ]
   },
+  "permission": {
+    "scope.userLocation": {
+      "desc": "你的位置信息将用于小程序位置接口的效果展示"
+    }
+  },
   "usingComponents": {}
 }

+ 271 - 203
unpackage/dist/dev/mp-weixin/pages/Personal/Personal.js

@@ -254,7 +254,7 @@ const _sfc_main = {
     },
     showEthnicField() {
       var _a;
-      return Object.keys(this.safeProfileFieldsConfig).length === 0 || ((_a = this.safeProfileFieldsConfig.ethnic) == null ? void 0 : _a.visible) !== false;
+      return Object.keys(this.safeProfileFieldsConfig).length === 0 || ((_a = this.safeProfileFieldsConfig.ethnicity) == null ? void 0 : _a.visible) !== false;
     },
     showHeightField() {
       var _a;
@@ -287,8 +287,8 @@ const _sfc_main = {
     },
     // 教育经历字段显示控制
     showEducationTimeField() {
-      var _a;
-      return Object.keys(this.safeEducationFieldsConfig).length === 0 || ((_a = this.safeEducationFieldsConfig.start_time) == null ? void 0 : _a.visible) !== false;
+      var _a, _b;
+      return Object.keys(this.safeEducationFieldsConfig).length === 0 || ((_a = this.safeEducationFieldsConfig.start_date) == null ? void 0 : _a.visible) !== false && ((_b = this.safeEducationFieldsConfig.end_date) == null ? void 0 : _b.visible) !== false;
     },
     showEducationSchoolField() {
       var _a;
@@ -304,8 +304,8 @@ const _sfc_main = {
     },
     // 工作经历字段显示控制
     showWorkTimeField() {
-      var _a;
-      return Object.keys(this.safeWorkFieldsConfig).length === 0 || ((_a = this.safeWorkFieldsConfig.start_time) == null ? void 0 : _a.visible) !== false;
+      var _a, _b;
+      return Object.keys(this.safeWorkFieldsConfig).length === 0 || ((_a = this.safeWorkFieldsConfig.start_date) == null ? void 0 : _a.visible) !== false && ((_b = this.safeWorkFieldsConfig.end_date) == null ? void 0 : _b.visible) !== false;
     },
     showWorkCompanyField() {
       var _a;
@@ -335,9 +335,44 @@ const _sfc_main = {
     },
     shouldShowSkillsStep() {
       return this.showRequireTrainingInfoField || this.showRequireProfessionalSkillsField;
+    },
+    // 判断是否显示教育经历步骤
+    shouldShowEducationStep() {
+      if (Object.keys(this.safeEducationFieldsConfig).length === 0) {
+        return true;
+      }
+      const fields = ["start_date", "end_date", "school_name", "major", "degree"];
+      return fields.some((field) => {
+        var _a;
+        return ((_a = this.safeEducationFieldsConfig[field]) == null ? void 0 : _a.visible) !== false;
+      });
     }
   },
   methods: {
+    // 输入时限制小数位数
+    handleInput(event, field, maxDecimals) {
+      let value = event.detail.value;
+      value = value.replace(/[^\d.-]/g, "").replace(/(\..*)\./g, "$1").replace(/(-\d*)-/g, "$1").replace(new RegExp(`^(-?\\d*\\.\\d{${maxDecimals}}).*$`), "$1");
+      if (value.startsWith(".")) {
+        value = "0" + value;
+      }
+      this.formData[field] = value;
+      this.$nextTick(() => {
+        event.target.value = value;
+      });
+    },
+    // 失焦时补全小数位
+    handleBlur(field, precision = 2) {
+      const val = this.formData[field];
+      if (val === "" || val === void 0 || val === null)
+        return;
+      const num = parseFloat(val);
+      if (!isNaN(num)) {
+        this.formData[field] = num.toFixed(precision);
+      } else {
+        this.formData[field] = "";
+      }
+    },
     // 添加承诺书相关方法
     togglePromiseChecked() {
       this.promiseChecked = !this.promiseChecked;
@@ -1028,7 +1063,26 @@ const _sfc_main = {
     prevStep() {
       const prevIndex = this.currentStepIndex - 1;
       if (prevIndex >= 0) {
-        this.currentStep = this.steps[prevIndex].id;
+        if (this.steps[prevIndex].id === 6 && !this.shouldShowSkillsStep) {
+          const skipIndex = prevIndex - 1;
+          if (skipIndex >= 0) {
+            if (this.steps[skipIndex].id === 5 && !this.shouldShowEducationStep) {
+              const skipIndex2 = skipIndex - 1;
+              if (skipIndex2 >= 0) {
+                this.currentStep = this.steps[skipIndex2].id;
+              }
+            } else {
+              this.currentStep = this.steps[skipIndex].id;
+            }
+          }
+        } else if (this.steps[prevIndex].id === 5 && !this.shouldShowEducationStep) {
+          const skipIndex = prevIndex - 1;
+          if (skipIndex >= 0) {
+            this.currentStep = this.steps[skipIndex].id;
+          }
+        } else {
+          this.currentStep = this.steps[prevIndex].id;
+        }
         common_vendor.index.pageScrollTo({
           scrollTop: 0,
           duration: 300
@@ -1045,7 +1099,19 @@ const _sfc_main = {
       }
       const nextIndex = this.currentStepIndex + 1;
       if (nextIndex < this.steps.length) {
-        if (this.steps[nextIndex].id === 6 && !this.shouldShowSkillsStep) {
+        if (this.steps[nextIndex].id === 5 && !this.shouldShowEducationStep) {
+          const skipIndex = nextIndex + 1;
+          if (skipIndex < this.steps.length) {
+            if (this.steps[skipIndex].id === 6 && !this.shouldShowSkillsStep) {
+              const skipIndex2 = skipIndex + 1;
+              if (skipIndex2 < this.steps.length) {
+                this.currentStep = this.steps[skipIndex2].id;
+              }
+            } else {
+              this.currentStep = this.steps[skipIndex].id;
+            }
+          }
+        } else if (this.steps[nextIndex].id === 6 && !this.shouldShowSkillsStep) {
           const skipIndex = nextIndex + 1;
           if (skipIndex < this.steps.length) {
             this.currentStep = this.steps[skipIndex].id;
@@ -1673,40 +1739,42 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   } : {}) : {}, {
     Y: $options.showHeightField
   }, $options.showHeightField ? {
-    Z: $data.formData.height,
-    aa: common_vendor.o(($event) => $data.formData.height = $event.detail.value)
+    Z: common_vendor.o([($event) => $data.formData.height = $event.detail.value, ($event) => $options.handleInput($event, "height", 2)]),
+    aa: common_vendor.o(($event) => $options.handleBlur("height")),
+    ab: $data.formData.height
   } : {}, {
-    ab: $options.showWeightField
+    ac: $options.showWeightField
   }, $options.showWeightField ? {
-    ac: $data.formData.weight,
-    ad: common_vendor.o(($event) => $data.formData.weight = $event.detail.value)
+    ad: common_vendor.o([($event) => $data.formData.weight = $event.detail.value, ($event) => $options.handleInput($event, "weight", 2)]),
+    ae: common_vendor.o(($event) => $options.handleBlur("weight")),
+    af: $data.formData.weight
   } : {}, {
-    ae: $data.formErrors.currentAddress ? 1 : "",
-    af: $data.formData.currentAddress,
-    ag: common_vendor.o(($event) => $data.formData.currentAddress = $event.detail.value),
-    ah: $data.formErrors.currentAddress
+    ag: $data.formErrors.currentAddress ? 1 : "",
+    ah: $data.formData.currentAddress,
+    ai: common_vendor.o(($event) => $data.formData.currentAddress = $event.detail.value),
+    aj: $data.formErrors.currentAddress
   }, $data.formErrors.currentAddress ? {
-    ai: common_vendor.t($data.formErrors.currentAddress)
+    ak: common_vendor.t($data.formErrors.currentAddress)
   } : {}, {
-    aj: $data.formData.residence,
-    ak: common_vendor.o(($event) => $data.formData.residence = $event.detail.value),
-    al: common_vendor.t($data.marriageOptions[$data.marriageIndex] || "请选择婚育状况"),
-    am: common_vendor.o((...args) => $options.bindMarriageChange && $options.bindMarriageChange(...args)),
-    an: $data.marriageIndex,
-    ao: $data.marriageOptions,
-    ap: common_vendor.o((...args) => $options.validateExpectedSalary && $options.validateExpectedSalary(...args)),
-    aq: $data.formErrors.expectedSalary ? 1 : "",
-    ar: $data.formData.expectedSalary,
-    as: common_vendor.o(($event) => $data.formData.expectedSalary = $event.detail.value),
-    at: $data.formErrors.expectedSalary
+    al: $data.formData.residence,
+    am: common_vendor.o(($event) => $data.formData.residence = $event.detail.value),
+    an: common_vendor.t($data.marriageOptions[$data.marriageIndex] || "请选择婚育状况"),
+    ao: common_vendor.o((...args) => $options.bindMarriageChange && $options.bindMarriageChange(...args)),
+    ap: $data.marriageIndex,
+    aq: $data.marriageOptions,
+    ar: common_vendor.o((...args) => $options.validateExpectedSalary && $options.validateExpectedSalary(...args)),
+    as: $data.formErrors.expectedSalary ? 1 : "",
+    at: $data.formData.expectedSalary,
+    av: common_vendor.o(($event) => $data.formData.expectedSalary = $event.detail.value),
+    aw: $data.formErrors.expectedSalary
   }, $data.formErrors.expectedSalary ? {
-    av: common_vendor.t($data.formErrors.expectedSalary)
+    ax: common_vendor.t($data.formErrors.expectedSalary)
   } : {}) : {}, {
-    aw: $data.currentStep === 3
+    ay: $data.currentStep === 3
   }, $data.currentStep === 3 ? common_vendor.e({
-    ax: $data.familyMembers.length > 0
+    az: $data.familyMembers.length > 0
   }, $data.familyMembers.length > 0 ? {
-    ay: common_vendor.f($data.familyMembers, (member, index, i0) => {
+    aA: common_vendor.f($data.familyMembers, (member, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(index + 1),
         b: common_vendor.o(($event) => $options.editFamilyMember(index), index),
@@ -1726,65 +1794,65 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         j: index
       });
     }),
-    az: $options.showFamilyRelationField,
-    aA: $options.showFamilyNameField,
-    aB: $options.showFamilyWorkplaceField,
-    aC: $options.showFamilyPositionField,
-    aD: $options.showFamilyPhoneField
+    aB: $options.showFamilyRelationField,
+    aC: $options.showFamilyNameField,
+    aD: $options.showFamilyWorkplaceField,
+    aE: $options.showFamilyPositionField,
+    aF: $options.showFamilyPhoneField
   } : {}, {
-    aE: common_vendor.t($data.isEditing ? "编辑家庭成员" : "添加家庭成员"),
-    aF: $data.isEditing
+    aG: common_vendor.t($data.isEditing ? "编辑家庭成员" : "添加家庭成员"),
+    aH: $data.isEditing
   }, $data.isEditing ? {
-    aG: common_vendor.o((...args) => $options.cancelEdit && $options.cancelEdit(...args))
+    aI: common_vendor.o((...args) => $options.cancelEdit && $options.cancelEdit(...args))
   } : {}, {
-    aH: $options.showFamilyRelationField
+    aJ: $options.showFamilyRelationField
   }, $options.showFamilyRelationField ? common_vendor.e({
-    aI: $data.familyMemberErrors.relation ? 1 : "",
-    aJ: $data.familyMemberForm.relation,
-    aK: common_vendor.o(($event) => $data.familyMemberForm.relation = $event.detail.value),
-    aL: $data.familyMemberErrors.relation
+    aK: $data.familyMemberErrors.relation ? 1 : "",
+    aL: $data.familyMemberForm.relation,
+    aM: common_vendor.o(($event) => $data.familyMemberForm.relation = $event.detail.value),
+    aN: $data.familyMemberErrors.relation
   }, $data.familyMemberErrors.relation ? {
-    aM: common_vendor.t($data.familyMemberErrors.relation)
+    aO: common_vendor.t($data.familyMemberErrors.relation)
   } : {}) : {}, {
-    aN: $options.showFamilyNameField
+    aP: $options.showFamilyNameField
   }, $options.showFamilyNameField ? common_vendor.e({
-    aO: $data.familyMemberErrors.name ? 1 : "",
-    aP: $data.familyMemberForm.name,
-    aQ: common_vendor.o(($event) => $data.familyMemberForm.name = $event.detail.value),
-    aR: $data.familyMemberErrors.name
+    aQ: $data.familyMemberErrors.name ? 1 : "",
+    aR: $data.familyMemberForm.name,
+    aS: common_vendor.o(($event) => $data.familyMemberForm.name = $event.detail.value),
+    aT: $data.familyMemberErrors.name
   }, $data.familyMemberErrors.name ? {
-    aS: common_vendor.t($data.familyMemberErrors.name)
+    aU: common_vendor.t($data.familyMemberErrors.name)
   } : {}) : {}, {
-    aT: $options.showFamilyWorkplaceField
+    aV: $options.showFamilyWorkplaceField
   }, $options.showFamilyWorkplaceField ? {
-    aU: $data.familyMemberForm.workplaceOrAddress,
-    aV: common_vendor.o(($event) => $data.familyMemberForm.workplaceOrAddress = $event.detail.value)
+    aW: $data.familyMemberForm.workplaceOrAddress,
+    aX: common_vendor.o(($event) => $data.familyMemberForm.workplaceOrAddress = $event.detail.value)
   } : {}, {
-    aW: $options.showFamilyPositionField
+    aY: $options.showFamilyPositionField
   }, $options.showFamilyPositionField ? {
-    aX: $data.familyMemberForm.position,
-    aY: common_vendor.o(($event) => $data.familyMemberForm.position = $event.detail.value)
+    aZ: $data.familyMemberForm.position,
+    ba: common_vendor.o(($event) => $data.familyMemberForm.position = $event.detail.value)
   } : {}, {
-    aZ: $options.showFamilyPhoneField
+    bb: $options.showFamilyPhoneField
   }, $options.showFamilyPhoneField ? common_vendor.e({
-    ba: common_vendor.o([($event) => $data.familyMemberForm.phone = $event.detail.value, (...args) => $options.validatePhone && $options.validatePhone(...args)]),
-    bb: $data.familyMemberErrors.phone ? 1 : "",
-    bc: $data.familyMemberForm.phone,
-    bd: $data.familyMemberErrors.phone
+    bc: common_vendor.o([($event) => $data.familyMemberForm.phone = $event.detail.value, (...args) => $options.validatePhone && $options.validatePhone(...args)]),
+    bd: $data.familyMemberErrors.phone ? 1 : "",
+    be: $data.familyMemberForm.phone,
+    bf: $data.familyMemberErrors.phone
   }, $data.familyMemberErrors.phone ? {
-    be: common_vendor.t($data.familyMemberErrors.phone)
+    bg: common_vendor.t($data.familyMemberErrors.phone)
   } : {}) : {}, {
-    bf: $data.familyMemberForm.isEmergencyContact,
-    bg: common_vendor.o((...args) => $options.handleEmergencyContactChange && $options.handleEmergencyContactChange(...args)),
-    bh: common_vendor.t($data.isEditing ? "✓" : "+"),
-    bi: common_vendor.o((...args) => $options.saveFamilyMember && $options.saveFamilyMember(...args)),
-    bj: common_vendor.t($data.isEditing ? "保存修改" : "添加成员")
+    bh: $data.familyMemberForm.isEmergencyContact,
+    bi: common_vendor.o((...args) => $options.handleEmergencyContactChange && $options.handleEmergencyContactChange(...args)),
+    bj: common_vendor.t($data.isEditing ? "✓" : "+"),
+    bk: common_vendor.o((...args) => $options.saveFamilyMember && $options.saveFamilyMember(...args)),
+    bl: common_vendor.t($data.isEditing ? "保存修改" : "添加成员")
   }) : {}, {
-    bk: $data.currentStep === 5
+    bm: $data.currentStep === 5
   }, $data.currentStep === 5 ? common_vendor.e({
-    bl: $data.educationList.length > 0
+    bn: $data.educationList.length > 0
   }, $data.educationList.length > 0 ? {
-    bm: common_vendor.f($data.educationList, (edu, index, i0) => {
+    bo: common_vendor.f($data.educationList, (edu, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(index === 0 ? "第一学历" : "最高学历"),
         b: common_vendor.o(($event) => $options.editEducation(index), index),
@@ -1802,98 +1870,98 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         i: index
       });
     }),
-    bn: $options.showEducationTimeField,
-    bo: $options.showEducationSchoolField,
-    bp: $options.showEducationMajorField,
-    bq: $options.showEducationDegreeField
+    bp: $options.showEducationTimeField,
+    bq: $options.showEducationSchoolField,
+    br: $options.showEducationMajorField,
+    bs: $options.showEducationDegreeField
   } : {}, {
-    br: $data.educationList.length < 2 || $data.isEditingEducation
+    bt: $data.educationList.length < 2 || $data.isEditingEducation
   }, $data.educationList.length < 2 || $data.isEditingEducation ? common_vendor.e({
-    bs: common_vendor.t($data.isEditingEducation ? "编辑教育经历" : $data.educationList.length === 0 ? "添加第一学历" : "添加最高学历"),
-    bt: $data.isEditingEducation
+    bv: common_vendor.t($data.isEditingEducation ? "编辑教育经历" : $data.educationList.length === 0 ? "添加第一学历" : "添加最高学历"),
+    bw: $data.isEditingEducation
   }, $data.isEditingEducation ? {
-    bv: common_vendor.o((...args) => $options.cancelEditEducation && $options.cancelEditEducation(...args))
+    bx: common_vendor.o((...args) => $options.cancelEditEducation && $options.cancelEditEducation(...args))
   } : {}, {
-    bw: $options.showEducationTimeField
+    by: $options.showEducationTimeField
   }, $options.showEducationTimeField ? common_vendor.e({
-    bx: common_vendor.t($data.educationForm.startTime || "开始时间"),
-    by: $data.educationForm.startTime,
-    bz: common_vendor.o((...args) => $options.bindStartTimeChange && $options.bindStartTimeChange(...args)),
-    bA: $data.educationErrors.startTime ? 1 : "",
-    bB: common_vendor.t($data.educationForm.endTime || "结束时间"),
-    bC: $data.educationForm.endTime,
-    bD: common_vendor.o((...args) => $options.bindEndTimeChange && $options.bindEndTimeChange(...args)),
-    bE: $data.educationErrors.endTime ? 1 : "",
-    bF: $data.educationErrors.startTime
+    bz: common_vendor.t($data.educationForm.startTime || "开始时间"),
+    bA: $data.educationForm.startTime,
+    bB: common_vendor.o((...args) => $options.bindStartTimeChange && $options.bindStartTimeChange(...args)),
+    bC: $data.educationErrors.startTime ? 1 : "",
+    bD: common_vendor.t($data.educationForm.endTime || "结束时间"),
+    bE: $data.educationForm.endTime,
+    bF: common_vendor.o((...args) => $options.bindEndTimeChange && $options.bindEndTimeChange(...args)),
+    bG: $data.educationErrors.endTime ? 1 : "",
+    bH: $data.educationErrors.startTime
   }, $data.educationErrors.startTime ? {
-    bG: common_vendor.t($data.educationErrors.startTime)
+    bI: common_vendor.t($data.educationErrors.startTime)
   } : {}, {
-    bH: $data.educationErrors.endTime
+    bJ: $data.educationErrors.endTime
   }, $data.educationErrors.endTime ? {
-    bI: common_vendor.t($data.educationErrors.endTime)
+    bK: common_vendor.t($data.educationErrors.endTime)
   } : {}) : {}, {
-    bJ: $options.showEducationSchoolField
+    bL: $options.showEducationSchoolField
   }, $options.showEducationSchoolField ? common_vendor.e({
-    bK: $data.educationErrors.schoolName ? 1 : "",
-    bL: $data.educationForm.schoolName,
-    bM: common_vendor.o(($event) => $data.educationForm.schoolName = $event.detail.value),
-    bN: $data.educationErrors.schoolName
+    bM: $data.educationErrors.schoolName ? 1 : "",
+    bN: $data.educationForm.schoolName,
+    bO: common_vendor.o(($event) => $data.educationForm.schoolName = $event.detail.value),
+    bP: $data.educationErrors.schoolName
   }, $data.educationErrors.schoolName ? {
-    bO: common_vendor.t($data.educationErrors.schoolName)
+    bQ: common_vendor.t($data.educationErrors.schoolName)
   } : {}) : {}, {
-    bP: $options.showEducationMajorField
+    bR: $options.showEducationMajorField
   }, $options.showEducationMajorField ? common_vendor.e({
-    bQ: $data.educationErrors.major ? 1 : "",
-    bR: $data.educationForm.major,
-    bS: common_vendor.o(($event) => $data.educationForm.major = $event.detail.value),
-    bT: $data.educationErrors.major
+    bS: $data.educationErrors.major ? 1 : "",
+    bT: $data.educationForm.major,
+    bU: common_vendor.o(($event) => $data.educationForm.major = $event.detail.value),
+    bV: $data.educationErrors.major
   }, $data.educationErrors.major ? {
-    bU: common_vendor.t($data.educationErrors.major)
+    bW: common_vendor.t($data.educationErrors.major)
   } : {}) : {}, {
-    bV: $options.showEducationDegreeField
+    bX: $options.showEducationDegreeField
   }, $options.showEducationDegreeField ? common_vendor.e({
-    bW: common_vendor.t($data.degreeOptions[$data.degreeIndex] || "请选择学历"),
-    bX: common_vendor.o((...args) => $options.bindDegreeChange && $options.bindDegreeChange(...args)),
-    bY: $data.degreeIndex,
-    bZ: $data.degreeOptions,
-    ca: $data.educationErrors.degree ? 1 : "",
-    cb: $data.educationErrors.degree
+    bY: common_vendor.t($data.degreeOptions[$data.degreeIndex] || "请选择学历"),
+    bZ: common_vendor.o((...args) => $options.bindDegreeChange && $options.bindDegreeChange(...args)),
+    ca: $data.degreeIndex,
+    cb: $data.degreeOptions,
+    cc: $data.educationErrors.degree ? 1 : "",
+    cd: $data.educationErrors.degree
   }, $data.educationErrors.degree ? {
-    cc: common_vendor.t($data.educationErrors.degree)
+    ce: common_vendor.t($data.educationErrors.degree)
   } : {}) : {}, {
-    cd: common_vendor.t($data.isEditingEducation ? "✓" : "+"),
-    ce: common_vendor.o((...args) => $options.saveEducation && $options.saveEducation(...args)),
-    cf: common_vendor.t($data.isEditingEducation ? "保存修改" : "添加学历")
+    cf: common_vendor.t($data.isEditingEducation ? "✓" : "+"),
+    cg: common_vendor.o((...args) => $options.saveEducation && $options.saveEducation(...args)),
+    ch: common_vendor.t($data.isEditingEducation ? "保存修改" : "添加学历")
   }) : {}) : {}, {
-    cg: $data.currentStep === 6 && ($options.showRequireTrainingInfoField || $options.showRequireProfessionalSkillsField)
+    ci: $data.currentStep === 6 && ($options.showRequireTrainingInfoField || $options.showRequireProfessionalSkillsField)
   }, $data.currentStep === 6 && ($options.showRequireTrainingInfoField || $options.showRequireProfessionalSkillsField) ? common_vendor.e({
-    ch: $options.showRequireTrainingInfoField
+    cj: $options.showRequireTrainingInfoField
   }, $options.showRequireTrainingInfoField ? {} : {}, {
-    ci: $options.showRequireTrainingInfoField
+    ck: $options.showRequireTrainingInfoField
   }, $options.showRequireTrainingInfoField ? common_vendor.e({
-    cj: $data.formErrors.skills ? 1 : "",
-    ck: $data.formData.skills,
-    cl: common_vendor.o(($event) => $data.formData.skills = $event.detail.value),
-    cm: $data.formErrors.skills
+    cl: $data.formErrors.skills ? 1 : "",
+    cm: $data.formData.skills,
+    cn: common_vendor.o(($event) => $data.formData.skills = $event.detail.value),
+    co: $data.formErrors.skills
   }, $data.formErrors.skills ? {
-    cn: common_vendor.t($data.formErrors.skills)
+    cp: common_vendor.t($data.formErrors.skills)
   } : {}) : {}, {
-    co: $options.showRequireProfessionalSkillsField
+    cq: $options.showRequireProfessionalSkillsField
   }, $options.showRequireProfessionalSkillsField ? {} : {}, {
-    cp: $options.showRequireProfessionalSkillsField
+    cr: $options.showRequireProfessionalSkillsField
   }, $options.showRequireProfessionalSkillsField ? common_vendor.e({
-    cq: $data.formErrors.training ? 1 : "",
-    cr: $data.formData.training,
-    cs: common_vendor.o(($event) => $data.formData.training = $event.detail.value),
-    ct: $data.formErrors.training
+    cs: $data.formErrors.training ? 1 : "",
+    ct: $data.formData.training,
+    cv: common_vendor.o(($event) => $data.formData.training = $event.detail.value),
+    cw: $data.formErrors.training
   }, $data.formErrors.training ? {
-    cv: common_vendor.t($data.formErrors.training)
+    cx: common_vendor.t($data.formErrors.training)
   } : {}) : {}) : {}, {
-    cw: $data.currentStep === 8
+    cy: $data.currentStep === 8
   }, $data.currentStep === 8 ? common_vendor.e({
-    cx: $data.workList.length > 0
+    cz: $data.workList.length > 0
   }, $data.workList.length > 0 ? {
-    cy: common_vendor.f($data.workList, (work, index, i0) => {
+    cA: common_vendor.f($data.workList, (work, index, i0) => {
       return common_vendor.e({
         a: common_vendor.t(index + 1),
         b: common_vendor.o(($event) => $options.editWork(index), index),
@@ -1916,108 +1984,108 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
         m: index
       });
     }),
-    cz: $options.showWorkTimeField,
-    cA: $options.showWorkCompanyField,
-    cB: $options.showWorkDepartmentField,
-    cC: $options.showWorkEmployeeCountField,
-    cD: $options.showWorkPositionField
+    cB: $options.showWorkTimeField,
+    cC: $options.showWorkCompanyField,
+    cD: $options.showWorkDepartmentField,
+    cE: $options.showWorkEmployeeCountField,
+    cF: $options.showWorkPositionField
   } : {}, {
-    cE: $data.workList.length < 2 || $data.isEditingWork
+    cG: $data.workList.length < 2 || $data.isEditingWork
   }, $data.workList.length < 2 || $data.isEditingWork ? common_vendor.e({
-    cF: common_vendor.t($data.isEditingWork ? "编辑工作经历" : "添加工作经历"),
-    cG: $data.isEditingWork
+    cH: common_vendor.t($data.isEditingWork ? "编辑工作经历" : "添加工作经历"),
+    cI: $data.isEditingWork
   }, $data.isEditingWork ? {
-    cH: common_vendor.o((...args) => $options.cancelEditWork && $options.cancelEditWork(...args))
+    cJ: common_vendor.o((...args) => $options.cancelEditWork && $options.cancelEditWork(...args))
   } : {}, {
-    cI: $options.showWorkTimeField
+    cK: $options.showWorkTimeField
   }, $options.showWorkTimeField ? common_vendor.e({
-    cJ: common_vendor.t($data.workForm.startTime || "开始时间"),
-    cK: $data.workForm.startTime,
-    cL: common_vendor.o((...args) => $options.bindWorkStartTimeChange && $options.bindWorkStartTimeChange(...args)),
-    cM: $data.workErrors.startTime ? 1 : "",
-    cN: common_vendor.t($data.workForm.endTime || "结束时间"),
-    cO: $data.workForm.endTime,
-    cP: common_vendor.o((...args) => $options.bindWorkEndTimeChange && $options.bindWorkEndTimeChange(...args)),
-    cQ: $data.workErrors.endTime ? 1 : "",
-    cR: $data.workErrors.startTime
+    cL: common_vendor.t($data.workForm.startTime || "开始时间"),
+    cM: $data.workForm.startTime,
+    cN: common_vendor.o((...args) => $options.bindWorkStartTimeChange && $options.bindWorkStartTimeChange(...args)),
+    cO: $data.workErrors.startTime ? 1 : "",
+    cP: common_vendor.t($data.workForm.endTime || "结束时间"),
+    cQ: $data.workForm.endTime,
+    cR: common_vendor.o((...args) => $options.bindWorkEndTimeChange && $options.bindWorkEndTimeChange(...args)),
+    cS: $data.workErrors.endTime ? 1 : "",
+    cT: $data.workErrors.startTime
   }, $data.workErrors.startTime ? {
-    cS: common_vendor.t($data.workErrors.startTime)
+    cU: common_vendor.t($data.workErrors.startTime)
   } : {}, {
-    cT: $data.workErrors.endTime
+    cV: $data.workErrors.endTime
   }, $data.workErrors.endTime ? {
-    cU: common_vendor.t($data.workErrors.endTime)
+    cW: common_vendor.t($data.workErrors.endTime)
   } : {}) : {}, {
-    cV: $options.showWorkCompanyField
+    cX: $options.showWorkCompanyField
   }, $options.showWorkCompanyField ? common_vendor.e({
-    cW: $data.workErrors.companyName ? 1 : "",
-    cX: $data.workForm.companyName,
-    cY: common_vendor.o(($event) => $data.workForm.companyName = $event.detail.value),
-    cZ: $data.workErrors.companyName
+    cY: $data.workErrors.companyName ? 1 : "",
+    cZ: $data.workForm.companyName,
+    da: common_vendor.o(($event) => $data.workForm.companyName = $event.detail.value),
+    db: $data.workErrors.companyName
   }, $data.workErrors.companyName ? {
-    da: common_vendor.t($data.workErrors.companyName)
+    dc: common_vendor.t($data.workErrors.companyName)
   } : {}) : {}, {
-    db: $options.showWorkEmployeeCountField
+    dd: $options.showWorkEmployeeCountField
   }, $options.showWorkEmployeeCountField ? common_vendor.e({
-    dc: $data.workErrors.employeeCount ? 1 : "",
-    dd: common_vendor.o((...args) => $options.validateEmployeeCount && $options.validateEmployeeCount(...args)),
-    de: $data.workForm.employeeCount,
-    df: common_vendor.o(($event) => $data.workForm.employeeCount = $event.detail.value),
-    dg: $data.workErrors.employeeCount
+    de: $data.workErrors.employeeCount ? 1 : "",
+    df: common_vendor.o((...args) => $options.validateEmployeeCount && $options.validateEmployeeCount(...args)),
+    dg: $data.workForm.employeeCount,
+    dh: common_vendor.o(($event) => $data.workForm.employeeCount = $event.detail.value),
+    di: $data.workErrors.employeeCount
   }, $data.workErrors.employeeCount ? {
-    dh: common_vendor.t($data.workErrors.employeeCount)
+    dj: common_vendor.t($data.workErrors.employeeCount)
   } : {}) : {}, {
-    di: $options.showWorkDepartmentField
+    dk: $options.showWorkDepartmentField
   }, $options.showWorkDepartmentField ? common_vendor.e({
-    dj: $data.workErrors.department ? 1 : "",
-    dk: $data.workForm.department,
-    dl: common_vendor.o(($event) => $data.workForm.department = $event.detail.value),
-    dm: $data.workErrors.department
+    dl: $data.workErrors.department ? 1 : "",
+    dm: $data.workForm.department,
+    dn: common_vendor.o(($event) => $data.workForm.department = $event.detail.value),
+    dp: $data.workErrors.department
   }, $data.workErrors.department ? {
-    dn: common_vendor.t($data.workErrors.department)
+    dq: common_vendor.t($data.workErrors.department)
   } : {}) : {}, {
-    dp: $options.showWorkPositionField
+    dr: $options.showWorkPositionField
   }, $options.showWorkPositionField ? common_vendor.e({
-    dq: $data.workErrors.position ? 1 : "",
-    dr: $data.workForm.position,
-    ds: common_vendor.o(($event) => $data.workForm.position = $event.detail.value),
-    dt: $data.workErrors.position
+    ds: $data.workErrors.position ? 1 : "",
+    dt: $data.workForm.position,
+    dv: common_vendor.o(($event) => $data.workForm.position = $event.detail.value),
+    dw: $data.workErrors.position
   }, $data.workErrors.position ? {
-    dv: common_vendor.t($data.workErrors.position)
+    dx: common_vendor.t($data.workErrors.position)
   } : {}) : {}, {
-    dw: $data.workErrors.monthlySalary ? 1 : "",
-    dx: common_vendor.o([($event) => $data.workForm.monthlySalary = $event.detail.value, (...args) => $options.validateMonthlySalary && $options.validateMonthlySalary(...args)]),
-    dy: $data.workForm.monthlySalary,
-    dz: $data.workErrors.monthlySalary
+    dy: $data.workErrors.monthlySalary ? 1 : "",
+    dz: common_vendor.o([($event) => $data.workForm.monthlySalary = $event.detail.value, (...args) => $options.validateMonthlySalary && $options.validateMonthlySalary(...args)]),
+    dA: $data.workForm.monthlySalary,
+    dB: $data.workErrors.monthlySalary
   }, $data.workErrors.monthlySalary ? {
-    dA: common_vendor.t($data.workErrors.monthlySalary)
+    dC: common_vendor.t($data.workErrors.monthlySalary)
   } : {}, {
-    dB: $data.workForm.supervisor,
-    dC: common_vendor.o(($event) => $data.workForm.supervisor = $event.detail.value),
-    dD: $data.workErrors.supervisor
+    dD: $data.workForm.supervisor,
+    dE: common_vendor.o(($event) => $data.workForm.supervisor = $event.detail.value),
+    dF: $data.workErrors.supervisor
   }, $data.workErrors.supervisor ? {
-    dE: common_vendor.t($data.workErrors.supervisor)
+    dG: common_vendor.t($data.workErrors.supervisor)
   } : {}, {
-    dF: common_vendor.o([($event) => $data.workForm.supervisorPhone = $event.detail.value, (...args) => $options.validatePhone && $options.validatePhone(...args)]),
-    dG: $data.workForm.supervisorPhone,
-    dH: $data.workErrors.supervisorPhone
+    dH: common_vendor.o([($event) => $data.workForm.supervisorPhone = $event.detail.value, (...args) => $options.validatePhone && $options.validatePhone(...args)]),
+    dI: $data.workForm.supervisorPhone,
+    dJ: $data.workErrors.supervisorPhone
   }, $data.workErrors.supervisorPhone ? {
-    dI: common_vendor.t($data.workErrors.supervisorPhone)
+    dK: common_vendor.t($data.workErrors.supervisorPhone)
   } : {}, {
-    dJ: common_vendor.t($data.isEditingWork ? "✓" : "+"),
-    dK: common_vendor.o((...args) => $options.saveWork && $options.saveWork(...args)),
-    dL: common_vendor.t($data.isEditingWork ? "保存修改" : "添加工作经历")
+    dL: common_vendor.t($data.isEditingWork ? "✓" : "+"),
+    dM: common_vendor.o((...args) => $options.saveWork && $options.saveWork(...args)),
+    dN: common_vendor.t($data.isEditingWork ? "保存修改" : "添加工作经历")
   }) : {}) : {}, {
-    dM: $options.showPrevButton
+    dO: $options.showPrevButton
   }, $options.showPrevButton ? {
-    dN: common_vendor.o((...args) => $options.prevStep && $options.prevStep(...args))
+    dP: common_vendor.o((...args) => $options.prevStep && $options.prevStep(...args))
   } : {}, {
-    dO: $options.showNextButton
+    dQ: $options.showNextButton
   }, $options.showNextButton ? {
-    dP: common_vendor.o((...args) => $options.nextStep && $options.nextStep(...args))
+    dR: common_vendor.o((...args) => $options.nextStep && $options.nextStep(...args))
   } : {}, {
-    dQ: $options.showSubmitButton
+    dS: $options.showSubmitButton
   }, $options.showSubmitButton ? {
-    dR: common_vendor.o((...args) => $options.submitForm && $options.submitForm(...args))
+    dT: common_vendor.o((...args) => $options.submitForm && $options.submitForm(...args))
   } : {});
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/Personal/Personal.wxml


+ 13 - 16
unpackage/dist/dev/mp-weixin/pages/agreement/agreement.js

@@ -1,6 +1,7 @@
 "use strict";
 const common_vendor = require("../../common/vendor.js");
-const api_user = require("../../api/user.js");
+require("../../utils/request.js");
+const common_config = require("../../common/config.js");
 const _sfc_main = {
   data() {
     return {
@@ -17,21 +18,18 @@ const _sfc_main = {
     goBack() {
       common_vendor.index.navigateBack();
     },
-    fetchAgreement() {
+    async fetchAgreement() {
       this.loading = true;
       this.error = false;
-      api_user.getUserAgreement().then((res) => {
-        console.log(res);
-        this.loading = false;
-        this.agreementContent = res.content || "";
-        console.log(this.agreementContent);
-      }).catch((err) => {
-        console.error("获取用户协议失败:", err);
-        this.error = true;
-        this.errorMsg = "网络异常,请稍后重试";
-      }).finally(() => {
-        this.loading = false;
+      const res = await common_vendor.index.request({
+        url: `${common_config.apiBaseUrl}/api/public/agreements/terms_of_service/`,
+        method: "GET"
       });
+      console.log(res);
+      if (res.statusCode == 200) {
+        this.loading = false;
+        this.agreementContent = res.data.content || "";
+      }
     }
   }
 };
@@ -41,10 +39,9 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
   }, $data.loading ? {} : $data.error ? {
     c: common_vendor.t($data.errorMsg),
     d: common_vendor.o((...args) => $options.fetchAgreement && $options.fetchAgreement(...args))
-  } : {
+  } : {}, {
+    b: $data.error,
     e: $data.agreementContent
-  }, {
-    b: $data.error
   });
 }
 const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);

+ 1 - 1
unpackage/dist/dev/mp-weixin/pages/agreement/agreement.wxml

@@ -1 +1 @@
-<view class="agreement-container"><scroll-view scroll-y class="agreement-content"><view wx:if="{{a}}" class="loading"><text>加载中...</text></view><view wx:elif="{{b}}" class="error"><text>{{c}}</text><button class="retry-btn" bindtap="{{d}}">重新加载</button></view><rich-text wx:else nodes="{{e}}"></rich-text></scroll-view></view>
+<view class="agreement-container"><scroll-view scroll-y class="agreement-content"><view wx:if="{{a}}" class="loading"><text>加载中...</text></view><view wx:elif="{{b}}" class="error"><text>{{c}}</text><button class="retry-btn" bindtap="{{d}}">重新加载</button></view><rich-text nodes="{{e}}"></rich-text></scroll-view></view>

+ 13 - 4
unpackage/dist/dev/mp-weixin/pages/camera/camera.js

@@ -74,7 +74,8 @@ const _sfc_main = {
       // 添加新的数据属性
       showPageWarning: false,
       // 添加新的数据属性
-      statusBarHeight: 0
+      statusBarHeight: 0,
+      positionConfig: {}
     };
   },
   computed: {
@@ -91,6 +92,7 @@ const _sfc_main = {
       this.fetchInterviewList();
     }
     this.statusBarHeight = common_vendor.index.getSystemInfoSync().statusBarHeight || 0;
+    this.positionConfig = JSON.parse(common_vendor.index.getStorageSync("configData"));
   },
   onReady() {
     this.cameraContext = common_vendor.index.createCameraContext();
@@ -100,6 +102,7 @@ const _sfc_main = {
     this.initDigitalHuman();
   },
   mounted() {
+    this.positionConfig = JSON.parse(common_vendor.index.getStorageSync("configData"));
     common_vendor.index.onUserCaptureScreen(() => {
       console.log("User captured screen");
       this.screenCaptureCount++;
@@ -719,9 +722,15 @@ const _sfc_main = {
           this.proceedToNextGroup();
         }
       } else {
-        common_vendor.index.navigateTo({
-          url: "/pages/posture-guide/posture-guide"
-        });
+        if (this.positionConfig.enable_posture_check) {
+          common_vendor.index.navigateTo({
+            url: "/pages/posture-guide/posture-guide"
+          });
+        } else {
+          common_vendor.index.navigateTo({
+            url: "/pages/interview-question/interview-question"
+          });
+        }
       }
     },
     // 添加新的方法处理弹窗确认

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
unpackage/dist/dev/mp-weixin/pages/camera/camera.wxml


+ 21 - 1
unpackage/dist/dev/mp-weixin/pages/identity-verify/identity-verify.js

@@ -2475,7 +2475,27 @@ const _sfc_main = {
     processQuestionData() {
       this.videoList = [];
       this.videoList.push(this.introVideoUrl);
-      this.subtitles = [
+      const configStr = common_vendor.index.getStorageSync("configData");
+      let openingSpeech = [];
+      if (configStr) {
+        try {
+          const configData = JSON.parse(configStr);
+          if (configData && configData.digital_human_opening_speech && Array.isArray(configData.digital_human_opening_speech)) {
+            openingSpeech = configData.digital_human_opening_speech.map((item, index, arr) => {
+              const startTime = index === 0 ? 0 : arr[index - 1].end_time || index * 5;
+              const endTime = item.end_time || (index + 1) * 5;
+              return {
+                startTime,
+                endTime,
+                text: item.content
+              };
+            });
+          }
+        } catch (error) {
+          console.error("解析configData失败:", error);
+        }
+      }
+      this.subtitles = openingSpeech.length > 0 ? openingSpeech : [
         {
           startTime: 0,
           endTime: 5,

+ 1 - 1
unpackage/dist/dev/mp-weixin/pages/interview-notice/interview-notice.wxml

@@ -1 +1 @@
-<view class="notice-container"><view class="notice-title">面试注意事项</view><view class="notice-subtitle">为了保障面试顺利进行,请注意以下事项</view><view class="notice-grid"><view class="notice-item light"><view class="icon-container"><text class="iconfont">☀</text></view><text class="item-text">保持光线良好、干净背景、安静不受打扰</text></view><view class="notice-item smile"><view class="icon-container"><text class="iconfont">☺</text></view><text class="item-text">保持微笑、声音洪亮、正面直视摄像头</text></view><view class="notice-item headphone"><view class="icon-container"><text class="iconfont">🎧</text></view><text class="item-text">保持声音回音接收正常、建议使用耳机</text></view><view class="notice-item wifi"><view class="icon-container"><text class="iconfont">📶</text></view><text class="item-text">保持网络通畅、面试期间勿断出</text></view><view class="notice-item forbidden"><view class="icon-container"><text class="iconfont">✖</text></view><text class="item-text">请勿人脸离开屏幕</text></view><view class="notice-item forbidden"><view class="icon-container"><text class="iconfont">✖</text></view><text class="item-text">请勿录屏、截屏</text></view></view><view class="warning-tip"> * 建议开启免提模式,避免采用\短信等打断面试 </view><view class="agreement"><radio checked="{{a}}" bindtap="{{b}}"/><text class="agreement-text">我同意并知晓</text></view><voice-check-modal wx:if="{{d}}" bindcomplete="{{c}}" u-i="389291d2-0" bind:__l="__l" u-p="{{d}}"/><button class="next-btn" disabled="{{e}}" bindtap="{{f}}">下一步</button></view>
+<view class="notice-container"><view class="notice-title">面试注意事项</view><view class="notice-subtitle">为了保障面试顺利进行,请注意以下事项</view><view class="notice-grid"><view class="notice-item light"><view class="icon-container"><text class="iconfont">☀</text></view><text class="item-text">保持光线良好、干净背景、安静不受打扰</text></view><view class="notice-item smile"><view class="icon-container"><text class="iconfont">☺</text></view><text class="item-text">保持微笑、声音洪亮、正面直视摄像头</text></view><view class="notice-item headphone"><view class="icon-container"><text class="iconfont">🎧</text></view><text class="item-text">保持声音回音接收正常、建议使用耳机</text></view><view class="notice-item wifi"><view class="icon-container"><text class="iconfont">📶</text></view><text class="item-text">保持网络通畅、面试期间勿断出</text></view><view class="notice-item forbidden"><view class="icon-container"><text class="iconfont">✖</text></view><text class="item-text">请勿人脸离开屏幕</text></view><view class="notice-item forbidden"><view class="icon-container"><text class="iconfont">✖</text></view><text class="item-text">请勿录屏、截屏</text></view></view><view class="warning-tip"> * 建议开启免提模式,避免采用\短信等打断面试 </view><view class="agreement"><radio checked="{{a}}" bindtap="{{b}}"/><text class="agreement-text">我同意并知晓</text></view><voice-check-modal wx:if="{{d}}" bindcomplete="{{c}}" u-i="60da0479-0" bind:__l="__l" u-p="{{d}}"/><button class="next-btn" disabled="{{e}}" bindtap="{{f}}">下一步</button></view>

+ 103 - 8
unpackage/dist/dev/mp-weixin/pages/interview-question/interview-question.js

@@ -1506,7 +1506,7 @@ const _sfc_main = {
       this.isPlayingAiVoice = false;
       this.currentSubtitle = "";
       setTimeout(() => {
-        common_vendor.index.navigateTo({
+        common_vendor.index.reLaunch({
           url: "/pages/success/success",
           success: () => {
             console.log("页面跳转成功");
@@ -1524,7 +1524,7 @@ const _sfc_main = {
     },
     // 添加处理导航失败的方法
     handleNavigationFailure() {
-      common_vendor.index.navigateTo({
+      common_vendor.index.reLaunch({
         url: "/pages/success/success",
         //'/pages/posture-guide/posture-guide',
         fail: (err2) => {
@@ -2056,7 +2056,7 @@ const _sfc_main = {
     // 添加新方法:播放AI语音
     async playAiVoice() {
       console.log("开始播放AI语音:", this.aiVoiceUrl);
-      this.hasShownTextFallbackToast = false;
+      this.resetAudioState();
       this.isPlayingAiVoice = true;
       this.showContinueQuestionButton = false;
       this.showEndInterviewButton = false;
@@ -2070,6 +2070,12 @@ const _sfc_main = {
         const systemInfo = common_vendor.index.getSystemInfoSync();
         const isMiniProgram = systemInfo.uniPlatform && systemInfo.uniPlatform.startsWith("mp-");
         const isIOS = systemInfo.platform === "ios";
+        this.audioPlaybackTimer = setTimeout(() => {
+          console.log("音频播放超时,使用备选方案");
+          if (this.isPlayingAiVoice) {
+            this.handlePlaybackTimeout();
+          }
+        }, 3e4);
         if (isMiniProgram) {
           if (isIOS) {
             await this.playIOSMiniProgramAudio();
@@ -2081,12 +2087,41 @@ const _sfc_main = {
         } else {
           await this.playAiVoiceForAndroid();
         }
-        this.navigateToNextPage();
+        this.pendingAutoNavigation = true;
       } catch (error) {
         console.error("音频播放失败:", error);
-        this.useTextFallbackAndNavigate();
+        this.handlePlaybackError(error);
       }
     },
+    // 添加新方法:处理播放超时
+    handlePlaybackTimeout() {
+      console.log("处理音频播放超时");
+      this.resetAudioState();
+      common_vendor.index.showToast({
+        title: "音频播放超时,将显示文字回复",
+        icon: "none",
+        duration: 2e3
+      });
+      this.useTextFallbackAndNavigate();
+    },
+    // 添加新方法:处理播放错误
+    handlePlaybackError(error) {
+      console.error("处理音频播放错误:", error);
+      this.resetAudioState();
+      const isIOS = common_vendor.index.getSystemInfoSync().platform === "ios";
+      if (isIOS && !this.hasTriedFallbackMethod) {
+        this.hasTriedFallbackMethod = true;
+        console.log("iOS设备尝试使用备选播放方法");
+        this.fallbackIOSAudioPlay();
+        return;
+      }
+      common_vendor.index.showToast({
+        title: "音频播放失败,将显示文字回复",
+        icon: "none",
+        duration: 2e3
+      });
+      this.useTextFallbackAndNavigate();
+    },
     // 新增方法:文本回退并导航
     useTextFallbackAndNavigate() {
       console.log("使用文本回退并准备导航");
@@ -2201,7 +2236,7 @@ const _sfc_main = {
       this.isPlayingAiVoice = false;
       this.currentSubtitle = "";
       setTimeout(() => {
-        common_vendor.index.navigateTo({
+        common_vendor.index.reLaunch({
           url: "/pages/success/success",
           success: () => {
             console.log("页面跳转成功");
@@ -2410,7 +2445,9 @@ const _sfc_main = {
     },
     // 添加新方法:iOS音频播放完成处理
     handleIOSAudioPlaybackComplete() {
+      console.log("iOS音频播放完成");
       this.isPlayingAiVoice = false;
+      common_vendor.index.hideLoading();
       setTimeout(() => {
         this.currentSubtitle = "";
       }, 2e3);
@@ -2422,8 +2459,31 @@ const _sfc_main = {
         }
         this.aiAudioPlayer = null;
       }
-      this.showContinueQuestionOptions();
-      this.checkPendingNavigation();
+      this.resetAudioState();
+      if (this.pendingAutoNavigation) {
+        console.log("执行待处理的自动跳转");
+        this.navigateToNextPage();
+      } else {
+        this.showContinueQuestionOptions();
+      }
+    },
+    // 添加新方法:重置音频状态
+    resetAudioState() {
+      this.isPlayingAiVoice = false;
+      this.hasTriedFallbackMethod = false;
+      this.hasShownTextFallbackToast = false;
+      if (this.aiAudioPlayer) {
+        try {
+          this.aiAudioPlayer.destroy();
+        } catch (e) {
+          console.error("销毁音频播放器失败:", e);
+        }
+        this.aiAudioPlayer = null;
+      }
+      if (this.audioPlaybackTimer) {
+        clearTimeout(this.audioPlaybackTimer);
+        this.audioPlaybackTimer = null;
+      }
     },
     // 添加新方法:iOS音频错误处理
     handleIOSAudioError(error) {
@@ -2466,6 +2526,41 @@ const _sfc_main = {
         this.fallbackIOSAudioPlay();
       }, 1e3);
     },
+    // 添加新方法:iOS专用音频播放
+    async playAiVoiceForIOS() {
+      console.log("使用iOS专用音频播放方法");
+      return new Promise((resolve, reject) => {
+        try {
+          this.aiAudioPlayer = common_vendor.index.createInnerAudioContext();
+          this.aiAudioPlayer.autoplay = true;
+          this.aiAudioPlayer.obeyMuteSwitch = false;
+          this.aiAudioPlayer.volume = 1;
+          this.aiAudioPlayer.src = this.aiVoiceUrl;
+          this.aiAudioPlayer.onPlay(() => {
+            console.log("iOS音频开始播放");
+            this.currentSubtitle = this.aiText;
+          });
+          this.aiAudioPlayer.onEnded(() => {
+            console.log("iOS音频播放完成");
+            this.handleIOSAudioPlaybackComplete();
+            resolve();
+          });
+          this.aiAudioPlayer.onError((err) => {
+            console.error("iOS音频播放错误:", err);
+            reject(err);
+          });
+          this.aiAudioPlayer.onWaiting(() => {
+            console.log("iOS音频加载中...");
+          });
+          this.aiAudioPlayer.onCanplay(() => {
+            console.log("iOS音频准备就绪");
+          });
+        } catch (error) {
+          console.error("创建iOS音频播放器失败:", error);
+          reject(error);
+        }
+      });
+    },
     // 添加新方法:iOS备选音频播放
     fallbackIOSAudioPlay() {
       console.log("iOS备选音频播放方案");

+ 1 - 1
unpackage/dist/dev/mp-weixin/pages/interview_retake/interview_retake.js

@@ -112,7 +112,7 @@ const _sfc_main = {
     },
     async uploadImage(tempFilePath) {
       const tenant_id = common_vendor.index.getStorageSync("tenant_id") || "1";
-      const description = `补拍-${this.currentStep.name}`;
+      const description = `${this.currentStep.name}`;
       return new Promise((resolve, reject) => {
         common_vendor.index.uploadFile({
           url: `${common_config.apiBaseUrl}/job/upload_posture_photo`,

+ 3 - 13
unpackage/dist/dev/mp-weixin/pages/job-detail/job-detail.js

@@ -115,9 +115,9 @@ const _sfc_main = {
       return true;
     },
     // 获取当前职位配置
-    getConfig() {
+    getConfig(selectedJobId) {
       common_vendor.index.request({
-        url: `${common_config.apiBaseUrl}/api/job/config/position/${this.selectedJobId}`,
+        url: `${common_config.apiBaseUrl}/api/job/config/position/${this.jobId}`,
         method: "GET",
         data: {
           openid: JSON.parse(common_vendor.index.getStorageSync("userInfo")).openid
@@ -174,17 +174,7 @@ const _sfc_main = {
           } catch (e) {
             console.error("更新用户信息失败:", e);
           }
-          this.getConfig();
-          common_vendor.index.navigateTo({
-            url: "/pages/Personal/Personal",
-            fail: (err) => {
-              console.error("页面跳转失败:", err);
-              common_vendor.index.showToast({
-                title: "页面跳转失败",
-                icon: "none"
-              });
-            }
-          });
+          this.getConfig(userInfo.appId);
         }
       } catch (err) {
         console.error("申请职位失败:", err);

+ 1 - 1
unpackage/dist/dev/mp-weixin/project.config.json

@@ -18,7 +18,7 @@
     }
   },
   "compileType": "miniprogram",
-  "libVersion": "3.8.11",
+  "libVersion": "3.9.2",
   "appid": "wxc9655eeaa3223b75",
   "projectname": "interview_uni",
   "condition": {

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff