From ac46a06e096fe31853bec9914fcd9df56f2ef2ac Mon Sep 17 00:00:00 2001 From: "wangmingyong@163.com" Date: Thu, 20 Aug 2026 09:13:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=88=E9=89=B4=E6=9D=83=E5=86=8D=E8=B0=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/util/w6sMedia.js | 185 ++++++++++++------ 1 file changed, 130 insertions(+), 55 deletions(-) diff --git a/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js b/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js index f1a393a8..d7f2ddb3 100644 --- a/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js +++ b/zdxt-web-client/zdxt-efcode-enterprise-app/src/util/w6sMedia.js @@ -1,83 +1,158 @@ import * as w6s from 'szient-js-sdk' +import sha1 from 'crypto-js/sha1' +import { siqCode } from '@/api/enterprise' import { baseUrl } from '@/config/env' import { $globalStore } from '@/common/globalStore' +// ========== w6s 鉴权(参照 enterpriseHome.vue 的写法) ========== +const generateRandomNumber = () => { + const min = 100000 + const max = 999999 + const randomNum = (Math.floor(Math.random() * (max - min + 1)) + min) + return randomNum.toString().padStart(6, '0') +} + +let w6sAuthPromise = null + +// 确保 w6s 鉴权完成,缓存 Promise 避免重复鉴权 +export const ensureW6sAuth = () => { + if (w6sAuthPromise) return w6sAuthPromise + w6sAuthPromise = new Promise((resolve, reject) => { + siqCode(null, success => { + let access_key = '' + let access_secret = '' + if (success.success) { + access_key = success.data.accessKey + access_secret = success.data.accessSecret + } + + if (!access_key || !access_secret) { + w6sAuthPromise = null + reject(new Error('获取深i企认证信息错误: access_key 或 access_secret 为空')) + return + } + + const nonce = generateRandomNumber() + const timestamp = `${Date.now()}` + + const str = [access_secret, nonce, timestamp] + .sort() + .reduce((s, item) => s + item, '') + + const signature = sha1(str).toString().toLowerCase() + + w6s.config({ + access_key: access_key, + nonce: nonce, + timestamp: timestamp, + signature: signature, + }).then((res) => { + console.log('w6s 鉴权成功', res) + }).catch((err) => { + w6sAuthPromise = null + reject(err) + }) + + w6s.ready(() => { + console.log('w6s ready') + resolve() + }) + }, error => { + w6sAuthPromise = null + reject(error) + }) + }) + return w6sAuthPromise +} + // 拍照并加水印(时间戳 + 经纬度自动叠加到照片) -export const takePhotoWithWaterMark = ({ +export const takePhotoWithWaterMark = async ({ content = '', fontSize = 14, color = '#FF5858', timeEnable = true, locationEnable = true, -} = {}) => new Promise((resolve, reject) => { - w6s.image.takePhotoAndAddWaterMark({ - content, - fontSize, - color, - markDisable: false, - timeEnable, - locationEnable, - success: resolve, - fail: reject, +} = {}) => { + await ensureW6sAuth() + return new Promise((resolve, reject) => { + w6s.image.takePhotoAndAddWaterMark({ + content, + fontSize, + color, + markDisable: false, + timeEnable, + locationEnable, + success: resolve, + fail: reject, + }) }) -}) +} // 录制视频 -export const startVideoRecorder = ({ +export const startVideoRecorder = async ({ duration = 60, quality = 1, // 0 高清 / 1 一般 / 2 流畅 front = false, syncSystemAlbum = false, -} = {}) => new Promise((resolve, reject) => { - w6s.video.startVideoRecoder({ - duration, - quality, - front, - sync_system_album: syncSystemAlbum, - success: resolve, - fail: reject, +} = {}) => { + await ensureW6sAuth() + return new Promise((resolve, reject) => { + w6s.video.startVideoRecoder({ + duration, + quality, + front, + sync_system_album: syncSystemAlbum, + success: resolve, + fail: reject, + }) }) -}) +} // 获取定位(经纬度) -export const getLocation = () => new Promise((resolve, reject) => { - w6s.location.getLocation({ success: resolve, fail: reject }) -}) +export const getLocation = async () => { + await ensureW6sAuth() + return new Promise((resolve, reject) => { + w6s.location.getLocation({ success: resolve, fail: reject }) + }) +} // 上传本地文件到后端 /app-enf/common/file/upload // 使用 w6s.file.upload(Cordova FileTransfer),直接传本地路径,无需 base64 转换 -export const uploadLocalFileToBackend = ({ +export const uploadLocalFileToBackend = async ({ fileURL, fileName = 'upload', mimeType = 'image/jpeg', -}) => new Promise((resolve, reject) => { - const token = $globalStore.useCommon?.token || '' - // w6s.file.upload 需要完整 URL - const api = `${baseUrl}/app-enf/common/file/upload` - const server = /^https?:/.test(api) ? api : `${window.location.origin}${api}` +}) => { + await ensureW6sAuth() + return new Promise((resolve, reject) => { + const token = $globalStore.useCommon?.token || '' + // w6s.file.upload 需要完整 URL + const api = `${baseUrl}/app-enf/common/file/upload` + const server = /^https?:/.test(api) ? api : `${window.location.origin}${api}` - const opts = new window.FileUploadOptions() - opts.fileKey = 'file' - opts.fileName = fileName - opts.mimeType = mimeType - opts.headers = { - Authorization: token ? `Bearer ${token}` : '', - clientid: '9e6eb24cd4e169a98b0d2cd8034d877b', - } - const fileIns = new w6s.file.upload(opts) - fileIns.upload({ - fileURL, - server, - trustAllHosts: false, - success: (res) => { - // Cordova FileTransfer 返回 res.response 为字符串 - try { - const parsed = typeof res.response === 'string' ? JSON.parse(res.response) : res.response - resolve(parsed) - } catch (e) { - resolve(res.response) - } - }, - fail: reject, + const opts = new window.FileUploadOptions() + opts.fileKey = 'file' + opts.fileName = fileName + opts.mimeType = mimeType + opts.headers = { + Authorization: token ? `Bearer ${token}` : '', + clientid: '9e6eb24cd4e169a98b0d2cd8034d877b', + } + const fileIns = new w6s.file.upload(opts) + fileIns.upload({ + fileURL, + server, + trustAllHosts: false, + success: (res) => { + // Cordova FileTransfer 返回 res.response 为字符串 + try { + const parsed = typeof res.response === 'string' ? JSON.parse(res.response) : res.response + resolve(parsed) + } catch (e) { + resolve(res.response) + } + }, + fail: reject, + }) }) -}) +}