更新
This commit is contained in:
@@ -50,7 +50,26 @@
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="手机号" prop="phone">
|
||||
<template v-if="showPhoneMaskedEdit">
|
||||
<el-input
|
||||
:model-value="
|
||||
phoneRevealUnlocked ? originalPhone || '' : maskPhone(originalPhone || '')
|
||||
"
|
||||
readonly
|
||||
placeholder="点击可查看完整手机号"
|
||||
maxlength="11"
|
||||
class="cursor-pointer phone-mask-toggle"
|
||||
@click="togglePhoneReveal"
|
||||
/>
|
||||
<p
|
||||
v-if="originalPhone && !phoneRevealUnlocked"
|
||||
class="text-xs text-gray-400 mt-1"
|
||||
>
|
||||
当前为脱敏显示,点击输入框可查看完整号码
|
||||
</p>
|
||||
</template>
|
||||
<el-input
|
||||
v-else
|
||||
v-model="formData.phone"
|
||||
placeholder="请输入手机号"
|
||||
maxlength="11"
|
||||
@@ -695,6 +714,12 @@ const visible = ref(false)
|
||||
const formRef = ref()
|
||||
const mode = ref('add')
|
||||
const submitting = ref(false)
|
||||
|
||||
/** 拥有后手机号可正常编辑,失焦不再强制脱敏 */
|
||||
const hasPhonePlainPermission = computed(() => hasPermission(['tcm.diagnosis/phonePlain']))
|
||||
/** 编辑且无明文权限:只读脱敏,点击切换查看完整号 */
|
||||
const showPhoneMaskedEdit = computed(() => mode.value === 'edit' && !hasPhonePlainPermission.value)
|
||||
const phoneRevealUnlocked = ref(false)
|
||||
const activeTab = ref('basic')
|
||||
const drawerTitle = computed(() => (mode.value === 'add' ? '新增诊单' : '编辑诊单'))
|
||||
|
||||
@@ -803,6 +828,11 @@ const maskPhone = (phone: string) => {
|
||||
return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
|
||||
}
|
||||
|
||||
const togglePhoneReveal = () => {
|
||||
if (!originalPhone.value) return
|
||||
phoneRevealUnlocked.value = !phoneRevealUnlocked.value
|
||||
}
|
||||
|
||||
const maskIdCard = (idCard: string) => {
|
||||
if (!idCard) return idCard
|
||||
if (idCard.length === 15) {
|
||||
@@ -813,30 +843,55 @@ const maskIdCard = (idCard: string) => {
|
||||
return idCard
|
||||
}
|
||||
|
||||
// 手机号聚焦 - 显示完整数据
|
||||
// 手机号聚焦 - 显示完整数据(无「明文」权限时仅新增模式在失焦后可再次展开编辑)
|
||||
const handlePhoneFocus = () => {
|
||||
isPhoneFocused.value = true
|
||||
if (originalPhone.value) {
|
||||
if (!originalPhone.value) return
|
||||
if (hasPhonePlainPermission.value) {
|
||||
formData.value.phone = originalPhone.value
|
||||
return
|
||||
}
|
||||
if (mode.value === 'add') {
|
||||
formData.value.phone = originalPhone.value
|
||||
}
|
||||
}
|
||||
|
||||
// 手机号失焦 - 恢复脱敏并验证
|
||||
// 手机号失焦:有明文权限则保持明文并校验;新增且无明文权限时仍脱敏展示
|
||||
const handlePhoneBlur = async () => {
|
||||
isPhoneFocused.value = false
|
||||
|
||||
// 保存原始数据并脱敏显示
|
||||
|
||||
if (hasPhonePlainPermission.value) {
|
||||
if (formData.value.phone && formData.value.phone.length === 11) {
|
||||
originalPhone.value = formData.value.phone
|
||||
if (/^1[3-9]\d{9}$/.test(formData.value.phone)) {
|
||||
try {
|
||||
const result = await checkPhone({
|
||||
phone: formData.value.phone,
|
||||
id: formData.value.id || ''
|
||||
})
|
||||
if (result.exists) {
|
||||
ElMessage.warning(result.message)
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('检查手机号失败:', error)
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (mode.value !== 'add') {
|
||||
return
|
||||
}
|
||||
|
||||
if (formData.value.phone && formData.value.phone.length === 11) {
|
||||
originalPhone.value = formData.value.phone
|
||||
|
||||
// 验证手机号唯一性
|
||||
if (/^1[3-9]\d{9}$/.test(formData.value.phone)) {
|
||||
try {
|
||||
const result = await checkPhone({
|
||||
phone: formData.value.phone,
|
||||
id: formData.value.id || ''
|
||||
})
|
||||
|
||||
if (result.exists) {
|
||||
ElMessage.warning(result.message)
|
||||
}
|
||||
@@ -844,8 +899,6 @@ const handlePhoneBlur = async () => {
|
||||
console.error('检查手机号失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
// 脱敏显示
|
||||
formData.value.phone = maskPhone(formData.value.phone)
|
||||
}
|
||||
}
|
||||
@@ -1026,21 +1079,22 @@ const open = async (type: string, id?: number) => {
|
||||
mode.value = type
|
||||
visible.value = true
|
||||
activeTab.value = 'basic' // 重置到基本信息标签页
|
||||
|
||||
phoneRevealUnlocked.value = false
|
||||
|
||||
// 加载字典数据
|
||||
await getDictOptions()
|
||||
|
||||
|
||||
if (type === 'edit' && id) {
|
||||
const data = await tcmDiagnosisDetail({ id })
|
||||
|
||||
// 保存原始完整数据
|
||||
originalPhone.value = data.phone || ''
|
||||
originalIdCard.value = data.id_card || ''
|
||||
|
||||
// 显示脱敏数据
|
||||
data.phone = maskPhone(data.phone || '')
|
||||
|
||||
// 有「手机号明文」权限:表单中保持完整号码;否则表单内为脱敏(编辑无权限时用只读区+点击展开)
|
||||
data.phone = hasPhonePlainPermission.value ? data.phone || '' : maskPhone(data.phone || '')
|
||||
data.id_card = maskIdCard(data.id_card || '')
|
||||
|
||||
|
||||
formData.value = data
|
||||
const y = data.diabetes_discovery_year
|
||||
formData.value.diabetes_discovery_year =
|
||||
@@ -1069,8 +1123,9 @@ const handleSubmit = async () => {
|
||||
// 如果是新增,保存成功后切换到编辑模式,这样可以添加血糖血压记录
|
||||
if (result && result.id) {
|
||||
mode.value = 'edit'
|
||||
phoneRevealUnlocked.value = false
|
||||
formData.value.id = result.id
|
||||
|
||||
|
||||
// 重新获取详情,确保patient_id等字段正确
|
||||
try {
|
||||
const detail = await tcmDiagnosisDetail({ id: result.id })
|
||||
@@ -1079,9 +1134,10 @@ const handleSubmit = async () => {
|
||||
// 更新原始数据
|
||||
originalPhone.value = detail.phone || ''
|
||||
originalIdCard.value = detail.id_card || ''
|
||||
|
||||
// 显示脱敏数据
|
||||
formData.value.phone = maskPhone(detail.phone || '')
|
||||
|
||||
formData.value.phone = hasPhonePlainPermission.value
|
||||
? detail.phone || ''
|
||||
: maskPhone(detail.phone || '')
|
||||
formData.value.id_card = maskIdCard(detail.id_card || '')
|
||||
} catch (error) {
|
||||
console.error('获取详情失败:', error)
|
||||
@@ -1110,7 +1166,7 @@ const handleOpenPrescription = () => {
|
||||
diagnosis_id: formData.value.id,
|
||||
appointment_id: 0,
|
||||
patient_name: formData.value.patient_name,
|
||||
patient_phone: formData.value.phone,
|
||||
patient_phone: originalPhone.value || formData.value.phone,
|
||||
patient_gender: formData.value.gender,
|
||||
patient_age: formData.value.age,
|
||||
case_record: JSON.parse(JSON.stringify(formData.value))
|
||||
@@ -1182,7 +1238,8 @@ const handleClose = () => {
|
||||
originalIdCard.value = ''
|
||||
isPhoneFocused.value = false
|
||||
isIdCardFocused.value = false
|
||||
|
||||
phoneRevealUnlocked.value = false
|
||||
|
||||
visible.value = false
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user