基于Java spring + vue3 + nuxt构建的内容管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

201 lines
6.7 KiB

<template>
<form
ref="formRef"
:model="form"
:rules="rules"
label-position="top"
class="w-full sm:py-2"
size="large"
status-icon
>
<el-card shadow="hover" v-if="comments" class="hover:border-green-50 hover:border-2 mb-5">
<template #header>
<div class="card-header font-bold text-xl flex justify-between">
<span>评分和评价</span>
<div class="comments">
<el-button @click="onComplaint">投诉</el-button>
<el-button type="primary" @click="onComments">发表评论</el-button>
</div>
</div>
</template>
<template #default>
<template v-if="comments.length > 0">
<div class="w-full">
<div v-for="(item,index) in comments" :key="index"
class="flex flex-col border-b-2 border-gray-200 pb-2 mb-3"
style="border-bottom:1px solid #f3f3f3">
<el-space class="user-info flex items-start" style="align-items:normal">
<div class="avatar">
<el-avatar :src="item.logo"/>
</div>
<div class="nickname flex flex-col">
<el-space class="text-sm text-gray-900">
<span class="font-bold">{{ item.tenantName }}</span>
<el-rate v-model="item.rate" disabled size="small"/>
</el-space>
<span class="text-xs text-gray-400">{{ item.createTime }}</span>
<div class="comments py-2" v-html="item.comments"></div>
<template v-if="item.children" v-for="(sub,index2) in item.children" :key="index2">
<el-space class="text-sm text-gray-900">
<el-avatar :src="sub.logo" size="small"/>
<span class="font-bold">{{ sub.tenantName }}</span>
<span class="text-xs text-gray-400">{{ sub.createTime }}</span>
</el-space>
<div class="comments py-2" v-html="sub.comments"></div>
</template>
</div>
</el-space>
</div>
</div>
<div class="pagination flex justify-center">
<el-pagination background layout="prev, pager, next" size="small" :total="count" @change="onPageChange"/>
</div>
</template>
<template v-else>
暂无用户评论
</template>
</template>
</el-card>
<!-- 发表评论 -->
<el-dialog
v-model="visible"
title="发表评论"
align-center
width="500"
:before-close="() => visible = false"
>
<el-form-item prop="rate">
<el-rate v-model="form.rate" size="large" />
</el-form-item>
<el-form-item prop="comments">
<el-input v-model="form.comments" :rows="5" type="textarea"
placeholder="最多300字,支持 markdown 语法。请认真填写评论内容,以便于帮助作者更好完善插件,如需反馈问题,请到下方插件提问进行提交。"/>
</el-form-item>
<template #footer>
<div class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="submitForm(formRef)">
提交
</el-button>
</div>
</template>
</el-dialog>
<!-- 发起投诉 -->
<el-dialog
v-model="visible2"
title="为什么举报此内容?"
align-center
width="500"
:before-close="() => visible2 = false"
>
<el-checkbox-group v-model="checkList">
<el-checkbox label="与我无关" value="与我无关"/>
<el-checkbox label="文章过时" value="文章过时"/>
<el-checkbox label="标题有误" value="标题有误"/>
<el-checkbox label="图像质量差或视觉缺陷" value="图像质量差或视觉缺陷"/>
<el-checkbox label="垃圾邮件" value="垃圾邮件"/>
<el-checkbox label="成人或违法违规内容" value="成人或违法违规内容"/>
<el-checkbox label="侵犯知识产权" value="侵犯知识产权"/>
</el-checkbox-group>
<div class="py-3">
<el-input v-model="form.comments" :rows="5" type="textarea"
placeholder="在此处输入反馈。请记住不要包含个人信息,如电话号码。"/>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="visible2 = false">取消</el-button>
<el-button type="primary" @click="submitForm(formRef)">
提交
</el-button>
</div>
</template>
</el-dialog>
</form>
</template>
<script setup lang="ts">
import {FullScreen} from '@element-plus/icons-vue'
import type {ApiResult} from "~/api";
import type {FormInstance, FormRules} from "element-plus";
import {useClientRequest} from "~/composables/useClientRequest";
import {reactive, ref} from "vue";
import useFormData from "~/utils/use-form-data";
import type {CompanyComment} from "~/api/system/companyComment/model";
const props = withDefaults(
defineProps<{
title?: string;
companyId?: number;
comments?: CompanyComment[];
count?: number;
}>(),
{}
);
const formRef = ref<FormInstance>()
const visible = ref<boolean>(false);
const visible2 = ref<boolean>(false);
const checkList = ref<string[]>([]);
const loading = ref<boolean>(true)
const emit = defineEmits<{
(e: 'done', page: number): void
}>()
// 配置信息
const {form, resetFields} = useFormData<CompanyComment>({
id: undefined,
parentId: undefined,
userId: undefined,
companyId: undefined,
rate: undefined,
sortNumber: undefined,
comments: undefined,
status: undefined,
});
const rules = reactive<FormRules<any>>({
rate: [
{required: true, message: '请输入评分', trigger: 'blur'},
],
comments: [
{required: true, message: '请输入手机号码', trigger: 'blur'},
{pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur'},
],
})
const onComments = () => {
visible.value = true;
}
const onComplaint = () => {
visible2.value = true;
}
const onPageChange = (page: number) => {
emit('done', page)
}
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
if (form.rate === 0) {
ElMessage.error('还没有评分哦!')
return false;
}
form.companyId = Number(getIdBySpm(5));
useClientRequest<ApiResult<any>>(`/system/company-comment`, {
method: 'POST',
body: form
}).then(res => {
if (res.code == 0) {
ElMessage.success(res.message)
visible.value = false
resetFields();
emit('done',0)
} else {
return ElMessage.error(res.message)
}
})
}
</script>