<template>
  <!-- 用户管理对话框 -->
  <el-dialog
    v-model="visible"
  :title="!dataForm.userId ? '新增' : '修改'"
  :close-on-click-modal="false"
  >
  <!-- 表单 -->
  <el-form
    ref="dataFormRef"
  :model="dataForm"
  :rules="dataRule"
  label-width="80px"
  @keyup.enter="onSubmit()"
  >
  <!-- 用户头像展示 -->
  <el-form-item
    label="用户头像"
    prop="pic"
  >
  <img
    v-if="dataForm.pic"
  :src="dataForm.pic"
  class="image"
  alt=""
  />
  <div v-else>无</div>                 <!-- 如果没有头像，则显示文本 -->
  </el-form-item>

  <!-- 用户昵称输入框 -->
  <el-form-item
    label="用户昵称"
    prop="nickName"
  >
  <el-input
    v-model="dataForm.nickName"
  :disabled="true"
  placeholder="用户昵称"
  />
  </el-form-item>

  <!-- 状态选择 -->
  <el-form-item
    label="状态"
    prop="status"
  >
  <el-radio-group v-model="dataForm.status"> <!-- 绑定状态值 -->
    <el-radio :label="0">禁用</el-radio>     <!-- 禁用状态 -->
    <el-radio :label="1">正常</el-radio>     <!-- 正常状态 -->
  </el-radio-group>
  </el-form-item>
  </el-form>

  <!-- 对话框底部按钮组 -->
  <template #footer>
      <span class="dialog-footer">
        <el-button @click="visible = false">取消</el-button> <!-- 取消按钮 -->
        <el-button type="primary" @click="onSubmit()">确定</el-button> <!-- 确认按钮 -->
      </span>
  </template>
  </el-dialog>
</template>

<script setup>
import { ref, reactive, nextTick } from 'vue'
import { ElMessage } from 'element-plus' // 导入消息提示组件
import { Debounce } from '@/utils/debounce' // 导入防抖函数

// 定义事件发射器
const emit = defineEmits(['refreshDataList'])

// 控制对话框显示状态的响应式变量
const visible = ref(false)

// 表单数据模型，使用ref定义以使其成为响应式的
const dataForm = ref({
  userId: 0,                                 // 用户ID，默认为0表示新增
  nickName: '',                              // 用户昵称
  pic: '',                                   // 用户头像链接
  status: 1                                  // 状态，默认为1表示正常
})

// 分页配置对象，使用reactive定义以使其成为响应式的
const page = reactive({
  total: 0, // 总页数
  currentPage: 1, // 当前页数
  pageSize: 10 // 每页显示多少条
})

// 表单验证规则，使用对象字面量定义
const dataRule = {
  nickName: [
    { required: true, message: '用户名不能为空', trigger: 'blur' } // 必填项
  ]
}

// 引用表单实例
const dataFormRef = ref(null)

/**
 * 初始化方法，接收可选的用户ID参数
 * @param id 用户ID（可选）
 */
const init = (id) => {
  dataForm.value.userId = id || 0 // 如果提供了id，则设置为编辑模式；否则设置为新增模式
  visible.value = true // 显示对话框
  nextTick(() => {
    dataFormRef.value?.resetFields() // 重置表单数据
  })
  if (dataForm.value.userId) { // 如果是编辑模式，则获取用户详情
    http({
      url: http.adornUrl(`/admin/user/info/${dataForm.value.userId}`), // API端点
      method: 'get',                                                   // 请求方式
      params: http.adornParams()                                       // 请求参数
    }).then(({ data }) => {
      dataForm.value = data // 更新表单数据
    })
  }
}

// 将init方法暴露出去，以便父组件调用
defineExpose({ init })

/**
 * 提交表单方法
 */
const onSubmit = Debounce(() => { // 使用防抖函数防止快速点击多次提交
  dataFormRef.value?.validate((valid) => { // 验证表单
    if (valid) { // 如果表单验证通过
      http({
        url: http.adornUrl('/admin/user'), // API端点
        method: dataForm.value.userId ? 'put' : 'post', // 如果有userId则是编辑操作，否则为新增操作
        data: http.adornData({
          userId: dataForm.value.userId || undefined, // 用户ID，新增时不发送
          nickName: dataForm.value.nickName,          // 用户昵称
          status: dataForm.value.status               // 状态
        })
      }).then(() => {
        ElMessage({
          message: '操作成功',
          type: 'success',
          duration: 1500,
          onClose: () => {
            visible.value = false // 关闭对话框
            emit('refreshDataList', page) // 发射刷新事件通知父组件刷新数据列表，并传递分页信息
          }
        })
      })
    }
  })
})
</script>
