diff --git a/common/api.js b/common/api.js
index ea31dc6..4489cac 100644
--- a/common/api.js
+++ b/common/api.js
@@ -10,19 +10,35 @@ import UniAppWebSocket from './uni-websocket'
export const API_HOST = 'https://dev.wash-painting.cn'
// ==========================================
-// 401 跳登录页防重锁:token 失效时多个接口会同时返回 401,
-// 各自 reLaunch 会并发冲突导致 reLaunch:fail timeout,只放行第一次
+// 登录态工具(微信审核要求:不得在浏览时强制登录)
+// 游客可直接浏览首页/酒友圈等公开内容,仅在用户主动使用
+// 记录、发布、点赞等需要身份的功能时,才弹窗由其自行选择是否登录。
// ==========================================
-let authRedirectLock = false
-function redirectToLogin() {
- if (authRedirectLock) return
- authRedirectLock = true
- setTimeout(() => { authRedirectLock = false }, 3000)
- const pages = getCurrentPages()
- const current = pages.length ? pages[pages.length - 1].route : ''
- // 已在登录页则不重复跳转
- if (current === 'pages/login/login') return
- uni.reLaunch({ url: '/pages/login/login', fail: () => {} })
+
+/** 判断当前是否已登录(本地降级登录也算登录态) */
+export function isLoggedIn() {
+ return uni.getStorageSync('is_logged_in') === 'true'
+}
+
+/**
+ * 需要登录才能使用的功能入口守卫。
+ * 已登录直接放行;未登录弹窗询问,用户可取消继续浏览(不强制)。
+ * @returns {boolean} 是否已登录
+ */
+export function requireLogin() {
+ if (isLoggedIn()) return true
+ uni.showModal({
+ title: '登录提示',
+ content: '该功能需要登录后使用,登录后记录可云端同步,是否立即登录?',
+ confirmText: '去登录',
+ cancelText: '再看看',
+ success: (res) => {
+ if (res.confirm) {
+ uni.navigateTo({ url: '/pages/login/login', fail: () => {} })
+ }
+ }
+ })
+ return false
}
// ==========================================
@@ -60,14 +76,11 @@ function httpRequest(url, params) {
}
resolve(res.data)
} else if (code === 401 ) {
- // token/refresh_token 过期或无效,清除登录态
+ // token/refresh_token 过期或无效:仅静默清除登录态并 reject,
+ // 不强制跳转登录页(游客可继续浏览),后续写操作由 requireLogin 引导
uni.removeStorageSync('auth_token')
uni.removeStorageSync('refresh_token')
uni.removeStorageSync('is_logged_in')
- if (!silent) {
- redirectToLogin()
- uni.showToast({ title: '登录已过期,请重新登录', icon: 'none', duration: 2500 })
- }
reject({ msg: '登录已过期,请重新登录', code })
} else {
const rawMsg = (res.data && res.data.msg) || (res.data && res.data.errmsg) || '请求失败'
diff --git a/pages.json b/pages.json
index f744b97..58a1f3a 100644
--- a/pages.json
+++ b/pages.json
@@ -53,7 +53,12 @@
"path": "pages/circle/circle",
"style": {
"navigationStyle": "custom",
- "navigationBarTitleText": ""
+ "navigationBarTitleText": "",
+ "app-plus": {
+ "background": "#0B0B14",
+ "bounceBackground": "#0B0B14",
+ "animationAlphaBGColor": "#0B0B14"
+ }
}
},
{
diff --git a/pages/circle-detail/circle-detail.vue b/pages/circle-detail/circle-detail.vue
index 19304ae..8124c65 100644
--- a/pages/circle-detail/circle-detail.vue
+++ b/pages/circle-detail/circle-detail.vue
@@ -65,7 +65,7 @@
import FeedCard from '../../components/FeedCard.vue'
import CommentItem from '../../components/CommentItem.vue'
import EmptyState from '../../components/EmptyState.vue'
-import { GetFeedComments, AddComment, LikeFeed, UnlikeFeed, DeleteFeed } from '../../common/api'
+import { GetFeedComments, AddComment, LikeFeed, UnlikeFeed, DeleteFeed, requireLogin } from '../../common/api'
import themeMixin from '../../common/theme-mixin'
export default {
@@ -93,7 +93,23 @@ export default {
},
methods: {
goBack() {
- uni.navigateBack()
+ // 分享落地场景:本页是页面栈中唯一页面(好友直接从分享卡片进入,未经过首页),
+ // navigateBack 无页面可退,此时直接回首页
+ if (getCurrentPages().length > 1) {
+ uni.navigateBack({
+ fail: () => {
+ uni.switchTab({
+ url: '/pages/index/index',
+ fail: () => uni.reLaunch({ url: '/pages/index/index' })
+ })
+ }
+ })
+ } else {
+ uni.switchTab({
+ url: '/pages/index/index',
+ fail: () => uni.reLaunch({ url: '/pages/index/index' })
+ })
+ }
},
async loadFeed() {
// 优先从 globalData 中查找对应动态
@@ -127,6 +143,7 @@ export default {
}
},
async handleLike(feed) {
+ if (!requireLogin()) return
feed.liked = !feed.liked
feed.likes += feed.liked ? 1 : -1
try {
@@ -160,7 +177,7 @@ export default {
try {
await DeleteFeed({ feedId: feed.id })
uni.showToast({ title: '已删除', icon: 'none' })
- setTimeout(() => uni.navigateBack(), 600)
+ setTimeout(() => this.goBack(), 600)
} catch (e) {
// httpRequest 已全局弹错误提示(如非本人动态后端会拒绝)
}
@@ -170,6 +187,7 @@ export default {
async submitComment() {
const text = this.commentText.trim()
if (!text) return
+ if (!requireLogin()) return
try {
await AddComment({ feedId: this.feedId, content: text })
this.comments.push({
diff --git a/pages/circle/circle.vue b/pages/circle/circle.vue
index c24e4d8..deb7a30 100644
--- a/pages/circle/circle.vue
+++ b/pages/circle/circle.vue
@@ -63,10 +63,10 @@
@@ -78,7 +78,7 @@ import FeedCard from '../../components/FeedCard.vue'
import FriendItem from '../../components/FriendItem.vue'
import EventCard from '../../components/EventCard.vue'
import EmptyState from '../../components/EmptyState.vue'
-import { GetCircleFeeds, LikeFeed, UnlikeFeed, DeleteFeed, GetFriends, GetFriendRequests, GetEvents, DeleteEvent, GetUnreadCount } from '../../common/api'
+import { GetCircleFeeds, LikeFeed, UnlikeFeed, DeleteFeed, GetFriends, GetFriendRequests, GetEvents, DeleteEvent, GetUnreadCount, isLoggedIn, requireLogin } from '../../common/api'
import wsManager from '../../common/websocket'
import { getMyInviteCode } from '../../common/invite'
import themeMixin from '../../common/theme-mixin'
@@ -114,11 +114,20 @@ export default {
// 我的邀请码(分享时携带,一次性)
inviteCode: '',
// 当前登录用户ID(用于判断动态是否为自己发布)
- myUserId: ''
+ myUserId: '',
+ // 游客标记:游客可浏览页面,互动时再引导登录
+ isGuest: false
}
},
onShow() {
- this.loadFeeds(true)
+ this.isGuest = !isLoggedIn()
+ if (this.isGuest) {
+ // 游客态不发起鉴权请求,展示空态与登录引导
+ this.feeds = []
+ this.loading = false
+ } else {
+ this.loadFeeds(true)
+ }
// 消息入口已隐藏,未读角标暂不展示,空转请求先停掉(恢复入口时打开)
// this.loadUnread()
// this.bindWsEvents()
@@ -212,6 +221,7 @@ export default {
}
},
async handleLike(feed) {
+ if (!requireLogin()) return
feed.liked = !feed.liked
feed.likes += feed.liked ? 1 : -1
try {
@@ -266,8 +276,13 @@ export default {
})
},
goPublish() {
+ if (!requireLogin()) return
uni.navigateTo({ url: '/pages/circle-publish/circle-publish' })
},
+ // 游客在空态点击"去登录"
+ goLogin() {
+ uni.navigateTo({ url: '/pages/login/login' })
+ },
// === 酒友 ===
async loadFriends() {
try {
diff --git a/pages/index/index.vue b/pages/index/index.vue
index d2816a1..b43bf85 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -8,6 +8,15 @@
+
+
+
+ 登录后开启完整记录
+ 云端同步 · 成就徽章 · 酒友互动
+
+ 去登录
+
+
@@ -139,7 +148,7 @@