update
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -176,6 +176,13 @@
|
|||||||
"navigationBarTitleText": "新增帐号",
|
"navigationBarTitleText": "新增帐号",
|
||||||
"navigationStyle": "custom"
|
"navigationStyle": "custom"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/complaint/index",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "投诉邀请人",
|
||||||
|
"navigationStyle": "custom"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// #endif
|
// #endif
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
72
src/pages/complaint/index.vue
Normal file
72
src/pages/complaint/index.vue
Normal 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>
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user