update
This commit is contained in:
@@ -1,12 +1,17 @@
|
||||
<script setup>
|
||||
import {onMounted} from "vue";
|
||||
import {toPath} from "./utils/index.js";
|
||||
import {useSystemStore} from "./pinia/SystemStore/index.js";
|
||||
import {toPath} from "./utils/index.js";
|
||||
|
||||
const SystemStore = useSystemStore();
|
||||
|
||||
onMounted(() => {
|
||||
const isRoot = SystemStore.isRoot;
|
||||
SystemStore.clearRouter().then(() => {
|
||||
SystemStore.setRouter(isRoot).then(() => {
|
||||
toPath(SystemStore.NOW_ROUTER, SystemStore.NOW_ROUTER_QUERY);
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -351,6 +351,20 @@ const admin = {
|
||||
data: {id}
|
||||
});
|
||||
},
|
||||
setTaskTop: async (id, type) => {
|
||||
return request({
|
||||
url: '/admin/task/setTaskTop',
|
||||
method: Method.POST,
|
||||
data: {id, type}
|
||||
});
|
||||
},
|
||||
setTaskWeigh: async (data) => {
|
||||
return request({
|
||||
url: '/admin/task/setTaskWeigh',
|
||||
method: Method.POST,
|
||||
data: data
|
||||
});
|
||||
},
|
||||
setNotcieWeigh: async (data) => {
|
||||
return request({
|
||||
url: '/admin/notice/weigh',
|
||||
@@ -672,6 +686,34 @@ const admin = {
|
||||
data: data,
|
||||
});
|
||||
},
|
||||
getTaskOrderList: async (data) => {
|
||||
return request({
|
||||
url: '/admin/Task/getTaskOrderList',
|
||||
method: Method.POST,
|
||||
data: data,
|
||||
});
|
||||
},
|
||||
getComplaintList: async (data) => {
|
||||
return request({
|
||||
url: '/admin/complaint/getList',
|
||||
method: Method.POST,
|
||||
data: data,
|
||||
});
|
||||
},
|
||||
editComplaintStatus: async (data) => {
|
||||
return request({
|
||||
url: '/admin/complaint/editStatus',
|
||||
method: Method.POST,
|
||||
data: data,
|
||||
});
|
||||
},
|
||||
overview: async (data) => {
|
||||
return request({
|
||||
url: '/admin/withdrawal/overview',
|
||||
method: Method.POST,
|
||||
data: data,
|
||||
});
|
||||
},
|
||||
}
|
||||
|
||||
export default admin;
|
||||
|
||||
@@ -554,6 +554,13 @@ const merchant = {
|
||||
data: {id}
|
||||
});
|
||||
},
|
||||
getEffectLog: async (data) => {
|
||||
return request({
|
||||
url: '/index/business/getEffectLog',
|
||||
method: Method.POST,
|
||||
data: data
|
||||
});
|
||||
},
|
||||
}
|
||||
|
||||
export default merchant;
|
||||
|
||||
@@ -24,8 +24,14 @@ const menuItemClick = (e) => {
|
||||
<icon-apps></icon-apps>
|
||||
</template>
|
||||
<template #title>{{ item.title }}</template>
|
||||
<a-menu-item v-for="k in item.children.filter(v=>!v.meta.hidden)" :key="`/${item.path}/${k.path}`">
|
||||
<a-menu-item v-for="k in item.children.filter(v=>!v.meta.hidden)"
|
||||
:key="`/${item.path}/${k.path}`">
|
||||
<a-badge v-if="k.meta?.num>0" :count="k.meta.num" :offset="[20,5]">
|
||||
{{ k.title }}
|
||||
</a-badge>
|
||||
<template v-else>
|
||||
{{ k.title }}
|
||||
</template>
|
||||
</a-menu-item>
|
||||
</a-sub-menu>
|
||||
</template>
|
||||
@@ -34,7 +40,12 @@ const menuItemClick = (e) => {
|
||||
<template #icon>
|
||||
<icon-apps></icon-apps>
|
||||
</template>
|
||||
<a-badge v-if="item.meta?.num>0" :count="item.meta.num" :offset="[20,5]">
|
||||
{{ item.title }}
|
||||
</a-badge>
|
||||
<template v-else>
|
||||
{{ item.title }}
|
||||
</template>
|
||||
</a-menu-item>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
@@ -4,6 +4,7 @@ import {reactive, ref, watch} from 'vue';
|
||||
import Api from "../../api/index.ts";
|
||||
import {Message} from "@arco-design/web-vue";
|
||||
import Comment from "../Comment/index.vue";
|
||||
import Talk from "../Talk/index.vue";
|
||||
|
||||
const emits = defineEmits(['success']);
|
||||
const {id} = defineProps({
|
||||
@@ -57,31 +58,26 @@ const refuseTaskChildren = async () => {
|
||||
<a-form
|
||||
layout="vertical">
|
||||
<a-form-item label="标题">
|
||||
<a-input :model-value="item.title"></a-input>
|
||||
<a-input v-model:model-value="item.title" :disabled="detail.check_status !== 0"></a-input>
|
||||
</a-form-item>
|
||||
<a-form-item label="正文">
|
||||
<a-textarea
|
||||
auto-size
|
||||
:max-length="1000"
|
||||
show-word-limit
|
||||
:disabled="detail.check_status !== 0"
|
||||
:model-value="item.content">
|
||||
</a-textarea>
|
||||
</a-form-item>
|
||||
<a-form-item label="话题">
|
||||
<div v-if="item.tags_arr.length > 0" id="tag-list"
|
||||
class="w-full bg-[var(--color-neutral-2)] p-[4px]">
|
||||
<a-tag v-for="v in item.tags_arr">#{{ v }}</a-tag>
|
||||
</div>
|
||||
<div v-else>
|
||||
暂无话题
|
||||
</div>
|
||||
<Talk v-model:model-value="item.tags_arr" :disabled="detail.check_status !== 0"></Talk>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item label="素材">
|
||||
<div v-if="item.materia_arr.length > 0" class="flex flex-wrap gap-[16px]">
|
||||
<x-image
|
||||
v-for="(v, index) in item.materia_arr"
|
||||
:hide-delete="true"
|
||||
:hide-delete="detail.check_status !== 0"
|
||||
:key="index"
|
||||
width="60px"
|
||||
height="60px"
|
||||
@@ -89,17 +85,14 @@ const refuseTaskChildren = async () => {
|
||||
</x-image>
|
||||
</div>
|
||||
<div v-else>
|
||||
暂无话题
|
||||
暂无素材
|
||||
</div>
|
||||
</a-form-item>
|
||||
|
||||
<a-form-item label="评论区内容">
|
||||
<div v-if="item.comment.length > 0" class="flex flex-col gap-[8px] w-full">
|
||||
<div v-if="item?.comment?.length > 0" class="flex flex-col gap-[8px] w-full">
|
||||
<comment :data="item.comment" :hide-delete="true"></comment>
|
||||
</div>
|
||||
<div v-else>
|
||||
暂无评论区内容
|
||||
</div>
|
||||
</a-form-item>
|
||||
</a-form>
|
||||
</a-tab-pane>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<script setup>
|
||||
const {list, size} = defineProps({
|
||||
import {ref} from "vue";
|
||||
|
||||
const {list, size, preview} = defineProps({
|
||||
list: {
|
||||
type: Array,
|
||||
default: []
|
||||
@@ -7,17 +9,27 @@ const {list, size} = defineProps({
|
||||
size: {
|
||||
type: String,
|
||||
default: "40px"
|
||||
},
|
||||
preview: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
}
|
||||
});
|
||||
const previewVisible = ref(false);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="x-image-small-list">
|
||||
<a-image :width="size" :height="size" :src="list[0]" v-bind="$attrs"></a-image>
|
||||
<div class="x-image-small-list-mask" v-if="list.length > 1">
|
||||
<div class="x-image-small-list-mask cursor-pointer" v-if="list.length > 1"
|
||||
@click="preview?previewVisible=true:null">
|
||||
+{{ list.length - 1 }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<a-image-preview-group v-model:visible="previewVisible">
|
||||
<a-image :width="size" :height="size" v-for="v in list" :src="v" v-bind="$attrs" v-show="false"></a-image>
|
||||
</a-image-preview-group>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
73
src/components/XSelect/XTagSelect.vue
Normal file
73
src/components/XSelect/XTagSelect.vue
Normal file
@@ -0,0 +1,73 @@
|
||||
<script setup>
|
||||
import {onMounted, reactive} from "vue";
|
||||
|
||||
const emits = defineEmits(['change']);
|
||||
const modelValue = defineModel();
|
||||
const {api, fieldName, apiPo, init, defaultValue} = defineProps({
|
||||
api: {
|
||||
type: Function,
|
||||
default: async () => {
|
||||
},
|
||||
required: true,
|
||||
},
|
||||
apiPo: {
|
||||
type: Object,
|
||||
default: {}
|
||||
},
|
||||
fieldName: {
|
||||
type: Object,
|
||||
default: {value: 'id', label: 'name'},
|
||||
},
|
||||
init: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
defaultValue: {
|
||||
type: Number,
|
||||
default: null,
|
||||
},
|
||||
});
|
||||
const list = reactive([]);
|
||||
|
||||
const popupChange = async (visible) => {
|
||||
if (visible) {
|
||||
api && api(apiPo).then(({data}) => {
|
||||
list.length = 0;
|
||||
list.push(...data);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
if (init) api && api(apiPo).then(({data}) => {
|
||||
list.length = 0;
|
||||
list.push(...data);
|
||||
});
|
||||
});
|
||||
|
||||
const handleSelect = (id) => {
|
||||
modelValue.value = id;
|
||||
emits('change');
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<a-dropdown @select="handleSelect">
|
||||
<a-tag v-bind="$attrs" :color="list.find(v => v.id === modelValue)?.color">
|
||||
<div class="flex gap-[6px] items-center justify-center cursor-pointer">
|
||||
<div v-if="modelValue===null">请选择</div>
|
||||
<div v-else>{{ list.find(v => v.id === modelValue)?.name }}</div>
|
||||
<icon-down/>
|
||||
</div>
|
||||
</a-tag>
|
||||
<template v-slot:content>
|
||||
<a-doption v-for="v in list" :key="v.id" :value="v.id">
|
||||
{{ v.name }}
|
||||
</a-doption>
|
||||
</template>
|
||||
</a-dropdown>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
</style>
|
||||
@@ -23,8 +23,8 @@ const status = computed({
|
||||
},
|
||||
})
|
||||
|
||||
const change = async () => {
|
||||
const {msg} = await api(id);
|
||||
const change = async (e) => {
|
||||
const {msg} = await api(id, Number(e));
|
||||
Message.success(msg);
|
||||
emits('change');
|
||||
}
|
||||
|
||||
@@ -1,30 +1,75 @@
|
||||
<script setup>
|
||||
import {onMounted, reactive} from "vue";
|
||||
import Api from "../../../../api/index.js";
|
||||
|
||||
const RADIO_LIST = [
|
||||
{
|
||||
label: '累计',
|
||||
value: 1,
|
||||
value: 0,
|
||||
},
|
||||
{
|
||||
label: '今日',
|
||||
value: 2,
|
||||
value: 1,
|
||||
},
|
||||
{
|
||||
label: '昨日',
|
||||
value: 3,
|
||||
value: 2,
|
||||
},
|
||||
{
|
||||
label: '本周',
|
||||
value: 4,
|
||||
value: 3,
|
||||
},
|
||||
{
|
||||
label: '本月',
|
||||
value: 5,
|
||||
value: 4,
|
||||
},
|
||||
{
|
||||
label: '自定义',
|
||||
value: 6,
|
||||
value: 5,
|
||||
},
|
||||
];
|
||||
|
||||
const po = reactive({
|
||||
type: 0,
|
||||
start_time: null,
|
||||
end_time: null,
|
||||
});
|
||||
const data = reactive({
|
||||
b_withdrawl_all: 0,
|
||||
b_withdrawl_all2: 0,
|
||||
b_withdrawl_real: 0,
|
||||
u_withdrawl_all2: 0,
|
||||
server: 0,
|
||||
cha: 0,
|
||||
complete_money: 0,
|
||||
b_withdrawl_success: 0,
|
||||
business: 0,
|
||||
compute1: 0,
|
||||
compute2: 0,
|
||||
recharge: 0,
|
||||
task: 0,
|
||||
u_task: 0,
|
||||
u_income_activity: 0,
|
||||
u_income_team: 0,
|
||||
u_withdrawl_all: 0,
|
||||
u_withdrawl_real: 0,
|
||||
u_withdrawl_success: 0,
|
||||
user: 0
|
||||
});
|
||||
const overview = async () => {
|
||||
const {data: _data} = await Api.admin.overview(po);
|
||||
Object.assign(data, _data);
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
overview();
|
||||
})
|
||||
|
||||
const handleDate = (e) => {
|
||||
po.start_time = e[0];
|
||||
po.end_time = e[1];
|
||||
overview();
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -35,8 +80,8 @@ const RADIO_LIST = [
|
||||
资金概览
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a-radio-group type="button">
|
||||
<div class="flex gap-[24px]">
|
||||
<a-radio-group type="button" v-model:model-value="po.type" @change="overview">
|
||||
<a-radio
|
||||
v-for="item in RADIO_LIST"
|
||||
:key="item.value"
|
||||
@@ -44,6 +89,10 @@ const RADIO_LIST = [
|
||||
{{ item.label }}
|
||||
</a-radio>
|
||||
</a-radio-group>
|
||||
<a-range-picker
|
||||
v-if="po.type === 5"
|
||||
@change="handleDate"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -51,7 +100,7 @@ const RADIO_LIST = [
|
||||
<div
|
||||
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
|
||||
<a-statistic
|
||||
:value="8.06"
|
||||
:value="data.recharge"
|
||||
:precision="2"
|
||||
:value-from="0"
|
||||
animation>
|
||||
@@ -63,7 +112,7 @@ const RADIO_LIST = [
|
||||
<div
|
||||
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
|
||||
<a-statistic
|
||||
:value="8.06"
|
||||
:value="data.task"
|
||||
:precision="2"
|
||||
:value-from="0"
|
||||
animation>
|
||||
@@ -75,7 +124,7 @@ const RADIO_LIST = [
|
||||
<div
|
||||
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
|
||||
<a-statistic
|
||||
:value="8.06"
|
||||
:value="data.business"
|
||||
:precision="2"
|
||||
:value-from="0"
|
||||
animation>
|
||||
@@ -87,7 +136,7 @@ const RADIO_LIST = [
|
||||
<div
|
||||
class="bg-[rgb(var(--arcoblue-1))] hover:bg-[rgb(var(--arcoblue-5))] duration-500 p-[20px] statistic-item">
|
||||
<a-statistic
|
||||
:value="8.06"
|
||||
:value="data.user"
|
||||
:precision="2"
|
||||
:value-from="0"
|
||||
animation>
|
||||
@@ -98,7 +147,7 @@ const RADIO_LIST = [
|
||||
</div>
|
||||
<div class="bg-[rgb(var(--orange-1))] hover:bg-[rgb(var(--orange-5))] duration-500 p-[20px] statistic-item">
|
||||
<a-statistic
|
||||
:value="8.06"
|
||||
:value="data.compute1"
|
||||
:precision="2"
|
||||
:value-from="0"
|
||||
animation>
|
||||
@@ -109,7 +158,7 @@ const RADIO_LIST = [
|
||||
</div>
|
||||
<div class="bg-[rgb(var(--orange-1))] hover:bg-[rgb(var(--orange-5))] duration-500 p-[20px] statistic-item">
|
||||
<a-statistic
|
||||
:value="8.06"
|
||||
:value="data.compute2"
|
||||
:precision="2"
|
||||
:value-from="0"
|
||||
animation>
|
||||
@@ -134,7 +183,7 @@ const RADIO_LIST = [
|
||||
:value-from="0"
|
||||
animation>
|
||||
<template #title>
|
||||
商家充值(含服务款)
|
||||
商户1剩余
|
||||
</template>
|
||||
</a-statistic>
|
||||
</div>
|
||||
@@ -145,7 +194,7 @@ const RADIO_LIST = [
|
||||
:value-from="0"
|
||||
animation>
|
||||
<template #title>
|
||||
商家充值(含服务款)
|
||||
商户2剩余
|
||||
</template>
|
||||
</a-statistic>
|
||||
</div>
|
||||
@@ -163,19 +212,19 @@ const RADIO_LIST = [
|
||||
<template #label>
|
||||
<div class="label">任务款已消耗</div>
|
||||
</template>
|
||||
<div class="value">60.00</div>
|
||||
<div class="value">{{ data.complete_money.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">任务服务费盈利</div>
|
||||
</template>
|
||||
<div class="value">6.00</div>
|
||||
<div class="value">{{ data.server.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">任务差额盈利</div>
|
||||
</template>
|
||||
<div class="value">30.00</div>
|
||||
<div class="value">{{ data.cha.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
</a-descriptions>
|
||||
</div>
|
||||
@@ -189,19 +238,19 @@ const RADIO_LIST = [
|
||||
<template #label>
|
||||
<div class="label">商家发起提现</div>
|
||||
</template>
|
||||
<div class="value">60.00</div>
|
||||
<div class="value">{{ data.b_withdrawl_all.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">商家提现手续费</div>
|
||||
</template>
|
||||
<div class="value">6.00</div>
|
||||
<div class="value">{{ data.b_withdrawl_all2.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">商家提现到手</div>
|
||||
</template>
|
||||
<div class="value">30.00</div>
|
||||
<div class="value">{{ data.b_withdrawl_real.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
</a-descriptions>
|
||||
</div>
|
||||
@@ -215,39 +264,39 @@ const RADIO_LIST = [
|
||||
<a-descriptions table-layout="fixed" :column="2">
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">商家发起提现</div>
|
||||
<div class="label">团队激励所得</div>
|
||||
</template>
|
||||
<div class="value">60.00</div>
|
||||
<div class="value">{{ data.u_income_team.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">商家提现手续费</div>
|
||||
<div class="label">达人发起提现</div>
|
||||
</template>
|
||||
<div class="value">6.00</div>
|
||||
<div class="value">{{ data.u_withdrawl_all.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">商家提现到手</div>
|
||||
<div class="label">活动奖励所得</div>
|
||||
</template>
|
||||
<div class="value">30.00</div>
|
||||
<div class="value">{{ data.u_income_activity.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">商家发起提现</div>
|
||||
<div class="label">达人提现手续费</div>
|
||||
</template>
|
||||
<div class="value">60.00</div>
|
||||
<div class="value">{{ data.u_withdrawl_all2.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">商家提现手续费</div>
|
||||
<div class="label">完成任务所得</div>
|
||||
</template>
|
||||
<div class="value">6.00</div>
|
||||
<div class="value">{{ data.u_task.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
<a-descriptions-item>
|
||||
<template #label>
|
||||
<div class="label">商家提现到手</div>
|
||||
<div class="label">达人提现到手</div>
|
||||
</template>
|
||||
<div class="value">30.00</div>
|
||||
<div class="value">{{ data.u_withdrawl_real.toFixed(2) }}</div>
|
||||
</a-descriptions-item>
|
||||
</a-descriptions>
|
||||
</a-card>
|
||||
@@ -261,7 +310,7 @@ const RADIO_LIST = [
|
||||
&:hover {
|
||||
:deep(.arco-statistic) {
|
||||
.arco-statistic-title,
|
||||
.arco-statistic-content>.arco-statistic-value {
|
||||
.arco-statistic-content > .arco-statistic-value {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
@@ -269,7 +318,7 @@ const RADIO_LIST = [
|
||||
|
||||
:deep(.arco-statistic) {
|
||||
.arco-statistic-title,
|
||||
.arco-statistic-content>.arco-statistic-value {
|
||||
.arco-statistic-content > .arco-statistic-value {
|
||||
transition: 500ms;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,44 +3,45 @@ import {reactive} from "vue";
|
||||
import useTableQuery from "../../../../hooks/useTableQuery.js";
|
||||
import Api from "../../../../api/index.js";
|
||||
import SequenceAdjustment from "../../../../components/SequenceAdjustment/index.vue";
|
||||
import XSwitch from "../../../../components/XSwitch/index.vue";
|
||||
|
||||
const columns = [
|
||||
{
|
||||
title: '任务编号',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'code',
|
||||
},
|
||||
{
|
||||
title: '任务名称',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'goods_intro',
|
||||
},
|
||||
{
|
||||
title: '发布渠道',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'platform',
|
||||
},
|
||||
{
|
||||
title: '创建时间',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'createtime',
|
||||
},
|
||||
{
|
||||
title: '子任务数',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'children_num',
|
||||
},
|
||||
{
|
||||
title: '子任务报价',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'children_price',
|
||||
},
|
||||
{
|
||||
title: '商家ID',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'b_uid',
|
||||
},
|
||||
{
|
||||
title: '平台报价',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'real_price',
|
||||
},
|
||||
{
|
||||
title: '是否置顶',
|
||||
dataIndex: 'topUp',
|
||||
slotName: 'topUp',
|
||||
dataIndex: 'is_hot',
|
||||
slotName: 'is_hot',
|
||||
width: 100,
|
||||
align: 'center',
|
||||
},
|
||||
@@ -59,9 +60,9 @@ const vo = reactive({
|
||||
total: 0,
|
||||
});
|
||||
|
||||
const {loading, pagination, initFetchData} = useTableQuery({
|
||||
const {loading, pagination, fetchData} = useTableQuery({
|
||||
parameter: po,
|
||||
api: Api.system.getData,
|
||||
api: Api.admin.getTaskOrderList,
|
||||
callback: (data) => {
|
||||
Object.assign(vo, data);
|
||||
}
|
||||
@@ -79,11 +80,20 @@ const {loading, pagination, initFetchData} = useTableQuery({
|
||||
:data="vo.rows"
|
||||
:columns="columns"
|
||||
class="flex-grow">
|
||||
<template v-slot:topUp>
|
||||
<a-switch></a-switch>
|
||||
<template v-slot:is_hot="{record}">
|
||||
<x-switch
|
||||
v-model:model-value="record.is_hot"
|
||||
:id="record.id"
|
||||
:api="Api.admin.setTaskTop"
|
||||
@change="fetchData">
|
||||
</x-switch>
|
||||
</template>
|
||||
<template v-slot:action>
|
||||
<SequenceAdjustment></SequenceAdjustment>
|
||||
<template v-slot:action="{record}">
|
||||
<SequenceAdjustment
|
||||
:id="record.id"
|
||||
@success="fetchData"
|
||||
:api="Api.admin.setTaskWeigh">
|
||||
</SequenceAdjustment>
|
||||
</template>
|
||||
</a-table>
|
||||
</a-card>
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
<script setup>
|
||||
import {reactive} from "vue";
|
||||
import {reactive, ref} from "vue";
|
||||
import useTableQuery from "../../../../hooks/useTableQuery.js";
|
||||
import Api from "../../../../api/index.js";
|
||||
import XImageSmallList from "../../../../components/XImage/XImageSmallList.vue";
|
||||
import XTagSelect from "../../../../components/XSelect/XTagSelect.vue";
|
||||
import {Message} from "@arco-design/web-vue";
|
||||
|
||||
const columns = [
|
||||
{
|
||||
@@ -11,20 +14,21 @@ const columns = [
|
||||
},
|
||||
{
|
||||
title: '达人ID',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'uid',
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '投诉截图',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'image',
|
||||
slotName: 'image',
|
||||
},
|
||||
{
|
||||
title: '投诉内容',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'intro',
|
||||
},
|
||||
{
|
||||
title: '联系方式',
|
||||
dataIndex: 'key',
|
||||
dataIndex: 'mobile',
|
||||
width: 150,
|
||||
},
|
||||
{
|
||||
@@ -34,7 +38,12 @@ const columns = [
|
||||
width: 120,
|
||||
},
|
||||
];
|
||||
|
||||
const selectedKeys = ref([]);
|
||||
const rowSelection = reactive({
|
||||
type: 'checkbox',
|
||||
showCheckedAll: true,
|
||||
onlyCurrent: false,
|
||||
});
|
||||
const po = reactive({});
|
||||
const vo = reactive({
|
||||
page: '',
|
||||
@@ -42,13 +51,46 @@ const vo = reactive({
|
||||
total: 0,
|
||||
});
|
||||
|
||||
const {loading, pagination, initFetchData} = useTableQuery({
|
||||
const {loading, pagination, initFetchData, fetchData} = useTableQuery({
|
||||
parameter: po,
|
||||
api: Api.system.getData,
|
||||
api: Api.admin.getComplaintList,
|
||||
callback: (data) => {
|
||||
Object.assign(vo, data);
|
||||
}
|
||||
});
|
||||
|
||||
const getActionList = () => Promise.resolve({
|
||||
data: [
|
||||
{
|
||||
id: 0,
|
||||
name: '待处理',
|
||||
color: 'cyan',
|
||||
},
|
||||
{
|
||||
id: 1,
|
||||
name: '已处理',
|
||||
color: 'green',
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
const changeStatus = async (item) => {
|
||||
const {msg} = await Api.admin.editComplaintStatus({
|
||||
ids: [item.id],
|
||||
status: item.status,
|
||||
});
|
||||
Message.success(msg);
|
||||
await fetchData();
|
||||
}
|
||||
|
||||
const handleStatus = async (status) => {
|
||||
const {msg} = await Api.admin.editComplaintStatus({
|
||||
ids: selectedKeys.value,
|
||||
status: status,
|
||||
});
|
||||
Message.success(msg);
|
||||
await fetchData();
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -59,29 +101,41 @@ const {loading, pagination, initFetchData} = useTableQuery({
|
||||
</div>
|
||||
|
||||
<div class="flex gap-[16px] mb-[16px]">
|
||||
<a-button type="primary">
|
||||
<a-button type="primary" @click="handleStatus(1)">
|
||||
<template #icon>
|
||||
<icon-check/>
|
||||
</template>
|
||||
批量已处理
|
||||
</a-button>
|
||||
<a-button type="primary">
|
||||
<a-button type="primary" @click="handleStatus(0)">
|
||||
<template #icon>
|
||||
<icon-clock-circle/>
|
||||
</template>
|
||||
批量已处理
|
||||
批量未处理
|
||||
</a-button>
|
||||
</div>
|
||||
|
||||
<a-table
|
||||
:loading="loading"
|
||||
v-model:selectedKeys="selectedKeys"
|
||||
:row-selection="rowSelection"
|
||||
@page-change="(e) => pagination.current = e"
|
||||
:pagination="pagination"
|
||||
:data="vo.rows"
|
||||
:columns="columns"
|
||||
class="flex-grow">
|
||||
<template v-slot:action>
|
||||
|
||||
<template v-slot:image="{record}">
|
||||
<x-image-small-list
|
||||
:list="record.images_arr">
|
||||
</x-image-small-list>
|
||||
</template>
|
||||
<template v-slot:action="{record}">
|
||||
<x-tag-select
|
||||
@change="changeStatus(record)"
|
||||
:api="getActionList"
|
||||
:init="true"
|
||||
v-model:model-value="record.status">
|
||||
</x-tag-select>
|
||||
</template>
|
||||
</a-table>
|
||||
</a-card>
|
||||
|
||||
@@ -132,8 +132,18 @@ const {loading, pagination, initFetchData} = useTableQuery({
|
||||
|
||||
<a-tabs class="pt-[20px]" type="rounded" v-model:active-key="po.status" @change="initFetchData">
|
||||
<a-tab-pane title="待回复" :key="0">
|
||||
<template v-slot:title v-if="vo.count1">
|
||||
<a-badge :count="vo.count1" :offset="[15,-10]">
|
||||
待回复
|
||||
</a-badge>
|
||||
</template>
|
||||
</a-tab-pane>
|
||||
<a-tab-pane title="已完成" :key="1">
|
||||
<template v-slot:title v-if="vo.count2">
|
||||
<a-badge :count="vo.count2" :offset="[15,-10]">
|
||||
已完成
|
||||
</a-badge>
|
||||
</template>
|
||||
</a-tab-pane>
|
||||
</a-tabs>
|
||||
|
||||
@@ -159,7 +169,7 @@ const {loading, pagination, initFetchData} = useTableQuery({
|
||||
<look-backfill-modal></look-backfill-modal>
|
||||
</template>
|
||||
<template v-slot:drfk="{record}">
|
||||
<a-badge :count="9" dot :dotStyle="{ width: '10px', height: '10px' }">
|
||||
<a-badge :count="record.is_read" dot :dotStyle="{ width: '10px', height: '10px' }">
|
||||
<a-link :hoverable="false" @click="async () => {
|
||||
state.showChat = true;
|
||||
const {data} = await Api.merchant.getChildrenInfo(record.id);
|
||||
@@ -183,6 +193,12 @@ const {loading, pagination, initFetchData} = useTableQuery({
|
||||
</Chat>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
<style lang="scss">
|
||||
.arco-tabs-nav {
|
||||
overflow: visible;
|
||||
|
||||
.arco-tabs-nav-tab {
|
||||
overflow: visible;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -6,23 +6,23 @@ import Api from "../../../../api/index.js";
|
||||
const columns = [
|
||||
{
|
||||
title: '处理ID',
|
||||
dataIndex: 'value'
|
||||
dataIndex: 'code'
|
||||
},
|
||||
{
|
||||
title: '处理时间',
|
||||
dataIndex: 'value'
|
||||
dataIndex: 'complete_time'
|
||||
},
|
||||
{
|
||||
title: '处理结果',
|
||||
dataIndex: 'value'
|
||||
dataIndex: 'remark'
|
||||
},
|
||||
{
|
||||
title: '处理原因',
|
||||
dataIndex: 'value'
|
||||
dataIndex: 'intro'
|
||||
},
|
||||
{
|
||||
title: '申诉状态',
|
||||
dataIndex: 'value'
|
||||
dataIndex: 'status_text'
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
@@ -43,10 +43,9 @@ const po = reactive({
|
||||
|
||||
const {loading, pagination, fetchData} = useTableQuery({
|
||||
parameter: po,
|
||||
api: Api.system.getData,
|
||||
api: Api.merchant.getEffectLog,
|
||||
callback: (data) => {
|
||||
Object.assign(vo, data);
|
||||
console.log(vo);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -91,7 +91,8 @@ onMounted(() => {
|
||||
end_time: dayjs(v.end_time * 1000).format('YYYY-MM-DD HH:mm:ss'),
|
||||
}));
|
||||
form.settltment_before = data.before.map(v => ({...v, ratio: Number(v.ratio)}));
|
||||
form.settlement_after = data.settlement_after.map(v => Number(v));
|
||||
form.settlement_after = data.settlement_after?.map(v => Number(v));
|
||||
form.special_images = data.special_images_arr;
|
||||
});
|
||||
})
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@ export const useSystemStore = defineStore("SystemStore", () => {
|
||||
|
||||
const setRouter = async (_isRoot) => {
|
||||
isRoot.value = _isRoot;
|
||||
console.log('我看看啥权限', _isRoot);
|
||||
|
||||
RoutesTemp.value.length = 0;
|
||||
|
||||
|
||||
@@ -15,8 +15,6 @@ router.beforeEach((to, from, next) => {
|
||||
if (!isLogin && !to.path.includes('loginSYS')) {
|
||||
next({path: '/loginSYS'});
|
||||
} else {
|
||||
SystemStore.NOW_ROUTER = to.path;
|
||||
Object.assign(SystemStore.NOW_ROUTER_QUERY, to.query);
|
||||
next();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
import router from "../router/index.js";
|
||||
import {useSystemStore} from "../pinia/SystemStore/index.js";
|
||||
|
||||
export const toPath = (path, query = {}) => {
|
||||
router.push({
|
||||
path: path, query: query
|
||||
}).then();
|
||||
}).then(() => {
|
||||
const SystemStore = useSystemStore();
|
||||
SystemStore.NOW_ROUTER = path;
|
||||
Object.assign(SystemStore.NOW_ROUTER_QUERY, query);
|
||||
});
|
||||
}
|
||||
|
||||
export const VITE_TINYMCE_KEY = () => {
|
||||
|
||||
Reference in New Issue
Block a user