This commit is contained in:
2025-05-12 19:45:27 +08:00
parent 2e9c403632
commit ce0587d2b6
47 changed files with 1355 additions and 310 deletions

View File

@@ -1,11 +1,172 @@
<script setup>
import DYICON from "../../static/icons/dy.png";
import KSICON from "../../static/icons/ks.png";
import SPHICON from "../../static/icons/sph.png";
import XHSICON from "../../static/icons/xhs.png";
import TTICON from "../../static/icons/tt.png";
import EDITICON from "../../static/icons/Edit.png";
import DELETEICON from "../../static/icons/Delete.png";
import PLUSICON from "../../static/icons/plus.png";
import XNav from "../../components/XNav.vue";
import XNoticeBar from "../../components/XNoticeBar.vue";
import {showToast, toPage} from "../../utils/uils.js";
import {onMounted, reactive} from "vue";
import Api from "../../api/index.js";
const BASE = [
{
id: 1,
name: '抖音',
icon: DYICON,
},
{
id: 2,
name: '快手',
icon: KSICON,
},
{
id: 3,
name: '小红书',
icon: XHSICON,
},
{
id: 4,
name: '视频号',
icon: SPHICON,
},
{
id: 5,
name: '今日头条',
icon: TTICON,
},
];
const list = reactive([]);
const dataList = reactive([]);
const po = reactive({
pid: null,
});
const getData = async () => {
const {data} = await Api.system.myAccount(po);
dataList.length = 0;
dataList.push(...data);
}
const changeTab = (pid) => {
po.pid = pid;
getData();
}
onMounted(() => {
Api.system.getPlatform().then(({data}) => {
data = data.filter(v => v.id !== 0);
list.length = 0;
data.forEach(v => {
BASE.forEach(k => {
if (v.id === k.id) {
list.push({
id: v.id,
name: v.name,
icon: k.icon,
});
}
})
})
po.pid = list[0].id;
getData();
})
})
const deleteItem = async (id) => {
const {msg} = await Api.system.delAccount(id);
showToast(msg);
await getData();
}
</script>
<template>
<!--账号管理-->
<x-nav></x-nav>
<x-notice-bar status="success" text="提示:左滑查看更多,点击可查看该平台所有的账号"></x-notice-bar>
<view class="p-[36rpx] bg-[#fff] !flex justify-around items-center">
<template v-for="(item, index) in list" :key="item.id">
<view class="!flex flex-col items-center" @click="changeTab(item.id)">
<image class="!size-[64rpx]" :src="item.icon"></image>
<view :class="['test-24r !mt-[10rpx]', po.pid === item.id ? 'cur' : '']">
{{
item.name
}}
</view>
</view>
<view class="!w-[1px] !h-[48rpx] bg-[#E5E6EB]" v-if="index <= list.length - 2"></view>
</template>
</view>
<view class="p-[20rpx] !flex flex-col gap-[20rpx]">
<view
@click="toPage('/pages/addAccount/index')"
class="py-[15rpx] bg-[#E8F3FF] text-[var(--primary-color)] !flex justify-center items-center gap-[10rpx] border border-[var(--primary-color)] rounded-[4rpx]">
<image :src="PLUSICON" class="!size-[26rpx] !mt-[2rpx]"></image>
新增帐号
</view>
<view
v-for="(v, index) in dataList"
:key="index"
class="p-[24rpx] bg-[#fff] rounded-[12rpx]">
<view class="!flex items-center justify-between">
<view>
<view class="test-28r">{{ v.nickname }}</view>
<view class="text-[#86909C] test-24r">{{ v.account }}</view>
</view>
<view class="px-[12rpx] py-[7rpx] test-24r success" v-if="v.status === 1">
{{ v.status_text }}
</view>
<view class="px-[12rpx] py-[7rpx] test-24r warn" v-else-if="v.status === 0 || v.status === 3">
{{ v.status_text }}
</view>
<view class="px-[12rpx] py-[7rpx] test-24r error" v-else>
{{ v.status_text }}
</view>
</view>
<view class="!w-full !h-[2rpx] bg-[#E5E6EB] !my-[20rpx]"></view>
<view class="!flex gap-[16rpx] items-center">
<image class="!size-[88rpx] image-bor rounded-[12rpx]" :src="v.homepage" mode="aspectFill"></image>
<image class="!size-[88rpx] image-bor rounded-[12rpx]" :src="v.qrcode" mode="aspectFill"></image>
<!---->
<image @click="toPage(`/pages/addAccount/index?id=${v.id}`)"
class="!size-[72rpx] rounded-[50%] overflow-hidden !ml-auto" :src="EDITICON"></image>
<image @click="deleteItem(v.id)" class="!size-[72rpx] rounded-[50%] overflow-hidden"
:src="DELETEICON"></image>
</view>
</view>
</view>
</template>
<style scoped>
<style lang="scss" scoped>
.cur {
color: var(--primary-color);
}
.success {
background-color: #E8FFEA;
color: #00B42A;
}
.warn {
background-color: #FFF7E8;
color: #FF7D00;
}
.error {
background-color: #FFECE8;
color: #F53F3F;
}
.image-bor {
border: 1px solid rgb(229, 230, 235);
}
</style>

View File

@@ -1,11 +1,88 @@
<script setup>
import XNav from "../../components/XNav.vue";
import XFormItem from "../../components/XFormItem.vue";
import XForm from "../../components/XForm.vue";
import XSelect from "../../components/XSelect.vue";
import Api from "../../api/index.js";
import XInput from "../../components/XInput.vue";
import XUpload from "../../components/XUpload.vue";
import {reactive} from "vue";
import {backPage, showToast} from "../../utils/uils.js";
import {onLoad} from "@dcloudio/uni-app";
const form = reactive({
status: null,
qrcode: [],
abnormaltime: null,
nickname: null,
account: null,
pid: null,
homepage: [],
});
const success = async () => {
if (!form.id) {
const {msg} = await Api.system.addAccount({
...form,
homepage: form.homepage[0],
qrcode: form.qrcode[0]
});
showToast(msg);
} else {
const {msg} = await Api.system.editAccount({
...form,
homepage: form.homepage[0],
qrcode: form.qrcode[0]
});
showToast(msg);
}
backPage();
}
onLoad((options) => {
const {id} = options;
Api.system.getAccountInfo(id).then(({data}) => {
data.homepage = [data.homepage];
data.qrcode = [data.qrcode];
Object.assign(form, data);
});
})
</script>
<template>
<!--添加账号-->
<x-nav></x-nav>
<view class="min-h-[calc(100vh-100rpx)] bg-[#fff] px-[30rpx] py-[25rpx]">
<x-form>
<x-form-item label="宣发平台">
<x-select v-model:model-value="form.pid" :api="Api.system.getPlatform"></x-select>
</x-form-item>
<x-form-item label="账号">
<x-input v-model:model-value="form.account" height="80rpx" placeholder="请输入帐号"></x-input>
</x-form-item>
<x-form-item label="昵称">
<x-input v-model:model-value="form.nickname" height="80rpx" placeholder="请输入昵称"></x-input>
</x-form-item>
<x-form-item label="账号状态">
<x-select v-model:model-value="form.status" :api="Api.system.getAccountStatus"></x-select>
</x-form-item>
<x-form-item label="主页截图">
<x-upload v-model:files="form.homepage"></x-upload>
</x-form-item>
<x-form-item label="主页二维码">
<x-upload v-model:files="form.qrcode"></x-upload>
</x-form-item>
</x-form>
<tui-button @click="success" class="!fixed bottom-[30rpx] left-0 !mx-[30rpx] !w-[calc(100vw-60rpx)]">确认提交
</tui-button>
</view>
</template>
<style scoped>
<style lang="scss">
.x-form-item-label {
font-size: 28rpx;
color: #4E5969 !important;
}
</style>

View File

@@ -1,45 +1,71 @@
<script setup>
import {ref, reactive} from "vue";
import {onMounted, reactive, ref} from "vue";
import XNav from "../../components/XNav.vue";
import videoMask from '../../static/images/video-mask.png';
import XVideoModal from "../../components/XVideoModal.vue";
import Api from "../../api/index.js";
import useTableQuery from "../../hooks/useTableQuery.js";
import OpenTypeFun from "../../components/OpenTypeFun.js";
const tabs = [
{
name: '发布问题',
value: 0,
},
{
name: '抖音问题',
value: 1,
},
{
name: '结算问题',
value: 2,
},
{
name: '提现问题',
value: 3,
},
];
const tab = ref(0);
const current = ref(0);
const tabs = reactive([]);
const advList = reactive([]);
const tab = ref(1);
const collapseCur = ref(0);
const dataList = reactive([
{
name: "杜甫",
intro: "杜甫的思想核心是儒家的仁政思想他有“致君尧舜上再使风俗淳”的宏伟抱负。杜甫虽然在世时名声并不显赫但后来声名远播对中国文学和日本文学都产生了深远的影响。杜甫共有约1500首诗歌被保留了下来大多集于《杜工部集》。"
},
{
name: "李清照",
intro: "李清照出生于书香门第,早期生活优裕,其父李格非藏书甚富,她小时候就在良好的家庭环境中打下文学基础。出嫁后与夫赵明诚共同致力于书画金石的搜集整理。金兵入据中原时,流寓南方,境遇孤苦。所作词,前期多写其悠闲生活,后期多悲叹身世,情调感伤。形式上善用白描手法,自辟途径,语言清丽。"
},
{
name: "鲁迅",
intro: "鲁迅一生在文学创作、文学批评、思想研究、文学史研究、翻译、美术理论引进、基础科学介绍和古籍校勘与研究等多个领域具有重大贡献。他对于五四运动以后的中国社会思想文化发展具有重大影响,蜚声世界文坛,尤其在韩国、日本思想文化领域有极其重要的地位和影响,被誉为“二十世纪东亚文化地图上占最大领土的作家”。"
const vo = reactive({
rows: [],
top: [],
page: 0,
total: 0,
});
const po = reactive({
category_id: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.getArticle,
immediate: false,
parameter: po,
callback: async (data) => {
const {data: top} = await Api.system.getTopArticle(po);
console.log('???LLLL', top);
Object.assign(vo, data);
vo.top = top;
}
]);
});
const getArticleCategory = async () => {
const {data} = await Api.system.getArticleCategory({
pid: tab.value
});
tabs.length = 0;
tabs.push(...data.map(v => ({
value: v.id,
name: v.name
})));
po.category_id = tabs[0].value;
await initFetchData();
}
const changeCategory = async (id) => {
tab.value = id;
await getArticleCategory();
}
const changeMinCategory = async (id) => {
po.category_id = id;
await initFetchData();
}
onMounted(() => {
getArticleCategory();
Api.system.getAdvList({
position: 3,
}).then(({data}) => {
advList.length = 0;
advList.push(...data);
});
})
</script>
<template>
@@ -48,42 +74,42 @@ const dataList = reactive([
<view class="box-border !p-[20rpx]">
<swiper class="!h-[240rpx] !w-full overflow-hidden rounded-[8rpx]">
<swiper-item class="!w-full !h-full" v-for="i in [1,2,3,4,5]">
<image class="!w-full !h-full" mode="widthFix" src="../../static/images/banner占位.png"></image>
<swiper-item class="!w-full !h-full" v-for="i in advList" :key="i.id">
<image @click="OpenTypeFun(i)" class="!w-full !h-full" mode="aspectFill" :src="i.file"></image>
</swiper-item>
</swiper>
</view>
<view class="!grid grid-cols-2 gap-[20rpx] !px-[20rpx]">
<view :class="['tab', tab===0 ? 'cur' : '']" @click="tab=0">
<view :class="['tab', tab===1 ? 'cur' : '']" @click="changeCategory(1)">
常见问题
</view>
<view :class="['tab', tab===1 ? 'cur' : '']" @click="tab=1">
<view :class="['tab', tab===2 ? 'cur' : '']" @click="changeCategory(2)">
基础教学
</view>
</view>
<view class="!mt-[20rpx] !px-[20rpx]">
<view class="!w-full bg-[#fff] rounded-[12rpx] pt-[30rpx] px-[20rpx]">
<template v-if="tab===0">
<template v-if="tab===1">
<view class="!grid grid-cols-4 gap-[20rpx]">
<view
v-for="item in tabs"
@click="current=item.value"
:class="['rounded-full bg-[#F2F3F5] text-center !py-[8rpx] !text-[13px] duration-500', current===item.value ? 'current' : '']">
@click="changeMinCategory(item.value)"
:class="['rounded-full bg-[#F2F3F5] text-center !py-[8rpx] !text-[13px] duration-500', po.category_id===item.value ? 'current' : '']">
{{ item.name }}
</view>
</view>
<view class="!mt-[28rpx]">
<template v-for="(item,index) in dataList" :key="index">
<view class="!pt-[28rpx]">
<template v-for="(item,index) in [...vo.top, ...vo.rows]" :key="index">
<tui-collapse :index="index" :current="collapseCur" :disabled="item.disabled"
@click="({index}) => collapseCur=index">
<template v-slot:title>
<tui-list-cell :hover="!item.disabled">{{ item.name }}</tui-list-cell>
<tui-list-cell :hover="!item.disabled">{{ item.title }}</tui-list-cell>
</template>
<template v-slot:content>
<view class="tui-content">{{ item.intro }}</view>
<view class="tui-content px-[16px] text-[#86909C]">{{ item.content }}</view>
</template>
</tui-collapse>
</template>
@@ -94,28 +120,30 @@ const dataList = reactive([
<view class="!grid grid-cols-4 gap-[20rpx]">
<view
v-for="item in tabs"
@click="current=item.value"
:class="['rounded-full bg-[#F2F3F5] text-center !py-[8rpx] !text-[13px] duration-500', current===item.value ? 'current' : '']">
@click="changeMinCategory(item.value)"
:class="['rounded-full bg-[#F2F3F5] text-center !py-[8rpx] !text-[13px] duration-500', po.category_id===item.value ? 'current' : '']">
{{ item.name }}
</view>
</view>
<view class="!mt-[28rpx]">
<template v-for="(item,index) in dataList" :key="index">
<x-video-modal>
<view
:class="['!flex gap-[16rpx] py-[28rpx] box-border', index<dataList.length-1 ? 'border-b' : '']">
<image class="!w-[148rpx] !h-[120rpx] rounded-[12rpx]" mode="aspectFill"
:src="videoMask"></image>
<view class="!pt-[28rpx]">
<template v-for="(item,index) in [...vo.top, ...vo.rows]" :key="index">
<view
@click="OpenTypeFun(item)"
:class="['!flex gap-[16rpx] py-[28rpx] box-border', index<vo.rows.length-1 ? 'border-b' : '']">
<image
class="!w-[148rpx] !h-[120rpx] rounded-[12rpx]"
mode="aspectFill"
:src="item.files && item.files[0] || videoMask">
</image>
<view class="!flex flex-col gap-[8rpx]">
<view class="title">掘金壁纸详细挂载教程新手必看</view>
<view class="info">
掘金壁纸详细挂载教程新手必看掘金壁纸详细挂载教程新手必看
</view>
<view class="!flex flex-col gap-[8rpx]">
<view class="title">{{ item.title }}</view>
<view class="info">
{{ item.content }}
</view>
</view>
</x-video-modal>
</view>
</template>
</view>
</template>

View File

@@ -6,15 +6,16 @@ import nav3 from '../../static/icons/icon-邀请好友.png';
import nav4 from '../../static/icons/icon-添加客服.png';
import nav5 from '../../static/icons/icon-重要消息.png';
import XDropdownList from "../../components/XDropdownList.vue";
import XDropdownItem from "../../components/XDropdownItem.vue";
import TaskItem from "../../components/TaskItem.vue";
import useTableQuery from "../../hooks/useTableQuery.js";
import Api from "../../api/index.js";
import {reactive, ref} from "vue";
import {reactive, ref, onMounted} from "vue";
import {toPage} from "../../utils/uils.js";
import AddCustomerServiceModal from "../../components/AddCustomerServiceModal.vue";
import OpenTypeFun from "../../components/OpenTypeFun.js";
const showAddCustomer = ref(false);
const advList = reactive([]);
const nav = [
{
title: '新手教学',
@@ -46,7 +47,30 @@ const nav = [
},
];
const taskType = reactive([]);
const platformType = reactive([]);
const sortType = reactive([
{id: 0, name: '默认排序'},
{id: 1, name: '价格最高'},
{id: 2, name: '极速打款'},
{id: 3, name: '素材安全'},
{id: 4, 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({
type: 0,
pid: 0,
order: 0,
});
const vo = reactive({
page: '',
@@ -55,14 +79,21 @@ const vo = reactive({
});
const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.getData,
api: Api.system.getTask,
parameter: po,
callback: (data) => {
vo.page = data.page;
vo.total = data.total;
vo.rows =[...vo.rows, ... data.rows];
Object.assign(vo, data);
}
});
onMounted(() => {
Api.system.getAdvList({
position: 1,
}).then(({data}) => {
advList.length = 0;
advList.push(...data);
});
})
</script>
<template>
@@ -73,7 +104,7 @@ const {loading, pagination, initFetchData} = useTableQuery({
<scroll-view
@refresherpulling="initFetchData()"
@scrolltolower="pagination.current++"
@scrolltolower="pagination.page++"
class="h-[calc(100vh-200rpx)]"
scroll-y>
<view class="relative overflow-hidden bg-b-r !pb-[34rpx]">
@@ -83,8 +114,8 @@ const {loading, pagination, initFetchData} = useTableQuery({
<view class="box-border !p-[20rpx]">
<swiper class="!h-[240rpx] !w-full overflow-hidden rounded-[8rpx]">
<swiper-item class="!w-full !h-full" v-for="i in [1,2,3,4,5]">
<image class="!w-full !h-full" mode="widthFix" src="../../static/images/banner占位.png"></image>
<swiper-item class="!w-full !h-full" v-for="i in advList">
<image @click="OpenTypeFun(i)" class="!w-full !h-full" mode="aspectFill" :src="i.file"></image>
</swiper-item>
</swiper>
</view>
@@ -109,49 +140,25 @@ const {loading, pagination, initFetchData} = useTableQuery({
</view>
<view class="!grid !grid-cols-3 !px-[20rpx] gap-[20rpx]">
<x-dropdown-list>
<view class="bg-[#fff] !py-[14rpx] !px-[24rpx] rounded-[8rpx]">
全部任务
</view>
<template #menu>
<x-dropdown-item>全部任务</x-dropdown-item>
<x-dropdown-item>宣发任务</x-dropdown-item>
<x-dropdown-item>评论任务</x-dropdown-item>
<x-dropdown-item>点赞任务</x-dropdown-item>
<x-dropdown-item>助力任务</x-dropdown-item>
<x-dropdown-item>其他任务</x-dropdown-item>
</template>
<x-dropdown-list
@change="initFetchData"
v-model:model-value="po.type"
:option="taskType">
</x-dropdown-list>
<x-dropdown-list>
<view class="bg-[#fff] !py-[14rpx] !px-[24rpx] rounded-[8rpx]">
全部平台
</view>
<template #menu>
<x-dropdown-item>全部平台</x-dropdown-item>
<x-dropdown-item>抖音</x-dropdown-item>
<x-dropdown-item>快手</x-dropdown-item>
<x-dropdown-item>小红书</x-dropdown-item>
<x-dropdown-item>今日头条</x-dropdown-item>
<x-dropdown-item>其他</x-dropdown-item>
</template>
<x-dropdown-list
@change="initFetchData"
v-model:model-value="po.pid"
:option="platformType">
</x-dropdown-list>
<x-dropdown-list>
<view class="bg-[#fff] !py-[14rpx] !px-[24rpx] rounded-[8rpx]">
默认排序
</view>
<template #menu>
<x-dropdown-item>默认排序</x-dropdown-item>
<x-dropdown-item>价格最高</x-dropdown-item>
<x-dropdown-item>极速打款</x-dropdown-item>
<x-dropdown-item>素材安全</x-dropdown-item>
<x-dropdown-item>简单上手</x-dropdown-item>
<x-dropdown-item>最新发布</x-dropdown-item>
</template>
<x-dropdown-list
@change="initFetchData"
v-model:model-value="po.order"
:option="sortType">
</x-dropdown-list>
</view>
<view class="!flex flex-col gap-[20rpx] !mt-[20rpx] !px-[20rpx]">
<task-item v-for="i in vo.rows"></task-item>
<task-item v-for="i in vo.rows" :key="i.id" :data="i"></task-item>
<tui-loadmore v-if="loading" text="加载中..."></tui-loadmore>
</view>

View File

@@ -9,8 +9,8 @@ import {useUserStore} from "../../pinia/UserStore/index.js";
const UserStore = useUserStore();
const form = reactive({
mobile: null,
password: null,
mobile: '15709267061',
password: '123456',
});
const success = async () => {

View File

@@ -1,11 +1,12 @@
<script setup>
import XNav from "../../components/XNav.vue";
import {ref} from "vue";
import {reactive} from "vue";
import XInput from "../../components/XInput.vue";
import XLink from "../../components/XLink.vue";
import MessageCard from "../../components/MessageCard.vue";
import useTableQuery from "../../hooks/useTableQuery.js";
import Api from "../../api/index.js";
const currentTab = ref(0);
const tabs = [
{
name: '任务消息',
@@ -14,6 +15,29 @@ const tabs = [
name: '平台消息',
},
];
const po = reactive({
type: 1,
keyword: null,
});
const vo = reactive({
rows: [],
page: 0,
total: 0,
});
const {loading, pagination, initFetchData} = useTableQuery({
api: Api.system.getMessageCenter,
parameter: po,
callback: (data) => {
Object.assign(vo, data);
}
});
const changeTab = ({index}) => {
po.type = index;
initFetchData();
}
</script>
<template>
@@ -21,31 +45,43 @@ const tabs = [
<XNav :show-back="false"></XNav>
<view class="w-full bg-[#fff]">
<tui-tabs :tabs="tabs" :currentTab="currentTab" @change="({index}) => currentTab=index" height="90"></tui-tabs>
<tui-tabs :tabs="tabs" :currentTab="po.type" @change="changeTab" height="90"></tui-tabs>
<view class="!pt-[24rpx] !pb-[28rpx] !px-[32rpx] !flex gap-[32rpx] items-center">
<view class="flex-grow">
<x-input height="72rpx" placeholder="请输入要查询的内容">
<x-input v-model:model-value="po.keyword" height="72rpx" placeholder="请输入要查询的内容">
<template #prefix>
<tui-icon name="search" size="18" class="!mr-[12rpx]"></tui-icon>
</template>
</x-input>
</view>
<x-link>搜索</x-link>
<x-link @click="initFetchData">搜索</x-link>
</view>
</view>
<view class="!px-[20rpx] !py-[16rpx]">
<radio>只看未读</radio>
<view class="!px-[20rpx] !py-[16rpx] box-border !h-[80rpx] !flex items-center">
<checkbox>只看未读</checkbox>
</view>
<view class="!flex flex-col !px-[20rpx]">
<MessageCard
:context-row="currentTab === 0 ? 'ellipsis-1': 'ellipsis-2'"
v-for="item in 100">
</MessageCard>
</view>
<scroll-view
@refresherpulling="initFetchData()"
@scrolltolower="() => {
console.log('进来了???')
pagination.page++;
}"
class="h-[calc(100vh-500rpx)]"
scroll-y>
<view class="!flex flex-col !px-[20rpx]">
<MessageCard
:context-row="po.type === 0 ? 'ellipsis-1': 'ellipsis-2'"
:type="po.type"
:data="item"
:key="item.id"
v-for="item in vo.rows">
</MessageCard>
</view>
</scroll-view>
</template>
<style scoped>

View File

@@ -1,15 +1,28 @@
<script setup>
import {ref} from 'vue';
import XNav from "../../components/XNav.vue";
import Api from "../../api/index.js";
import {onLoad} from "@dcloudio/uni-app";
const title = ref('灵活用工平台综合服务协议');
const nodes = ref('<div>Hello World!</div>');
onLoad((options) => {
const {id} = options;
Api.system.getSingle({
id: id
}).then(({data}) => {
title.value = data.title;
nodes.value = data.content;
})
})
</script>
<template>
<x-nav>{{ title }}</x-nav>
<view class="bg-[#fff]">
<view class="bg-[#fff] p-[24rpx] min-h-[calc(100vh-100rpx)] box-border">
<rich-text :nodes="nodes"></rich-text>
</view>
</template>

View File

@@ -2,6 +2,13 @@
import fmt from "../../../static/images/fmt.png";
import linkIcon from '../../../static/icons/link.png';
import XImage from "../../../components/XImage.vue";
const {data} = defineProps({
data: {
type: Object,
default: null,
}
});
</script>
<template>
@@ -13,10 +20,10 @@ import XImage from "../../../components/XImage.vue";
<view class="block items-center">
<view class="block-title">任务案例:</view>
<view class="block-info w-full overflow-hidden">
<view class="text-[#165DFF] !flex items-center gap-[10rpx]">
<view class="text-[#165DFF] !flex items-center gap-[10rpx]" v-if="data.case_url">
<image class="!size-[24rpx] flex-shrink-0" :src="linkIcon"></image>
<text class="ellipsis-1 flex-grow">
https://www.baidu.com/s?wd=%E7%8C%8E%E8%81%98&sa=fyb_n_homepage&rsv_dl=fyb_n_homepage&from=super&cl=3&tn=baidutop10&fr=top1000&rsv_idx=2&hisfilter=1
{{ data.case_url }}
</text>
<view class="nowrap flex-shrink !py-[7rpx] !px-[32rpx] rounded-full bg-[#E8F3FF]"
style="font-size: 24rpx">
@@ -28,9 +35,14 @@ import XImage from "../../../components/XImage.vue";
<view class="block">
<view class="block-title">素材案例:</view>
<view class="block-info !grid grid-cols-3 gap-[20rpx]">
<x-image class="!size-[160rpx]" :src="fmt" :list="[fmt,fmt,fmt]" :cur="0" mode="aspectFill" :draggable="false"></x-image>
<x-image class="!size-[160rpx]" :src="fmt" :list="[fmt,fmt,fmt]" :cur="1" mode="aspectFill" :draggable="false"></x-image>
<x-image class="!size-[160rpx]" :src="fmt" :list="[fmt,fmt,fmt]" :cur="2" mode="aspectFill" :draggable="false"></x-image>
<x-image
v-if="data.case_images_arr.length > 0"
class="!size-[160rpx]"
:src="data.case_images_arr[0]"
:list="data.case_images_arr"
:cur="0" mode="aspectFill"
:draggable="false">
</x-image>
</view>
</view>
<view class="block">

View File

@@ -6,12 +6,12 @@ import {onLoad} from "@dcloudio/uni-app";
import XLink from "../../components/XLink.vue";
import XNoticeBar from "../../components/XNoticeBar.vue";
import XImage from "../../components/XImage.vue";
import fmt from "../../static/images/fmt.png";
import Api from "../../api/index.js";
import dayjs from "dayjs";
import XPrompt from "../../components/XPrompt.vue";
import {numberToCharacter} from "../../utils/uils.js";
// #ifdef APP-PLUS
import TaskDetails from "./components/TaskDetails.vue";
import CollectMaterials from "./components/CollectMaterials.vue";
import MyBackfill from "./components/MyBackfill.vue";
import ReviewCommunication from "./components/ReviewCommunication.vue";
// #endif
// #ifndef APP-PLUS
@@ -43,8 +43,14 @@ const tabs = reactive([
},
]);
const getData = async (id) => {
const {data} = await Api.system.getTaskinfo(id || details.value.id);
details.value = data;
}
onLoad((options) => {
const {id} = options;
getData(id);
});
onMounted(() => {
@@ -66,24 +72,29 @@ onMounted(() => {
<XNav></XNav>
<x-notice-bar></x-notice-bar>
<view class="!p-[20rpx] !flex flex-col gap-[20rpx] box-border">
<view class="!p-[20rpx] !flex flex-col gap-[20rpx] box-border" v-if="details">
<view class="rounded-[16rpx] !p-[24rpx] bg-[#fff] !flex flex-col gap-[20rpx]">
<view class="!flex gap-[30rpx]">
<image class="!size-[84rpx]" :src="goodsIcon"></image>
<view class="flex-grow">
<view class="goods-title !w-full !flex items-center justify-between">
洗面奶洗面奶
<view :class="['goods-state']">进行中</view>
{{ details.goods_name }}
<view :class="['goods-state']" v-if="details.is_use !== 0">{{ details.status_text }}</view>
</view>
<view class="goods-bh">
<view v-if="details.is_use === 0" class="goods-bh">
{{ dayjs(details.end_time).format('YYYY-MM-DD HH:mm') }} 前可领取
</view>
<view v-else class="goods-bh">
任务编号DF1515
<x-link>复制</x-link>
</view>
</view>
</view>
<view class="bg-[#F7F8FA] px-[28rpx] py-[16rpx] rounded-[8rpx] !flex justify-around"
style="font-size: 24rpx">
<view
v-if="details.is_use !== 0"
class="bg-[#F7F8FA] px-[28rpx] py-[16rpx] rounded-[8rpx] !flex justify-around"
style="font-size: 24rpx">
<view>发布账号</view>
<view class="bg-[#E5E6EB] w-[5rpx] h-auto"></view>
<view>昵称: 我是大冤种</view>
@@ -91,25 +102,58 @@ onMounted(() => {
<view>账号: 56378899</view>
</view>
<view class="!grid grid-cols-3 gap-[20rpx]">
<view class="!grid grid-cols-4 gap-[20rpx]">
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">今日头条</view>
<view class="goods-st">{{ details.platform }}</view>
<view class="goods-st-info">发布平台</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">今日头条</view>
<view class="goods-st-info">发布平台</view>
<view class="goods-st">¥ {{ details.real_price.toFixed(2) }}</view>
<view class="goods-st-info">任务报酬</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">今日头条</view>
<view class="goods-st-info">发布平台</view>
<view class="goods-st">{{ details.material_name }}</view>
<view class="goods-st-info">素材类型</view>
</view>
<view class="bg-[#E8F3FF] px-[26rpx] py-[20rpx] rounded-[8rpx]">
<view class="goods-st">{{ details.children_num }}</view>
<view class="goods-st-info">剩余名额</view>
</view>
</view>
<view class="!flex flex-col gap-[10px]">
<view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center">
<view class="text-[#4E5969] test-24r !flex items-center gap-[5px]">
安全评分:
<x-prompt
info="由该任务或类似任务的历史禁言率、素材是否绿色决定。分值越高,说明完成任务对账号影响最小"
title="分值说明">
</x-prompt>
</view>
<view class="!flex items-center gap-[5px]">
<view class="text-[#165DFF]">{{ details.security_level }}</view>
<view class="test-24r">{{ details.security_text }}</view>
</view>
</view>
<view class="!flex px-[10px] py-[12px] bg-[#F2F3F5] gap-[8px] items-center">
<view class="text-[#4E5969] test-24r !flex items-center gap-[5px]">
耗时评分:
<x-prompt
info="由该任务完整完成所需要的时间和操作步骤决定。分值越高,说明完成任务越简单"
title="分值说明">
</x-prompt>
</view>
<view class="!flex items-center gap-[5px]">
<view class="text-[#165DFF]">{{ details.time_level }}</view>
<view class="test-24r">{{ details.time_text }}</view>
</view>
</view>
</view>
</view>
<view id="mainDetailBox" class="rounded-[16rpx] bg-[#fff] main-details overflow-hidden">
<tui-tabs
v-if="mainDetailWidth"
v-if="mainDetailWidth && details.is_use !== 0"
:tabs="tabs"
:currentTab="currentTabs"
:width="mainDetailWidth"
@@ -120,7 +164,7 @@ onMounted(() => {
<Suspense>
<template #default>
<div class="h-full flex flex-col items-start">
<component :is="tabs[currentTabs].component"></component>
<component :is="tabs[currentTabs].component" :data="details"></component>
</div>
</template>
@@ -140,28 +184,48 @@ onMounted(() => {
<view class="block items-center">
<view class="block-title">发布平台:</view>
<view class="block-info">
抖音
{{ details.platform }}
</view>
</view>
<view class="block items-center">
<view class="block-title">发布方式:</view>
<view class="block-info">
三连发/每次相同
{{
numberToCharacter(details.fb_num - 1)
}}连发/{{ details.is_identical === 0 ? '每次不同' : '每次相同' }}
<x-prompt title="发布方式说明">
<template #info>
<view>
领取素材后按照要求连续发布
<text class="text-[#FF7D00]">{{ details.fb_num }}</text>
每遍素材
<text class="text-[#FF7D00]">
{{ details.is_identical === 0 ? '不同' : '相同' }}
</text>
</view>
</template>
</x-prompt>
</view>
</view>
<view class="block items-center">
<view class="block-title">每次间隔时长:</view>
<view class="block-info">
10分钟
{{ details.duration }}分钟
</view>
</view>
<view class="block">
<view class="block-title">特殊要求:</view>
<view class="block-info gap-[20rpx]">
<view>请使用抖音扫码下图收藏音乐发布时使用</view>
<view>{{ details.special_text }}</view>
<view class="!grid grid-cols-3 !mt-[12rpx]">
<x-image class="!size-[96rpx]" :src="fmt" mode="aspectFill"
:draggable="false"></x-image>
<x-image
v-for="(v, index) in details.special_images_arr"
:key="index"
class="!size-[96rpx]"
:src="v"
mode="aspectFill"
:draggable="false">
</x-image>
</view>
</view>
</view>
@@ -173,42 +237,20 @@ onMounted(() => {
<view class="title">
回填要求
</view>
<view class="block flex-col">
<view class="block-title">第1次回填:</view>
<view
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-info !flex w-full">
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] w-[60%] whitespace-nowrap">
0813-09:54 0813-17:14之间
{{ dayjs(v.start_time).format('MMDD-HH:mm') }}
{{ dayjs(v.end_time).format('MMDD-HH:mm') }}之间
</view>
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow">
3个作品评论区截图
</view>
</view>
</view>
<view class="block flex-col">
<view class="block-title">第2次回填:</view>
<view class="block-info !flex w-full">
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] w-[60%] whitespace-nowrap">
0813-09:54 0813-17:14之间
</view>
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow">
3个作品链接
</view>
</view>
</view>
<view class="block flex-col">
<view class="block-title">第3次回填:</view>
<view class="block-info !flex w-full">
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] w-[60%] whitespace-nowrap">
0814-10:00 0814-11:30之间
</view>
<view
class="bg-[#F7F8FA] py-[12rpx] px-[20rpx] border-1 border-[rgb(229,230,235)] flex-grow">
每一个作品的播放量截图
{{ v.content }}
</view>
</view>
</view>
@@ -223,7 +265,19 @@ onMounted(() => {
<view class="block items-center">
<view class="block-title">作品保留时间:</view>
<view class="block-info">
3
{{ details.retention_time }} {{ details.retention_type === 1 ? '分钟' : '小时' }}
<x-prompt title="保留时间说明">
<template #info>
<view>
该任务结算后要保留
<text class="text-[#FF7D00]">{{ details.retention_time }}
{{ details.retention_type === 1 ? '分钟' : '小时' }}
</text>
<view>到期请自行删除避免违规若提前删除将影响后续收益</view>
</view>
</template>
</x-prompt>
</view>
</view>
<view class="block-extend">
@@ -232,7 +286,11 @@ onMounted(() => {
<view class="block items-center">
<view class="block-title !w-[300rpx]">每次回填将在该时间内审核:</view>
<view class="block-info">
4小时
{{ details.check_time }} {{ details.check_type === 1 ? '分钟' : '小时' }}
<x-prompt
title="审核时间说明"
:info="`回填后,我们将于${details.check_time}${details.check_type === 1 ? '分钟' : '小时'}内完成审核,超时自动通过`">
</x-prompt>
</view>
</view>
<view class="block-extend">
@@ -246,28 +304,20 @@ onMounted(() => {
<view class="title">
扣款说明
</view>
<view class="block !flex !gap-0">
<view class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]">1.
<view
v-for="(v, index) in details.settlement"
:key="v.id"
class="block !flex !gap-0">
<view class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]">
{{ index + 1 }}.
</view>
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] flex-grow">
未按约定评论
{{ v.intro }}
</view>
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] !w-[210rpx]">
扣除20%收益
</view>
</view>
<view class="block !flex !gap-0">
<view class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)]">2.
</view>
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] flex-grow">
当天发布其他广告
</view>
<view
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] !w-[210rpx]">
扣除100%收益
class="test-24r px-[20rpx] py-[12rpx] bg-[#F7F8FA] border-1 border-[rgb(229,230,235)] whitespace-nowrap">
扣除{{ v.ratio }}%收益
</view>
</view>
<view class="block-extend">
@@ -281,18 +331,32 @@ onMounted(() => {
<view class="title">
其他说明
</view>
<view class="block">
<view class="test-24r">
未到约定期限达人提前删除视频处罚扣除1点达人信用分
<view class="block !flex-col">
<view class="test-24r" v-for="(v, index) in details.settlement_arr" :key="index">
{{ v.intro }}
</view>
</view>
<view class="py-[7rpx] px-[32rpx] rounded-full text-[var(--primary-color)] bg-[#E8F3FF] w-fit">
查看信用分管理方法
</view>
<x-prompt title="信用分说明"
info="扣除信用分,将影响您后续接任务以及提现。请按约定完成任务。请在接受任务前认真阅读各要求,有能力完成再接受。">
<template #button>
<view
class="py-[7rpx] px-[32rpx] rounded-full text-[var(--primary-color)] bg-[#E8F3FF] w-fit">
查看信用分管理方法
</view>
</template>
</x-prompt>
</view>
</view>
<view class="bg-[#94BFFF] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center">
<view
v-if="details.is_use === 0"
class="bg-[var(--primary-color)] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center">
接受任务
</view>
<view
v-else
class="bg-[#94BFFF] rounded-[8rpx] py-[26rpx] text-[#fff] !flex justify-center items-center">
已接受
</view>
</template>

View File

@@ -1,5 +1,16 @@
<script setup>
import {onMounted, reactive} from "vue";
import {useUserStore} from "../../../pinia/UserStore/index.js";
import Api from "../../../api/index.js";
const UserStore = useUserStore();
const detail = reactive({});
onMounted(() => {
Api.system.myTeamInfo().then(({data}) => {
Object.assign(detail, data);
});
})
</script>
<template>
@@ -8,7 +19,7 @@
我的邀请码
</view>
<view class="invitationCodeValue">
123445
{{ UserStore?.userInfo?.invite }}
</view>
<view class="view-detail !ml-auto">查看团队详情></view>
</view>
@@ -16,15 +27,15 @@
<view class="!mt-[24rpx] !grid grid-cols-3 gap-[22rpx]">
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col">
<view class="test-22r text-[#86909C]">人数</view>
<view class="test-36r text-[#165DFF]">323</view>
<view class="test-36r text-[#165DFF]">{{ detail.count }}</view>
</view>
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col">
<view class="test-22r text-[#86909C]">团队收益</view>
<view class="test-36r text-[#165DFF]">323</view>
<view class="test-36r text-[#165DFF]">{{ detail.income }}</view>
</view>
<view class="rounded-[16rpx] bg-[#E8F3FF] p-[20rpx] !flex gap-[6rpx] flex-col">
<view class="test-22r text-[#86909C]">团队奖励</view>
<view class="test-36r text-[#165DFF]">323</view>
<view class="test-36r text-[#165DFF]">{{ detail.reward }}</view>
</view>
</view>
</template>

View File

@@ -1,5 +1,5 @@
<script setup>
import {defineAsyncComponent, ref} from 'vue';
import {defineAsyncComponent, onMounted, ref} from 'vue';
import ICON1 from '../../static/icons/icon_提现记录.png';
import ICON2 from '../../static/icons/icon_变动记录.png';
import ICON3 from '../../static/icons/icon_我的钱包.png';
@@ -12,11 +12,9 @@ import user_BG from '../../static/images/user_bg.png';
import XNav from "../../components/XNav.vue";
import CreditScore from "../../components/CreditScore.vue";
import {toPage} from "../../utils/uils.js";
import {useUserStore} from "../../pinia/UserStore/index.js";
// #ifdef APP-PLUS
import MyTeam from "./components/MyTeam.vue";
import Inviter from "./components/Inviter.vue";
import AccompanyingMentor from "./components/AccompanyingMentor.vue";
// #endif
// #ifndef APP-PLUS
@@ -43,11 +41,17 @@ const tabs = [
component: AccompanyingMentor,
},
]
const UserStore = useUserStore();
onMounted(() => {
UserStore.getUserInfo();
})
</script>
<template>
<!--我的-->
<x-nav></x-nav>
<x-nav :show-back="false"></x-nav>
<view class="!w-full !h-[484rpx] overflow-hidden relative">
<image class="!w-[1200rpx] !h-[480rpx] !absolute left-[-200rpx]" :src="user_BG" mode="aspectFill"></image>
@@ -55,9 +59,9 @@ const tabs = [
<view class="!w-full relative z-10 p-[20rpx] !flex gap-[34rpx] justify-between">
<image class="!size-[132rpx]" :src="Avatar" mode="aspectFill"></image>
<view class="!flex flex-col items-start justify-between box-border py-[4rpx]">
<view class="user_name">用户名称</view>
<view class="user_phone">手机号1570****061</view>
<view class="user_phone">uid38578</view>
<view class="user_name">{{ UserStore?.userInfo?.nickname }}</view>
<view class="user_phone">手机号{{ UserStore?.userInfo?.mobile }}</view>
<view class="user_phone">uid{{ UserStore?.userInfo?.uid }}</view>
</view>
<credit-score class="!mr-[110rpx] !ml-auto"></credit-score>
@@ -77,20 +81,23 @@ const tabs = [
<view>
<view class="info-title">总收益</view>
<view class="info-balance">
24687.65
{{ UserStore?.userInfo?.total_money.toFixed(2) }}
</view>
</view>
<view>
<view class="info-title">可提现</view>
<view class="info-balance">
358.32
{{ UserStore?.userInfo?.money.toFixed(2) }}
</view>
</view>
</view>
<view class="gap-line"></view>
<view class="py-[32rpx] px-[42rpx] !flex items-center gap-[20rpx]">
<view class="info-title !mb-0">已提现</view>
<view class="info-balance" style="font-size: 28rpx">24239.33</view>
<view class="info-balance" style="font-size: 28rpx">{{
UserStore?.userInfo?.withraw_money.toFixed(2)
}}
</view>
</view>
</view>
@@ -138,9 +145,10 @@ const tabs = [
<image class="!size-[84rpx]" mode="aspectFill" :src="ICON4"></image>
<view class="test-24r">邀请好友</view>
</view>
<view class="!flex items-center flex-col justify-center gap-[12rpx]">
<view class="!flex items-center flex-col justify-center gap-[12rpx]"
@click="toPage('/pages/accountManagement/index')">
<image class="!size-[84rpx]" mode="aspectFill" :src="ICON5"></image>
<view class="test-24r">邀请好友</view>
<view class="test-24r">账号管理</view>
</view>
<view class="!flex items-center flex-col justify-center gap-[12rpx]">
<image class="!size-[84rpx]" mode="aspectFill" :src="ICON6"></image>

View File

@@ -0,0 +1,59 @@
<script setup>
import {reactive, ref, onMounted} from "vue";
import XInfoModal from "../../../components/XInfoModal.vue";
import XForm from "../../../components/XForm.vue";
import XFormItem from "../../../components/XFormItem.vue";
import XInput from "../../../components/XInput.vue";
import {useUserStore} from "../../../pinia/UserStore/index.js";
import Api from "../../../api/index.js";
import {showToast} from "../../../utils/uils.js";
const XFormRef = ref();
const show = defineModel('show');
const rules = {
nickname: {
reg: /^[^]*\S[^]*$/,
msg: '请输入正确的微信号',
}
};
const form = reactive({
nickname: null,
});
const success = async () => {
XFormRef.value.verify();
const {msg} = await Api.system.saveInfo({...form, type: 2});
showToast(msg);
await UserStore.getUserInfo();
show.value = false;
}
const UserStore = useUserStore();
onMounted(() => {
form.nickname = UserStore.userInfo.nickname;
})
</script>
<template>
<x-info-modal v-model:show="show" @success="success">
<view class="title">修改昵称</view>
<x-form ref="XFormRef" :model="form" :rules="rules">
<x-form-item>
<x-input height="72rpx" placeholder="微信号" v-model:model-value="form.nickname"></x-input>
</x-form-item>
</x-form>
</x-info-modal>
</template>
<style scoped lang="scss">
.title {
color: rgb(29, 33, 41);
font-size: 32rpx;
font-weight: 500;
line-height: 24px;
letter-spacing: 0;
text-align: center;
margin-bottom: 20rpx;
}
</style>

View File

@@ -1,22 +1,43 @@
<script setup>
import {reactive, ref} from "vue";
import {onMounted, reactive, ref} from "vue";
import XInfoModal from "../../../components/XInfoModal.vue";
import XForm from "../../../components/XForm.vue";
import XFormItem from "../../../components/XFormItem.vue";
import XInput from "../../../components/XInput.vue";
import SendMsg from "../../../components/SendMsg.vue";
import Api from "../../../api/index.js";
import {showToast} from "../../../utils/uils.js";
import {useUserStore} from "../../../pinia/UserStore/index.js";
const XFormRef = ref();
const UserStore = useUserStore();
const show = defineModel('show');
const rules = {};
const rules = {
mobile: {
reg: /^1[3-9]\d{9}$/,
msg: '请输入正确的手机号',
},
captcha: {
reg: /.+/,
msg: '请输入正确的验证码',
},
password: {
reg: /.+/,
msg: '请输入正确的密码',
},
};
const form = reactive({
phone: null,
verificationCode: null,
mobile: null,
captcha: null,
password: null,
});
const success = () => {
const success = async () => {
XFormRef.value.verify();
const {msg} = await Api.system.savePassword(form);
showToast(msg);
await UserStore.getUserInfo();
show.value = false;
}
</script>
@@ -26,10 +47,10 @@ const success = () => {
<x-form ref="XFormRef" :model="form" :rules="rules">
<x-form-item label="手机号">
<x-input height="72rpx" placeholder="微信号" v-model:model-value="form.phone"></x-input>
<x-input height="72rpx" placeholder="微信号" v-model:model-value="form.mobile"></x-input>
</x-form-item>
<x-form-item label="验证码">
<send-msg height="72rpx" v-model:model-value="form.verificationCode"></send-msg>
<send-msg height="72rpx" :mobile="form.mobile" v-model:model-value="form.captcha" :type="3"></send-msg>
</x-form-item>
<x-form-item label="新登录密码">
<x-input height="72rpx" placeholder="新登录密码" v-model:model-value="form.password"></x-input>

View File

@@ -5,36 +5,44 @@ import XForm from "../../../components/XForm.vue";
import XFormItem from "../../../components/XFormItem.vue";
import XInput from "../../../components/XInput.vue";
import SendMsg from "../../../components/SendMsg.vue";
import {useUserStore} from "../../../pinia/UserStore/index.js";
import Api from "../../../api/index.js";
import {showToast} from "../../../utils/uils.js";
const XFormRef = ref();
const UserStore = useUserStore();
const show = defineModel('show');
const rules = {
oldPhone: {
reg: /^\[1][3-9]\d{9}$/,
old_mobile: {
reg: /^1[3-9]\d{9}$/,
msg: '请输入正确的手机号',
},
oldVerificationCode: {
old_captcha: {
reg: /.+/,
msg: '请输入正确验证码',
},
new_mobile: {
reg: /^1[3-9]\d{9}$/,
msg: '请输入正确的手机号',
},
newPhone: {
reg: /^\[1][3-9]\d{9}$/,
msg: '请输入正确的手机号',
},
newVerificationCode: {
new_captcha: {
reg: /.+/,
msg: '请输入正确的手机号',
msg: '请输入正确验证码',
},
};
const form = reactive({
oldPhone: null,
oldVerificationCode: null,
newPhone: null,
newVerificationCode: null,
old_mobile: null,
old_captcha: null,
new_mobile: null,
new_captcha: null,
});
const success = () => {
const success = async () => {
XFormRef.value.verify();
const {msg} = await Api.system.saveMobile(form);
showToast(msg);
show.value = false;
await UserStore.getUserInfo();
}
</script>
@@ -44,16 +52,26 @@ const success = () => {
<x-form ref="XFormRef" :model="form" :rules="rules">
<x-form-item label="原手机号">
<x-input height="72rpx" placeholder="原手机号" v-model:model-value="form.oldPhone"></x-input>
<x-input height="72rpx" placeholder="原手机号" v-model:model-value="form.old_mobile"></x-input>
</x-form-item>
<x-form-item label="验证码">
<send-msg height="72rpx" v-model:model-value="form.oldVerificationCode"></send-msg>
<send-msg
height="72rpx"
:mobile="form.old_mobile"
v-model:model-value="form.old_captcha"
:type="4">
</send-msg>
</x-form-item>
<x-form-item label="手机号">
<x-input height="72rpx" placeholder="新手机号" v-model:model-value="form.oldPhone"></x-input>
<x-form-item label="手机号">
<x-input height="72rpx" placeholder="新手机号" v-model:model-value="form.new_mobile"></x-input>
</x-form-item>
<x-form-item label="验证码">
<send-msg height="72rpx" v-model:model-value="form.newVerificationCode"></send-msg>
<send-msg
height="72rpx"
:mobile="form.new_mobile"
v-model:model-value="form.new_captcha"
:type="5">
</send-msg>
</x-form-item>
</x-form>
</x-info-modal>

View File

@@ -1,25 +1,37 @@
<script setup>
import {reactive, ref} from "vue";
import {reactive, ref, onMounted} from "vue";
import XInfoModal from "../../../components/XInfoModal.vue";
import XForm from "../../../components/XForm.vue";
import XFormItem from "../../../components/XFormItem.vue";
import XInput from "../../../components/XInput.vue";
import {useUserStore} from "../../../pinia/UserStore/index.js";
import Api from "../../../api/index.js";
import {showToast} from "../../../utils/uils.js";
const XFormRef = ref();
const show = defineModel('show');
const rules = {
wxCode: {
reg: /^\[1][3-9]\d{9}$/,
wechat: {
reg: /^[^]*\S[^]*$/,
msg: '请输入正确的微信号',
}
};
const form = reactive({
wxCode: null,
wechat: null,
});
const success = () => {
const success = async () => {
XFormRef.value.verify();
const {msg} = await Api.system.saveInfo({...form, type: 3});
showToast(msg);
await UserStore.getUserInfo();
show.value = false;
}
const UserStore = useUserStore();
onMounted(() => {
form.wechat = UserStore.userInfo.wechat;
})
</script>
<template>
@@ -28,7 +40,7 @@ const success = () => {
<x-form ref="XFormRef" :model="form" :rules="rules">
<x-form-item>
<x-input height="72rpx" placeholder="微信号" v-model:model-value="form.wxCode"></x-input>
<x-input height="72rpx" placeholder="微信号" v-model:model-value="form.wechat"></x-input>
</x-form-item>
</x-form>
</x-info-modal>

View File

@@ -3,23 +3,32 @@ import {defineAsyncComponent, ref} from "vue";
import Right from "../../static/icons/right.png";
import Avatar from "../../static/images/Avatar.png";
import XNav from "../../components/XNav.vue";
import {useUserStore} from "../../pinia/UserStore/index.js";
import {onShow} from "@dcloudio/uni-app";
// #ifdef APP-PLUS
import EditNickName from './components/EditNickName.vue';
import EditWxCode from './components/EditWxCode.vue';
import EditPhone from './components/EditPhone.vue';
import EditPassWord from './components/EditPassWord.vue';
// #endif
// #ifndef APP-PLUS
const EditNickName = defineAsyncComponent(() => import('./components/EditNickName.vue'));
const EditWxCode = defineAsyncComponent(() => import('./components/EditWxCode.vue'));
const EditPhone = defineAsyncComponent(() => import('./components/EditPhone.vue'));
const EditPassWord = defineAsyncComponent(() => import('./components/EditPassWord.vue'));
// #endif
const UserStore = useUserStore();
const showTool = ref(false);
const tool = ref('EditWxCode');
const tools = [
{
key: 'EditNickName',
component: EditNickName,
},
{
key: 'EditWxCode',
component: EditWxCode,
@@ -38,6 +47,10 @@ const openTools = (key) => {
tool.value = key;
showTool.value = true;
}
onShow(() => {
UserStore.getUserInfo();
})
</script>
<template>
@@ -52,9 +65,9 @@ const openTools = (key) => {
</view>
<view class="h-[3rpx] w-full bg-[rgb(229,230,235)] !ml-[32rpx]"></view>
<view class="!flex items-center h-[108rpx] px-[32rpx]">
<view class="!flex items-center h-[108rpx] px-[32rpx]" @click="openTools('EditNickName')">
<view class="title">昵称</view>
<view class="!ml-auto whitespace-nowrap value">酷酷猛吃</view>
<view class="!ml-auto whitespace-nowrap value">{{ UserStore?.userInfo?.nickname }}</view>
<image class="!w-[16rpx] !ml-[16rpx]" mode="widthFix" :src="Right"></image>
</view>
<view class="h-[3rpx] w-full bg-[rgb(229,230,235)] !ml-[32rpx]"></view>
@@ -63,21 +76,14 @@ const openTools = (key) => {
<view class="bg-[#fff] !mt-[20rpx]">
<view class="!flex items-center h-[108rpx] px-[32rpx]" @click="openTools('EditPhone')">
<view class="title">手机号</view>
<view class="!ml-auto whitespace-nowrap value">178****0214</view>
<view class="!ml-auto whitespace-nowrap value">{{ UserStore?.userInfo?.mobile }}</view>
<image class="!w-[16rpx] !ml-[16rpx]" mode="widthFix" :src="Right"></image>
</view>
<view class="h-[3rpx] w-full bg-[rgb(229,230,235)] !ml-[32rpx]"></view>
<view class="!flex items-center h-[108rpx] px-[32rpx]" @click="openTools('EditWxCode')">
<view class="title">微信号</view>
<view class="!ml-auto whitespace-nowrap value">za395739</view>
<image class="!w-[16rpx] !ml-[16rpx]" mode="widthFix" :src="Right"></image>
</view>
<view class="h-[3rpx] w-full bg-[rgb(229,230,235)] !ml-[32rpx]"></view>
<view class="!flex items-center h-[108rpx] px-[32rpx]">
<view class="title">昵称</view>
<view class="!ml-auto whitespace-nowrap value">酷酷猛吃</view>
<view class="!ml-auto whitespace-nowrap value">{{ UserStore?.userInfo?.wechat }}</view>
<image class="!w-[16rpx] !ml-[16rpx]" mode="widthFix" :src="Right"></image>
</view>
<view class="h-[3rpx] w-full bg-[rgb(229,230,235)] !ml-[32rpx]"></view>

View File

@@ -0,0 +1,11 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped lang="scss">
</style>