diff --git a/miniprogram/src/modules/comprehensive/api/auth.js b/miniprogram/src/modules/comprehensive/api/auth.js
index 42b6012..4f68df1 100644
--- a/miniprogram/src/modules/comprehensive/api/auth.js
+++ b/miniprogram/src/modules/comprehensive/api/auth.js
@@ -10,6 +10,7 @@ const toMember = (backendMember = {}) => ({
avatar_url: backendMember.avatar_url || '',
balance: backendMember.balance || '0.00',
is_active: backendMember.is_active === true,
+ profile_completed: backendMember.profile_completed === true,
created_at: backendMember.created_at || ''
})
@@ -33,7 +34,7 @@ export const authApi = {
}
}).then(toWechatLogin)
- authStorage.setToken(loginData.access_token)
+ authStorage.setPendingToken(loginData.access_token)
return loginData
},
logout() {
diff --git a/miniprogram/src/modules/comprehensive/api/member.js b/miniprogram/src/modules/comprehensive/api/member.js
index 20fd25b..dbaacd9 100644
--- a/miniprogram/src/modules/comprehensive/api/member.js
+++ b/miniprogram/src/modules/comprehensive/api/member.js
@@ -10,6 +10,7 @@ const toMember = (backendMember = {}) => ({
avatar_url: backendMember.avatar_url || '',
balance: backendMember.balance || '0.00',
is_active: backendMember.is_active === true,
+ profile_completed: backendMember.profile_completed === true,
created_at: backendMember.created_at || ''
})
diff --git a/miniprogram/src/modules/comprehensive/api/request.js b/miniprogram/src/modules/comprehensive/api/request.js
index c84474c..da97125 100644
--- a/miniprogram/src/modules/comprehensive/api/request.js
+++ b/miniprogram/src/modules/comprehensive/api/request.js
@@ -2,6 +2,8 @@ const KEY_TOKEN = 'COMPREHENSIVE_VENUE_TOKEN'
const API_BASE_URL = import.meta.env.VITE_COMPREHENSIVE_API_BASE_URL || 'http://127.0.0.1:8001'
+let pendingToken = null
+
const normalizeError = (res, fallbackMessage = '请求服务失败') => {
const body = res?.data || res || {}
return {
@@ -19,16 +21,41 @@ export const authStorage = {
getToken() {
return uni.getStorageSync(KEY_TOKEN)
},
+ setPendingToken(token) {
+ pendingToken = token
+ },
+ getPendingToken() {
+ return pendingToken
+ },
+ clearPendingToken() {
+ pendingToken = null
+ },
clear() {
uni.removeStorageSync(KEY_TOKEN)
+ pendingToken = null
},
isLoggedIn() {
return !!uni.getStorageSync(KEY_TOKEN)
}
}
+let isRedirecting = false
+
+function redirectToLogin() {
+ if (isRedirecting) return
+ const pages = getCurrentPages()
+ const current = pages[pages.length - 1]
+ const currentRoute = current?.route || ''
+ if (currentRoute === 'pages/comprehensive/profile/login' || currentRoute === 'pages/comprehensive/profile/setup') {
+ return
+ }
+ isRedirecting = true
+ authStorage.clear()
+ uni.reLaunch({ url: '/pages/comprehensive/profile/login', complete: () => { isRedirecting = false } })
+}
+
export function request(options = {}) {
- const token = authStorage.getToken()
+ const token = authStorage.getToken() || authStorage.getPendingToken()
const header = {
'Content-Type': 'application/json',
...(options.header || {})
@@ -48,7 +75,9 @@ export function request(options = {}) {
const body = res.data
if (res.statusCode === 401 || body?.code === 40001) {
- authStorage.clear()
+ redirectToLogin()
+ reject(normalizeError(res, ''))
+ return
}
if (res.statusCode >= 200 && res.statusCode < 300 && body?.code === 0) {
@@ -76,7 +105,7 @@ export function request(options = {}) {
}
export function uploadFile(options = {}) {
- const token = authStorage.getToken()
+ const token = authStorage.getToken() || authStorage.getPendingToken()
const header = {
...(options.header || {})
}
@@ -101,7 +130,9 @@ export function uploadFile(options = {}) {
}
if (res.statusCode === 401 || body?.code === 40001) {
- authStorage.clear()
+ redirectToLogin()
+ reject(normalizeError({ ...res, data: body }, ''))
+ return
}
if (res.statusCode >= 200 && res.statusCode < 300 && body?.code === 0) {
diff --git a/miniprogram/src/modules/comprehensive/stores/session.js b/miniprogram/src/modules/comprehensive/stores/session.js
index 8298c8d..fda6d80 100644
--- a/miniprogram/src/modules/comprehensive/stores/session.js
+++ b/miniprogram/src/modules/comprehensive/stores/session.js
@@ -6,6 +6,7 @@ export const useComprehensiveSessionStore = defineStore('comprehensiveVenueSessi
state: () => ({
isReady: false,
isLoggedIn: false,
+ needsSetup: false,
member: null
}),
actions: {
@@ -28,12 +29,23 @@ export const useComprehensiveSessionStore = defineStore('comprehensiveVenueSessi
const loginResult = await loginByWechat()
const data = await authApi.wechatLogin({ code: loginResult.code })
this.member = data.member
- this.isLoggedIn = true
+ this.needsSetup = true
+ return data
+ },
+ completeLogin() {
+ const pendingToken = authStorage.getPendingToken()
+ if (pendingToken) {
+ authStorage.setToken(pendingToken)
+ authStorage.clearPendingToken()
+ this.isLoggedIn = true
+ this.needsSetup = false
+ }
},
logout() {
authApi.logout()
this.member = null
this.isLoggedIn = false
+ this.needsSetup = false
},
async refreshMember() {
if (!authStorage.isLoggedIn()) return
diff --git a/miniprogram/src/pages.json b/miniprogram/src/pages.json
index 58d514b..c0322a7 100644
--- a/miniprogram/src/pages.json
+++ b/miniprogram/src/pages.json
@@ -174,6 +174,18 @@
"navigationBarTitleText": "个人信息"
}
},
+ {
+ "path": "pages/comprehensive/profile/login",
+ "style": {
+ "navigationBarTitleText": "登录"
+ }
+ },
+ {
+ "path": "pages/comprehensive/profile/setup",
+ "style": {
+ "navigationBarTitleText": "完善信息"
+ }
+ },
{
"path": "pages/comprehensive/mall/index",
"style": {
diff --git a/miniprogram/src/pages/comprehensive/courses/index.vue b/miniprogram/src/pages/comprehensive/courses/index.vue
index 95f7aee..7d39eeb 100644
--- a/miniprogram/src/pages/comprehensive/courses/index.vue
+++ b/miniprogram/src/pages/comprehensive/courses/index.vue
@@ -1,11 +1,6 @@
-
-
-
+
会员卡
团课
@@ -104,7 +99,6 @@ import { ticketApi } from '@/modules/comprehensive/api/ticket'
import { multiplyAmount } from '@/modules/comprehensive/utils/money'
import { useComprehensiveSessionStore } from '@/modules/comprehensive/stores/session'
import { formatTimeRange, todayString } from '@/modules/comprehensive/utils/date'
-import UnauthLoginPanel from '@/components/UnauthLoginPanel.vue'
const session = useComprehensiveSessionStore()
const activeTab = ref('membership')
@@ -225,11 +219,6 @@ const goDetail = (item) => {
}
}
-const login = async () => {
- await session.login()
- loadSessions(true)
-}
-
const refresh = async () => {
if (activeTab.value === 'tickets') {
ticketProduct.value = null
diff --git a/miniprogram/src/pages/comprehensive/profile/index.vue b/miniprogram/src/pages/comprehensive/profile/index.vue
index 2655899..93c1f8e 100644
--- a/miniprogram/src/pages/comprehensive/profile/index.vue
+++ b/miniprogram/src/pages/comprehensive/profile/index.vue
@@ -1,71 +1,78 @@
-
-
-
-
-
-
-
- {{ avatarInitial }}
-
-
- {{ session.member?.nickname }}
-
- {{ session.member.phone }}
-
- 余额 ¥{{ balanceText }}
-
+
+
+
+ 点击登录
-
-
+
+ 点击登录
+
+
+
+
-
+
+
+
+
+
+
@@ -76,7 +83,6 @@ import { useComprehensiveSessionStore } from '@/modules/comprehensive/stores/ses
import { memberApi } from '@/modules/comprehensive/api/member'
import { formatAmount } from '@/modules/comprehensive/utils/money'
import AgreementLinks from '@/components/AgreementLinks.vue'
-import UnauthLoginPanel from '@/components/UnauthLoginPanel.vue'
const session = useComprehensiveSessionStore()
const avatarInitial = computed(() => (session.member?.nickname || '用户').slice(0, 1))
@@ -104,8 +110,8 @@ onMounted(async () => {
}
})
-const login = async () => {
- await session.login()
+const login = () => {
+ uni.navigateTo({ url: '/pages/comprehensive/profile/login' })
}
const logout = () => {
@@ -121,6 +127,65 @@ defineExpose({ onPageShow: () => {} })
diff --git a/miniprogram/src/pages/comprehensive/profile/setup.vue b/miniprogram/src/pages/comprehensive/profile/setup.vue
new file mode 100644
index 0000000..160ac3d
--- /dev/null
+++ b/miniprogram/src/pages/comprehensive/profile/setup.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+
+ 昵称
+
+
+
+
+ 手机号
+
+ {{ phone }}
+
+
+
+
+
+
+ 返回首页
+
+
+
+
+
+
+
+
+