This commit is contained in:
2025-12-13 22:58:49 +08:00
parent a79073a88f
commit 2c572ee282
18 changed files with 315 additions and 265 deletions

View File

@@ -2,16 +2,37 @@
import { watch, ref } from "vue"; import { watch, ref } from "vue";
import XModal from "./XModal.vue"; import XModal from "./XModal.vue";
import Api from "../api/index.js"; import Api from "../api/index.js";
import { useUserStore } from "../pinia/UserStore/index.js";
const UserStore = useUserStore();
const show = defineModel('show'); const show = defineModel('show');
const qrCode = ref(null); const qrCode = ref(null);
let old_openid = "";
let timer = null;
const cancel = () => {
show.value = false;
if (timer) clearInterval(timer);
}
const check = async () => {
await UserStore.getUserInfo();
if (old_openid !== UserStore.userInfo.openid) {
cancel();
}
}
watch( watch(
() => show.value, () => show.value,
(val) => { (val) => {
if (val) Api.system.createQrcode().then(({data}) => { if (val) {
Api.system.createQrcode().then(async ({ data }) => {
await UserStore.getUserInfo();
old_openid = UserStore.userInfo.openid;
qrCode.value = data.url; qrCode.value = data.url;
}) timer = setInterval(check, 500);
});
}
} }
) )
</script> </script>
@@ -21,8 +42,7 @@ watch(
<slot></slot> <slot></slot>
</view> </view>
<x-modal <x-modal v-model:show="show" @cancel="cancel">
v-model:show="show">
<view class="px-[30rpx] py-[40rpx] relative"> <view class="px-[30rpx] py-[40rpx] relative">
<image @click="show = false" class="!w-[52rpx] !h-[52rpx] absolute top-[-110rpx] right-[calc(-100%-10rpx)]" <image @click="show = false" class="!w-[52rpx] !h-[52rpx] absolute top-[-110rpx] right-[calc(-100%-10rpx)]"
src="/static/icons/close.png"></image> src="/static/icons/close.png"></image>

View File

@@ -56,10 +56,7 @@ defineExpose({
<slot></slot> <slot></slot>
</view> </view>
<view <view v-if="show" @click="show = false" class="x-image-preview">
v-if="show"
@click="show=false"
class="x-image-preview">
<view class="x-image-docker"> <view class="x-image-docker">
<template v-if="list.length > 1"> <template v-if="list.length > 1">
<swiper class="!size-full" :current="cur" @change="({ detail: { current } }) => cur = current"> <swiper class="!size-full" :current="cur" @change="({ detail: { current } }) => cur = current">
@@ -85,8 +82,7 @@ defineExpose({
<template v-else> <template v-else>
<template v-if="!src.endsWith('.mp4')"> <template v-if="!src.endsWith('.mp4')">
<image class="!size-full" :src="src" mode="aspectFit"></image> <image class="!size-full" :src="src" mode="aspectFit"></image>
<image v-if="sy" class="!size-full !absolute left-0 top-0" :src="SY_ICON" <image v-if="sy" class="!size-full !absolute left-0 top-0" :src="SY_ICON" mode="aspectFit"></image>
mode="aspectFit"></image>
</template> </template>
<template v-else> <template v-else>
<view class="!size-full !flex items-center" @click.stop> <view class="!size-full !flex items-center" @click.stop>
@@ -96,15 +92,11 @@ defineExpose({
</template> </template>
<image <image v-if="list.length > 1" @click="show = false"
v-if="list.length>1"
@click="show=false"
class="!w-[52rpx] !h-[52rpx] !absolute left-1/2 -translate-x-1/2 bottom-[-130rpx]" class="!w-[52rpx] !h-[52rpx] !absolute left-1/2 -translate-x-1/2 bottom-[-130rpx]"
src="/static/icons/close.png"> src="/static/icons/close.png">
</image> </image>
<image <image v-else @click="show = false"
v-else
@click="show=false"
class="!w-[52rpx] !h-[52rpx] !absolute left-1/2 -translate-x-1/2 bottom-[-60rpx]" class="!w-[52rpx] !h-[52rpx] !absolute left-1/2 -translate-x-1/2 bottom-[-60rpx]"
src="/static/icons/close.png"> src="/static/icons/close.png">
</image> </image>

View File

@@ -1,11 +1,17 @@
<script setup> <script setup>
const show = defineModel('show'); const show = defineModel('show');
const emits = defineEmits('cancel');
const cancel = () => {
show.value = false;
emits('cancel');
}
</script> </script>
<template> <template>
<tui-modal <tui-modal
v-bind="$attrs" v-bind="$attrs"
@cancel="show=false" @cancel="cancel"
padding="0" padding="0"
custom custom
:show="show"> :show="show">

View File

@@ -108,7 +108,7 @@ watch(
</x-image> </x-image>
</view> </view>
</template> </template>
<x-upload v-model:files="form.homepage" single></x-upload> <x-upload v-model:files="form.homepage" del single></x-upload>
</x-form-item> </x-form-item>
<x-form-item label="主页二维码"> <x-form-item label="主页二维码">
<template v-slot:label> <template v-slot:label>
@@ -120,7 +120,7 @@ watch(
</x-image> </x-image>
</view> </view>
</template> </template>
<x-upload v-model:files="form.qrcode" single></x-upload> <x-upload v-model:files="form.qrcode" del single></x-upload>
</x-form-item> </x-form-item>
</x-form> </x-form>

View File

@@ -61,15 +61,6 @@ const sortType = reactive([
{ id: 5, name: '最新发布' }, { id: 5, name: '最新发布' },
]); ]);
Api.system.getTaskType().then(({data}) => {
taskType.length = 0;
taskType.push(...data);
});
Api.system.getPlatform().then(({data}) => {
platformType.length = 0;
platformType.push(...data);
});
const po = reactive({ const po = reactive({
type: 0, type: 0,
pid: 0, pid: 0,
@@ -92,10 +83,12 @@ const {loading, pagination, initFetchData} = useTableQuery({
}); });
onShow(() => { onShow(() => {
initFetchData(); // #ifndef MP-WEIXIN
}); const ua = navigator.userAgent.toLowerCase();
if (ua.indexOf("micromessenger") !== -1) {
onMounted(() => { toPage('/pages/notSupported/index');
return;
}
Api.system.getAdvList({ Api.system.getAdvList({
position: 1, position: 1,
}).then(({ data }) => { }).then(({ data }) => {
@@ -106,7 +99,17 @@ onMounted(() => {
textContent.length = 0; textContent.length = 0;
textContent.push(...data); textContent.push(...data);
}); });
}) Api.system.getTaskType().then(({ data }) => {
taskType.length = 0;
taskType.push(...data);
});
Api.system.getPlatform().then(({ data }) => {
platformType.length = 0;
platformType.push(...data);
});
initFetchData();
// #endif
});
</script> </script>
<template> <template>
@@ -116,16 +119,12 @@ onMounted(() => {
<add-customer-service-modal v-model:show="showAddCustomer"></add-customer-service-modal> <add-customer-service-modal v-model:show="showAddCustomer"></add-customer-service-modal>
<scroll-view <scroll-view @refresherpulling="initFetchData()" @scrolltolower="() => {
@refresherpulling="initFetchData()"
@scrolltolower="() => {
pagination.page++; pagination.page++;
}" }" class="h-[calc(100vh-200rpx)]" scroll-y>
class="h-[calc(100vh-200rpx)]"
scroll-y>
<view class="relative overflow-hidden bg-b-r !pb-[34rpx]"> <view class="relative overflow-hidden bg-b-r !pb-[34rpx]">
<image class="!w-full !absolute top-1/2 -translate-y-1/2" src="/static/icons/home-bg.png" <image class="!w-full !absolute top-1/2 -translate-y-1/2" src="/static/icons/home-bg.png" mode="widthFix">
mode="widthFix"></image> </image>
<view class="!w-full !h-full !absolute !top-0 !left-0 bg-w"></view> <view class="!w-full !h-full !absolute !top-0 !left-0 bg-w"></view>
<view class="box-border !p-[20rpx]"> <view class="box-border !p-[20rpx]">
@@ -137,10 +136,7 @@ onMounted(() => {
</view> </view>
<view class="mt-[44rpx] !flex !gap-[50rpx] !mx-[36rpx] relative z-10"> <view class="mt-[44rpx] !flex !gap-[50rpx] !mx-[36rpx] relative z-10">
<view <view v-for="item in nav" :key="item.title" @click="item.path ? toPage(item.path) : item.onClick()"
v-for="item in nav"
:key="item.title"
@click="item.path ? toPage(item.path) : item.onClick()"
class="!flex flex-col items-center gap-[6rpx]"> class="!flex flex-col items-center gap-[6rpx]">
<view class="!size-[96rpx] rounded-[20rpx] overflow-hidden"> <view class="!size-[96rpx] rounded-[20rpx] overflow-hidden">
<image class="!size-full" :src="item.icon"></image> <image class="!size-full" :src="item.icon"></image>
@@ -156,20 +152,11 @@ onMounted(() => {
</view> </view>
<view class="!grid !grid-cols-3 !px-[20rpx] gap-[20rpx]"> <view class="!grid !grid-cols-3 !px-[20rpx] gap-[20rpx]">
<x-dropdown-list <x-dropdown-list @change="initFetchData" v-model:model-value="po.type" :option="taskType">
@change="initFetchData"
v-model:model-value="po.type"
:option="taskType">
</x-dropdown-list> </x-dropdown-list>
<x-dropdown-list <x-dropdown-list @change="initFetchData" v-model:model-value="po.pid" :option="platformType">
@change="initFetchData"
v-model:model-value="po.pid"
:option="platformType">
</x-dropdown-list> </x-dropdown-list>
<x-dropdown-list <x-dropdown-list @change="initFetchData" v-model:model-value="po.order" :option="sortType">
@change="initFetchData"
v-model:model-value="po.order"
:option="sortType">
</x-dropdown-list> </x-dropdown-list>
</view> </view>

View File

@@ -67,7 +67,7 @@ watch(
<scroll-view <scroll-view
scroll-y scroll-y
@refresherpulling="initFetchData()" @refresherpulling="initFetchData()"
@scrolltolower="pagination.current++" @scrolltolower="pagination.page++"
class="h-[calc(100vh-200rpx)]"> class="h-[calc(100vh-200rpx)]">
<view class="!flex flex-col gap-[20rpx] p-[20rpx]"> <view class="!flex flex-col gap-[20rpx] p-[20rpx]">
<view class="bg-[var(--primary-color)] p-[32rpx] rounded-[12rpx] !flex items-center"> <view class="bg-[var(--primary-color)] p-[32rpx] rounded-[12rpx] !flex items-center">

View File

@@ -40,20 +40,37 @@ const success = async () => {
</script> </script>
<template> <template>
<view class="!px-[34rpx] !flex flex-col gap-[40rpx]"> <view class="account-login">
<x-input v-model:model-value="form.mobile" placeholder="请输入手机号"></x-input> <x-input v-model:model-value="form.mobile" placeholder="请输入手机号"></x-input>
<x-input v-model:model-value="form.password" placeholder="密码"> <x-input v-model:model-value="form.password" placeholder="密码">
<template #suffix> <template #suffix>
<x-link @click="toPage('/pages/forgotPassword/index')">忘记密码?</x-link> <x-link @click="toPage('/pages/forgotPassword/index')">忘记密码?</x-link>
</template> </template>
</x-input> </x-input>
<tui-button class="!mt-[80rpx]" @click="success">登录</tui-button> <tui-button class="btn primary" @click="success">登录</tui-button>
<tui-button @click="toPage('/pages/register/index')" class="!mt-[40rpx]" plain link> <tui-button @click="toPage('/pages/register/index')" class="btn link-btn" plain link>
<image class="!h-[26rpx]" mode="heightFix" src="../../static/icons/去注册.png"></image> <image class="register-icon" mode="heightFix" src="../../static/icons/去注册.png"></image>
</tui-button> </tui-button>
</view> </view>
</template> </template>
<style scoped> <style scoped>
.account-login{
padding: 0 34rpx;
display: flex;
flex-direction: column;
gap: 40rpx;
}
.btn{
margin-top: 40rpx;
}
.btn.primary{
margin-top: 80rpx;
}
.register-icon{
height: 26rpx;
}
</style> </style>

View File

@@ -13,18 +13,14 @@ onMounted(() => {
</script> </script>
<template> <template>
<view class="!mt-[68rpx] !flex flex-col gap-[20rpx]"> <view class="container">
<view class="!flex gap-[30rpx] scrollX"> <view class="row scrollX">
<view <view v-for="item in list1" :key="item" class="qp">
v-for="item in list1"
class="!h-[72rpx] qp">
{{ item }} {{ item }}
</view> </view>
</view> </view>
<view class="!flex gap-[30rpx] scrollX"> <view class="row scrollX">
<view <view v-for="item in list2" :key="item" class="qp">
v-for="item in list2"
class="!h-[72rpx] qp">
{{ item }} {{ item }}
</view> </view>
</view> </view>
@@ -32,6 +28,19 @@ onMounted(() => {
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.container {
margin-top: 68rpx;
display: flex;
flex-direction: column;
gap: 20rpx;
}
.row {
display: flex;
gap: 30rpx;
overflow-x: auto; // optional
}
.scrollX { .scrollX {
width: max-content !important; width: max-content !important;
animation: scroll 120s linear infinite; animation: scroll 120s linear infinite;
@@ -43,15 +52,21 @@ onMounted(() => {
@keyframes scroll { @keyframes scroll {
0% { 0% {
transform: translateX(100vw); /* 从右侧开始 */ transform: translateX(100vw);
} }
100% { 100% {
transform: translateX(-100%); /* 滚动到左侧结束 */ transform: translateX(-100%);
} }
} }
.qp { .qp {
@apply px-[36rpx] flex items-center rounded-full; height: 72rpx;
padding-left: 36rpx;
padding-right: 36rpx;
display: flex;
align-items: center;
border-radius: 9999px;
background: linear-gradient(to right, #B8C5E9, #CAE2E9, #D0D6E2); background: linear-gradient(to right, #B8C5E9, #CAE2E9, #D0D6E2);
box-shadow: inset 0 0 10px 15rpx rgba(255, 255, 255); box-shadow: inset 0 0 10px 15rpx rgba(255, 255, 255);
backdrop-filter: blur(20px); backdrop-filter: blur(20px);

View File

@@ -41,16 +41,33 @@ const success = async () => {
</script> </script>
<template> <template>
<view class="!px-[34rpx] !flex flex-col gap-[40rpx]"> <view class="phone-login">
<x-input v-model:model-value="form.mobile" placeholder="请输入手机号"></x-input> <x-input v-model:model-value="form.mobile" placeholder="请输入手机号"></x-input>
<send-msg v-model:model-value="form.captcha" :mobile="form.mobile" :type="2"></send-msg> <send-msg v-model:model-value="form.captcha" :mobile="form.mobile" :type="2"></send-msg>
<tui-button class="!mt-[80rpx]" @click="success">登录</tui-button> <tui-button class="btn primary" @click="success">登录</tui-button>
<tui-button @click="toPage('/pages/register/index')" class="!mt-[40rpx]" plain link> <tui-button @click="toPage('/pages/register/index')" class="btn link-btn" plain link>
<image class="!h-[26rpx]" mode="heightFix" src="../../static/icons/去注册.png"></image> <image class="register-icon" mode="heightFix" src="../../static/icons/去注册.png"></image>
</tui-button> </tui-button>
</view> </view>
</template> </template>
<style scoped> <style lang="scss" scoped>
.phone-login{
padding: 0 34rpx;
display: flex;
flex-direction: column;
gap: 40rpx;
}
.btn{
margin-top: 40rpx;
}
.btn.primary{
margin-top: 80rpx;
}
.register-icon{
height: 26rpx;
}
</style> </style>

View File

@@ -29,20 +29,20 @@ onLoad((options) => {
<!--登陆--> <!--登陆-->
<XNav :showBack="false"></XNav> <XNav :showBack="false"></XNav>
<view class="h-[390rpx] relative overflow-hidden"> <view class="box">
<image class="!absolute left-1/2 top-1/2 -translate-1/2 !w-[1198rpx] !h-[806rpx] !pb-[40rpx]" <image class="boximg" :src="BGICON">
:src="BGICON"></image> </image>
<view class="!flex gap-[16rpx] items-center !mt-[56rpx] !ml-[16rpx] relative z-10"> <view class="hi-box">
<image class="!w-[68rpx] !h-[68rpx]" src="/static/icons/hi.png"></image> <image class="hi" src="/static/icons/hi.png"></image>
<view class="title">欢迎登录系统</view> <view class="title">欢迎登录系统</view>
</view> </view>
<BulletChat></BulletChat> <BulletChat></BulletChat>
</view> </view>
<view class="h-full bg-white !-mt-[20rpx] rounded-t-[20rpx] relative z-10"> <view class="form">
<tui-tabs class="!mx-auto !mb-[40rpx]" :tabs="tabs" :currentTab="currentTab" itemWidth="50%" <tui-tabs class="tabs" :tabs="tabs" :currentTab="currentTab" itemWidth="50%"
@change="({ index }) => currentTab = index" :width="300" :sliderWidth="130"></tui-tabs> @change="({ index }) => currentTab = index" :width="300" :sliderWidth="130"></tui-tabs>
<PhoneLogin v-if="currentTab === 0"></PhoneLogin> <PhoneLogin v-if="currentTab === 0"></PhoneLogin>
@@ -52,13 +52,32 @@ onLoad((options) => {
<w-x-official-account v-model:show="showWX"></w-x-official-account> <w-x-official-account v-model:show="showWX"></w-x-official-account>
</template> </template>
<style lang="scss"> <style lang="scss" scoped>
page { .tabs {
@apply mx-auto mb-[40rpx];
}
.form {
@apply h-full -mt-[20rpx] rounded-t-[20rpx] relative z-10;
background-color: #fff; background-color: #fff;
} }
</style>
<style lang="scss" scoped> .boximg {
@apply absolute left-1/2 top-1/2 -translate-1/2 w-[1198rpx] h-[806rpx] pb-[40rpx];
}
.box {
@apply h-[390rpx] relative overflow-hidden;
}
.hi-box {
@apply flex gap-[16rpx] items-center mt-[56rpx] ml-[16rpx] relative z-10;
}
.hi {
@apply w-[68rpx] h-[68rpx];
}
.title { .title {
color: rgb(29, 33, 41); color: rgb(29, 33, 41);
font-size: 26px; font-size: 26px;
@@ -68,3 +87,9 @@ page {
text-align: left; text-align: left;
} }
</style> </style>
<style lang="scss">
page {
background-color: #fff;
}
</style>

View File

@@ -40,7 +40,7 @@ const UserStore = useUserStore();
</view> </view>
<view class="btm h-[50vh] !flex flex-col items-center px-[40rpx] !mx-[20rpx]"> <view class="btm h-[50vh] !flex flex-col items-center px-[40rpx] !mx-[20rpx]">
<image class="!w-[300rpx] !mt-[40rpx] !mb-[40rpx]" mode="widthFix" :src="BDH"></image> <image class="!w-[300rpx] !mt-[40rpx] !mb-[40rpx] flex-shrink-0" mode="widthFix" :src="BDH"></image>
<view class="!flex items-center bg-[#fff] p-[28rpx] w-full rounded-[16rpx] gap-[28rpx]"> <view class="!flex items-center bg-[#fff] p-[28rpx] w-full rounded-[16rpx] gap-[28rpx]">
<image class="!size-[70rpx]" mode="aspectFill" :src="BD1"></image> <image class="!size-[70rpx]" mode="aspectFill" :src="BD1"></image>
<view> <view>
@@ -87,3 +87,11 @@ const UserStore = useUserStore();
margin-bottom: calc(24rpx + env(safe-area-inset-bottom)); margin-bottom: calc(24rpx + env(safe-area-inset-bottom));
} }
</style> </style>
<style>
#app {
width: 100%;
height: auto;
aspect-ratio: 1 / 2.1;
}
</style>

View File

@@ -85,18 +85,14 @@ onShow(() => {
<!--我的任务--> <!--我的任务-->
<XNav :show-back="false"></XNav> <XNav :show-back="false"></XNav>
<x-filter <x-filter v-model:model="po" @init="() => {
v-model:model="po"
@init="() => {
po.cid = 0; po.cid = 0;
po.pid = 0; po.pid = 0;
po.is_settlement = 0; po.is_settlement = 0;
po.status = 1; po.status = 1;
po.start_time = dayjs().subtract(1, 'month').format('YYYY-MM-DD'); po.start_time = dayjs().subtract(1, 'month').format('YYYY-MM-DD');
po.end_time = dayjs().format('YYYY-MM-DD'); po.end_time = dayjs().format('YYYY-MM-DD');
}" }" @success="initFetchData" v-model:visible="showFilter">
@success="initFetchData"
v-model:visible="showFilter">
<x-filter-item label="任务类型"> <x-filter-item label="任务类型">
<x-radio-group v-model:model-value="po.cid"> <x-radio-group v-model:model-value="po.cid">
<view class="!grid grid-cols-4 gap-[24rpx]"> <view class="!grid grid-cols-4 gap-[24rpx]">
@@ -121,17 +117,12 @@ onShow(() => {
</x-radio-group> </x-radio-group>
</x-filter-item> </x-filter-item>
<x-filter-item label="选择时间段"> <x-filter-item label="选择时间段">
<x-date-range <x-date-range v-model:end-time="po.end_time" v-model:start-time="po.start_time">
v-model:end-time="po.end_time"
v-model:start-time="po.start_time">
</x-date-range> </x-date-range>
</x-filter-item> </x-filter-item>
</x-filter> </x-filter>
<scroll-view <scroll-view @refresherpulling="initFetchData()" @scrolltolower="pagination.page++" class="h-[calc(100vh-200rpx)]"
@refresherpulling="initFetchData()"
@scrolltolower="pagination.current++"
class="h-[calc(100vh-200rpx)]"
scroll-y> scroll-y>
<view class="relative"> <view class="relative">
<view class="!w-full !h-[414rpx] bg-[var(--primary-color)] bor-b-r !absolute"> <view class="!w-full !h-[414rpx] bg-[var(--primary-color)] bor-b-r !absolute">
@@ -142,8 +133,7 @@ onShow(() => {
<view class="!w-full text-center !flex justify-center items-center">全部平台</view> <view class="!w-full text-center !flex justify-center items-center">全部平台</view>
<view class="!w-full text-center !flex justify-center items-center">全部状态</view> <view class="!w-full text-center !flex justify-center items-center">全部状态</view>
<view class="!w-full text-center !flex justify-center items-center"> <view class="!w-full text-center !flex justify-center items-center">
<view <view @click="showFilter = true"
@click="showFilter=true"
class="!flex items-center justify-center gap-[10rpx] !py-[10rpx] !px-[30rpx] bg-[#0E42D2] rounded-[8rpx]"> class="!flex items-center justify-center gap-[10rpx] !py-[10rpx] !px-[30rpx] bg-[#0E42D2] rounded-[8rpx]">
<image class="!w-[22rpx] !h-[22rpx]" :src="filer"></image> <image class="!w-[22rpx] !h-[22rpx]" :src="filer"></image>
筛选 筛选
@@ -205,9 +195,7 @@ onShow(() => {
</view> </view>
<view class="!grid grid-cols-4 gap-[20rpx] !px-[20rpx] bg-[#F2F3F5] py-[20rpx]"> <view class="!grid grid-cols-4 gap-[20rpx] !px-[20rpx] bg-[#F2F3F5] py-[20rpx]">
<view <view v-for="(item, index) in tabs" @click="changeCurrent(item)"
v-for="(item, index) in tabs"
@click="changeCurrent(item)"
:class="['rounded-full bg-[#fff] text-center !py-[8rpx] !text-[13px] duration-500', po.status === item.value ? 'current' : '', vo[`count${index + 1}`] > 0 ? 'badge' : '']"> :class="['rounded-full bg-[#fff] text-center !py-[8rpx] !text-[13px] duration-500', po.status === item.value ? 'current' : '', vo[`count${index + 1}`] > 0 ? 'badge' : '']">
{{ item.name }} {{ item.name }}
</view> </view>

View File

@@ -1,11 +1,22 @@
<script setup> <script setup>
import { onShow } from "@dcloudio/uni-app";
import ICON from "../../static/images/wxweb.png"; import ICON from "../../static/images/wxweb.png";
onShow(() => {
const ua = navigator.userAgent.toLowerCase();
if (ua.indexOf("micromessenger") === -1) {
toPage('/pages/home/index');
}
});
</script> </script>
<template> <template>
<image :src="ICON" mode="aspectFill" class="!w-full !h-screen"></image> <image :src="ICON" mode="aspectFill" class="!w-full !h-screen max-image"></image>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
.max-image {
width: 100%;
height: 100vh;
}
</style> </style>

View File

@@ -23,9 +23,7 @@ const list = computed(() => data.children.material[current.value].comment?.flatM
<template> <template>
<!--领取素材--> <!--领取素材-->
<view class="!flex gap-[24rpx] !mb-[28rpx]"> <view class="!flex gap-[24rpx] !mb-[28rpx]">
<view <view v-for="(item, index) in data.children.material" @click="current = index"
v-for="(item,index) in data.children.material"
@click="current=index"
:class="['tab-item', index === current ? 'cur' : '']"> :class="['tab-item', index === current ? 'cur' : '']">
素材{{ index + 1 }} 素材{{ index + 1 }}
</view> </view>
@@ -85,13 +83,10 @@ const list = computed(() => data.children.material[current.value].comment?.flatM
</view> </view>
<view class="!flex gap-[20rpx] flex-wrap !my-[10rpx]"> <view class="!flex gap-[20rpx] flex-wrap !my-[10rpx]">
<view class="!w-[96rpx] !h-[96rpx] !aspect-square" v-for="k in v.image_arr"> <view class="!w-[96rpx] !h-[96rpx] !aspect-square" v-for="k in v.image_arr">
<x-image <x-image :style="{
:style="{
width: '96rpx', width: '96rpx',
height: '96rpx', height: '96rpx',
}" }" :src="k" :list="v.image_arr">
:src="k"
:list="v.image_arr">
</x-image> </x-image>
</view> </view>
</view> </view>
@@ -143,6 +138,7 @@ const list = computed(() => data.children.material[current.value].comment?.flatM
font-weight: 500; font-weight: 500;
line-height: 140%; line-height: 140%;
letter-spacing: 0; letter-spacing: 0;
white-space: pre-line;
} }
} }
</style> </style>

View File

@@ -181,13 +181,8 @@ const scroll = ({detail: {scrollTop}}) => {
<x-notice-bar v-if="details.banner" :text="[details.banner]"></x-notice-bar> <x-notice-bar v-if="details.banner" :text="[details.banner]"></x-notice-bar>
<left-menu v-show="showMenu" :tabs="menuTabs" @top="topTop" @setScroll="setScroll"></left-menu> <left-menu v-show="showMenu" :tabs="menuTabs" @top="topTop" @setScroll="setScroll"></left-menu>
<scroll-view <scroll-view scroll-y @scroll="scroll" scroll-with-animation :scroll-top="scrollState.top"
scroll-y class="h-[calc(100vh-180rpx)]" v-if="details">
@scroll="scroll"
scroll-with-animation
:scroll-top="scrollState.top"
class="h-[calc(100vh-180rpx)]"
v-if="details">
<view class="!p-[20rpx] !flex flex-col gap-[20rpx] box-border"> <view class="!p-[20rpx] !flex flex-col gap-[20rpx] box-border">
<view id="taskHeader" class="rounded-[16rpx] !p-[24rpx] bg-[#fff] !flex flex-col gap-[20rpx]"> <view id="taskHeader" class="rounded-[16rpx] !p-[24rpx] bg-[#fff] !flex flex-col gap-[20rpx]">
<view class="!flex gap-[30rpx]"> <view class="!flex gap-[30rpx]">
@@ -210,8 +205,7 @@ const scroll = ({detail: {scrollTop}}) => {
</view> </view>
</view> </view>
<view <view v-if="!home && details.is_use !== 0"
v-if="!home && details.is_use !== 0"
class="bg-[#F7F8FA] px-[28rpx] py-[16rpx] rounded-[8rpx] !flex justify-around" class="bg-[#F7F8FA] px-[28rpx] py-[16rpx] rounded-[8rpx] !flex justify-around"
style="font-size: 24rpx"> style="font-size: 24rpx">
<view>发布账号</view> <view>发布账号</view>
@@ -256,9 +250,7 @@ const scroll = ({detail: {scrollTop}}) => {
<view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center"> <view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center">
<view class="text-[#4E5969] test-24r !flex items-center gap-[5px]"> <view class="text-[#4E5969] test-24r !flex items-center gap-[5px]">
安全评分: 安全评分:
<x-prompt <x-prompt info="由该任务或类似任务的历史禁言率、素材是否绿色决定。分值越高,说明完成任务对账号影响最小" title="分值说明">
info="由该任务或类似任务的历史禁言率、素材是否绿色决定。分值越高,说明完成任务对账号影响最小"
title="分值说明">
</x-prompt> </x-prompt>
</view> </view>
<view class="!flex items-center gap-[5px]"> <view class="!flex items-center gap-[5px]">
@@ -269,9 +261,7 @@ const scroll = ({detail: {scrollTop}}) => {
<view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center"> <view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center">
<view class="text-[#4E5969] test-24r !flex items-center gap-[5px]"> <view class="text-[#4E5969] test-24r !flex items-center gap-[5px]">
耗时评分: 耗时评分:
<x-prompt <x-prompt info="由该任务完整完成所需要的时间和操作步骤决定。分值越高,说明完成任务越简单" title="分值说明">
info="由该任务完整完成所需要的时间和操作步骤决定。分值越高,说明完成任务越简单"
title="分值说明">
</x-prompt> </x-prompt>
</view> </view>
<view class="!flex items-center gap-[5px]"> <view class="!flex items-center gap-[5px]">
@@ -283,12 +273,8 @@ const scroll = ({detail: {scrollTop}}) => {
</view> </view>
<view id="mainDetailBox" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden"> <view id="mainDetailBox" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden">
<tui-tabs <tui-tabs v-if="mainDetailWidth && (!home && details.is_use !== 0)" :tabs="tabs"
v-if="mainDetailWidth && (!home && details.is_use !== 0)" :currentTab="currentTabs" :width="mainDetailWidth" @change="({ index }) => currentTabs = index">
:tabs="tabs"
:currentTab="currentTabs"
:width="mainDetailWidth"
@change="({index})=>currentTabs=index">
</tui-tabs> </tui-tabs>
<view :style="{ padding: currentTabs === 3 ? '0' : '24rpx' }"> <view :style="{ padding: currentTabs === 3 ? '0' : '24rpx' }">
@@ -349,10 +335,9 @@ const scroll = ({detail: {scrollTop}}) => {
v-if="details.special_images_arr.length || details.special_text?.length > 0"> v-if="details.special_images_arr.length || details.special_text?.length > 0">
<view class="block-title">特殊要求:</view> <view class="block-title">特殊要求:</view>
<view class="block-info gap-[20rpx]"> <view class="block-info gap-[20rpx]">
<view>{{ details.special_text }}</view> <view style="white-space: pre-line;">{{ details.special_text }}</view>
<view class="!grid grid-cols-3 !mt-[12rpx]"> <view class="!grid grid-cols-3 !mt-[12rpx]">
<x-square-carousel-image <x-square-carousel-image v-if="details.special_images_arr.length > 0"
v-if="details.special_images_arr.length > 0"
:list="details.special_images_arr"> :list="details.special_images_arr">
</x-square-carousel-image> </x-square-carousel-image>
</view> </view>
@@ -372,10 +357,7 @@ const scroll = ({detail: {scrollTop}}) => {
<view class="title"> <view class="title">
回填要求 回填要求
</view> </view>
<view <view v-for="(v, index) in details.task_content" :key="v.id" class="block flex-col">
v-for="(v,index) in details.task_content"
:key="v.id"
class="block flex-col">
<view class="block-title">{{ index + 1 }}次回填:</view> <view class="block-title">{{ index + 1 }}次回填:</view>
<view class="block-info !flex w-full"> <view class="block-info !flex w-full">
<view <view
@@ -387,9 +369,7 @@ const scroll = ({detail: {scrollTop}}) => {
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow"> class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow">
{{ v.content }} {{ v.content }}
<view class="!inline-block"> <view class="!inline-block">
<x-image <x-image :src="v.ts_images_arr[0]" :list="v.ts_images_arr">
:src="v.ts_images_arr[0]"
:list="v.ts_images_arr">
<image class="!size-[24rpx]" :src="ICON" mode="aspectFill"></image> <image class="!size-[24rpx]" :src="ICON" mode="aspectFill"></image>
</x-image> </x-image>
</view> </view>
@@ -429,8 +409,7 @@ const scroll = ({detail: {scrollTop}}) => {
<view class="block-title !w-[300rpx]">每次回填将在该时间内审核:</view> <view class="block-title !w-[300rpx]">每次回填将在该时间内审核:</view>
<view class="block-info"> <view class="block-info">
{{ details.check_time }} {{ details.check_type === 1 ? '分钟' : '小时' }} {{ details.check_time }} {{ details.check_type === 1 ? '分钟' : '小时' }}
<x-prompt <x-prompt title="审核时间说明"
title="审核时间说明"
:info="`回填后,我们将于${details.check_time}${details.check_type === 1 ? '分钟' : '小时'}内完成审核,超时自动通过`"> :info="`回填后,我们将于${details.check_time}${details.check_type === 1 ? '分钟' : '小时'}内完成审核,超时自动通过`">
</x-prompt> </x-prompt>
</view> </view>
@@ -479,10 +458,7 @@ const scroll = ({detail: {scrollTop}}) => {
<view class="title"> <view class="title">
扣款说明 扣款说明
</view> </view>
<view <view v-for="(v, index) in details.settlement" :key="v.id" class="block !flex !gap-0">
v-for="(v, index) in details.settlement"
:key="v.id"
class="block !flex !gap-0">
<view <view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]"> class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]">
{{ index + 1 }}. {{ index + 1 }}.
@@ -512,8 +488,7 @@ const scroll = ({detail: {scrollTop}}) => {
{{ v.intro }} {{ v.intro }}
</view> </view>
</view> </view>
<x-prompt title="信用分说明" <x-prompt title="信用分说明" info="扣除信用分,将影响您后续接任务以及提现。请按约定完成任务。请在接受任务前认真阅读各要求,有能力完成再接受。">
info="扣除信用分,将影响您后续接任务以及提现。请按约定完成任务。请在接受任务前认真阅读各要求,有能力完成再接受。">
<template #button> <template #button>
<view <view
class="py-[7rpx] px-[32rpx] rounded-full text-[var(--primary-color)] bg-[#E8F3FF] w-fit"> class="py-[7rpx] px-[32rpx] rounded-full text-[var(--primary-color)] bg-[#E8F3FF] w-fit">
@@ -531,8 +506,7 @@ const scroll = ({detail: {scrollTop}}) => {
</view> </view>
</accept-assignment-modal> </accept-assignment-modal>
<view <view v-else
v-else
class="bg-[#94BFFF] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center"> class="bg-[#94BFFF] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center">
已接受 已接受
</view> </view>
@@ -540,12 +514,7 @@ const scroll = ({detail: {scrollTop}}) => {
</view> </view>
</scroll-view> </scroll-view>
<x-confirm-modal <x-confirm-modal title="注意" width="500rpx" v-bind="$attrs" :cancel="false" confirm-text="知道了"
title="注意"
width="500rpx"
v-bind="$attrs"
:cancel="false"
confirm-text="知道了"
v-model:show="showInitModal"> v-model:show="showInitModal">
<template #info> <template #info>
<view class="text-[22rpx]"> <view class="text-[22rpx]">

View File

@@ -40,7 +40,7 @@ const {loading, pagination, initFetchData, fetchData} = useTableQuery({
<scroll-view <scroll-view
scroll-y scroll-y
@refresherpulling="initFetchData()" @refresherpulling="initFetchData()"
@scrolltolower="pagination.current++" @scrolltolower="pagination.page++"
class="p-[20rpx] h-[calc(100vh-100rpx)]"> class="p-[20rpx] h-[calc(100vh-100rpx)]">
<view class="!flex flex-col gap-[20rpx]"> <view class="!flex flex-col gap-[20rpx]">
<view class="bg-[var(--primary-color)] p-[32rpx] rounded-[12rpx] !flex items-center"> <view class="bg-[var(--primary-color)] p-[32rpx] rounded-[12rpx] !flex items-center">

View File

@@ -28,13 +28,12 @@ request.interceptors.request.use(
(config) => { (config) => {
const {token} = useUserStore(); const {token} = useUserStore();
console.log('看看token在不在', token)
// 如果 token 存在,则将其添加到请求头中 // 如果 token 存在,则将其添加到请求头中
if (token) { if (token) {
config.headers['Access-Token'] = token; config.headers['Access-Token'] = token;
} }
console.log(`请求拦截器1${config.url}`, config); // console.log(`请求拦截器1${config.url}`, config);
console.log(`请求拦截器2${config.url}`, config.data); console.log(`请求拦截器2${config.url}`, config.data);
if (!config.UN_AES) { if (!config.UN_AES) {