diff --git a/.workbuddy/memory/2026-07-14.md b/.workbuddy/memory/2026-07-14.md index 5576528..e7fe654 100644 --- a/.workbuddy/memory/2026-07-14.md +++ b/.workbuddy/memory/2026-07-14.md @@ -90,3 +90,29 @@ adapter `/list` 接口忽略分页,一次返回全部收藏;前端 `listShop 2. **`src/api/shop/shopCart/index.ts`**:`updateCartNum` 发 `{id, cartNum}`;`updateCartChecked` 发 `{id, selected}` 3. **`src/contexts/CartContext.tsx`**:`refresh()` 读 `item.cartNum` 和 `item.selected`;`addItem()` 发 `cartNum`;`updateQuantity` 调用 `{id, cartNum}` 4. **`src/pages/shop/index.tsx`** + **`src/pages/shop/category.tsx`**:`addToCart` 参数 `num` → `cartNum` + +## 禁用 loginByOpenId 静默登录(2026-07-14) + +### 改动 +- **`src/contexts/UserContext.tsx`**:移除"情况3"静默登录块(`Taro.login` + `loginByOpenId`),无 token 时直接保持未登录状态;清理 `loginByOpenId`、`TenantId` 无用导入 +- **`src/hooks/useUser.ts`**:移除降级方案中的 `loginByOpenId` 调用,仅从 storage 读取;清理 `loginByOpenId`、`TenantId` 无用导入 +- `src/api/layout/index.ts` 中 `loginByOpenId` 函数定义保留,仅不再被调用 + +## 商城分类页价格登录可见(2026-07-14) + +### 改动 +- **`src/pages/shop/index.tsx`**:价格显示从手写 `Text` 改为 `Price` 组件 + `loginMask` 属性(与首页一致),游客看到"登录后查看价格";VIP 划线价逻辑保留在 `original` prop 中;单位 `unitName` 仅登录后显示 + +## 订单列表页未登录可查看订单 Bug 修复(2026-07-14) + +### 问题 +`pages/order/list` 未登录用户也能看到订单数据。 + +### 根因 +页面缺少登录校验——`useEffect` 直接调用 `loadOrders`,未登录时 `user?.userId` 为 `undefined`,后端未按用户过滤直接返回了订单。 + +### 修改 +- **`src/pages/order/list.tsx`**:采用项目标准模式 A(与 commission.tsx 等页面一致): + 1. 从 `useUser()` 获取 `isLoggedIn` + 2. `useEffect` 中加 `if (!isLoggedIn)` 守卫 → `Taro.navigateTo('/passport/login')` + return + 3. render 中 `if (!isLoggedIn) return null` diff --git a/src/contexts/UserContext.tsx b/src/contexts/UserContext.tsx index a4d9864..0635f1e 100644 --- a/src/contexts/UserContext.tsx +++ b/src/contexts/UserContext.tsx @@ -1,9 +1,8 @@ import React, { createContext, useContext, useState, useEffect, type ReactNode } from 'react' import Taro from '@tarojs/taro' import type { User } from '@/api/system/user/model' -import { getUserInfo, loginByOpenId } from '@/api/layout' +import { getUserInfo } from '@/api/layout' import { saveStorageByLoginUser, clearStorageByLoginUser } from '@/utils/server' -import { TenantId } from '@/config/app' interface UserContextType { user: User | null @@ -42,36 +41,12 @@ export const UserProvider: React.FC<{ children: ReactNode }> = ({ children }) => setLoading(false) return } catch { - // token无效,清除并尝试静默登录 + // token无效,清除 clearStorageByLoginUser() } } - // 情况3: 没有本地token,尝试静默登录(老用户自动登录) - try { - const loginResult = await new Promise<{ access_token?: string; user?: User }>((resolve, reject) => { - Taro.login({ - success: (res) => { - if (res.code) { - loginByOpenId({ code: res.code, tenantId: TenantId }) - .then(resolve) - .catch(reject) - } else { - reject(new Error('no code')) - } - }, - fail: reject, - }) - }) - // 静默登录成功(老用户),自动完成登录 - if (loginResult?.access_token && loginResult?.user) { - saveStorageByLoginUser(loginResult.access_token, loginResult.user) - setUser(loginResult.user) - } - } catch { - // 静默登录失败(非老用户或网络问题),保持未登录状态 - } - + // 无本地token,保持未登录状态(已禁用静默登录) setLoading(false) } init() diff --git a/src/hooks/useUser.ts b/src/hooks/useUser.ts index c91c2ea..4fce662 100644 --- a/src/hooks/useUser.ts +++ b/src/hooks/useUser.ts @@ -2,8 +2,6 @@ import { useUserContext } from '@/contexts/UserContext' import { useEffect, useState } from 'react' import Taro from '@tarojs/taro' import type { User } from '@/api/system/user/model' -import { loginByOpenId } from '@/api/layout' -import { TenantId } from '@/config/app' /** * useUser - 兼容性 Hook @@ -57,24 +55,8 @@ const useUserFallback = () => { } useEffect(() => { - const init = async () => { - const hasLocal = loadFromStorage() - if (!hasLocal) { - try { - const data = await new Promise((resolve, reject) => { - Taro.login({ - success: (res) => loginByOpenId({ code: res.code, tenantId: TenantId }).then(resolve).catch(reject), - fail: reject, - }) - }) - if (data?.access_token && data?.user) { - loginUser(data.access_token, data.user) - } - } catch { /* ignore */ } - } - setLoading(false) - } - init() + loadFromStorage() + setLoading(false) }, []) return { user, isLoggedIn: !!user, loading, loginUser, logoutUser, refreshUser, syncFromStorage } diff --git a/src/pages/order/list.tsx b/src/pages/order/list.tsx index dda2839..e47e00c 100644 --- a/src/pages/order/list.tsx +++ b/src/pages/order/list.tsx @@ -31,7 +31,7 @@ interface TabState { } const OrderListPage: React.FC = () => { - const { user } = useUser() + const { user, isLoggedIn } = useUser() const initTab = Taro.getCurrentInstance().router?.params?.tab ?? Taro.getStorageSync('order_tab') // 读取后清除,避免影响下次进入 @@ -104,10 +104,14 @@ const OrderListPage: React.FC = () => { // 切换 tab 时加载数据 useEffect(() => { + if (!isLoggedIn) { + Taro.navigateTo({ url: '/passport/login' }) + return + } if (!tabStates[tabIndex].initialized) { loadOrders(tabIndex, 1) } - }, [tabIndex]) + }, [tabIndex, isLoggedIn]) const handleLoadMore = () => { if (!currentState.finished && !currentState.loading) { @@ -121,6 +125,10 @@ const OrderListPage: React.FC = () => { } } + if (!isLoggedIn) { + return null + } + return ( {/* 自定义 Tabs 标题栏 */} diff --git a/src/pages/shop/index.tsx b/src/pages/shop/index.tsx index 59fd6fa..200d802 100644 --- a/src/pages/shop/index.tsx +++ b/src/pages/shop/index.tsx @@ -13,6 +13,7 @@ import { requireLogin } from '@/utils/login-guard' import { useShare } from '@/hooks/useShare' import EmptyState from '@/components/common/EmptyState' import LoadMore from '@/components/common/LoadMore' +import Price from '@/components/common/Price' definePageConfig({ navigationBarTitleText: '商品分类', @@ -305,24 +306,21 @@ const ShopPage: React.FC = () => { {/* 价格 + 销量 + 加购 */} - - ¥{getDisplayPrice(item)} - - {item.unitName ? ( + + {item.unitName && !isGuest() ? ( /{item.unitName} ) : null} - {/* VIP 划掉原价 */} - {isVipMember() && item.dealerPrice ? ( - - ¥{item.price} - - ) : item.salePrice && item.salePrice !== item.price ? ( - isGuest() ? null : ( - - ¥{item.salePrice} - - ) - ) : null} {/* 销量 */} {item.sales !== undefined && item.sales > 0 && (