添加全局私有视角到我的页面

This commit is contained in:
WindowBird 2025-11-12 17:09:46 +08:00
parent a74badc79a
commit 9413b651e0
4 changed files with 105 additions and 24 deletions

View File

@ -3,7 +3,7 @@
<!-- 顶部标题栏 --> <!-- 顶部标题栏 -->
<view class="header"> <view class="header">
<text class="header-title">客户管理</text> <text class="header-title">客户管理</text>
<view v-if="useUserStore().getUserInfo?.roles?.some(r => ['admin','sys_admin'].includes(r))" style="display: flex;align-items: center;gap: 6px"> <view v-if="showPrivateSwitch" style="display: flex;align-items: center;gap: 6px">
<view>私有</view><uv-switch v-model="filterSelf"></uv-switch> <view>私有</view><uv-switch v-model="filterSelf"></uv-switch>
</view> </view>
@ -161,6 +161,7 @@
<script setup> <script setup>
import { ref, computed, onMounted, onUnmounted, watch } from 'vue'; import { ref, computed, onMounted, onUnmounted, watch } from 'vue';
import { storeToRefs } from 'pinia';
import FabPlus from '@/components/FabPlus.vue'; import FabPlus from '@/components/FabPlus.vue';
import CustomerSummaryBrief from '@/components/customer/CustomerSummaryBrief.vue'; import CustomerSummaryBrief from '@/components/customer/CustomerSummaryBrief.vue';
import { usePagination } from '@/composables/usePagination'; import { usePagination } from '@/composables/usePagination';
@ -171,7 +172,18 @@ import {
} from '@/utils/customerMappings'; } from '@/utils/customerMappings';
// //
const filterSelf =ref(false); const userStore = useUserStore();
const { userInfo, privateView } = storeToRefs(userStore);
const filterSelf = computed({
get: () => privateView.value,
set: (val) => userStore.setPrivateView(val)
});
const currentUserId = computed(() =>
userInfo.value?.user?.userId || userInfo.value?.userId || null
);
const showPrivateSwitch = computed(() =>
userInfo.value?.roles?.some(r => ['admin','sys_admin'].includes(r))
);
const showFilter = ref(false); const showFilter = ref(false);
const filterStatus = ref(''); const filterStatus = ref('');
@ -230,10 +242,10 @@ const formatDateTime = (dateTime) => {
// //
const buildQueryParams = () => { const buildQueryParams = () => {
const params = {}; const params = {
joinUserId: filterSelf.value && currentUserId.value ? currentUserId.value : null
params.joinUserId = filterSelf.value? useUserStore().getUserInfo.user.userId : null };
console.log(filterSelf.value? useUserStore().getUserInfo.user.userId : null) console.log(filterSelf.value ? currentUserId.value : null)
// statusList // statusList
@ -374,7 +386,7 @@ watch(filterStatus, () => {
reset(); reset();
// id // id
queryParams.value = { queryParams.value = {
joinUserId: filterSelf.value? useUserStore().getUserInfo.user.userId : null, joinUserId: filterSelf.value && currentUserId.value ? currentUserId.value : null,
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10
}; };
@ -390,7 +402,7 @@ watch(filterStatus, () => {
watch(filterSelf, () => { watch(filterSelf, () => {
console.log('筛选是否自己变化:', filterSelf.value); console.log('筛选是否自己变化:', filterSelf.value);
const params = buildQueryParams(); const params = buildQueryParams();
console.log('<UNK>:当前参数', params); console.log('客户列表查询参数', params);
updateParams(params); updateParams(params);
}) })

View File

@ -8,13 +8,7 @@
<view class="dashboard-content" v-else> <view class="dashboard-content" v-else>
<view
v-if="showPrivateSwitch"
class="private-filter"
>
<view>私有</view>
<uv-switch v-model="filterSelf"></uv-switch>
</view>
<!-- 任务概览 --> <!-- 任务概览 -->
<view class="task-overview"> <view class="task-overview">
<view <view
@ -160,15 +154,20 @@
<script setup> <script setup>
import { ref, onMounted, watch, computed } from 'vue'; import { ref, onMounted, watch, computed } from 'vue';
import { storeToRefs } from 'pinia';
import { getTaskStatusType, getTaskStatusStyle, getStatusText } from '@/utils/taskConfig.js'; import { getTaskStatusType, getTaskStatusStyle, getStatusText } from '@/utils/taskConfig.js';
import { getDashboardBrief, getTaskList } from '@/api'; import { getDashboardBrief, getTaskList } from '@/api';
import { useUserStore } from '@/store/user'; import { useUserStore } from '@/store/user';
import {truncateText} from "@/utils/textSolve/truncateText"; import {truncateText} from "@/utils/textSolve/truncateText";
const userStore = useUserStore(); const userStore = useUserStore();
const filterSelf = ref(false); const { userInfo, privateView } = storeToRefs(userStore);
const showPrivateSwitch = computed(() => const filterSelf = computed({
userStore.getUserInfo?.roles?.some(r => ['admin', 'sys_admin'].includes(r)) get: () => privateView.value,
set: (val) => userStore.setPrivateView(val)
});
const currentUserId = computed(() =>
userInfo.value?.user?.userId || userInfo.value?.userId || null
); );
// //
@ -339,9 +338,8 @@ const loadDashboardData = async () => {
keys keys
}; };
if (filterSelf.value) { if (filterSelf.value && currentUserId.value) {
const joinUserId = userStore.userInfo?.user?.userId; params.joinUserId = currentUserId.value;
params.joinUserId = joinUserId;
} }
const res = await getDashboardBrief(params); const res = await getDashboardBrief(params);

View File

@ -1,5 +1,16 @@
<template> <template>
<view class="mine-page"> <view class="mine-page">
<view
class="card settings-card"
v-if="showPrivateSwitch"
>
<view class="setting-row">
<text class="setting-label">私有视角</text>
<uv-switch v-model="filterSelf" />
</view>
<text class="setting-desc">开启后仅展示分配给我的客户和任务数据</text>
</view>
<view class="card"> <view class="card">
<uv-button type="error" :plain="true" @click="onLogout" :loading="loading"> <uv-button type="error" :plain="true" @click="onLogout" :loading="loading">
@ -10,12 +21,21 @@
</template> </template>
<script setup> <script setup>
import { ref } from 'vue' import { ref, computed } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserStore } from '@/store/user' import { useUserStore } from '@/store/user'
import { logout } from '@/api/user' import { logout } from '@/api/user'
const loading = ref(false) const loading = ref(false)
const userStore = useUserStore() const userStore = useUserStore()
const { privateView, userInfo } = storeToRefs(userStore)
const filterSelf = computed({
get: () => privateView.value,
set: (val) => userStore.setPrivateView(val)
})
const showPrivateSwitch = computed(() =>
userInfo.value?.roles?.some(r => ['admin', 'sys_admin'].includes(r))
)
const onLogout = async () => { const onLogout = async () => {
if (loading.value) return if (loading.value) return
@ -50,6 +70,28 @@ const onLogout = async () => {
box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.04); box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.04);
} }
.settings-card {
margin-bottom: 24rpx;
}
.setting-row {
display: flex;
justify-content: space-between;
align-items: center;
}
.setting-label {
font-size: 30rpx;
font-weight: 500;
color: #111827;
}
.setting-desc {
margin-top: 14rpx;
font-size: 24rpx;
color: #6b7280;
}
.title { .title {
font-size: 30rpx; font-size: 30rpx;
font-weight: 600; font-weight: 600;

View File

@ -6,13 +6,24 @@ import { defineStore } from 'pinia'
*/ */
export const useUserStore = defineStore('user', { export const useUserStore = defineStore('user', {
state: () => { state: () => {
const storedPrivateView = uni.getStorageSync('privateView')
const normalizePrivateView = () => {
if (typeof storedPrivateView === 'boolean') return storedPrivateView
if (storedPrivateView === '' || storedPrivateView === undefined || storedPrivateView === null) {
return false
}
return !!storedPrivateView
}
return { return {
// 用户 token // 用户 token
token: uni.getStorageSync('token') || '', token: uni.getStorageSync('token') || '',
// 用户信息 // 用户信息
userInfo: uni.getStorageSync('userInfo') || null, userInfo: uni.getStorageSync('userInfo') || null,
// token 过期时间(可选) // token 过期时间(可选)
tokenExpireTime: uni.getStorageSync('tokenExpireTime') || null tokenExpireTime: uni.getStorageSync('tokenExpireTime') || null,
// 是否启用私有视角
privateView: normalizePrivateView()
} }
}, },
@ -38,6 +49,13 @@ export const useUserStore = defineStore('user', {
return state.userInfo return state.userInfo
}, },
/**
* 获取私有视角设置
*/
getPrivateView: (state) => {
return state.privateView
},
/** /**
* 判断 token 是否过期如果设置了过期时间 * 判断 token 是否过期如果设置了过期时间
*/ */
@ -93,11 +111,13 @@ export const useUserStore = defineStore('user', {
this.token = '' this.token = ''
this.userInfo = null this.userInfo = null
this.tokenExpireTime = null this.tokenExpireTime = null
this.privateView = false
// 清除本地存储 // 清除本地存储
uni.removeStorageSync('token') uni.removeStorageSync('token')
uni.removeStorageSync('userInfo') uni.removeStorageSync('userInfo')
uni.removeStorageSync('tokenExpireTime') uni.removeStorageSync('tokenExpireTime')
uni.removeStorageSync('privateView')
}, },
/** /**
@ -107,6 +127,15 @@ export const useUserStore = defineStore('user', {
*/ */
updateToken(token, expireTime = null) { updateToken(token, expireTime = null) {
this.setToken(token, expireTime) this.setToken(token, expireTime)
},
/**
* 设置私有视角
* @param {boolean} value
*/
setPrivateView(value) {
this.privateView = value
uni.setStorageSync('privateView', value)
} }
} }
}) })