lrj
3 天以前 7ba080d35812e6db7bd5aa8f88161c02653eb6c1
web/src/views/employee/EmployeeForm.vue
@@ -39,14 +39,27 @@
        />
      </el-form-item>
      <el-form-item label="重置密码" prop="password" v-if="isEdit">
        <el-input
          v-model="form.password"
          type="password"
          placeholder="留空则不修改密码"
          maxlength="20"
          show-password
        />
      <el-form-item label="密码" prop="password" v-if="isEdit">
        <div style="display: flex; align-items: center; gap: 10px;">
          <el-input
            v-model="form.password"
            type="password"
            :placeholder="isPasswordModified ? '请输入新密码(6-20位,包含字母和数字)' : '点击重置密码按钮来修改密码'"
            maxlength="20"
            show-password
            :disabled="!isPasswordModified"
            @focus="handlePasswordFocus"
            @input="handlePasswordInput"
            style="flex: 1;"
          />
          <el-button
            type="primary"
            size="small"
            @click="handleResetPassword"
          >
            重置密码
          </el-button>
        </div>
      </el-form-item>
      <el-form-item label="员工角色" prop="roleId">
@@ -115,6 +128,9 @@
const roles = ref<Role[]>([])
const rolesLoading = ref(false)
// 跟踪密码是否被修改
const isPasswordModified = ref(false)
// 计算是否为编辑模式
const isEdit = computed(() => !!props.employee?.id)
@@ -159,13 +175,16 @@
  password: [
    { 
      validator: (rule, value, callback) => {
        if (isEdit.value && !value) {
          // 编辑模式下密码可以为空(不修改)
        // 编辑模式下,如果是占位符密码且未修改,则跳过验证
        if (isEdit.value && value === '••••••••' && !isPasswordModified.value) {
          callback()
        } else if (!value) {
          return
        }
        if (!value || value.trim() === '') {
          callback(new Error('请输入登录密码'))
        } else if (value.length < 6 || value.length > 20) {
          callback(new Error('密码长度应在6-20个字符之间'))
        } else if (!/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d@$!%*?&]{6,}$/.test(value)) {
          callback(new Error('密码至少6个字符,必须包含字母和数字'))
        } else {
          callback()
        }
@@ -192,6 +211,7 @@
  form.password = ''
  form.roleId = ''
  form.description = ''
  isPasswordModified.value = false
  formRef.value?.clearValidate()
}
@@ -202,7 +222,8 @@
    form.id = employee.id
    form.name = employee.name
    form.phone = employee.phone
    form.password = '' // 密码不回显
    form.password = '••••••••' // 编辑时显示占位符密码
    isPasswordModified.value = false // 重置密码修改状态
    form.roleId = employee.roleId
    form.description = employee.description || ''
  } else {
@@ -215,6 +236,27 @@
const handleClose = () => {
  visible.value = false
  resetForm()
}
// 处理密码字段焦点事件
const handlePasswordFocus = () => {
  if (isEdit.value && form.password === '••••••••') {
    form.password = ''
  }
}
// 处理密码输入事件
const handlePasswordInput = (value: string) => {
  if (isEdit.value) {
    isPasswordModified.value = value !== '' && value !== '••••••••'
  }
}
// 处理重置密码
const handleResetPassword = () => {
  form.password = ''
  isPasswordModified.value = true
  ElMessage.success('密码已清空,请输入新密码')
}
// 提交表单
@@ -232,11 +274,15 @@
      id: form.id,
      name: form.name.trim(),
      phone: form.phone.trim(),
      password: form.password || undefined, // 空密码传 undefined
      roleId: form.roleId,
      description: form.description?.trim() || undefined
    }
    // 只有在新建或密码被修改时才包含密码字段
    if (!isEdit.value || isPasswordModified.value) {
      submitData.password = form.password
    }
    await employeeApi.saveEmployee(submitData)
    
    ElMessage.success(isEdit.value ? '员工信息更新成功' : '员工创建成功')