From 3a1539009026fc71de16db0ef72f24d392479d75 Mon Sep 17 00:00:00 2001
From: owen <owen@evolsun.com>
Date: Sat, 26 Aug 2023 13:34:07 +0800
Subject: [PATCH] =?UTF-8?q?=E5=95=86=E5=93=81=E8=AF=84=E8=AE=BA=EF=BC=9A?=
 =?UTF-8?q?=E5=9B=9E=E5=A4=8D=E8=A1=A8=E5=8D=95=E6=8F=90=E5=8F=96=E5=88=B0?=
 =?UTF-8?q?=E5=8D=95=E7=8B=AC=E7=9A=84=E7=BB=84=E4=BB=B6=E4=B8=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../mall/product/comment/CommentForm.vue      |  3 -
 src/views/mall/product/comment/ReplyForm.vue  | 77 +++++++++++++++++++
 src/views/mall/product/comment/index.vue      | 58 ++------------
 3 files changed, 82 insertions(+), 56 deletions(-)
 create mode 100644 src/views/mall/product/comment/ReplyForm.vue

diff --git a/src/views/mall/product/comment/CommentForm.vue b/src/views/mall/product/comment/CommentForm.vue
index 8a60bef1..77557437 100644
--- a/src/views/mall/product/comment/CommentForm.vue
+++ b/src/views/mall/product/comment/CommentForm.vue
@@ -75,7 +75,6 @@ const formData = ref({
   spuId: undefined,
   spuName: undefined,
   skuId: undefined,
-  scores: 5,
   descriptionScores: 5,
   benefitScores: 5,
   content: undefined,
@@ -87,7 +86,6 @@ const formRules = reactive({
   userAvatar: [{ required: true, message: '用户头像不能为空', trigger: 'blur' }],
   userNickname: [{ required: true, message: '用户名称不能为空', trigger: 'blur' }],
   content: [{ required: true, message: '评论内容不能为空', trigger: 'blur' }],
-  scores: [{ required: true, message: '评分星级不能为空', trigger: 'blur' }],
   descriptionScores: [{ required: true, message: '描述星级不能为空', trigger: 'blur' }],
   benefitScores: [{ required: true, message: '服务星级不能为空', trigger: 'blur' }]
 })
@@ -153,7 +151,6 @@ const resetForm = () => {
     userAvatar: undefined,
     spuId: undefined,
     skuId: undefined,
-    scores: 5,
     descriptionScores: 5,
     benefitScores: 5,
     content: undefined,
diff --git a/src/views/mall/product/comment/ReplyForm.vue b/src/views/mall/product/comment/ReplyForm.vue
new file mode 100644
index 00000000..4ce36781
--- /dev/null
+++ b/src/views/mall/product/comment/ReplyForm.vue
@@ -0,0 +1,77 @@
+<template>
+  <Dialog title="回复" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="回复内容" prop="replyContent">
+        <el-input type="textarea" v-model="formData.replyContent" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitReplyForm" type="primary" :disabled="formLoading">确 定 </el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+import * as CommentApi from '@/api/mall/product/comment'
+import { ElInput } from 'element-plus'
+
+defineOptions({ name: 'ProductComment' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formData = ref({
+  id: undefined,
+  replyContent: undefined
+})
+const formRules = reactive({
+  replyContent: [{ required: true, message: '回复内容不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (id?: number) => {
+  resetForm()
+  formData.value.id = id
+  dialogVisible.value = true
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+
+const submitReplyForm = async () => {
+  const valid = await formRef?.value?.validate()
+  if (!valid) return
+
+  formLoading.value = true
+  try {
+    await CommentApi.replyComment(formData.value)
+    message.success(t('common.createSuccess'))
+
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    replyContent: undefined
+  }
+  formRef.value?.resetFields()
+}
+</script>
diff --git a/src/views/mall/product/comment/index.vue b/src/views/mall/product/comment/index.vue
index 7647aff1..4fe65a86 100644
--- a/src/views/mall/product/comment/index.vue
+++ b/src/views/mall/product/comment/index.vue
@@ -60,7 +60,6 @@
   <ContentWrap>
     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="false">
       <el-table-column label="评论编号" align="center" prop="id" min-width="60" />
-      <!-- TODO @疯狂:后端貌似没读取? -->
       <el-table-column label="用户名称" align="center" prop="userNickname" width="80" />
       <el-table-column label="商品信息" align="center" min-width="210">
         <template #default="scope">
@@ -144,33 +143,15 @@
 
   <!-- 表单弹窗:添加/修改 -->
   <CommentForm ref="formRef" @success="getList" />
-
-  <Dialog title="回复" v-model="replyDialog.visible">
-    <el-form
-      ref="replyFormRef"
-      :model="replyDialog.formData"
-      :rules="replyDialog.formRules"
-      label-width="100px"
-      v-loading="replyDialog.loading"
-    >
-      <el-form-item label="回复内容" prop="replyContent">
-        <el-input type="textarea" v-model="replyDialog.formData.replyContent" />
-      </el-form-item>
-    </el-form>
-    <template #footer>
-      <el-button @click="submitReplyForm" type="primary" :disabled="replyDialog.loading"
-        >确 定
-      </el-button>
-      <el-button @click="replyDialog.visible = false">取 消</el-button>
-    </template>
-  </Dialog>
+  <!-- 回复表单弹窗 -->
+  <ReplyForm ref="replyFormRef" @success="getList" />
 </template>
 
 <script setup lang="ts">
 import { dateFormatter } from '@/utils/formatTime'
 import * as CommentApi from '@/api/mall/product/comment'
 import CommentForm from './CommentForm.vue'
-import { ElInput } from 'element-plus'
+import ReplyForm from '@/views/mall/product/comment/ReplyForm.vue'
 
 defineOptions({ name: 'ProductComment' })
 
@@ -242,39 +223,10 @@ const openForm = (type: string, id?: number) => {
   formRef.value.open(type, id)
 }
 
-// TODO @疯狂:要不回复,也搞一个组件出去?
-/** 回复 **/
+/** 回复按钮操作 **/
 const replyFormRef = ref()
-const replyDialog = reactive({
-  visible: false,
-  loading: false,
-  formData: {
-    id: -1,
-    replyContent: ''
-  },
-  formRules: {
-    replyContent: [{ required: true, message: '回复内容不能为空', trigger: 'blur' }]
-  }
-})
 const handleReply = (id: number) => {
-  replyDialog.formData.id = id
-  replyDialog.formData.replyContent = ''
-  replyDialog.visible = true
-}
-const submitReplyForm = async () => {
-  const valid = await replyFormRef?.value?.validate()
-  if (!valid) return
-
-  replyDialog.loading = true
-  try {
-    await CommentApi.replyComment(replyDialog.formData)
-    message.success(t('common.createSuccess'))
-
-    replyDialog.visible = false
-    await getList()
-  } finally {
-    replyDialog.loading = false
-  }
+  replyFormRef.value.open(id)
 }
 
 /** 显示/隐藏 **/