feat: 本地 Java 发票 OCR + 策划方案多角色开放 + H5 相机脱敏修复
- OCR: 进程内 PaddleOCR ONNX Runtime 识别替代远程 Python 微服务 (新增 ocr/core/service/config 引擎, 删 OcrClient/OcrConfig, PDF 文本层优先 + QR 快路径) - 投稿: 项目设计投稿 → 项目策划方案, doctor/executor/sponsor 三角色开放 (BizProjectPlan 按非 admin/manager 隔离, 复用 Submissions.vue, 设计文件改 OssFileUploader) - H5: <video> 去掉 autoplay + safePlay 重试, 穿透 uni-app wrapper 找原生 video - 脱敏: 签到表高斯模糊由横向条带改为全高竖条带 (20%~50% 宽度) - 域名: ringdoctor.com → risingdoctor.com
This commit is contained in:
@@ -32,7 +32,27 @@ export function useCamera(videoId: string, blur?: BlurConfig) {
|
||||
const errorMsg = ref<string>('')
|
||||
|
||||
function getVideoEl(): HTMLVideoElement | null {
|
||||
return document.getElementById(videoId) as HTMLVideoElement | null
|
||||
const el = document.getElementById(videoId) as HTMLElement | null
|
||||
if (!el) return null
|
||||
// uni-app H5 把 <video> 编译成 <uni-video> Vue 组件时, getElementById
|
||||
// 拿到的是 wrapper, 它的 srcObject setter 会透传给内部原生 <video>,
|
||||
// 但 readyState / play() 不一定透传. 用 readyState 是否 number 判断是否原生.
|
||||
if (el.tagName === 'VIDEO' && typeof (el as any).readyState === 'number') {
|
||||
return el as HTMLVideoElement
|
||||
}
|
||||
// wrapper 场景: 内部包了一个原生 <video>
|
||||
const inner = el.querySelector('video') as HTMLVideoElement | null
|
||||
if (inner && typeof inner.readyState === 'number') {
|
||||
console.log('[camera] 穿透 uni-app wrapper, 找到内部原生 <video>')
|
||||
return inner
|
||||
}
|
||||
// 最后一搏: 找页面上第一个原生 <video>
|
||||
const fallback = document.querySelector('video') as HTMLVideoElement | null
|
||||
if (fallback) {
|
||||
console.log('[camera] 全局兜底找到第一个原生 <video>')
|
||||
return fallback
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
async function startCamera() {
|
||||
|
||||
Reference in New Issue
Block a user