From 07d35d48d71125eb33309329a51221c95579c7ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com>
Date: Tue, 3 Feb 2026 16:54:09 +0800
Subject: [PATCH] =?UTF-8?q?refactor(user):=20=E4=BC=98=E5=8C=96=E7=94=A8?=
=?UTF-8?q?=E6=88=B7=E6=9D=83=E9=99=90=E6=A3=80=E6=9F=A5=E5=92=8C=E7=95=8C?=
=?UTF-8?q?=E9=9D=A2=E6=98=BE=E7=A4=BA=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 移除邀请人ID表单项并注释相关代码
- 注释掉邀请信息检测成功提示弹窗功能
- 在开发、生产、测试环境中添加本地API调试配置选项
- 添加分销商角色权限检查,非分销商无法查看客户列表
- 使用useRef避免重复显示无权限提示
- 在客户列表页面添加权限验证和加载状态处理
- 移除用户卡片中的余额、积分、优惠券、礼品卡等显示组件
- 简化用户角色名称获取逻辑,优先使用用户角色数组第一个角色名称
- 优化用户信息加载和权限验证流程
---
config/env.ts | 3 ++
src/app.ts | 14 +++----
src/dealer/apply/add.tsx | 6 +--
src/dealer/customer/index.tsx | 54 +++++++++++++++++++++++---
src/hooks/useUser.ts | 18 ++-------
src/pages/user/components/UserCard.tsx | 40 ++++---------------
6 files changed, 72 insertions(+), 63 deletions(-)
diff --git a/config/env.ts b/config/env.ts
index 66f018d..d49548f 100644
--- a/config/env.ts
+++ b/config/env.ts
@@ -3,18 +3,21 @@ export const ENV_CONFIG = {
// 开发环境
development: {
API_BASE_URL: 'https://cms-api.websoft.top/api',
+ // API_BASE_URL: 'http://127.0.0.1:9200/api',
APP_NAME: '开发环境',
DEBUG: 'true',
},
// 生产环境
production: {
API_BASE_URL: 'https://cms-api.websoft.top/api',
+ // API_BASE_URL: 'http://127.0.0.1:9200/api',
APP_NAME: '南南佐顿门窗',
DEBUG: 'false',
},
// 测试环境
test: {
API_BASE_URL: 'https://cms-api.websoft.top/api',
+ // API_BASE_URL: 'http://127.0.0.1:9200/api',
APP_NAME: '测试环境',
DEBUG: 'true',
}
diff --git a/src/app.ts b/src/app.ts
index af82678..5d3254b 100644
--- a/src/app.ts
+++ b/src/app.ts
@@ -74,13 +74,13 @@ function App(props: { children: any; }) {
trackInviteSource(inviteParams.source || 'unknown', parseInt(inviteParams.inviter || '0'))
// 显示邀请提示
- setTimeout(() => {
- Taro.showToast({
- title: `检测到邀请信息 ID:${inviteParams.inviter}`,
- icon: 'success',
- duration: 3000
- })
- }, 1000)
+ // setTimeout(() => {
+ // Taro.showToast({
+ // title: `检测到邀请信息 ID:${inviteParams.inviter}`,
+ // icon: 'success',
+ // duration: 3000
+ // })
+ // }, 1000)
} else {
console.log('❌ 未检测到邀请参数')
diff --git a/src/dealer/apply/add.tsx b/src/dealer/apply/add.tsx
index bd26cd5..983bfed 100644
--- a/src/dealer/apply/add.tsx
+++ b/src/dealer/apply/add.tsx
@@ -411,9 +411,9 @@ const AddUserAddress = () => {
>
-
-
-
+ {/**/}
+ {/* */}
+ {/**/}
{
const [page, setPage] = useState(1)
const [hasMore, setHasMore] = useState(true)
+ // 非分销商不允许查看客户列表
+ const {hasRole, loading: userLoading} = useUser()
+ const canView = hasRole('dealer')
+ const roleCheckFinished = !userLoading
+ const noPermissionShownRef = useRef(false)
+
+ useEffect(() => {
+ if (!roleCheckFinished || canView) return
+ if (noPermissionShownRef.current) return
+ noPermissionShownRef.current = true
+ Taro.showToast({
+ title: '没有查看权限',
+ icon: 'none',
+ duration: 1500
+ })
+ }, [roleCheckFinished, canView])
+
// Tab配置
const tabList = getStatusOptions();
@@ -330,22 +348,24 @@ const CustomerIndex = () => {
})
}
- // 初始化数据
+ // 初始化统计数据
useEffect(() => {
- fetchCustomerData(activeTab, true).then();
+ if (!roleCheckFinished || !canView) return;
fetchStatusCounts().then();
- }, []);
+ }, [roleCheckFinished, canView]);
// 当activeTab变化时重新获取数据
useEffect(() => {
+ if (!roleCheckFinished || !canView) return;
setList([]); // 清空列表
setPage(1); // 重置页码
setHasMore(true); // 重置加载状态
fetchCustomerData(activeTab, true);
- }, [activeTab]);
+ }, [activeTab, roleCheckFinished, canView]);
// 监听页面显示,当从其他页面返回时刷新数据
useDidShow(() => {
+ if (!roleCheckFinished || !canView) return;
// 刷新当前tab的数据和统计信息
setList([]);
setPage(1);
@@ -543,6 +563,30 @@ const CustomerIndex = () => {
);
};
+ if (!roleCheckFinished) {
+ return (
+
+
+ 加载中...
+
+ );
+ }
+
+ if (!canView) {
+ return (
+
+
+
+
+ );
+ }
+
return (
{/* 搜索栏 */}
diff --git a/src/hooks/useUser.ts b/src/hooks/useUser.ts
index 479a0f3..7b7b1b2 100644
--- a/src/hooks/useUser.ts
+++ b/src/hooks/useUser.ts
@@ -10,6 +10,7 @@ export const useUser = () => {
const [user, setUser] = useState(null);
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [loading, setLoading] = useState(true);
+ const [userInfo] = useState()
// 自动登录(通过OpenID)
const autoLoginByOpenId = async () => {
@@ -256,23 +257,10 @@ export const useUser = () => {
return user?.nickname || user?.realName || user?.username || '未登录';
};
- // 获取用户显示的角色(同步版本)
+ // 角色名称:优先取用户 roles 数组的第一个角色名称
const getRoleName = () => {
- if(hasRole('superAdmin')){
- return '超级管理员';
- }
- if(hasRole('admin')){
- return '管理员';
- }
- if(hasRole('staff')){
- return '员工';
- }
- if(hasRole('vip')){
- return 'VIP会员';
- }
- return '注册用户';
+ return userInfo?.roles?.[0]?.roleName || userInfo?.roleName || '业务员'
}
-
// 检查用户是否已实名认证
const isCertified = () => {
return user?.certification === true;
diff --git a/src/pages/user/components/UserCard.tsx b/src/pages/user/components/UserCard.tsx
index f337c19..9f4c950 100644
--- a/src/pages/user/components/UserCard.tsx
+++ b/src/pages/user/components/UserCard.tsx
@@ -1,6 +1,6 @@
import {Button} from '@nutui/nutui-react-taro'
-import {Avatar, Tag} from '@nutui/nutui-react-taro'
-import {View, Text} from '@tarojs/components'
+import {Avatar} from '@nutui/nutui-react-taro'
+import {View} from '@tarojs/components'
import {Scan} from '@nutui/icons-react-taro';
import {getWxOpenId} from '@/api/layout';
import Taro from '@tarojs/taro';
@@ -8,7 +8,6 @@ import {useEffect} from "react";
import navTo from "@/utils/common";
import {TenantId} from "@/config/app";
import {useUser} from "@/hooks/useUser";
-import {useUserData} from "@/hooks/useUserData";
function UserCard() {
const {
@@ -17,10 +16,8 @@ function UserCard() {
isLoggedIn,
loginUser,
fetchUserInfo,
- getDisplayName,
- getRoleName
+ getDisplayName
} = useUser();
- const {data} = useUserData();
useEffect(() => {
// Taro.getSetting:获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限。
@@ -180,12 +177,10 @@ function UserCard() {
{getDisplayName()}
{isLoggedIn ? (
-
-
-
- {getRoleName()}
-
-
+
+ {/**/}
+ {/* {getRoleName()}*/}
+ {/**/}
) : ''}
@@ -198,27 +193,6 @@ function UserCard() {
- {/**/}
- {/* navTo('/user/wallet/wallet', true)}>*/}
- {/* 余额*/}
- {/* {data?.balance || '0.00'}*/}
- {/* */}
- {/* */}
- {/* 积分*/}
- {/* {data?.points || 0}*/}
- {/* */}
- {/* navTo('/user/coupon/index', true)}>*/}
- {/* 优惠券*/}
- {/* {data?.coupons || 0}*/}
- {/* */}
- {/* navTo('/user/gift/index', true)}>*/}
- {/* 礼品卡*/}
- {/* {data?.giftCards || 0}*/}
- {/* */}
- {/**/}