This commit is contained in:
2025-06-17 21:34:52 +08:00
parent 021918e56d
commit 2e8617147c
9 changed files with 153 additions and 30 deletions

View File

@@ -376,6 +376,13 @@ const system = {
data: data data: data
}); });
}, },
complaint: async (data) => {
return request({
method: MethodsENUM.POST,
url: "/user/complaint",
data: data
});
},
} }
export default system; export default system;

View File

@@ -9,7 +9,8 @@ const {label} = defineProps({
<template> <template>
<view class="x-form-item"> <view class="x-form-item">
<view class="!mb-[8rpx] x-form-item-label" v-if="label">{{ label }}</view> <view class="!mb-[8rpx] x-form-item-label" v-if="!$slots.label && label">{{ label }}</view>
<slot name="label" v-else></slot>
<slot></slot> <slot></slot>
</view> </view>
</template> </template>

View File

@@ -176,6 +176,13 @@
"navigationBarTitleText": "新增帐号", "navigationBarTitleText": "新增帐号",
"navigationStyle": "custom" "navigationStyle": "custom"
} }
},
{
"path": "pages/complaint/index",
"style": {
"navigationBarTitleText": "投诉邀请人",
"navigationStyle": "custom"
}
} }
// #endif // #endif
], ],

View File

@@ -5,7 +5,7 @@ import SQ from '../../static/icons/搜索.png';
import XNav from "../../components/XNav.vue"; import XNav from "../../components/XNav.vue";
import filer from "../../static/icons/filer-balck.png"; import filer from "../../static/icons/filer-balck.png";
import XFilter from "../../components/XFilter.vue"; import XFilter from "../../components/XFilter.vue";
import {reactive, ref} from "vue"; import {reactive, ref, watch} from "vue";
import XFilterItem from "../../components/XFilterItem.vue"; import XFilterItem from "../../components/XFilterItem.vue";
import XRadioGroup from "../../components/XRadioGroup.vue"; import XRadioGroup from "../../components/XRadioGroup.vue";
import XRadio from "../../components/XRadio.vue"; import XRadio from "../../components/XRadio.vue";
@@ -15,10 +15,16 @@ import Api from "../../api/index.js";
const isVague = ref(false); const isVague = ref(false);
const showFilter = ref(false); const showFilter = ref(false);
const isSearch = ref(false); const isSearch = ref(false);
const po = reactive({}); const po = reactive({
const vo = reactive({}); status: 0,
const sumPo = reactive({ keyword: null,
type: 0, type: 0,
order: 0,
});
const vo = reactive({
income: 0,
reward: 0,
total: 0,
}); });
const {loading, pagination, initFetchData} = useTableQuery({ const {loading, pagination, initFetchData} = useTableQuery({
@@ -28,6 +34,17 @@ const {loading, pagination, initFetchData} = useTableQuery({
Object.assign(vo, data); Object.assign(vo, data);
} }
}); });
watch(
() => po.status,
() => initFetchData(),
{deep: true}
)
const handleSeach = async () => {
if (po.keyword === null || po.keyword === "") isSearch.value = false;
await initFetchData();
}
</script> </script>
<template> <template>
@@ -35,10 +52,11 @@ const {loading, pagination, initFetchData} = useTableQuery({
<x-nav></x-nav> <x-nav></x-nav>
<x-filter <x-filter
v-model:model="sumPo" v-model:model="po"
@success="initFetchData"
v-model:visible="showFilter"> v-model:visible="showFilter">
<x-filter-item label="成员类型"> <x-filter-item label="成员类型">
<x-radio-group v-model:model-value="sumPo.type"> <x-radio-group v-model:model-value="po.type">
<view class="!grid grid-cols-3 gap-[24rpx]"> <view class="!grid grid-cols-3 gap-[24rpx]">
<x-radio :value="0">我邀请的</x-radio> <x-radio :value="0">我邀请的</x-radio>
<x-radio :value="1">他人邀请的</x-radio> <x-radio :value="1">他人邀请的</x-radio>
@@ -46,7 +64,7 @@ const {loading, pagination, initFetchData} = useTableQuery({
</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="po.order">
<view class="!grid grid-cols-3 gap-[24rpx]"> <view class="!grid grid-cols-3 gap-[24rpx]">
<x-radio :value="0">按收益</x-radio> <x-radio :value="0">按收益</x-radio>
<x-radio :value="1">加入时间正序</x-radio> <x-radio :value="1">加入时间正序</x-radio>
@@ -70,28 +88,28 @@ const {loading, pagination, initFetchData} = useTableQuery({
<view class="!mx-[20rpx] bg-[#fff] rounded-[20rpx] !mt-[20rpx]"> <view class="!mx-[20rpx] bg-[#fff] rounded-[20rpx] !mt-[20rpx]">
<view class="balance-card"> <view class="balance-card">
<view class="p-[24rpx] !flex items-center gap-[20rpx]"> <view class="p-[24rpx] !flex items-center gap-[20rpx]">
<view class="radio radio-cur">今天</view> <view :class="['radio', po.status===1?'radio-cur':'']" @click="po.status=1">今天</view>
<view class="radio">昨天</view> <view :class="['radio', po.status===2?'radio-cur':'']" @click="po.status=2">昨天</view>
<view class="radio">累计</view> <view :class="['radio', po.status===0?'radio-cur':'']" @click="po.status=0">累计</view>
</view> </view>
<view class="gap-line"></view> <view class="gap-line"></view>
<view class="py-[52rpx] px-[44rpx] !grid grid-cols-3"> <view class="py-[52rpx] px-[44rpx] !grid grid-cols-3">
<view> <view>
<view class="info-title">新增成员()</view> <view class="info-title">新增成员()</view>
<view class="info-balance"> <view class="info-balance">
4 {{ vo.total }}
</view> </view>
</view> </view>
<view> <view>
<view class="info-title">团队收益()</view> <view class="info-title">团队收益()</view>
<view class="info-balance"> <view class="info-balance">
15.64 {{ vo.income.toFixed(2) }}
</view> </view>
</view> </view>
<view> <view>
<view class="info-title">团队奖励()</view> <view class="info-title">团队奖励()</view>
<view class="info-balance"> <view class="info-balance">
5.60 {{ vo.reward.toFixed(2) }}
</view> </view>
</view> </view>
</view> </view>
@@ -108,7 +126,7 @@ const {loading, pagination, initFetchData} = useTableQuery({
<view :class="['btn', isSearch?'search':'']" @click="isSearch=true"> <view :class="['btn', isSearch?'search':'']" @click="isSearch=true">
<image class="!size-[28rpx] flex-shrink-0" mode="aspectFill" :src="SQ"></image> <image class="!size-[28rpx] flex-shrink-0" mode="aspectFill" :src="SQ"></image>
<text v-if="!isSearch">搜索</text> <text v-if="!isSearch">搜索</text>
<input @blur="isSearch=false" v-else></input> <input v-model="po.keyword" @blur="handleSeach" v-else></input>
</view> </view>
</view> </view>

View File

@@ -0,0 +1,72 @@
<script setup>
import XNav from "../../components/XNav.vue";
import XForm from "../../components/XForm.vue";
import XFormItem from "../../components/XFormItem.vue";
import XUpload from "../../components/XUpload.vue";
import XInput from "../../components/XInput.vue";
import Api from "../../api";
import {reactive} from "vue";
import {backPage, showToast} from "../../utils/uils";
const form = reactive({
content: null,
images: [],
mobile: null,
});
const success = async () => {
const {msg} = await Api.system.complaint(form);
showToast(msg);
backPage();
}
</script>
<template>
<x-nav></x-nav>
<view class="p-[20rpx]">
<x-form>
<x-form-item>
<template v-slot:label>
<view class="!flex items-center gap-[12rpx]">
<text class="!mt-[10rpx] text-[red]">*</text>
投诉内容
</view>
</template>
<view class="bg-[#F2F3F5] rounded-[8rpx] overflow-hidden px-[24rpx] py-[8rpx] relative">
<textarea
v-model="form.content"
class="!w-full !h-[400rpx]"
placeholder="请填写你想投诉的问题,以便我们提供更好的帮助">
</textarea>
<view class="absolute right-[24rpx] z-10 bottom-[8rpx] text-[#86909C]">22/200</view>
</view>
</x-form-item>
<x-form-item label="相关截图">
<x-upload v-model:files="form.images"></x-upload>
</x-form-item>
<x-form-item label="联系方式">
<template v-slot:label>
<view class="!flex items-center gap-[12rpx]">
<text class="!mt-[10rpx] text-[red]">*</text>
联系方式
</view>
</template>
<x-input v-model:model-value="form.mobile" placeholder="手机号或微信号"></x-input>
</x-form-item>
</x-form>
<view class="fixed bottom-[24rpx] w-[calc(100vw-40rpx)]">
<tui-button @click="success">确定提交</tui-button>
</view>
</view>
</template>
<style>
page {
background-color: #fff;
}
</style>
<style scoped lang="scss">
</style>

View File

@@ -1,7 +1,7 @@
<script setup> <script setup>
import filer from '../../static/icons/filer.png'; import filer from '../../static/icons/filer.png';
import XNav from "../../components/XNav.vue"; import XNav from "../../components/XNav.vue";
import {reactive, ref} from "vue"; import {reactive, ref, computed} from "vue";
import TaskCard from "../../components/TaskCard.vue"; import TaskCard from "../../components/TaskCard.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";
@@ -14,24 +14,28 @@ import XAlert from "../../components/XAlert.vue";
const taskType = reactive([]); const taskType = reactive([]);
const platformType = reactive([]); const platformType = reactive([]);
const tabs = [ const tabs = computed(() => [
{ {
name: '进行中', name: '进行中',
value: 1, value: 1,
isTag: 0,
}, },
{ {
name: '审核中', name: '审核中',
value: 2, value: 2,
isTag: 0,
}, },
{ {
name: '已失效', name: '已失效',
value: -1, value: -1,
isTag: 0,
}, },
{ {
name: '已完成', name: '已完成',
value: 3, value: 3,
isTag: 0,
}, },
]; ]);
const showFilter = ref(false); const showFilter = ref(false);
const po = reactive({ const po = reactive({
status: 1, status: 1,
@@ -183,9 +187,9 @@ const changeCurrent = async (item) => {
<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 in tabs" v-for="(item, index) in tabs"
@click="changeCurrent(item)" @click="changeCurrent(item)"
:class="['rounded-full bg-[#fff] text-center !py-[8rpx] !text-[13px] duration-500', po.status===item.value ? 'current' : '']"> :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> </view>
@@ -205,6 +209,22 @@ const changeCurrent = async (item) => {
color: #fff; color: #fff;
} }
.badge {
@apply relative;
}
.badge::before {
content: '';
display: block;
width: 15rpx;
height: 15rpx;
background-color: red;
position: absolute;
right: 0;
top: 0;
border-radius: 50%;
}
.block-value { .block-value {
color: rgb(22, 93, 255); color: rgb(22, 93, 255);
font-size: 40rpx; font-size: 40rpx;

View File

@@ -1,7 +1,7 @@
<script setup> <script setup>
import goodsIcon from '../../static/icons/goodsIcon.png'; import goodsIcon from '../../static/icons/goodsIcon.png';
import XNav from "../../components/XNav.vue"; import XNav from "../../components/XNav.vue";
import {defineAsyncComponent, getCurrentInstance, nextTick, onMounted, reactive, ref} from 'vue'; import {defineAsyncComponent, getCurrentInstance, nextTick, onMounted, computed, ref} from 'vue';
import {onLoad} from "@dcloudio/uni-app"; import {onLoad} from "@dcloudio/uni-app";
import XLink from "../../components/XLink.vue"; import XLink from "../../components/XLink.vue";
import XNoticeBar from "../../components/XNoticeBar.vue"; import XNoticeBar from "../../components/XNoticeBar.vue";
@@ -27,7 +27,7 @@ const details = ref(null);
const home = ref(false); const home = ref(false);
const mainDetailWidth = ref(0); const mainDetailWidth = ref(0);
const currentTabs = ref(0); const currentTabs = ref(0);
const tabs = reactive([ const tabs = computed(() => [
{ {
name: "任务详情", name: "任务详情",
component: TaskDetails, component: TaskDetails,
@@ -39,10 +39,12 @@ const tabs = reactive([
{ {
name: "我的回填", name: "我的回填",
component: MyBackfill, component: MyBackfill,
isDot: details.value.children.is_back > 0,
}, },
{ {
name: "审核沟通", name: "审核沟通",
component: ReviewCommunication, component: ReviewCommunication,
isDot: details.value.children.is_read > 0,
}, },
]); ]);

View File

@@ -1,6 +1,7 @@
<script setup> <script setup>
import {onMounted, reactive} from "vue"; import {onMounted, reactive} from "vue";
import Api from "../../../api/index.js"; import Api from "../../../api/index.js";
import {copy, toPage} from "../../../utils/uils.js";
const detail = reactive({}); const detail = reactive({});
@@ -9,12 +10,6 @@ onMounted(() => {
Object.assign(detail, data); Object.assign(detail, data);
}); });
}); });
const callPhone = () => {
uni.makePhoneCall({
phoneNumber: detail.mobile,
});
}
</script> </script>
<template> <template>
@@ -23,11 +18,12 @@ const callPhone = () => {
<view class="test-24r !ml-[24rpx]">{{ detail.nickname }}</view> <view class="test-24r !ml-[24rpx]">{{ detail.nickname }}</view>
<view <view
@click="callPhone" @click="copy(detail.wechat)"
class="px-[20rpx] py-[7rpx] test-22r text-[#fff] rounded-full bg-[var(--primary-color)] !flex items-center justify-center !ml-auto"> class="px-[20rpx] py-[7rpx] test-22r text-[#fff] rounded-full bg-[var(--primary-color)] !flex items-center justify-center !ml-auto">
联系TA 联系TA
</view> </view>
<view <view
@click="toPage('/pages/complaint/index')"
class="px-[20rpx] py-[7rpx] test-22r text-[#fff] rounded-full bg-[#C9CDD4] !flex items-center justify-center !ml-[20rpx]"> class="px-[20rpx] py-[7rpx] test-22r text-[#fff] rounded-full bg-[#C9CDD4] !flex items-center justify-center !ml-[20rpx]">
投诉 投诉
</view> </view>

View File

@@ -122,7 +122,7 @@ onMounted(() => {
<image class="!size-[40rpx]" mode="aspectFill" :src="ICON1"></image> <image class="!size-[40rpx]" mode="aspectFill" :src="ICON1"></image>
<view class="test-24r">提现记录</view> <view class="test-24r">提现记录</view>
</view> </view>
<view class="!flex items-center gap-[12rpx]" @click="toPage('/pages/changeLog/index')"> <view class="!flex items-center gap-[12rpx]" @click="toPage('/pages/walletLog/index')">
<image class="!size-[40rpx]" mode="aspectFill" :src="ICON2"></image> <image class="!size-[40rpx]" mode="aspectFill" :src="ICON2"></image>
<view class="test-24r">变动记录</view> <view class="test-24r">变动记录</view>
</view> </view>