This commit is contained in:
dzl
2025-09-12 09:38:37 +08:00
2 changed files with 141 additions and 28 deletions

View File

@@ -14,7 +14,7 @@
</el-button> </el-button>
</div> </div>
<div class="nav-center"> <div class="nav-center">
<h1 class="nav-title">分享推广</h1> <h1 class="nav-title">分享</h1>
</div> </div>
<div class="nav-right"> <div class="nav-right">
<!-- 占位元素保持标题居中 --> <!-- 占位元素保持标题居中 -->
@@ -22,7 +22,7 @@
</nav> </nav>
<div class="page-content"> <div class="page-content">
<!-- 说明 --> <!-- 说明 -->
<div class="intro-section"> <div class="intro-section">
<div class="intro-card"> <div class="intro-card">
<h3 class="intro-title">邀请好友注册</h3> <h3 class="intro-title">邀请好友注册</h3>
@@ -80,16 +80,19 @@
direction="btt" direction="btt"
:lockScroll="false" :lockScroll="false"
size="70%" size="70%"
@open="requestLowerUsers" @open="requestLowerUsers(params)"
@closed="closeScrollerLowerUsers" @closed="closeScrollerLowerUsers"
> >
<ul v-infinite-scroll="loadScrollerLowerUsers" class="users-list" style="overflow: auto" <!-- 一级 -->
<ul v-if="!showScrollerLowerUsersByUser" v-infinite-scroll="loadScrollerLowerUsers" class="users-list"
style="overflow: auto"
:infinite-scroll-immediate="false" :infinite-scroll-immediate="false"
:infinite-scroll-disabled="scrollLowerUsers"> :infinite-scroll-disabled="scrollLowerUsers">
<el-empty v-if="lowerUsers.length==0" :image-size="200" /> <!-- lowerUsers 空数据处理 -->
<el-empty v-if="lowerUsers.length==0" :image-size="200"/>
<li v-else v-for="(item, index) in lowerUsers" :key="item.id"> <li v-else v-for="(item, index) in lowerUsers" :key="item.id">
<el-divider v-if="index!=0" border-style="dashed"/> <el-divider v-if="index!=0" border-style="dashed"/>
<div class="users-item"> <div class="users-item" @click="handleLowerUserByUserId(item)">
<el-image <el-image
:src="getImageUrl(item.avatar)" :src="getImageUrl(item.avatar)"
:preview-src-list="[getImageUrl(item.avatar)]" :preview-src-list="[getImageUrl(item.avatar)]"
@@ -112,6 +115,45 @@
</li> </li>
<el-divider v-if="scrollLowerUsers" border-style="dashed" content-position="center">到底了~</el-divider> <el-divider v-if="scrollLowerUsers" border-style="dashed" content-position="center">到底了~</el-divider>
</ul> </ul>
<!-- 二级 -->
<ul v-else v-infinite-scroll="loadScrollerLowerUsersByUser" class="users-list" style="overflow: auto"
:infinite-scroll-immediate="false"
:infinite-scroll-disabled="scrollLowerUsersByUser">
<el-page-header style="margin-bottom: 20px" @back="onBack">
<template #content>
<span class="text-large font-600 mr-3"
style="font-size: 14px"> 正在查看{{ currentUser.username }}的下级 </span>
</template>
<div class="mt-4 text-sm font-bold"></div>
</el-page-header>
<!-- lowerUsers 空数据处理 -->
<el-empty v-if="lowerUsersByUser.length==0" :image-size="200"/>
<li v-else v-for="(item, index) in lowerUsersByUser" :key="item.id">
<el-divider v-if="index!=0" border-style="dashed"/>
<div class="users-item">
<el-image
:src="getImageUrl(item.avatar)"
:preview-src-list="[getImageUrl(item.avatar)]"
class="user-avatar"
fit="cover"
>
<template #error>
<div class="image-slot">
<el-icon>
<Picture/>
</el-icon>
</div>
</template>
</el-image>
<div class="user-text">
<div class="user-username">用户名{{ item.username }}</div>
<div class="user-date">时间{{ item.created_at }}</div>
</div>
</div>
</li>
<el-divider v-if="scrollLowerUsersByUser" border-style="dashed" content-position="center">到底了~</el-divider>
</ul>
</el-drawer> </el-drawer>
</div> </div>
@@ -119,7 +161,7 @@
</template> </template>
<script setup> <script setup>
import {ref, onMounted, nextTick} from 'vue' import {ref, onMounted, nextTick, reactive} from 'vue'
import {useRouter} from 'vue-router' import {useRouter} from 'vue-router'
import {useUserStore} from '@/stores/user' import {useUserStore} from '@/stores/user'
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
@@ -148,7 +190,7 @@ const generateInviteLink = () => {
console.log(userId) console.log(userId)
const baseUrl = `${window.location.origin}/frontend` const baseUrl = `${window.location.origin}/frontend`
// return `${baseUrl}/register?inviter=${userId}`// 实施用 // return `${baseUrl}/register?inviter=${userId}`// 实施用
return `http://192.168.1.124:5173/register?inviter=${userId}`// 测试用 return `http://192.168.1.250:5173/register?inviter=${userId}`// 测试用
} }
// 生成二维码 // 生成二维码
@@ -204,33 +246,43 @@ const copyLink = async () => {
} }
// 查看下级用户 // 查看下级用户
const scrollLowerUsers = ref(false) const canMultiLevel = ref(false) // 是否有权查看更多级用户
const lowerUsers = ref([]) const showScrollerLowerUsersByUser = ref(false) // 一二级切换
const scrollLowerUsers = ref(false) // 一级是否继续滚动
const scrollLowerUsersByUser = ref(false) // 二级是否继续滚动
const lowerUsers = ref([]) // 一级下级
const currentUser = ref({}) // 二级当前选中
const lowerUsersByUser = ref([]) // 二级下级
// 一级传参
const params = { const params = {
page: 1, page: 1,
size: 10 size: 10
} }
const pages = ref(0)
// 二级传参
const paramsByUser = {
page: 1,
size: 10,
user_id: ''
}
const pages = ref(1)
const pagesByUser = ref(1)
// 打开查看下级用户抽屉
const handleLowerUser = async () => { const handleLowerUser = async () => {
// 判断是否为*代理查看下下级用户
var role = JSON.parse(localStorage.getItem('role'))
if (role.distribution || (role.user_type == 'agent' || role.user_type == 'agent_directly')) {
canMultiLevel.value = true
}
lowerUsers.value = [] lowerUsers.value = []
drawerLowerUsers.value = true drawerLowerUsers.value = true
} }
const loadScrollerLowerUsers = async () => { // 请求一级用户
if (scrollLowerUsers.value) {
return
}
params.page += 1
await requestLowerUsers(params)
}
const closeScrollerLowerUsers = () => {
lowerUsers.value = []
params.page = 0
scrollLowerUsers.value = false
}
const requestLowerUsers = async (params) => { const requestLowerUsers = async (params) => {
await distributionAPI.getLowerUsers(params).then((res) => { await distributionAPI.getLowerUsers(params).then((res) => {
lowerUsers.value = lowerUsers.value.concat(res.data.data) lowerUsers.value = lowerUsers.value.concat(res.data.data)
@@ -241,6 +293,57 @@ const requestLowerUsers = async (params) => {
}) })
} }
// 请求二级用户
const requestLowerUsersByUser = async (params) => {
await distributionAPI.getLowerUsers(params).then((res) => {
lowerUsersByUser.value = lowerUsersByUser.value.concat(res.data.data)
pagesByUser.value = res.data.pagination.pages
if (params.page >= pagesByUser.value) {
scrollLowerUsersByUser.value = true
}
})
}
// 一级分页请求查看
const loadScrollerLowerUsers = async () => {
if (scrollLowerUsers.value) {
return
}
params.page += 1
await requestLowerUsers(params)
}
// 二级分页请求查看
const loadScrollerLowerUsersByUser = async () => {
if (scrollLowerUsersByUser.value) {
return
}
paramsByUser.page += 1
await requestLowerUsersByUser(paramsByUser)
}
// 查看二级用户
const handleLowerUserByUserId = async (item) => {
// 是否有权查看二级
if (canMultiLevel.value) {
paramsByUser.user_id = item.user_id
currentUser.value = item
await requestLowerUsersByUser(paramsByUser)
showScrollerLowerUsersByUser.value = true
}
}
const onBack = () => {
showScrollerLowerUsersByUser.value = false
}
// 关闭查看下级用户抽屉
const closeScrollerLowerUsers = () => {
lowerUsers.value = []
params.page = 0
scrollLowerUsers.value = false
}
// 生命周期 // 生命周期
onMounted(() => { onMounted(() => {
@@ -415,7 +518,7 @@ onMounted(() => {
.users-list { .users-list {
height: 100%; height: 100%;
padding: 0; padding: 0 0 0 10px;;
margin: 0; margin: 0;
list-style: none; list-style: none;
} }

View File

@@ -25,7 +25,13 @@
<template v-if="userStore.isAuthenticated"> <template v-if="userStore.isAuthenticated">
<span class="username">{{ userStore.user?.username || '用户' }}</span> <span class="username">{{ userStore.user?.username || '用户' }}</span>
<div class="user-role"> <div class="user-role">
<el-tag type="primary">代理</el-tag> <template v-if="accountInfo.distribution">
<el-tag v-if="accountInfo.user_type==='agent_directly'" type="primary">直营代理</el-tag>
<el-tag v-if="accountInfo.user_type==='directly_operated'" type="primary">直营商户</el-tag>
<el-tag v-if="accountInfo.user_type==='agent'" type="primary">代理</el-tag>
<el-tag v-if="accountInfo.user_type==='user'" type="primary">融豆商户</el-tag>
</template>
<el-tag v-else type="primary">普通用户</el-tag>
</div> </div>
<!-- <button class="logout-btn" @click="handleLogout">退出登录</button>--> <!-- <button class="logout-btn" @click="handleLogout">退出登录</button>-->
</template> </template>
@@ -198,6 +204,11 @@ export default {
balance: response.data.user?.balance || '0.00', balance: response.data.user?.balance || '0.00',
is_distribute: response.data.user?.is_distribute || false is_distribute: response.data.user?.is_distribute || false
}; };
// 存储用户角色
localStorage.setItem('role', JSON.stringify({
"distribution": accountInfo.value.distribution,
"user_type": accountInfo.value.user_type
}));
// 确保加载头像 // 确保加载头像
if (response.data.user?.avatar) { if (response.data.user?.avatar) {
// 使用getImageUrl处理头像路径 // 使用getImageUrl处理头像路径
@@ -446,7 +457,6 @@ export default {
avatarUrl.value = userStore.user.avatar; avatarUrl.value = userStore.user.avatar;
} }
loadAccountInfo(); loadAccountInfo();
}); });
return { return {