feat(app): 实现自动登录和邀请关系处理

- 集成微信登录和自动登录逻辑
- 添加处理邀请关系的功能-优化启动参数处理流程
- 增加邀请信息提示功能- 实现主题配置加载逻辑

fix(api):修正类型导入路径错误

- 统一使用 @/api 路径导入 PageParam 类型feat(api): 扩展网站字段模型

- 在 cmsWebsiteField 模型中新增 theme 字段- 支持主题配置的存储和读取
This commit is contained in:
2025-09-25 17:26:23 +08:00
parent 5eb4ac73fb
commit ae78a10b91
3 changed files with 68 additions and 15 deletions

View File

@@ -1,4 +1,4 @@
import type { PageParam } from '@/api/index'; import type { PageParam } from '@/api';
/** /**
* 应用参数 * 应用参数
@@ -48,6 +48,7 @@ export interface Config {
loginBgImg?: string; loginBgImg?: string;
address?: string; address?: string;
tel?: string; tel?: string;
theme?: string;
workDay?: string; workDay?: string;
kefu2?: string; kefu2?: string;
kefu1?: string; kefu1?: string;

View File

@@ -1,4 +1,4 @@
import type { PageParam } from '@/api/index'; import type { PageParam } from '@/api';
/** /**
* 收货地址 * 收货地址

View File

@@ -3,13 +3,49 @@ import Taro, {useDidShow, useDidHide} from '@tarojs/taro'
// 全局样式 // 全局样式
import './app.scss' import './app.scss'
import {parseInviteParams, saveInviteParams, trackInviteSource} from "@/utils/invite"; import {loginByOpenId} from "@/api/layout";
import {TenantId} from "@/config/app";
import {saveStorageByLoginUser} from "@/utils/server";
import {parseInviteParams, saveInviteParams, trackInviteSource, handleInviteRelation} from "@/utils/invite";
import {configWebsiteField} from "@/api/cms/cmsWebsiteField";
function App(props: { children: any; }) { function App(props: { children: any; }) {
const reload = () => {
Taro.login({
success: (res) => {
loginByOpenId({
code: res.code,
tenantId: TenantId
}).then(async data => {
if (data) {
saveStorageByLoginUser(data.access_token, data.user)
// 处理邀请关系
if (data.user?.userId) {
try {
const inviteSuccess = await handleInviteRelation(data.user.userId)
if (inviteSuccess) {
console.log('自动登录时邀请关系建立成功')
}
} catch (error) {
console.error('自动登录时处理邀请关系失败:', error)
}
}
}
})
}
})
};
// 可以使用所有的 React Hooks // 可以使用所有的 React Hooks
useEffect(() => { useEffect(() => {
// 自动登录逻辑现在已经集成到 useUser Hook 中 // Taro.getSetting获取用户的当前设置。返回值中只会出现小程序已经向用户请求过的权限。
// 这里只需要处理邀请参数 Taro.getSetting({
success: (res) => {
if (res.authSetting['scope.userInfo']) {
reload();
}
}
});
}, []); }, []);
// 对应 onShow // 对应 onShow
@@ -17,17 +53,19 @@ function App(props: { children: any; }) {
// 处理小程序启动参数中的邀请信息 // 处理小程序启动参数中的邀请信息
const options = Taro.getLaunchOptionsSync() const options = Taro.getLaunchOptionsSync()
handleLaunchOptions(options) handleLaunchOptions(options)
handleTheme()
}) })
// 处理启动参数 // 处理启动参数
const handleLaunchOptions = (options: any) => { const handleLaunchOptions = (options: any) => {
try { try {
console.log('小程序启动参数:', options) console.log('=== 小程序启动参数处理开始 ===')
console.log('完整启动参数:', JSON.stringify(options, null, 2))
// 解析邀请参数 // 解析邀请参数
const inviteParams = parseInviteParams(options) const inviteParams = parseInviteParams(options)
if (inviteParams) { if (inviteParams) {
console.log('检测到邀请参数:', inviteParams) console.log('✅ 成功检测到邀请参数:', inviteParams)
// 保存邀请参数到本地存储 // 保存邀请参数到本地存储
saveInviteParams(inviteParams) saveInviteParams(inviteParams)
@@ -35,20 +73,34 @@ function App(props: { children: any; }) {
// 统计邀请来源 // 统计邀请来源
trackInviteSource(inviteParams.source || 'unknown', parseInt(inviteParams.inviter || '0')) trackInviteSource(inviteParams.source || 'unknown', parseInt(inviteParams.inviter || '0'))
// 检测到邀请信息 // 显示邀请提示
// setTimeout(() => { setTimeout(() => {
// Taro.showToast({ Taro.showToast({
// title: '检测到邀请信息', title: `检测到邀请信息 ID:${inviteParams.inviter}`,
// icon: 'success', icon: 'success',
// duration: 2000 duration: 3000
// }) })
// }, 1000) }, 1000)
} else {
console.log('❌ 未检测到邀请参数')
} }
console.log('=== 小程序启动参数处理结束 ===')
} catch (error) { } catch (error) {
console.error('处理启动参数失败:', error) console.error('处理启动参数失败:', error)
} }
} }
const handleTheme = () => {
configWebsiteField().then(data => {
// 设置主题
if(data.theme && !Taro.getStorageSync('user_theme')){
Taro.setStorageSync('user_theme', data.theme)
}
})
}
// 对应 onHide // 对应 onHide
useDidHide(() => { useDidHide(() => {
}) })