((resolve, reject) => {
+ Taro.login({
+ success: (loginRes) => {
+ loginByOpenId({
+ code: loginRes.code,
+ tenantId: TenantId
+ }).then(async (data) => {
+ if (data) {
+ // 保存登录信息
+ saveUserToStorage(data.access_token, data.user);
+ setUser(data.user);
+ setIsLoggedIn(true);
+
+ // 处理邀请关系
+ if (data.user?.userId) {
+ try {
+ const inviteSuccess = await handleInviteRelation(data.user.userId);
+ if (inviteSuccess) {
+ console.log('自动登录时邀请关系建立成功');
+ }
+ } catch (error) {
+ console.error('自动登录时处理邀请关系失败:', error);
+ }
+ }
+
+ resolve(data.user);
+ } else {
+ reject(new Error('自动登录失败'));
+ }
+ }).catch(_ => {
+ // 首次注册,跳转到邀请注册页面
+ const pages = Taro.getCurrentPages();
+ const currentPage = pages[pages.length - 1];
+ const inviteParams = getStoredInviteParams()
+ if (currentPage?.route !== 'dealer/apply/add' && inviteParams?.inviter) {
+ return Taro.navigateTo({
+ url: '/dealer/apply/add'
+ });
+ }
+ });
+ },
+ fail: reject
+ });
+ });
+ return res;
+ } catch (error) {
+ console.error('自动登录失败:', error);
+ return null;
+ }
+ };
+
// 从本地存储加载用户数据
- const loadUserFromStorage = () => {
+ const loadUserFromStorage = async () => {
try {
const token = Taro.getStorageSync('access_token');
const userData = Taro.getStorageSync('User');
@@ -26,8 +82,13 @@ export const useUser = () => {
setIsLoggedIn(true);
setUser({ userId, tenantId } as User);
} else {
- setUser(null);
- setIsLoggedIn(false);
+ // 没有本地登录信息,尝试自动登录
+ console.log('没有本地登录信息,尝试自动登录...');
+ const autoLoginResult = await autoLoginByOpenId();
+ if (!autoLoginResult) {
+ setUser(null);
+ setIsLoggedIn(false);
+ }
}
} catch (error) {
console.error('加载用户数据失败:', error);
@@ -43,9 +104,24 @@ export const useUser = () => {
try {
Taro.setStorageSync('access_token', token);
Taro.setStorageSync('User', userInfo);
- Taro.setStorageSync('UserId', userInfo.userId);
- Taro.setStorageSync('TenantId', userInfo.tenantId);
- Taro.setStorageSync('Phone', userInfo.phone);
+
+ // 确保关键字段不为空时才保存,避免覆盖现有数据
+ if (userInfo.userId) {
+ Taro.setStorageSync('UserId', userInfo.userId);
+ }
+ if (userInfo.tenantId) {
+ Taro.setStorageSync('TenantId', userInfo.tenantId);
+ }
+ if (userInfo.phone) {
+ Taro.setStorageSync('Phone', userInfo.phone);
+ }
+ // 保存头像和昵称信息
+ if (userInfo.avatar) {
+ Taro.setStorageSync('Avatar', userInfo.avatar);
+ }
+ if (userInfo.nickname) {
+ Taro.setStorageSync('Nickname', userInfo.nickname);
+ }
} catch (error) {
console.error('保存用户数据失败:', error);
}
@@ -114,9 +190,16 @@ export const useUser = () => {
}
try {
- const updatedUser = { ...user, ...userData };
+ // 先获取最新的用户信息,确保我们有完整的数据
+ const latestUserInfo = await getUserInfo();
+
+ // 合并最新的用户信息和要更新的数据
+ const updatedUser = { ...latestUserInfo, ...userData };
+
+ // 调用API更新用户信息
await updateUserInfo(updatedUser);
+ // 更新本地状态
setUser(updatedUser);
// 更新本地存储
@@ -216,7 +299,10 @@ export const useUser = () => {
// 初始化时加载用户数据
useEffect(() => {
- loadUserFromStorage();
+ loadUserFromStorage().catch(error => {
+ console.error('初始化用户数据失败:', error);
+ setLoading(false);
+ });
}, []);
return {
@@ -231,6 +317,7 @@ export const useUser = () => {
fetchUserInfo,
updateUser,
loadUserFromStorage,
+ autoLoginByOpenId,
// 工具方法
hasPermission,
diff --git a/src/hooks/useUserData.ts b/src/hooks/useUserData.ts
index 33a1bef..fcc0423 100644
--- a/src/hooks/useUserData.ts
+++ b/src/hooks/useUserData.ts
@@ -39,6 +39,10 @@ export const useUserData = (): UseUserDataReturn => {
setLoading(true)
setError(null)
+ if(!Taro.getStorageSync('UserId')){
+ return;
+ }
+
// 并发请求所有数据
const [userDataRes, couponsRes, giftCardsRes] = await Promise.all([
getUserInfo(),
diff --git a/src/pages/cart/cart.tsx b/src/pages/cart/cart.tsx
index 7a48947..e415a03 100644
--- a/src/pages/cart/cart.tsx
+++ b/src/pages/cart/cart.tsx
@@ -1,5 +1,5 @@
import {useEffect, useState} from "react";
-import Taro, {useShareAppMessage, useShareTimeline, useDidShow} from '@tarojs/taro';
+import Taro, {useShareAppMessage, useDidShow} from '@tarojs/taro';
import {
NavBar,
Checkbox,
@@ -39,15 +39,9 @@ function Cart() {
nutuiInputnumberButtonBorderRadius: '4px',
}
- useShareTimeline(() => {
- return {
- title: '购物车 - 网宿小店'
- };
- });
-
useShareAppMessage(() => {
return {
- title: '购物车 - 网宿小店',
+ title: '购物车 - 时里院子市集',
success: function () {
console.log('分享成功');
},
diff --git a/src/pages/cms/category/components/ArticleList.tsx b/src/pages/cms/category/components/ArticleList.tsx
new file mode 100644
index 0000000..3f46857
--- /dev/null
+++ b/src/pages/cms/category/components/ArticleList.tsx
@@ -0,0 +1,25 @@
+import {Image, Cell} from '@nutui/nutui-react-taro'
+import Taro from '@tarojs/taro'
+
+const ArticleList = (props: any) => {
+
+ return (
+ <>
+
+ {props.data.map((item, index) => {
+ return (
+ |
+ }
+ key={index}
+ onClick={() => Taro.navigateTo({url: '/cms/detail/index?id=' + item.articleId})}
+ />
+ )
+ })}
+
+ >
+ )
+}
+export default ArticleList
diff --git a/src/pages/cms/category/components/ArticleTabs.tsx b/src/pages/cms/category/components/ArticleTabs.tsx
new file mode 100644
index 0000000..a995345
--- /dev/null
+++ b/src/pages/cms/category/components/ArticleTabs.tsx
@@ -0,0 +1,59 @@
+import {useEffect, useState} from "react";
+import {Tabs, Loading} from '@nutui/nutui-react-taro'
+import {pageCmsArticle} from "@/api/cms/cmsArticle";
+import {CmsArticle} from "@/api/cms/cmsArticle/model";
+import ArticleList from "./ArticleList";
+
+const ArticleTabs = (props: any) => {
+ const [loading, setLoading] = useState(true)
+ const [tab1value, setTab1value] = useState('0')
+ const [list, setList] = useState([])
+
+ const reload = async (value) => {
+ const {data} = props
+ pageCmsArticle({
+ categoryId: data[value].navigationId,
+ page: 1,
+ status: 0,
+ limit: 10
+ }).then((res) => {
+ res && setList(res?.list || [])
+ })
+ .catch(err => {
+ console.log(err)
+ })
+ .finally(() => {
+ setTab1value(value)
+ setLoading(false)
+ })
+ }
+
+ useEffect(() => {
+ reload(0).then()
+ }, []);
+
+ if (loading) {
+ return (
+ 加载中
+ )
+ }
+
+ return (
+ <>
+ {
+ reload(value).then()
+ }}
+ >
+ {props.data?.map((item, index) => {
+ return (
+
+ )
+ })}
+
+
+ >
+ )
+}
+export default ArticleTabs
diff --git a/src/pages/cms/category/components/Banner.tsx b/src/pages/cms/category/components/Banner.tsx
new file mode 100644
index 0000000..7f3942d
--- /dev/null
+++ b/src/pages/cms/category/components/Banner.tsx
@@ -0,0 +1,31 @@
+import { useEffect, useState } from 'react'
+import { Swiper } from '@nutui/nutui-react-taro'
+import {CmsAd} from "@/api/cms/cmsAd/model";
+import {Image} from '@nutui/nutui-react-taro'
+import {getCmsAd} from "@/api/cms/cmsAd";
+
+const MyPage = () => {
+ const [item, setItem] = useState()
+ const reload = () => {
+ getCmsAd(439).then(data => {
+ setItem(data)
+ })
+ }
+
+ useEffect(() => {
+ reload()
+ }, [])
+
+ return (
+ <>
+
+ {item?.imageList?.map((item) => (
+
+
+
+ ))}
+
+ >
+ )
+}
+export default MyPage
diff --git a/src/pages/cms/category/index.config.ts b/src/pages/cms/category/index.config.ts
new file mode 100644
index 0000000..689ba07
--- /dev/null
+++ b/src/pages/cms/category/index.config.ts
@@ -0,0 +1,4 @@
+export default definePageConfig({
+ navigationBarTitleText: '文章列表',
+ navigationBarTextStyle: 'black'
+})
diff --git a/src/pages/cms/category/index.scss b/src/pages/cms/category/index.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/pages/cms/category/index.tsx b/src/pages/cms/category/index.tsx
new file mode 100644
index 0000000..6886cc3
--- /dev/null
+++ b/src/pages/cms/category/index.tsx
@@ -0,0 +1,71 @@
+import Taro from '@tarojs/taro'
+import {useShareAppMessage} from "@tarojs/taro"
+import {Loading} from '@nutui/nutui-react-taro'
+import {useEffect, useState} from "react"
+import {useRouter} from '@tarojs/taro'
+import {getCmsNavigation, listCmsNavigation} from "@/api/cms/cmsNavigation";
+import {CmsNavigation} from "@/api/cms/cmsNavigation/model";
+import {pageCmsArticle} from "@/api/cms/cmsArticle";
+import {CmsArticle} from "@/api/cms/cmsArticle/model";
+import ArticleList from './components/ArticleList'
+import ArticleTabs from "./components/ArticleTabs";
+import './index.scss'
+
+function Category() {
+ const {params} = useRouter();
+ const [categoryId, setCategoryId] = useState(0)
+ const [category, setCategory] = useState([])
+ const [loading, setLoading] = useState(true)
+ const [nav, setNav] = useState()
+ const [list, setList] = useState