commit
2a2203eed9
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* @Author: ch
|
||||
* @Date: 2022-06-15 17:55:43
|
||||
* @LastEditors: ch
|
||||
* @LastEditTime: 2022-06-24 09:44:44
|
||||
* @Description: file content
|
||||
*/
|
||||
import request from '@/utils/request.js';
|
||||
//获取评论列表
|
||||
export const commentList = (params) =>
|
||||
request({
|
||||
url: '/mall/comment/admin/comment',
|
||||
method: 'get',
|
||||
params,
|
||||
});
|
||||
// 获取评价详情
|
||||
export const commentDetail = ({ id }) =>
|
||||
request({
|
||||
url: `/mall/comment/admin/comment/getCommentDetail/${id}`,
|
||||
method: 'get',
|
||||
});
|
||||
|
||||
//评论
|
||||
export const commentAdd = (data) =>
|
||||
request({
|
||||
url: '/mall/comment/admin/merchantComment',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
// 更新评价显示状态
|
||||
export const updateCommentShow = (data) =>
|
||||
request({
|
||||
url: '/mall/comment/admin/comment',
|
||||
method: 'put',
|
||||
data,
|
||||
});
|
@ -0,0 +1,206 @@
|
||||
import * as api from '@/api/goods/comment.js';
|
||||
import { ElMessage } from 'element-plus/es';
|
||||
const state = {
|
||||
list: [],
|
||||
detail: {
|
||||
id: 18,
|
||||
originId: 0,
|
||||
parentId: 0,
|
||||
userId: 97,
|
||||
userName: 'ocean',
|
||||
commentContent: '用户超时未做出评价,系统默认好评',
|
||||
isShow: false,
|
||||
createTime: '2022-06-17 15:27:09',
|
||||
commentType: 1,
|
||||
userAvatar: 'https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/default-headimg.png',
|
||||
skuName: '测试SKU',
|
||||
productName: '测试虚拟111',
|
||||
phone: '151****5744',
|
||||
pictureUrl: 'https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/uc/account-avatar/120x120.png',
|
||||
commentScore: 5,
|
||||
followComment: {
|
||||
id: 19,
|
||||
originId: 18,
|
||||
parentId: 18,
|
||||
userId: 97,
|
||||
userName: 'ocean',
|
||||
commentContent: '新增一条追评',
|
||||
isShow: true,
|
||||
createTime: '2022-06-17 17:13:32',
|
||||
commentType: 2,
|
||||
},
|
||||
answerCommentList: [
|
||||
{
|
||||
id: 20,
|
||||
originId: 18,
|
||||
parentId: 18,
|
||||
userId: 8,
|
||||
userName: '随机昵称',
|
||||
commentContent: '新增一条回复',
|
||||
isShow: true,
|
||||
createTime: '2022-06-17 17:14:02',
|
||||
commentType: 3,
|
||||
parentUserName: 'ocean',
|
||||
},
|
||||
{
|
||||
id: 21,
|
||||
originId: 18,
|
||||
parentId: 18,
|
||||
userId: 8,
|
||||
userName: '随机昵称',
|
||||
commentContent: '1232321',
|
||||
isShow: true,
|
||||
createTime: '2022-06-17 18:31:48',
|
||||
commentType: 3,
|
||||
parentUserName: 'ocean',
|
||||
},
|
||||
{
|
||||
id: 22,
|
||||
originId: 18,
|
||||
parentId: 18,
|
||||
userId: 8,
|
||||
userName: '随机昵称',
|
||||
commentContent: '我回复我回复我回复我回复我回复',
|
||||
isShow: true,
|
||||
createTime: '2022-06-17 18:32:39',
|
||||
commentType: 3,
|
||||
parentUserName: 'ocean',
|
||||
},
|
||||
{
|
||||
id: 23,
|
||||
originId: 18,
|
||||
parentId: 22,
|
||||
userId: 8,
|
||||
userName: '随机昵称',
|
||||
commentContent: '222222222222',
|
||||
isShow: true,
|
||||
createTime: '2022-06-17 18:34:30',
|
||||
commentType: 3,
|
||||
parentUserName: '随机昵称',
|
||||
},
|
||||
{
|
||||
id: 24,
|
||||
originId: 18,
|
||||
parentId: 18,
|
||||
userId: 8,
|
||||
userName: '随机昵称',
|
||||
commentContent: '直接评论直接评论',
|
||||
isShow: true,
|
||||
createTime: '2022-06-17 18:36:03',
|
||||
commentType: 3,
|
||||
parentUserName: 'ocean',
|
||||
},
|
||||
],
|
||||
},
|
||||
total: 0,
|
||||
opts: {
|
||||
isShow: [
|
||||
{
|
||||
value: true,
|
||||
label: '显示',
|
||||
},
|
||||
{
|
||||
value: false,
|
||||
label: '隐藏',
|
||||
},
|
||||
],
|
||||
score: [
|
||||
{
|
||||
value: 1,
|
||||
label: '1星',
|
||||
},
|
||||
{
|
||||
value: 2,
|
||||
label: '2星',
|
||||
},
|
||||
{
|
||||
value: 3,
|
||||
label: '3星',
|
||||
},
|
||||
{
|
||||
value: 4,
|
||||
label: '4星',
|
||||
},
|
||||
{
|
||||
value: 5,
|
||||
label: '5星',
|
||||
},
|
||||
],
|
||||
commentType: {
|
||||
// 评论
|
||||
comment: 1,
|
||||
// 追评
|
||||
addComment: 2,
|
||||
// 回复
|
||||
reply: 3,
|
||||
},
|
||||
},
|
||||
};
|
||||
const getters = {};
|
||||
const mutations = {
|
||||
setList: (state, data) => (state.list = data),
|
||||
setTotal: (state, data) => (state.total = data),
|
||||
setDetail: (state, data) => (state.detail = data),
|
||||
};
|
||||
const actions = {
|
||||
async search({ state, commit, rootGetters }, params) {
|
||||
let data = { ...params };
|
||||
let pagingCode = params.pagingCode;
|
||||
if (data.dateRange?.length) {
|
||||
data.commentTimeBegin = data.dateRange[0];
|
||||
data.commentTimeEnd = data.dateRange[1];
|
||||
}
|
||||
if (data.scoreList) {
|
||||
data.commentScoreList = data.scoreList.join(',');
|
||||
delete data.scoreList;
|
||||
}
|
||||
delete data.dateRange;
|
||||
delete data.pagingCode;
|
||||
const res = await api.commentList({
|
||||
...rootGetters['local/page'](pagingCode),
|
||||
...data,
|
||||
});
|
||||
if (res) {
|
||||
commit(
|
||||
'setList',
|
||||
res?.records.map((i) => ({
|
||||
...i,
|
||||
scoreName: state.opts.score.find((item) => item.value === i.commentScore)?.label,
|
||||
})) || []
|
||||
);
|
||||
commit('setTotal', res?.total || 0);
|
||||
}
|
||||
},
|
||||
async updateShow({}, params) {
|
||||
const res = await api.updateCommentShow(params);
|
||||
if (!res) {
|
||||
ElMessage.error('状态更新失败!');
|
||||
return Promise.reject('状态更新失败!');
|
||||
}
|
||||
return Promise.resolve(res);
|
||||
},
|
||||
async getDetail({ commit }, id) {
|
||||
const res = await api.commentDetail({ id });
|
||||
if (!res) {
|
||||
ElMessage.error('获取详情失败');
|
||||
return Promise.reject('获取详情失败');
|
||||
}
|
||||
commit('setDetail', res);
|
||||
return Promise.resolve(res);
|
||||
},
|
||||
async add({}, data) {
|
||||
const res = await api.commentAdd(data);
|
||||
if (!res) {
|
||||
ElMessage.error('回复失败');
|
||||
return Promise.reject(false);
|
||||
}
|
||||
return Promise.resolve(res);
|
||||
},
|
||||
};
|
||||
|
||||
export default {
|
||||
state,
|
||||
getters,
|
||||
mutations,
|
||||
actions,
|
||||
};
|
@ -0,0 +1,260 @@
|
||||
<!--
|
||||
* @Author: ch
|
||||
* @Date: 2022-06-15 17:29:32
|
||||
* @LastEditors: ch
|
||||
* @LastEditTime: 2022-06-30 16:14:29
|
||||
* @Description: file content
|
||||
-->
|
||||
<template>
|
||||
<div>
|
||||
<table-list
|
||||
v-loading="loading"
|
||||
:operation="['search']"
|
||||
:code="_pagingCode"
|
||||
:config="config"
|
||||
:data="list"
|
||||
:total="total"
|
||||
@search="handleSearch"
|
||||
:reset="handleReset"
|
||||
>
|
||||
<template #search>
|
||||
<el-form inline>
|
||||
<el-form-item label="商品名称" prop="productName">
|
||||
<el-input v-model="state.condition.productName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="用户昵称">
|
||||
<el-input v-model="state.condition.userName" />
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号" prop="phone">
|
||||
<el-input v-model="state.condition.phone" />
|
||||
</el-form-item>
|
||||
<el-form-item label="评分" prop="name">
|
||||
<el-select v-model="state.condition.scoreList" multiple collapse-tags collapse-tags-tooltip>
|
||||
<el-option
|
||||
v-for="(item, idx) in opts.score"
|
||||
:key="idx"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否显示" prop="name">
|
||||
<el-select v-model="state.condition.isShow">
|
||||
<el-option
|
||||
v-for="(item, idx) in opts.isShow"
|
||||
:key="idx"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="评价时间" prop="dateRange">
|
||||
<el-date-picker
|
||||
v-model="state.condition.dateRange"
|
||||
:default-time="[new Date(0, 0, 0, 0, 0, 0), new Date(0, 0, 0, 23, 59, 59)]"
|
||||
type="datetimerange"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</template>
|
||||
|
||||
<template #operation="{ selection }">
|
||||
<div class="batch-show-hide" v-if="selection.length">
|
||||
<el-select v-model="allShowHideVal">
|
||||
<el-option
|
||||
v-for="(item, idx) in opts.isShow"
|
||||
:key="idx"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
></el-option>
|
||||
</el-select>
|
||||
<el-button type="primary" @click="handleAllShowHide(selection)">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</table-list>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="jsx">
|
||||
import ElButton from '@/components/extra/ElButton.vue';
|
||||
import ElSwitch from '@/components/extra/ElSwitch.vue';
|
||||
const router = useRouter();
|
||||
const store = useStore();
|
||||
const loading = ref(false);
|
||||
// 页面字典表数据
|
||||
const opts = computed(() => store.state.comment.opts);
|
||||
// 表格数据
|
||||
const list = computed(() => _.cloneDeep(store.state.comment.list));
|
||||
const total = computed(() => store.state.comment.total);
|
||||
// 分页code需要使用此code到全局sotre取分页参数
|
||||
const _pagingCode = 'CommentManagement';
|
||||
// 表格查询参数
|
||||
const _condition = {
|
||||
productName: '',
|
||||
userName: '',
|
||||
phone: '',
|
||||
scoreList: [],
|
||||
isShow: '',
|
||||
dateRange: '',
|
||||
};
|
||||
const state = reactive({
|
||||
condition: { ..._condition },
|
||||
});
|
||||
// 批量操作的值
|
||||
const allShowHideVal = ref(true);
|
||||
|
||||
// store.dispatch('comment/search', { pagingCode: _pagingCode });
|
||||
|
||||
/**
|
||||
* 搜索
|
||||
*/
|
||||
const handleSearch = async () => {
|
||||
loading.value = true;
|
||||
await store.dispatch('comment/search', { ...state.condition, pagingCode: _pagingCode });
|
||||
loading.value = false;
|
||||
};
|
||||
onActivated(handleSearch);
|
||||
/**
|
||||
* 重置
|
||||
*/
|
||||
const handleReset = () => {
|
||||
state.condition = { ..._condition };
|
||||
};
|
||||
/**
|
||||
* 单行操作显示隐藏
|
||||
*
|
||||
*/
|
||||
const handleShowHide = async (row) => {
|
||||
loading.value = true;
|
||||
try {
|
||||
await store.dispatch('comment/updateShow', {
|
||||
idList: [row.id],
|
||||
isShow: row.isShow,
|
||||
});
|
||||
} catch (e) {
|
||||
row.isShow = !row.isShow;
|
||||
}
|
||||
loading.value = false;
|
||||
};
|
||||
/**
|
||||
* 批量操作显示隐藏
|
||||
*/
|
||||
const handleAllShowHide = async (selection) => {
|
||||
loading.value = true;
|
||||
let val = allShowHideVal.value;
|
||||
try {
|
||||
await store.dispatch('comment/updateShow', {
|
||||
idList: selection.map((i) => i.id),
|
||||
isShow: val,
|
||||
});
|
||||
} catch (e) {
|
||||
val = !val;
|
||||
}
|
||||
loading.value = false;
|
||||
selection.forEach((item) => {
|
||||
item.isShow = val;
|
||||
});
|
||||
};
|
||||
const handleDetail = (id) => {
|
||||
router.push({
|
||||
name: 'CommentDetail',
|
||||
params: {
|
||||
id: id,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const config = reactive({
|
||||
columns: [
|
||||
{
|
||||
type: 'selection',
|
||||
fixed: 'left',
|
||||
width: 60,
|
||||
},
|
||||
{
|
||||
label: '商品名称',
|
||||
width: 180,
|
||||
align: 'left',
|
||||
slots: {
|
||||
default: ({ row }) => <div class="row-ellipsis">{row.productName}</div>,
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '评价内容',
|
||||
align: 'left',
|
||||
slots: {
|
||||
default: ({ row }) => (
|
||||
<div class="row-ellipsis ctx-link" onClick={() => handleDetail(row.id)}>
|
||||
{row.commentContent}
|
||||
</div>
|
||||
),
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '评分',
|
||||
prop: 'scoreName',
|
||||
width: 70,
|
||||
},
|
||||
{
|
||||
label: '用户',
|
||||
width: 120,
|
||||
slots: {
|
||||
default: ({ row }) => (
|
||||
<div>
|
||||
<p class="row-ellipsis">{row.userName}</p>
|
||||
<p>{row.phone}</p>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '评价时间',
|
||||
prop: 'time',
|
||||
width: 120,
|
||||
slots: {
|
||||
default: ({ row }) => (
|
||||
<div>
|
||||
<p>{row.createTime.split(' ')[0]}</p>
|
||||
<p>{row.createTime.split(' ')[1]}</p>
|
||||
</div>
|
||||
),
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '显示',
|
||||
width: 80,
|
||||
slots: {
|
||||
default: ({ row }) => <ElSwitch v-model={row.isShow} onChange={() => handleShowHide(row)} />,
|
||||
},
|
||||
},
|
||||
{
|
||||
label: '操作',
|
||||
width: 70,
|
||||
slots: {
|
||||
default: ({ row }) => (
|
||||
<ElButton type="text" onClick={() => handleDetail(row.id)}>
|
||||
查看
|
||||
</ElButton>
|
||||
),
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.batch-show-hide {
|
||||
margin-left: 20px;
|
||||
}
|
||||
:deep(.row-ellipsis) {
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
overflow: hidden;
|
||||
}
|
||||
:deep(.ctx-link) {
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
color: var(--el-color-primary);
|
||||
}
|
||||
}
|
||||
</style>
|
Loading…
Reference in new issue