This commit is contained in:
Your Name
2026-04-21 18:02:27 +08:00
parent a1d2ab4649
commit d899e0fe0a
301 changed files with 1937 additions and 344 deletions
+79 -22
View File
@@ -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
}