Skip to content

Commit c9e9398

Browse files
committed
feat: 登陆拦截
1 parent 69e616d commit c9e9398

File tree

6 files changed

+167
-22
lines changed

6 files changed

+167
-22
lines changed

src/pages/demo/base/route.vue

-21
This file was deleted.

src/pages/demo/index.vue

+23
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,24 @@ const pageDemos = pagesJson.pages
6060
path: e.path,
6161
}))
6262
63+
const routeInterceptionList = [
64+
{
65+
title: '说明页面',
66+
path: 'pages/demo/route-interceptor/index',
67+
},
68+
{
69+
title: '单独登录页面',
70+
path: 'pages/demo/route-interceptor/login-page?name=feige&age=30',
71+
},
72+
{
73+
title: '登录弹窗',
74+
path: 'pages/demo/route-interceptor/login-model?name=feige&age=30',
75+
},
76+
{
77+
title: '静默登录',
78+
path: 'pages/demo/route-interceptor/login-auto?name=feige&age=30',
79+
},
80+
]
6381
const tabList = reactive([
6482
{
6583
id: 1,
@@ -68,6 +86,11 @@ const tabList = reactive([
6886
},
6987
{
7088
id: 2,
89+
title: '登录拦截',
90+
list: routeInterceptionList,
91+
},
92+
{
93+
id: 3,
7194
title: '页面功能',
7295
list: pageDemos,
7396
},
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<route lang="json5" type="page">
2+
{
3+
needLogin: true,
4+
style: { navigationBarTitleText: '登陆拦截' },
5+
}
6+
</route>
7+
8+
<template>
9+
<view class="mt-8 text-center">
10+
<view class="">登陆拦截的时候的登录有如下3种情况</view>
11+
<view class="">1.登录动作有单独的登录页面,需要通过重定向处理</view>
12+
<view class="">
13+
2.登录动作在当前页面通过弹窗登录,登录后需要更新登录状态(或者刷新本页面,体验没那么好)
14+
</view>
15+
<view class="">3.静默登录,小程序可以直接login,通常情况下都是登录状态的</view>
16+
<view class="leading-10">
17+
用户是否已登录:<text>{{ isLogined ? '是' : '否' }}</text>
18+
</view>
19+
<button v-if="!isLogined" @click="setUserInfo">登陆</button>
20+
<button v-else @click="clearUserInfo" class="mt-4">登出</button>
21+
</view>
22+
</template>
23+
24+
<script lang="ts" setup>
25+
import { useUserStore } from '@/store'
26+
27+
const userStore = useUserStore()
28+
29+
const isLogined = computed(() => {
30+
return userStore.isLogined
31+
})
32+
33+
const setUserInfo = () => {
34+
userStore.setUserInfo({ nickname: '菲鸽', avatar: '', token: 'abcdef' })
35+
}
36+
const clearUserInfo = () => {
37+
userStore.clearUserInfo()
38+
}
39+
</script>
40+
41+
<style lang="scss" scoped>
42+
//
43+
</style>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<route lang="json5" type="page">
2+
{
3+
layout: 'default',
4+
style: {
5+
navigationBarTitleText: '自动登录(无需拦截)',
6+
},
7+
}
8+
</route>
9+
10+
<template>
11+
<view class="mt-8 text-center">
12+
<view class="">
13+
自动登录,通常在小程序里面都会先自动登录,所以都是登录状态,无需拦截。这个项目不方便演示,后续开个新项目演示
14+
</view>
15+
</view>
16+
</template>
17+
18+
<script lang="ts" setup>
19+
//
20+
</script>
21+
22+
<style lang="scss" scoped>
23+
//
24+
</style>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<route lang="json5" type="page">
2+
{
3+
style: { navigationBarTitleText: '登陆拦截 - 登陆弹窗' },
4+
}
5+
</route>
6+
7+
<template>
8+
<view class="mt-8 text-center">
9+
<view class="leading-10">
10+
用户是否已登录:<text>{{ isLogined ? '是' : '否' }}</text>
11+
</view>
12+
<view>这里有一个按钮(比如点赞按钮),点击这个按钮需要先登录</view>
13+
<button @tap="onClick">点赞菲鸽</button>
14+
<uv-modal
15+
ref="modal"
16+
title="登陆"
17+
content="模拟登陆,点击确认按钮即可"
18+
@confirm="confirmLogin"
19+
></uv-modal>
20+
</view>
21+
</template>
22+
23+
<script lang="ts" setup>
24+
import { useUserStore } from '@/store'
25+
import { onShareAppMessage, onShareTimeline } from '@dcloudio/uni-app'
26+
27+
const userStore = useUserStore()
28+
const pages = getCurrentPages()
29+
console.log('pages:', pages)
30+
31+
const modal = ref()
32+
33+
const isLogined = computed(() => {
34+
console.log('userStore=>', userStore)
35+
const pages = getCurrentPages()
36+
console.log('pages:', pages)
37+
return userStore.isLogined
38+
})
39+
40+
const confirmLogin = () => {
41+
userStore.setUserInfo({ nickname: '菲鸽', avatar: '', token: 'abcdef' })
42+
onClick() // 补偿机制,比较友好。当然,也可以让用户重新点击一下。
43+
modal.value?.close()
44+
}
45+
const onClick = () => {
46+
if (isLogined.value) {
47+
console.log('用户已登录,可以点赞')
48+
uni.showToast({ title: '点赞成功' })
49+
// 这里执行接口请求
50+
return
51+
}
52+
modal.value?.open()
53+
}
54+
55+
/** 激活“分享给好友” */
56+
onShareAppMessage((options: Page.ShareAppMessageOption): Page.CustomShareContent => {
57+
console.log('options:', options)
58+
return {
59+
title: 'unibest 路由拦截、进入指定页面',
60+
desc: 'unibest 演示示例',
61+
// path: '/pages/demo/base/route-middleware?redirect=/pages/demo/base/route-interceptor?a=1&b=2',
62+
path: 'pages/route-interceptor/index?name=feige&age=30&sex=male',
63+
}
64+
})
65+
/** 激活“分享到朋友圈”, 注意:需要先激活“分享给好友” */
66+
onShareTimeline((): Page.ShareTimelineContent => {
67+
return {
68+
title: '自定义分享标题',
69+
query: 'a=1&b=2',
70+
}
71+
})
72+
</script>
73+
74+
<style lang="scss" scoped>
75+
//
76+
</style>

src/pages/route-interceptor/index.vue src/pages/demo/route-interceptor/login-page.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<route lang="json5" type="page">
22
{
33
needLogin: true,
4-
style: { navigationBarTitleText: '路由拦截' },
4+
style: { navigationBarTitleText: '登陆拦截 - 登陆页面' },
55
}
66
</route>
77

0 commit comments

Comments
 (0)