This commit is contained in:
2025-06-10 20:43:07 +08:00
parent 443b164348
commit f16fd016d0
18 changed files with 178 additions and 87 deletions

View File

@@ -456,6 +456,34 @@ const merchant = {
data: data data: data
}); });
}, },
getTaskBlock: async (data) => {
return request({
url: '/index/task/getTaskBlock',
method: Method.POST,
data: data
});
},
cancelTaskBlock: async (data) => {
return request({
url: '/index/task/cancelTaskBlock',
method: Method.POST,
data: data
});
},
getTaskEffect: async (data) => {
return request({
url: '/index/task/getTaskEffect',
method: Method.POST,
data: data
});
},
cancelTaskEffect: async (data) => {
return request({
url: '/index/task/cancelTaskEffect',
method: Method.POST,
data: data
});
},
} }
export default merchant; export default merchant;

View File

@@ -7,6 +7,10 @@ const input = ref('');
const changeInput = (e) => { const changeInput = (e) => {
if (e.match(/#(\S+?)(?=\s)/g)) { if (e.match(/#(\S+?)(?=\s)/g)) {
if (modelValue.value === void 0) {
console.log('进来了')
}
console.log(modelValue.value)
modelValue.value.push(...e.match(/#(\S+?)(?=\s)/g).map(tag => tag.slice(1))); modelValue.value.push(...e.match(/#(\S+?)(?=\s)/g).map(tag => tag.slice(1)));
input.value = null; input.value = null;
nextTick(() => { nextTick(() => {

View File

@@ -1,6 +1,7 @@
<script setup> <script setup>
import {onMounted, reactive} from "vue"; import {onMounted, reactive} from "vue";
const emits = defineEmits(['change']);
const {api, fieldName, apiPo, init, defaultValue} = defineProps({ const {api, fieldName, apiPo, init, defaultValue} = defineProps({
api: { api: {
type: Function, type: Function,
@@ -50,6 +51,7 @@ onMounted(() => {
:options="list" :options="list"
:field-names="fieldName" :field-names="fieldName"
:default-value="defaultValue" :default-value="defaultValue"
@change="emits('change')"
@popup-visible-change="popupChange" @popup-visible-change="popupChange"
placeholder="请选择"> placeholder="请选择">
</a-select> </a-select>

View File

@@ -2,7 +2,7 @@
import XImage from "../XImage/Index.vue"; import XImage from "../XImage/Index.vue";
import Api from "../../api/index.js"; import Api from "../../api/index.js";
const {size, api, multiple} = defineProps({ const {size, api, multiple, placeholder} = defineProps({
size: { size: {
type: String, type: String,
default: '60px' default: '60px'
@@ -14,6 +14,10 @@ const {size, api, multiple} = defineProps({
multiple: { multiple: {
type: Boolean, type: Boolean,
default: true, default: true,
},
placeholder: {
type: String,
default: '上传'
} }
}); });
const files = defineModel('files'); const files = defineModel('files');
@@ -40,7 +44,7 @@ const beforeUpload = (file) => {
<template #upload-button> <template #upload-button>
<div class="upload-button test"> <div class="upload-button test">
<IconPlus/> <IconPlus/>
上传 {{ placeholder }}
</div> </div>
</template> </template>
</a-upload> </a-upload>

View File

@@ -5,6 +5,7 @@ import {Message} from "@arco-design/web-vue";
const visible = ref(false); const visible = ref(false);
const detail = reactive({}); const detail = reactive({});
const emits = defineEmits(['success']);
const {id, money} = defineProps({ const {id, money} = defineProps({
id: { id: {
type: Number, type: Number,
@@ -39,6 +40,7 @@ const success = async () => {
money: money, money: money,
}); });
Message.success(msg); Message.success(msg);
emits('success');
} }
</script> </script>

View File

@@ -2,43 +2,44 @@
import useTableQuery from "../../../../hooks/useTableQuery.js"; import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js"; import Api from "../../../../api/index.js";
import {reactive} from "vue"; import {reactive} from "vue";
import {Message} from "@arco-design/web-vue";
const columns = [ const columns = [
{ {
title: 'ID', title: 'ID',
dataIndex: 'key', dataIndex: 'id',
}, },
{ {
title: '渠道', title: '渠道',
dataIndex: 'key', dataIndex: 'platform',
}, },
{ {
title: '已拉黑达人', title: '已拉黑达人',
dataIndex: 'key', dataIndex: 'uid',
}, },
{ {
title: '拉黑原因', title: '拉黑原因',
dataIndex: 'key', dataIndex: 'remark',
}, },
{ {
title: '拉黑效果', title: '拉黑效果',
dataIndex: 'key', dataIndex: 'type_text',
}, },
{ {
title: '拉黑开始日期', title: '拉黑开始日期',
dataIndex: 'key', dataIndex: 'createtime',
}, },
{ {
title: '拉黑结束日期', title: '拉黑结束日期',
dataIndex: 'key', dataIndex: 'endtime',
}, },
{ {
title: '关联任务ID', title: '关联任务ID',
dataIndex: 'key', dataIndex: 'task_id',
}, },
{ {
title: '关联子任务ID', title: '关联子任务ID',
dataIndex: 'key', dataIndex: 'task_children_id',
}, },
{ {
title: '操作', title: '操作',
@@ -57,14 +58,20 @@ const po = reactive({
wd: null, wd: null,
}); });
const {loading, pagination, initFetchData} = useTableQuery({ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po, parameter: po,
api: Api.system.getData, api: Api.merchant.getTaskBlock,
callback: (data) => { callback: (data) => {
Object.assign(vo, data); Object.assign(vo, data);
console.log(vo); console.log(vo);
} }
}); });
const cancelTaskBlock = async (id) => {
const {msg} = await Api.merchant.cancelTaskBlock({id: id});
Message.success(msg);
await fetchData();
}
</script> </script>
<template> <template>
@@ -86,8 +93,11 @@ const {loading, pagination, initFetchData} = useTableQuery({
:pagination="pagination" :pagination="pagination"
:loading="loading" :loading="loading"
:columns="columns"> :columns="columns">
<template v-slot:action> <template v-slot:action="{record}">
<a-popconfirm content="确定取消吗?" @ok="cancelTaskBlock(record.id)" v-if="record.is_cancel !== 1">
<a-link :hoverable="false" :disabled="false">取消拉黑</a-link> <a-link :hoverable="false" :disabled="false">取消拉黑</a-link>
</a-popconfirm>
<a-link :hoverable="false" :disabled="true" v-else>已取消</a-link>
</template> </template>
</a-table> </a-table>
</div> </div>

View File

@@ -3,23 +3,24 @@ import OriginTag from "../../../../components/OriginTag/index.vue";
import useTableQuery from "../../../../hooks/useTableQuery.js"; import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js"; import Api from "../../../../api/index.js";
import {reactive} from "vue"; import {reactive} from "vue";
import {Message} from "@arco-design/web-vue";
const columns = [ const columns = [
{ {
title: 'ID', title: 'ID',
dataIndex: 'key', dataIndex: 'id',
}, },
{ {
title: '达人', title: '达人',
dataIndex: 'key', dataIndex: 'uid',
}, },
{ {
title: '处罚理由', title: '处罚理由',
dataIndex: 'key', dataIndex: 'intro',
}, },
{ {
title: '处罚结果', title: '处罚结果',
dataIndex: 'key', dataIndex: 'remark',
}, },
{ {
title: '进度', title: '进度',
@@ -28,15 +29,15 @@ const columns = [
}, },
{ {
title: '提交日期', title: '提交日期',
dataIndex: 'key', dataIndex: 'createtime',
}, },
{ {
title: '关联任务ID', title: '关联任务ID',
dataIndex: 'key', dataIndex: 'task_id',
}, },
{ {
title: '关联子任务ID', title: '关联子任务ID',
dataIndex: 'key', dataIndex: 'task_children_id',
}, },
{ {
title: '操作', title: '操作',
@@ -55,14 +56,20 @@ const po = reactive({
wd: null, wd: null,
}); });
const {loading, pagination, initFetchData} = useTableQuery({ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
parameter: po, parameter: po,
api: Api.system.getData, api: Api.merchant.getTaskEffect,
callback: (data) => { callback: (data) => {
Object.assign(vo, data); Object.assign(vo, data);
console.log(vo); console.log(vo);
} }
}); });
const cancelTaskEffect = async (id) => {
const {msg} = await Api.merchant.cancelTaskEffect({id});
Message.success(msg);
await fetchData();
}
</script> </script>
<template> <template>
@@ -84,15 +91,18 @@ const {loading, pagination, initFetchData} = useTableQuery({
:pagination="pagination" :pagination="pagination"
:loading="loading" :loading="loading"
:columns="columns"> :columns="columns">
<template v-slot:status> <template v-slot:status="{record}">
<OriginTag color="rgb(var(--success-6))">已生效</OriginTag> <OriginTag v-if="record.status === 0" color="rgb(var(--orange-6))">审核中</OriginTag>
<OriginTag color="rgb(var(--orange-6))">审核中</OriginTag> <OriginTag v-if="record.status === 1" color="rgb(var(--success-6))">已生效</OriginTag>
<OriginTag color="rgb(var(--arcoblue-6))">达人申诉成功</OriginTag> <OriginTag v-if="record.status === 3" color="rgb(var(--arcoblue-6))">达人申诉成功</OriginTag>
<OriginTag color="rgb(var(--red-6))">已拒绝</OriginTag> <OriginTag v-if="record.status === 2" color="rgb(var(--red-6))">已拒绝</OriginTag>
</template> </template>
<template v-slot:action> <template v-slot:action="{record}">
<a-popconfirm content="确定撤销吗?" @ok="cancelTaskEffect(record.id)" v-if="record.status !== 2">
<a-link :hoverable="false" :disabled="false">撤销</a-link> <a-link :hoverable="false" :disabled="false">撤销</a-link>
</a-popconfirm>
<a-link :hoverable="false" :disabled="false">/</a-link>
</template> </template>
</a-table> </a-table>
</div> </div>

View File

@@ -13,6 +13,7 @@ const {businessInfo} = defineProps({
default: {} default: {}
} }
}); });
const emits = defineEmits(['success']);
const money = ref(null); const money = ref(null);
const radioValue = ref(null); const radioValue = ref(null);
const withdrawalList = reactive([]); const withdrawalList = reactive([]);
@@ -92,7 +93,8 @@ onMounted(() => {
<a-form-item class="mt-[40px]"> <a-form-item class="mt-[40px]">
<!-- <a-button type="primary" @click="openWithdrawalStatus">立即提现</a-button>--> <!-- <a-button type="primary" @click="openWithdrawalStatus">立即提现</a-button>-->
<LookWithdrawalInformationModal :id="withdrawalList[radioValue]?.id" :money="money"> <LookWithdrawalInformationModal :id="withdrawalList[radioValue]?.id" :money="money"
@success="emits('success')">
<a-button type="primary" :disabled="!withdrawalList[radioValue]?.id || !money">立即提现</a-button> <a-button type="primary" :disabled="!withdrawalList[radioValue]?.id || !money">立即提现</a-button>
</LookWithdrawalInformationModal> </LookWithdrawalInformationModal>
</a-form-item> </a-form-item>

View File

@@ -112,7 +112,7 @@ onMounted(() => {
<Recharge></Recharge> <Recharge></Recharge>
</a-tab-pane> </a-tab-pane>
<a-tab-pane key="Reflect" title="我的提现"> <a-tab-pane key="Reflect" title="我的提现">
<Reflect :businessInfo="businessInfo"></Reflect> <Reflect :businessInfo="businessInfo" @success="getData"></Reflect>
</a-tab-pane> </a-tab-pane>
</a-tabs> </a-tabs>
</a-card> </a-card>

View File

@@ -6,6 +6,7 @@ import {Message} from "@arco-design/web-vue";
import Comment from "../../../../../components/Comment/index.vue"; import Comment from "../../../../../components/Comment/index.vue";
import AddMaterial from "../../../components/AddMaterial.vue"; import AddMaterial from "../../../components/AddMaterial.vue";
import AddComment from "../../../components/AddComment.vue"; import AddComment from "../../../components/AddComment.vue";
import Talk from "../../../../../components/Talk/index.vue";
const emits = defineEmits(['success']); const emits = defineEmits(['success']);
const {task} = defineProps({ const {task} = defineProps({
@@ -93,10 +94,7 @@ const update = async () => {
</a-textarea> </a-textarea>
</a-form-item> </a-form-item>
<a-form-item label="话题"> <a-form-item label="话题">
<div id="tag-list" <Talk v-model:model-value="item.tags"></Talk>
class="w-full bg-[var(--color-neutral-2)] p-[4px]">
<a-input v-model:model-value="task.tags"></a-input>
</div>
</a-form-item> </a-form-item>
<a-form-item label="素材"> <a-form-item label="素材">

View File

@@ -62,6 +62,7 @@ const success = async () => {
<a-form-item label="投放渠道" field="platform_id"> <a-form-item label="投放渠道" field="platform_id">
<XSelect <XSelect
:init="true" :init="true"
@change="form.material_id=null"
v-model:model-value="form.platform_id" v-model:model-value="form.platform_id"
:api="Api.merchant.getPlatformList"> :api="Api.merchant.getPlatformList">
</XSelect> </XSelect>
@@ -81,11 +82,12 @@ const success = async () => {
<a-input v-model:model-value="form.goods_intro" placeholder="请输入产品功效,如:驱蚊"></a-input> <a-input v-model:model-value="form.goods_intro" placeholder="请输入产品功效,如:驱蚊"></a-input>
</a-form-item> </a-form-item>
<a-form-item label="包含子任务数量" field="children_num"> <a-form-item label="包含子任务数量" field="children_num">
<a-input v-model:model-value="form.children_num" <a-input-number :precision="0" :min="0" :max="50" v-model:model-value="form.children_num"
placeholder="请输入代发的账号数量最多一个任务可包含50个子任务"></a-input> placeholder="请输入代发的账号数量最多一个任务可包含50个子任务"></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="单个子任务价格" field="children_price"> <a-form-item label="单个子任务价格" field="children_price">
<a-input v-model:model-value="form.children_price" placeholder="请输入单个子任务价格"></a-input> <a-input-number :precision="2" :min="0" v-model:model-value="form.children_price"
placeholder="请输入单个子任务价格"></a-input-number>
</a-form-item> </a-form-item>
<a-form-item label="案例链接" field="case_url"> <a-form-item label="案例链接" field="case_url">

View File

@@ -2,9 +2,9 @@
import Api from "../../../../../api/index.js"; import Api from "../../../../../api/index.js";
import XSelect from "../../../../../components/XSelect/index.vue"; import XSelect from "../../../../../components/XSelect/index.vue";
import FormTitle from "../../../../../components/FormTitle/index.vue"; import FormTitle from "../../../../../components/FormTitle/index.vue";
import UploadOne from "../../../../../components/upload/UploadOne.vue";
import {useTemplateRef} from "vue"; import {useTemplateRef} from "vue";
import {Message} from "@arco-design/web-vue"; import {Message} from "@arco-design/web-vue";
import UploadAvatar from "../../../../../components/upload/UploadAvatar.vue";
const emits = defineEmits(['success', 'prev']); const emits = defineEmits(['success', 'prev']);
const form = defineModel('form'); const form = defineModel('form');
@@ -78,8 +78,11 @@ const success = async () => {
</a-form-item> </a-form-item>
<a-form-item label="" field="special_images"> <a-form-item label="" field="special_images">
{{ form.special_images }} <UploadAvatar
<upload-one :file="form.special_images" size="100px" :api="Api.system.uploadFile2"></upload-one> size="100px"
v-model:files="form.special_images"
:api="Api.system.uploadFile2">
</UploadAvatar>
</a-form-item> </a-form-item>
<a-form-item label="选择限制 IP" field="choose_area"> <a-form-item label="选择限制 IP" field="choose_area">

View File

@@ -68,7 +68,9 @@ const success = async () => {
</a-radio-group> </a-radio-group>
</a-form-item> </a-form-item>
<a-form-item label="评论是否需要置顶" <a-form-item
v-if="form.is_comment===1"
label="评论是否需要置顶"
extra="若您的评论内容有营销属性,不建议置顶。各个平台置顶评论都由人工审核,有概率置顶不成功且影响流量"> extra="若您的评论内容有营销属性,不建议置顶。各个平台置顶评论都由人工审核,有概率置顶不成功且影响流量">
<a-radio-group v-model:model-value="form.is_top"> <a-radio-group v-model:model-value="form.is_top">
<a-radio :value="0"></a-radio> <a-radio :value="0"></a-radio>

View File

@@ -79,7 +79,6 @@ const success = async () => {
<a-form-item field="back_id" label="结算条件" class="whitespace-nowrap"> <a-form-item field="back_id" label="结算条件" class="whitespace-nowrap">
达人回传 达人回传
<XSelect <XSelect
disabled
class="mx-[6px]" class="mx-[6px]"
:init="true" :init="true"
:api-po="{id: form.platform_id}" :api-po="{id: form.platform_id}"

View File

@@ -119,7 +119,23 @@ onMounted(() => {
<a-form-item label="结算后" extra="*如有其他要求,可联系管理员添加"> <a-form-item label="结算后" extra="*如有其他要求,可联系管理员添加">
<div class="max-w-[618px]"> <div class="max-w-[618px]">
<a-checkbox-group> <a-checkbox-group>
<a-checkbox v-for="v in settltment_after_list" :value="v.id">{{ v.name }}</a-checkbox> <a-checkbox v-for="v in settltment_after_list" :value="v.id">
{{ v.name }}
<a-popover position="rt">
<icon-question-circle/>
<template v-slot:content>
<div class="text-[14px] text-[#1D2129]">什么是达人信用分</div>
<div class="w-[312px] text-[#86909C] text-[12px]">
信用分是规范达人行为确保其维护商家利益的强制手段
信用分过低将影响达人参加任务提现邀请好友等多项核心功能的使用
</div>
<div class="text-[#165DFF] text-[12px] cursor-pointer">
查看达人信用分管理详情
<icon-double-right/>
</div>
</template>
</a-popover>
</a-checkbox>
</a-checkbox-group> </a-checkbox-group>
</div> </div>
</a-form-item> </a-form-item>

View File

@@ -1,6 +1,6 @@
<script setup> <script setup>
import Comment from "../../../../components/Comment/index.vue"; import Comment from "../../../../components/Comment/index.vue";
import {reactive, ref} from "vue"; import {computed, reactive, ref} from "vue";
import useTableQuery from "../../../../hooks/useTableQuery.js"; import useTableQuery from "../../../../hooks/useTableQuery.js";
import Api from "../../../../api/index.js"; import Api from "../../../../api/index.js";
import {useRoute} from "vue-router"; import {useRoute} from "vue-router";
@@ -9,12 +9,27 @@ import AddMaterial from "../../components/AddMaterial.vue";
import AddComment from "../../components/AddComment.vue"; import AddComment from "../../components/AddComment.vue";
import XImageSmallList from "../../../../components/XImage/XImageSmallList.vue"; import XImageSmallList from "../../../../components/XImage/XImageSmallList.vue";
import ViewMaterial from "../../components/ViewMaterial.vue"; import ViewMaterial from "../../components/ViewMaterial.vue";
import XMention from "../../../../components/XMention/index.vue"; import Talk from "../../../../components/Talk/index.vue";
import {Message} from "@arco-design/web-vue"; import {Message} from "@arco-design/web-vue";
const route = useRoute(); const route = useRoute();
const AddMaterialRef = ref(); const AddMaterialRef = ref();
const columns = reactive([ const po = reactive({
id: route.query.id,
});
const vo = reactive({
limit: {
title_limit: 0,
desc_limit: 0,
tags_limit: 0,
},
page: '',
rows: [],
total: 0,
pageSize: 9,
});
const columns = computed(() => {
return [
{ {
title: '子任务编号', title: '子任务编号',
dataIndex: 'uid', dataIndex: 'uid',
@@ -23,16 +38,19 @@ const columns = reactive([
title: '标题', title: '标题',
dataIndex: 'title', dataIndex: 'title',
slotName: 'title', slotName: 'title',
hidden: vo.limit.title_limit === 0,
}, },
{ {
title: '正文', title: '正文',
dataIndex: 'content', dataIndex: 'content',
slotName: 'content', slotName: 'content',
hidden: vo.limit.desc_limit === 0,
}, },
{ {
title: '话题', title: '话题',
dataIndex: 'tags', dataIndex: 'tags',
slotName: 'tags', slotName: 'tags',
hidden: vo.limit.tags_limit === 0,
}, },
{ {
title: '素材', title: '素材',
@@ -44,15 +62,7 @@ const columns = reactive([
dataIndex: 'pl', dataIndex: 'pl',
slotName: 'pl', slotName: 'pl',
}, },
]); ].filter(v => !v.hidden)
const po = reactive({
id: route.query.id,
});
const vo = reactive({
page: '',
rows: [],
total: 0,
pageSize: 9,
}); });
const {loading, pagination, fetchData} = useTableQuery({ const {loading, pagination, fetchData} = useTableQuery({
@@ -60,6 +70,7 @@ const {loading, pagination, fetchData} = useTableQuery({
api: Api.merchant.getTaskChildrenList, api: Api.merchant.getTaskChildrenList,
callback: (data) => { callback: (data) => {
Object.assign(vo, data); Object.assign(vo, data);
console.log('lime', vo)
} }
}); });
@@ -118,11 +129,9 @@ const success = async () => {
</template> </template>
<template v-slot:tags="{record}"> <template v-slot:tags="{record}">
<div class="flex flex-col gap-[12px]"> <div class="flex flex-col gap-[12px]">
<x-mention <div class="flex gap-[12px]" v-for="v in record.childrenMaterial">
placeholder="请输入话题" <Talk v-model:model-value="v.tags"></Talk>
@success="(e) => v.tags = e" </div>
v-for="v in record.childrenMaterial">
</x-mention>
</div> </div>
</template> </template>
<template v-slot:material="{record, rowIndex}"> <template v-slot:material="{record, rowIndex}">

View File

@@ -29,7 +29,7 @@ const form = reactive({
is_identical: 1, is_identical: 1,
duration: null, duration: null,
special_text: null, special_text: null,
special_images: null, special_images: [],
choose_area: null, choose_area: null,
machine: 0, machine: 0,

View File

@@ -8,7 +8,7 @@ export const BASEURL = import.meta.env.MODE === 'development' ? '/baseApi' : imp
// 创建 Axios 实例 // 创建 Axios 实例
const request = axios.create({ const request = axios.create({
baseURL: BASEURL, // 替换为你的基础 URL baseURL: BASEURL, // 替换为你的基础 URL
timeout: 10000, // 请求超时设置 timeout: 20000, // 请求超时设置
}); });
// 请求拦截器 // 请求拦截器