feat(user): 添加关于页隐藏开发者登录功能

- 在底部版权信息连续点击11次时弹出开发者登录弹窗
- 登录方式采用手机号加短信验证码,复用现有登录API
- 点击计数器使用useRef实现,3秒无操作自动重置
- 第4次及以后点击显示剩余步数提示,前3次触发轻震动反馈
- 登录成功后同步React登录态,关闭弹窗并重置表单
- 弹窗中使用NutUI组件,实现验证码发送和倒计时功能
This commit is contained in:
2026-07-15 01:25:04 +08:00
parent 1e4549095a
commit 19ca568d60
3 changed files with 285 additions and 2 deletions

79
src/utils/privacy.ts Normal file
View File

@@ -0,0 +1,79 @@
import Taro from '@tarojs/taro'
/**
* 在调用隐私相关 API / 组件前,确保用户已完成微信隐私协议授权。
* 基础库 3.16.1+ 强制要求,未授权会抛 errno:112 / buttonId is wrong 等错误。
* 旧基础库或不支持隐私协议的版本直接放行。
*/
export const ensurePrivacyAuthorized = (): Promise<void> => {
return new Promise((resolve) => {
const wxAny: any = Taro
if (typeof wxAny.requirePrivacyAuthorize !== 'function') {
resolve()
return
}
if (typeof wxAny.getPrivacySetting === 'function') {
wxAny.getPrivacySetting({
success: (res: any) => {
if (res && res.needAuthorization) {
wxAny.requirePrivacyAuthorize({
success: () => resolve(),
fail: () => resolve(),
})
} else {
resolve()
}
},
fail: () => resolve(),
})
} else {
wxAny.requirePrivacyAuthorize({
success: () => resolve(),
fail: () => resolve(),
})
}
})
}
/**
* 打开官方隐私协议页面(半屏协议)。
* 返回是否成功打开。
*/
export const openPrivacyContract = (): Promise<boolean> => {
return new Promise((resolve) => {
const wxAny: any = Taro
if (typeof wxAny.openPrivacyContract !== 'function') {
resolve(false)
return
}
wxAny.openPrivacyContract({
success: () => resolve(true),
fail: () => resolve(false),
})
})
}
/**
* 检查当前用户是否需要同意隐私协议。
*/
export const checkPrivacyAuthorization = (): Promise<{
needAuthorization: boolean
isAuthorization: boolean
}> => {
return new Promise((resolve) => {
const wxAny: any = Taro
if (typeof wxAny.getPrivacySetting !== 'function') {
resolve({ needAuthorization: false, isAuthorization: true })
return
}
wxAny.getPrivacySetting({
success: (res: any) => {
resolve({
needAuthorization: !!res?.needAuthorization,
isAuthorization: !!res?.isAuthorization,
})
},
fail: () => resolve({ needAuthorization: false, isAuthorization: true }),
})
})
}