This commit is contained in:
2025-05-19 19:03:53 +08:00
parent ddfd747704
commit e15474a836
14 changed files with 242 additions and 66 deletions

2
.env
View File

@@ -1,3 +1,3 @@
VITE_API_URL=http://192.168.1.105/api VITE_API_URL=http://admin.ceshi.guo123.cn
VITE_TINYMCE_KEY=agmu6i1c6k7bcp36oenzyz7yi1yplptq7goyx88y1g6ofnqu VITE_TINYMCE_KEY=agmu6i1c6k7bcp36oenzyz7yi1yplptq7goyx88y1g6ofnqu
VITE_AES_KEY=st123456654321st VITE_AES_KEY=st123456654321st

BIN
dist.zip Normal file

Binary file not shown.

View File

@@ -243,6 +243,20 @@ const system = {
data: data data: data
}); });
}, },
myTaskList: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/task/myTaskList",
data: data
});
},
addTaskBackfill: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/task/addTaskBackfill",
data: data
});
},
} }
export default system; export default system;

View File

@@ -3,36 +3,49 @@ import dy from "../static/images/抖音.png";
import qrw from "../static/icons/qrw.png"; import qrw from "../static/icons/qrw.png";
import XCountdown from "./XCountdown.vue"; import XCountdown from "./XCountdown.vue";
import {toPage} from "../utils/uils.js"; import {toPage} from "../utils/uils.js";
import FBENUM from "../enum/FBENUM.js";
import PlatformENUM from "../enum/PlatformENUM.js";
import dayjs from "dayjs";
const {data} = defineProps({
data: {
type: Object,
default: {}
}
});
</script> </script>
<template> <template>
<view @click="toPage(`/pages/taskDetails/index?id=${1}`)" class="rounded-[8rpx] bg-[#fff] !p-[24rpx] overflow-hidden task-card"> <view @click="toPage(`/pages/taskDetails/index?id=${data.id}`)"
class="rounded-[8rpx] bg-[#fff] !p-[24rpx] overflow-hidden task-card">
<view class="!pb-[20rpx] !flex justify-between" style="border-bottom: 1px solid #E5E6EB"> <view class="!pb-[20rpx] !flex justify-between" style="border-bottom: 1px solid #E5E6EB">
<view style="font-size: 28rpx"> <view style="font-size: 28rpx">
任务编号DF1212 任务编号{{ data.uid }}
</view> </view>
<view v-if="false" style="font-size: 24rpx"> <view v-if="data.back_status === 1" style="font-size: 24rpx">
<Text class="text-[#165DFF]">08-13-09:54</Text>后可开始回填 <Text class="text-[#165DFF]">{{ dayjs(data.time).format('MM-DD-HH:mm') }}</Text>
后可开始回填
</view> </view>
<x-countdown v-else> <x-countdown v-else :time="dayjs(data.time)">
<view style="font-size: 24rpx;font-weight: 400;" class="text-[rgb(78,89,105)]">审核倒计时:</view> <view style="font-size: 24rpx;font-weight: 400;" class="text-[rgb(78,89,105)]">审核倒计时:</view>
</x-countdown> </x-countdown>
</view> </view>
<view class="!flex gap-[26rpx] !pt-[20rpx]"> <view class="!flex gap-[26rpx] !pt-[20rpx]">
<image class="!size-[88rpx] rounded-[50%] overflow-hidden" mode="aspectFill" :src="dy"></image> <image class="!size-[88rpx] rounded-[50%] overflow-hidden" mode="aspectFill"
:src="PlatformENUM[data.platform_id]"></image>
<view class="!h-[88rpx] !flex flex-col justify-between"> <view class="!h-[88rpx] !flex flex-col justify-between">
<view class="title">美白祛斑洗面奶</view> <view class="title">{{ data.goods_name }}</view>
<view class="!flex gap-[8rpx]"> <view class="!flex gap-[8rpx]">
<view class="tag">抖音</view> <view class="tag">{{ data.platform }}</view>
<view class="tag">连发</view> <view class="tag">{{ FBENUM[data.fb_num - 1] }}连发</view>
</view> </view>
</view> </view>
<view class="!h-[88rpx] !ml-auto !flex items-center gap-[6rpx]"> <view class="!h-[88rpx] !ml-auto !flex items-center gap-[6rpx]">
<view class="price-info">待确认</view> <view class="price-info">{{ data.status_text }}</view>
<view class="price"> <view class="price">
<text class="unit">¥</text> <text class="unit">¥</text>
8.56 {{ data.coin.toFixed(2) }}
</view> </view>
</view> </view>
</view> </view>
@@ -40,11 +53,11 @@ import {toPage} from "../utils/uils.js";
<view class="!mt-[34rpx] !px-[20rpx] !py-[10rpx] bg-[#F2F3F5] info relative"> <view class="!mt-[34rpx] !px-[20rpx] !py-[10rpx] bg-[#F2F3F5] info relative">
<view class="!flex gap-[8rpx] justify-between"> <view class="!flex gap-[8rpx] justify-between">
<view>领取账号:</view> <view>领取账号:</view>
<view>酷酷猛吃</view> <view>{{ data.account }}</view>
</view> </view>
<view class="!flex gap-[8rpx] justify-between"> <view class="!flex gap-[8rpx] justify-between">
<view>领取时间:</view> <view>领取时间:</view>
<view>2024-08-06 14:10</view> <view>{{ data.accept_time }}</view>
</view> </view>
</view> </view>
</view> </view>

View File

@@ -16,7 +16,7 @@ const upload = async () => {
uploadFile({ uploadFile({
count: 1, count: 1,
}).then(({data}) => { }).then(({data}) => {
files.value.push(data); files.value?.push(data);
emits('success', data); emits('success', data);
}) })
} }

3
src/enum/FBENUM.js Normal file
View File

@@ -0,0 +1,3 @@
const FBENUM = ['一', '二', '三', '四', '五'];
export default FBENUM;

View File

@@ -125,7 +125,7 @@
{ {
"path": "pages/changeLog/index", "path": "pages/changeLog/index",
"style": { "style": {
"navigationBarTitleText": "变动记录", "navigationBarTitleText": "团队详情",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
}, },

View File

@@ -12,6 +12,8 @@ import XRadio from "../../components/XRadio.vue";
import XDateRange from "../../components/XDateRange.vue"; import XDateRange from "../../components/XDateRange.vue";
import XAlert from "../../components/XAlert.vue"; import XAlert from "../../components/XAlert.vue";
const taskType = reactive([]);
const platformType = reactive([]);
const tabs = [ const tabs = [
{ {
name: '发布问题', name: '发布问题',
@@ -37,8 +39,7 @@ const sumPo = reactive({
startTime: null, startTime: null,
endTime: null, endTime: null,
}); });
const po = reactive({ const po = reactive({});
});
const vo = reactive({ const vo = reactive({
page: '', page: '',
rows: [], rows: [],
@@ -46,7 +47,7 @@ const vo = reactive({
}); });
const {loading, pagination, initFetchData} = useTableQuery({ const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.getData, api: Api.system.myTaskList,
parameter: po, parameter: po,
callback: (data) => { callback: (data) => {
vo.page = data.page; vo.page = data.page;
@@ -54,6 +55,15 @@ const {loading, pagination, initFetchData} = useTableQuery({
vo.rows = [...vo.rows, ...data.rows]; vo.rows = [...vo.rows, ...data.rows];
} }
}); });
Api.system.getTaskType().then(({data}) => {
taskType.length = 0;
taskType.push(...data);
});
Api.system.getPlatform().then(({data}) => {
platformType.length = 0;
platformType.push(...data);
});
</script> </script>
<template> <template>
@@ -66,23 +76,14 @@ const {loading, pagination, initFetchData} = useTableQuery({
<x-filter-item label="任务类型"> <x-filter-item label="任务类型">
<x-radio-group v-model:model-value="sumPo.type"> <x-radio-group v-model:model-value="sumPo.type">
<view class="!grid grid-cols-4 gap-[24rpx]"> <view class="!grid grid-cols-4 gap-[24rpx]">
<x-radio :value="0">全部任务</x-radio> <x-radio v-for="v in taskType" :key="v.id" :value="v.id">{{ v.name }}</x-radio>
<x-radio :value="1">宣发</x-radio>
<x-radio :value="2">评论</x-radio>
<x-radio :value="3">续期</x-radio>
</view> </view>
</x-radio-group> </x-radio-group>
</x-filter-item> </x-filter-item>
<x-filter-item label="发布平台"> <x-filter-item label="发布平台">
<x-radio-group v-model:model-value="sumPo.type"> <x-radio-group v-model:model-value="sumPo.type">
<view class="!grid grid-cols-4 gap-[24rpx]"> <view class="!grid grid-cols-4 gap-[24rpx]">
<x-radio :value="0">全部平台</x-radio> <x-radio v-for="v in platformType" :key="v.id" :value="v.id">{{ v.name }}</x-radio>
<x-radio :value="1">抖音</x-radio>
<x-radio :value="2">快手</x-radio>
<x-radio :value="3">视频号</x-radio>
<x-radio :value="4">小红书</x-radio>
<x-radio :value="5">今日头条</x-radio>
<x-radio :value="6">咸鱼</x-radio>
</view> </view>
</x-radio-group> </x-radio-group>
</x-filter-item> </x-filter-item>
@@ -154,11 +155,18 @@ const {loading, pagination, initFetchData} = useTableQuery({
<view class="block-title !flex gap-[6rpx] items-center"> <view class="block-title !flex gap-[6rpx] items-center">
到账收益() 到账收益()
<x-alert btnText="知道了" btnColor="#165DFF"> <x-alert btnText="知道了" btnColor="#165DFF">
<tui-icon name="explain" :size="16" ></tui-icon> <tui-icon name="explain" :size="16"></tui-icon>
<template #context> <template #context>
<view style="font-size: 32rpx;font-weight: 500" class="!mb-[30rpx]">到账收益</view> <view style="font-size: 32rpx;font-weight: 500" class="!mb-[30rpx]">
<view style="font-size: 28rpx;font-weight: 400" class="text-[rgb(78,89,105)]">根据您的任务完成情况</view> 到账收益
<view style="font-size: 28rpx;font-weight: 400" class="text-[rgb(78,89,105)] !mt-[10rpx]">实际获得的收益</view> </view>
<view style="font-size: 28rpx;font-weight: 400" class="text-[rgb(78,89,105)]">
根据您的任务完成情况
</view>
<view style="font-size: 28rpx;font-weight: 400"
class="text-[rgb(78,89,105)] !mt-[10rpx]">
实际获得的收益
</view>
</template> </template>
</x-alert> </x-alert>
</view> </view>
@@ -178,7 +186,7 @@ const {loading, pagination, initFetchData} = useTableQuery({
</view> </view>
<view class="!flex flex-col gap-[20rpx] !px-[20rpx]"> <view class="!flex flex-col gap-[20rpx] !px-[20rpx]">
<TaskCard v-for="i in vo.rows"></TaskCard> <TaskCard v-for="i in vo.rows" :key="i.id" :data="i"></TaskCard>
<tui-loadmore v-if="loading" text="加载中..."></tui-loadmore> <tui-loadmore v-if="loading" text="加载中..."></tui-loadmore>
</view> </view>

View File

@@ -3,31 +3,24 @@ import {ref, reactive} from "vue";
import XSquareCarouselImage from "../../../components/XSquareCarouselImage.vue"; import XSquareCarouselImage from "../../../components/XSquareCarouselImage.vue";
import {toPage} from "../../../utils/uils.js"; import {toPage} from "../../../utils/uils.js";
const {data} = defineProps({
data: {
type: Object,
default: null,
}
});
const current = ref(0); const current = ref(0);
const list = reactive([
{
id: 0,
name: '素材1',
},
{
id: 1,
name: '素材2',
},
{
id: 2,
name: '素材3',
},
]);
</script> </script>
<template> <template>
<!--领取素材--> <!--领取素材-->
<view class="!flex gap-[24rpx] !mb-[28rpx]"> <view class="!flex gap-[24rpx] !mb-[28rpx]">
<view <view
v-for="(item,index) in list" v-for="(item,index) in data.children.material"
@click="current=index" @click="current=index"
:class="['tab-item', index===current?'cur':'']"> :class="['tab-item', index===current?'cur':'']">
素材1 素材{{ index + 1 }}
</view> </view>
</view> </view>
@@ -37,7 +30,7 @@ const list = reactive([
标题: 标题:
</view> </view>
<view class="block-info"> <view class="block-info">
标题内容标题内容标题内容标题内容标题内容标题内容标题内容标题内容 {{ data.children.material[current].title }}
</view> </view>
</view> </view>
<view class="block"> <view class="block">
@@ -53,7 +46,7 @@ const list = reactive([
正文: 正文:
</view> </view>
<view class="block-info"> <view class="block-info">
简介内容简介内容简介内容简介内容简介内容简介内容简介内容简介内容简介内容简介内... {{ data.children.material[current].content }}
</view> </view>
</view> </view>
<view class="block"> <view class="block">
@@ -61,7 +54,7 @@ const list = reactive([
素材: 素材:
</view> </view>
<view class="block-info"> <view class="block-info">
<x-square-carousel-image></x-square-carousel-image> <x-square-carousel-image :list="data.children.material[current].material_arr"></x-square-carousel-image>
</view> </view>
</view> </view>
<view class="block"> <view class="block">
@@ -72,10 +65,14 @@ const list = reactive([
<view> <view>
<view>评论1我用的也是这款早tb可以购买噢~我用的也是这款早tb可以购买噢~</view> <view>评论1我用的也是这款早tb可以购买噢~我用的也是这款早tb可以购买噢~</view>
<view class="!flex gap-[20rpx] flex-wrap"> <view class="!flex gap-[20rpx] flex-wrap">
<image class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill" src="/static/images/test.png"></image> <image class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill"
<image class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill" src="/static/images/test.png"></image> src="/static/images/test.png"></image>
<image class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill" src="/static/images/test.png"></image> <image class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill"
<image class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill" src="/static/images/test.png"></image> src="/static/images/test.png"></image>
<image class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill"
src="/static/images/test.png"></image>
<image class="!w-[96rpx] !h-[96rpx] !aspect-square" mode="aspectFill"
src="/static/images/test.png"></image>
</view> </view>
</view> </view>
</view> </view>
@@ -90,7 +87,7 @@ const list = reactive([
<style scoped lang="scss"> <style scoped lang="scss">
.tab-item { .tab-item {
padding: 12rpx 32rpx; padding: 12rpx 26rpx;
border-radius: 9999rpx; border-radius: 9999rpx;
background-color: #F7F8FA; background-color: #F7F8FA;
font-size: 24rpx; font-size: 24rpx;

View File

@@ -1,12 +1,136 @@
<script setup> <script setup>
import {reactive, ref, watch} from "vue";
import XLink from "../../../components/XLink.vue";
import XUpload from "../../../components/XUpload.vue";
import XInput from "../../../components/XInput.vue";
import Api from "../../../api/index.js";
import {showToast} from "../../../utils/uils.js";
import dayjs from "dayjs";
import XCountdown from "../../../components/XCountdown.vue";
const {data} = defineProps({
data: {
type: Object,
default: null,
}
});
const content = reactive([]);
const current = ref(0);
const success = async () => {
const {msg} = await Api.system.addTaskBackfill({
id: data.children.id,
cid: current.value + 1,
content: content,
type: data.task_content[current.value].is_image,
});
showToast(msg);
}
watch(
() => [data, current],
() => {
content.push(...data.children.back[current.value].content_arr);
},
{deep: true, immediate: true}
)
</script> </script>
<template> <template>
<!--我的回填--> <!--我的回填-->
<view class="!flex gap-[24rpx] !mb-[28rpx]">
<view
v-for="(item,index) in data.task_content"
@click="current=index"
:class="['tab-item', index===current?'cur':'']">
回填{{ index + 1 }}
</view>
</view>
<view class="block">
<view class="block-title">
回填指引:
</view>
<view class="block-info">
<x-link>查看指引</x-link>
</view>
</view>
<view class="block">
<view class="block-title">
回填时间:
</view>
<view class="block-info">
{{ data.task_content[current].start_time }} {{ data.task_content[current].end_time }}
</view>
</view>
<view class="block">
<view class="block-title">
倒计时:
</view>
<view class="block-info">
<x-countdown :time="dayjs(data.task_content[current].end_time)">
</x-countdown>
</view>
</view>
<view class="block" v-for="(v, index) in data.fb_num">
<view class="block-title">
视频1的评论区截图:
</view>
<view class="block-info">
<x-upload
@success="(e) => content[index] = e"
:files="content[index] ? [content[index]] : []"
v-if="data.task_content[current].is_image === 1">
</x-upload>
<x-input v-else v-model:model-value="content[index]" height="64rpx" placeholder="请输入内容"></x-input>
</view>
</view>
<tui-button @click="success">提交</tui-button>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
.tab-item {
padding: 12rpx 26rpx;
border-radius: 9999rpx;
background-color: #F7F8FA;
font-size: 24rpx;
color: #4E5969;
transition: 500ms;
}
.cur {
background-color: #E8F3FF;
color: #165DFF;
}
.block {
display: flex;
gap: 20rpx;
margin-bottom: 20rpx;
.block-title {
flex-shrink: 0;
color: rgb(134, 144, 156);
font-size: 24rpx;
font-weight: 500;
line-height: 140%;
letter-spacing: 0;
text-align: left;
width: 160rpx;
}
.block-info {
color: rgb(78, 89, 105);
font-size: 24rpx;
font-weight: 500;
line-height: 140%;
letter-spacing: 0;
}
}
</style> </style>

View File

@@ -17,10 +17,10 @@ const {data} = defineProps({
<view class="title"> <view class="title">
案例概览 案例概览
</view> </view>
<view class="block items-center"> <view class="block items-center" v-if="data.case_url">
<view class="block-title">任务案例:</view> <view class="block-title">任务案例:</view>
<view class="block-info w-full overflow-hidden"> <view class="block-info w-full overflow-hidden">
<view class="text-[#165DFF] !flex items-center gap-[10rpx]" v-if="data.case_url"> <view class="text-[#165DFF] !flex items-center gap-[10rpx]">
<image class="!size-[24rpx] flex-shrink-0" :src="linkIcon"></image> <image class="!size-[24rpx] flex-shrink-0" :src="linkIcon"></image>
<text class="ellipsis-1 flex-grow"> <text class="ellipsis-1 flex-grow">
{{ data.case_url }} {{ data.case_url }}
@@ -47,7 +47,23 @@ const {data} = defineProps({
</view> </view>
<view class="block"> <view class="block">
<view class="block-title">评论区案例:</view> <view class="block-title">评论区案例:</view>
<view> <view class="test-24r text-[#4E5969]">
<view v-if="data.comment_arr">
评论1:
<text v-if="data.comment_arr.pid!==0" class="text-[#86909C]">
<image class="!size-[20rpx]" src="/static/icons/msgback.png"></image>
回复1:
</text>
{{ data.comment_arr.intro }}
</view>
<view v-for="(v, index) in data.comment_arr.children">
评论1:
<text v-if="data.comment_arr.pid!==0" class="text-[#86909C]">
<image class="!size-[20rpx]" src="/static/icons/msgback.png"></image>
回复1:
</text>
{{ data.comment_arr.intro }}
</view>
</view> </view>
</view> </view>
</view> </view>

View File

@@ -86,7 +86,7 @@ onMounted(() => {
{{ dayjs(details.end_time).format('YYYY-MM-DD HH:mm') }} 前可领取 {{ dayjs(details.end_time).format('YYYY-MM-DD HH:mm') }} 前可领取
</view> </view>
<view v-else class="goods-bh"> <view v-else class="goods-bh">
任务编号DF1515 任务编号{{ details.is_use === 0 ? details.code : details.children.uid }}
<x-link>复制</x-link> <x-link>复制</x-link>
</view> </view>
</view> </view>
@@ -98,9 +98,9 @@ onMounted(() => {
style="font-size: 24rpx"> style="font-size: 24rpx">
<view>发布账号</view> <view>发布账号</view>
<view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view> <view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view>
<view>昵称: 我是大冤种</view> <view>昵称: {{ details.children.account.nickname }}</view>
<view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view> <view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view>
<view>账号: 56378899</view> <view>账号: {{ details.children.account.account }}</view>
</view> </view>
<view class="!grid grid-cols-4 gap-[20rpx]"> <view class="!grid grid-cols-4 gap-[20rpx]">

View File

@@ -2,6 +2,7 @@
import {onMounted, reactive} from "vue"; import {onMounted, reactive} from "vue";
import {useUserStore} from "../../../pinia/UserStore/index.js"; import {useUserStore} from "../../../pinia/UserStore/index.js";
import Api from "../../../api/index.js"; import Api from "../../../api/index.js";
import {toPage} from "../../../utils/uils.js";
const UserStore = useUserStore(); const UserStore = useUserStore();
const detail = reactive({}); const detail = reactive({});
@@ -21,7 +22,7 @@ onMounted(() => {
<view class="invitationCodeValue"> <view class="invitationCodeValue">
{{ UserStore?.userInfo?.invite }} {{ UserStore?.userInfo?.invite }}
</view> </view>
<view class="view-detail !ml-auto">查看团队详情></view> <view class="view-detail !ml-auto" @click="toPage('/pages/changeLog/index')">查看团队详情></view>
</view> </view>
<view class="!mt-[24rpx] !grid grid-cols-3 gap-[22rpx]"> <view class="!mt-[24rpx] !grid grid-cols-3 gap-[22rpx]">

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B