feat: 邀请函邮件发送 + 首次设密/密码为空 + 姓名单一可信源
邀请发送 (菜单暂隐藏, 待确认参数见 发送邀请-待确认参数.md): - 后端: BizInvite / BizInviteRecipient + Controller/Service/Mapper/XML - 邮件: InviteMailSender (spring-boot-starter-mail SMTP) + application*.yml 邮件配置 - 上传进度: UploadProgressRegistry + UploadProgressController - 前端: InviteList / InviteNew / InviteDetail / InviteView + api/business/invite.js - 原型: proto/html/components/invite-detail / new-invitation / send-invitation 登录/账号: - 首次设密: /getInfo 返回 isPasswordEmpty, SysProfileController 密码为空时跳过旧密码校验, ForcePasswordDialog 强制弹窗 - 姓名单一可信源 resolveDisplayName: doctor→biz_expert.name, sponsor/executor→biz_person.name, 其余回退 nick_name - OA compliance 门禁改为按手机号查 ecology 视图 (不再限定 manager/leader) 其它: - OSS zip 在线查看 (列清单+取单文件, 公开只读) + SecurityConfig permitAll - doctor 项目详情 ProjectDetail.vue - 数据库/测试/设计文档 (md) 入库
This commit is contained in:
@@ -16,7 +16,7 @@ import {
|
||||
describeCameraError,
|
||||
type Facing,
|
||||
} from '@/utils/camera'
|
||||
import { uploadCameraPhoto } from '@/utils/upload'
|
||||
import { uploadCameraPhoto, uploadCameraPhotos } from '@/utils/upload'
|
||||
|
||||
/** 条带高斯模糊配置 (签到表脱敏用): 对截图竖直 [start, end] 比例区间做高斯模糊 */
|
||||
export type BlurConfig = {
|
||||
@@ -29,6 +29,9 @@ export function useCamera(videoId: string, blur?: BlurConfig) {
|
||||
const facing = ref<Facing>('environment')
|
||||
const captured = ref<string>('')
|
||||
const blurred = ref<string>('')
|
||||
// 连拍多张 (签到表): 每张 = sharp + 对应的高斯模糊版, 攒批后一次提交
|
||||
const shots = ref<string[]>([])
|
||||
const blurredShots = ref<string[]>([])
|
||||
const errorMsg = ref<string>('')
|
||||
|
||||
function getVideoEl(): HTMLVideoElement | null {
|
||||
@@ -125,6 +128,47 @@ export function useCamera(videoId: string, blur?: BlurConfig) {
|
||||
}
|
||||
}
|
||||
|
||||
/** 连拍: 把当前这张加入批次, 清空取景回相机 (继续拍下一张) */
|
||||
function addShot() {
|
||||
if (!captured.value) return
|
||||
shots.value.push(captured.value)
|
||||
blurredShots.value.push(blurred.value || '')
|
||||
captured.value = ''
|
||||
blurred.value = ''
|
||||
}
|
||||
|
||||
/** 连拍: 删除批次里第 index 张 */
|
||||
function removeShot(index: number) {
|
||||
shots.value.splice(index, 1)
|
||||
blurredShots.value.splice(index, 1)
|
||||
}
|
||||
|
||||
/** 连拍: 把批次里所有照片一次性直传 OSS + 回传后端 */
|
||||
async function submitAll() {
|
||||
if (!shots.value.length) return
|
||||
uni.showLoading({ title: '上传中...' })
|
||||
try {
|
||||
await uploadCameraPhotos(
|
||||
shots.value.map((s, i) => ({ sharp: s, blurred: blurredShots.value[i] || '' }))
|
||||
)
|
||||
uni.hideLoading()
|
||||
uni.showToast({
|
||||
title: '已上传',
|
||||
icon: 'success',
|
||||
duration: 1500,
|
||||
})
|
||||
shots.value = []
|
||||
blurredShots.value = []
|
||||
} catch (err) {
|
||||
uni.hideLoading()
|
||||
uni.showToast({
|
||||
title: (err as Error).message || '上传失败',
|
||||
icon: 'none',
|
||||
duration: 2500,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
startCamera()
|
||||
})
|
||||
@@ -145,5 +189,9 @@ export function useCamera(videoId: string, blur?: BlurConfig) {
|
||||
takePhoto,
|
||||
retake,
|
||||
confirm,
|
||||
shots,
|
||||
addShot,
|
||||
removeShot,
|
||||
submitAll,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user