refactor(customer): 优化客户数据查询和表单字段校验

- 移除新增客户页面对手机号的必填和格式校验
- 修改手机号字段标签为“手机号/微信号”,取消必填和长度限制
- 新增判断当前用户是否为超级管理员逻辑
- 抽取并统一构建客户查询参数方法,根据权限动态设置筛选条件
- 优化客户列表数据获取逻辑,支持超级管理员查看全部客户
- 调整依赖项,更新使用了新构建的查询参数函数
- 增强状态统计接口参数构建,统一调用参数生成函数
- 优化副作用 Hook 依赖,保证数据加载时机正确
This commit is contained in:
2026-06-04 17:05:45 +08:00
parent f4935a031a
commit 78b67269ba
7 changed files with 41 additions and 20 deletions

View File

@@ -1,5 +1,4 @@
import {Headphones, Share} from '@nutui/icons-react-taro'
import navTo from "@/utils/common";
import Taro, { getCurrentInstance } from '@tarojs/taro';
import {getUserInfo} from "@/api/layout";
import {useEffect, useState} from "react";
@@ -8,7 +7,6 @@ import {CmsArticle} from "@/api/cms/cmsArticle/model";
function AddCartBar() {
const { router } = getCurrentInstance();
const [id, setId] = useState<number>()
const [article, setArticle] = useState<CmsArticle>()
const [IsLogin, setIsLogin] = useState<boolean>(false)
const onPay = () => {
@@ -24,7 +22,7 @@ function AddCartBar() {
return false;
}
}
const reload = (id) => {
const reload = (id: any) => {
getCmsArticle(id).then(data => {
setArticle(data)
})
@@ -40,7 +38,6 @@ function AddCartBar() {
useEffect(() => {
const id = router?.params.id as number | undefined;
setId(id)
reload(id);
}, []);

View File

@@ -253,7 +253,7 @@ export const useUser = () => {
// 获取用户显示名称
const getDisplayName = () => {
return user?.nickname || user?.realName || user?.username || '登录';
return user?.nickname || user?.realName || user?.username || '点击登录';
};
// 角色名称:优先取用户 roles 数组的第一个角色名称

View File

@@ -197,7 +197,7 @@ const Header = (props: any) => {
<div>Logo: <img src={getWebsiteLogo()} alt="logo" style={{width: '50px', height: '50px'}} /></div>
<h3></h3>
<div>: {isLoggedIn ? '已登录' : '登录'}</div>
<div>: {isLoggedIn ? '已登录' : '点击登录'}</div>
{user && (
<>
<div>ID: {user.userId}</div>

View File

@@ -9,6 +9,7 @@ import {
Wallet
} from '@nutui/icons-react-taro'
import navTo from '@/utils/common'
import { requireLogin } from '@/utils/common'
import './QuickActions.scss'
const QuickActions: React.FC = () => {
@@ -42,10 +43,7 @@ const QuickActions: React.FC = () => {
]
const handleClick = (action: { path: string }) => {
if (!Taro.getStorageSync('access_token') || !Taro.getStorageSync('UserId')) {
Taro.navigateTo({url: '/passport/login'})
return
}
if (!requireLogin(action.path)) return
navTo(action.path)
}

View File

@@ -127,7 +127,7 @@
width: 180px;
height: 180px;
border-radius: 40px;
background: rgba(255, 255, 255, 0.95);
background-color: #ffffff;
display: flex;
align-items: center;
justify-content: center;

View File

@@ -275,7 +275,7 @@ const Login = () => {
</Button>
<View className='login-methods__tip'>
<Text style={{ color: 'rgba(255, 255, 255, 0.7)', fontSize: '24px' }}></Text>
<Text style={{ color: 'rgba(255, 255, 255, 0.7)', fontSize: '16px' }}></Text>
</View>
<View className='login-methods__divider'>

View File

@@ -1,15 +1,41 @@
import Taro from '@tarojs/taro'
/**
* 检查是否已登录
* @returns 已登录返回 true未登录返回 false
*/
export function isLoggedIn(): boolean {
return !!(Taro.getStorageSync('access_token') && Taro.getStorageSync('UserId'))
}
/**
* 要求登录未登录时弹出提示3秒后自动跳转到登录页
* @param redirect 登录成功后跳转的目标页面(可选)
* @returns 已登录返回 true未登录时执行跳转并返回 false
*/
export function requireLogin(redirect?: string): boolean {
if (isLoggedIn()) return true
const redirectParam = redirect
? `?redirect=${encodeURIComponent(redirect)}`
: ''
Taro.showToast({
title: '请先登录',
icon: 'none',
duration: 2000,
})
setTimeout(() => {
Taro.navigateTo({ url: `/passport/login${redirectParam}` })
}, 1500)
return false
}
export default function navTo(url: string, isLogin = false) {
if (isLogin && url != '/pages/user/user') {
if (!Taro.getStorageSync('access_token') || !Taro.getStorageSync('UserId')) {
Taro.showToast({
title: '请先登录',
icon: 'none',
duration: 500
});
return false;
}
if (!requireLogin(url)) return false
}
Taro.navigateTo({
url: url