diff --git a/docs/DEV_SETUP.md b/docs/DEV_SETUP.md index 1216d362..e844753b 100644 --- a/docs/DEV_SETUP.md +++ b/docs/DEV_SETUP.md @@ -182,6 +182,7 @@ curl -k -s https://peilian.njzhmj.top/h5/ | sed -n '1,20p' - SOP知识库:进入 `/knowledge/sop`,可上传 txt/md/PDF/Word/Excel/PPT 文档入库;点击“检索” → “生成训练题”,应看到“已完成闭环”、命中数据库 SOP 原文片段和训练题;数据库不可用时页面回退 seed。 - 资料处理:进入 `/knowledge/processing`,应看到资料总量、解析任务表、处理链路、规则与风险;可用少量文件验证“批量导入/选择目录/服务端导入”。**批量导入走异步队列**:提交即返回,页面出现“本次批量上传”进度面板(排队/加工中/完成/失败 + 单条重试),后台 worker 并发 2 逐条解析入库;暂存目录默认 `./.data/staging`(`aihr.upload.staging` 覆盖)。服务端导入读取 `./.data/import` 下的相对目录,启动后台任务并在页面显示进度,运行中任务可点“取消”;目录导入的重试粒度是同目录重新导入,批量上传的重试粒度是单文件。 - uni-app 员工端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/user/today/index`,手机号登录(dev 验证码固定 `123456`)。今日页进入问师傅、练习、案例素材和个人页;练习页应能完成开始练习、提交回应、结束评分、每日三题提交,个人页同步训练历史和成长证据包。 +- 移动端登录后若组织快照接口返回 `401/403`,只降级为手动岗位确认,不应清除手机号登录态;岗位确认页仍需允许员工选择“生活顾问”后继续进入业务页。 - uni-app 主管端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/supervisor/index/index`,应看到团队概览、团队画像、团队预警、指派专项、待复盘和复盘详情;从团队画像派专项后,最近专项应立即回读新记录。 - uni-app 候选人端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/candidate/index/index`,手机号登录(dev 验证码固定 `123456`)→ “开始面试/面试练习”完成答题评分;“补充资料”选择 PDF/Word/图片后上传,应看到资料状态。Codex 内置浏览器不支持本地文件选择时,用真实 HTTP multipart smoke 代替浏览器文件选择。 - 真 LLM 激活:在 `/system/model` 给供应商填 api_host/api_key 并启用 `category=chat` 模型后,三角色对练的客户回复与评分即为真实 LLM 生成;再启用 `category=asr/tts`(如硅基流动 SenseVoice/CosyVoice2)语音路径生效。未配置时全链路自动回退 seed。 diff --git a/mobile-uni/src/pages.json b/mobile-uni/src/pages.json index 7e62ca67..b4447641 100644 --- a/mobile-uni/src/pages.json +++ b/mobile-uni/src/pages.json @@ -131,7 +131,7 @@ }, "tabBar": { "color": "#7b8494", - "selectedColor": "#2f6bff", + "selectedColor": "#e70014", "backgroundColor": "#ffffff", "borderStyle": "white", "height": "66px", diff --git a/mobile-uni/src/pages/auth/login/index.vue b/mobile-uni/src/pages/auth/login/index.vue index ebdd285b..6473b8cb 100644 --- a/mobile-uni/src/pages/auth/login/index.vue +++ b/mobile-uni/src/pages/auth/login/index.vue @@ -1,70 +1,82 @@ @@ -103,9 +115,23 @@ const loggingIn = ref(false); const message = ref(''); const inputStyles = { color: '#25282d', - borderColor: '#d7d9de', - backgroundColor: '#ffffff' + borderColor: 'transparent', + backgroundColor: 'transparent' }; + +const normalizeDigits = (value: string | number, maxLength: number) => + String(value || '') + .replace(/\D/g, '') + .slice(0, maxLength); + +const onPhoneInput = (value: string | number) => { + formData.phone = normalizeDigits(value, 11); +}; + +const onSmsCodeInput = (value: string | number) => { + formData.smsCode = normalizeDigits(value, 6); +}; + const goAfterLogin = async () => { const redirect = consumeLoginRedirect() || '/pages/user/today/index'; goToMobileTarget(await nextUserRouteAfterLogin(redirect)); @@ -178,145 +204,294 @@ onShow(() => { diff --git a/mobile-uni/src/pages/auth/position/index.vue b/mobile-uni/src/pages/auth/position/index.vue index 55768a1a..f95b9f58 100644 --- a/mobile-uni/src/pages/auth/position/index.vue +++ b/mobile-uni/src/pages/auth/position/index.vue @@ -1,15 +1,23 @@ @@ -57,8 +69,13 @@ const finish = () => { const selectPosition = (position: UserPosition) => { if (saving.value) return; + selectedPosition.value = position; +}; + +const confirmPosition = () => { + if (!selectedPosition.value || saving.value) return; saving.value = true; - const saved = saveSelectedPosition(position); + const saved = saveSelectedPosition(selectedPosition.value); selectedPosition.value = saved; finish(); }; @@ -95,39 +112,105 @@ onShow(() => { diff --git a/mobile-uni/src/pages/user/practice/index.vue b/mobile-uni/src/pages/user/practice/index.vue index 5c939cf9..849e5613 100644 --- a/mobile-uni/src/pages/user/practice/index.vue +++ b/mobile-uni/src/pages/user/practice/index.vue @@ -1,10 +1,8 @@