添加全局私有视角到我的页面
This commit is contained in:
parent
a74badc79a
commit
9413b651e0
|
|
@ -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);
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user