From 9b31df28aa77800fb755bbb86f32f2e167bc06be Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Tue, 5 Aug 2025 15:15:57 +0800 Subject: [PATCH 01/13] feat: handle ios safari keyboard --- frontend/src/main.js | 2 ++ frontend/src/utils/iosKeyboardFix.js | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 frontend/src/utils/iosKeyboardFix.js diff --git a/frontend/src/main.js b/frontend/src/main.js index 6fe6cf3a4..ab33e3954 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -12,6 +12,7 @@ import { checkToken, clearToken, isLogin } from './utils/auth' import { loginWithGoogle } from './utils/google' import { initTheme } from './utils/theme' import { clearVditorStorage } from './utils/clearVditorStorage' +import { initIOSKeyboardFix } from './utils/iosKeyboardFix' // 采用本地开发环境 // export const API_DOMAIN = 'http://127.0.0.1' @@ -34,6 +35,7 @@ export const toast = useToast() initTheme() clearVditorStorage() +initIOSKeyboardFix() const app = createApp(App) app.use(router) diff --git a/frontend/src/utils/iosKeyboardFix.js b/frontend/src/utils/iosKeyboardFix.js new file mode 100644 index 000000000..d7bee160c --- /dev/null +++ b/frontend/src/utils/iosKeyboardFix.js @@ -0,0 +1,23 @@ +export function initIOSKeyboardFix() { + if (typeof window === 'undefined' || !window.visualViewport) return; + + const ua = navigator.userAgent || ''; + const isIOS = /iP(ad|hone|od)/.test(ua); + if (!isIOS) return; + + const viewport = window.visualViewport; + const adjustScroll = () => { + window.scrollTo(0, viewport.offsetTop); + }; + + viewport.addEventListener('resize', adjustScroll); + viewport.addEventListener('scroll', adjustScroll); + + let lastScrollY = 0; + document.addEventListener('focusin', () => { + lastScrollY = window.scrollY; + }); + document.addEventListener('focusout', () => { + window.scrollTo(0, lastScrollY); + }); +} From dc73a74e1cc8521a18d9e85a4e9148c08ea8763e Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 5 Aug 2025 15:20:57 +0800 Subject: [PATCH 02/13] Revert "feat: handle ios safari keyboard" This reverts commit 9b31df28aa77800fb755bbb86f32f2e167bc06be. --- frontend/src/main.js | 2 -- frontend/src/utils/iosKeyboardFix.js | 23 ----------------------- 2 files changed, 25 deletions(-) delete mode 100644 frontend/src/utils/iosKeyboardFix.js diff --git a/frontend/src/main.js b/frontend/src/main.js index ab33e3954..6fe6cf3a4 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -12,7 +12,6 @@ import { checkToken, clearToken, isLogin } from './utils/auth' import { loginWithGoogle } from './utils/google' import { initTheme } from './utils/theme' import { clearVditorStorage } from './utils/clearVditorStorage' -import { initIOSKeyboardFix } from './utils/iosKeyboardFix' // 采用本地开发环境 // export const API_DOMAIN = 'http://127.0.0.1' @@ -35,7 +34,6 @@ export const toast = useToast() initTheme() clearVditorStorage() -initIOSKeyboardFix() const app = createApp(App) app.use(router) diff --git a/frontend/src/utils/iosKeyboardFix.js b/frontend/src/utils/iosKeyboardFix.js deleted file mode 100644 index d7bee160c..000000000 --- a/frontend/src/utils/iosKeyboardFix.js +++ /dev/null @@ -1,23 +0,0 @@ -export function initIOSKeyboardFix() { - if (typeof window === 'undefined' || !window.visualViewport) return; - - const ua = navigator.userAgent || ''; - const isIOS = /iP(ad|hone|od)/.test(ua); - if (!isIOS) return; - - const viewport = window.visualViewport; - const adjustScroll = () => { - window.scrollTo(0, viewport.offsetTop); - }; - - viewport.addEventListener('resize', adjustScroll); - viewport.addEventListener('scroll', adjustScroll); - - let lastScrollY = 0; - document.addEventListener('focusin', () => { - lastScrollY = window.scrollY; - }); - document.addEventListener('focusout', () => { - window.scrollTo(0, lastScrollY); - }); -} From 1ed76f76870f643dc4dbae118d7b5d0de1ffef54 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 5 Aug 2025 15:21:14 +0800 Subject: [PATCH 03/13] feat: fix async request --- frontend/src/views/ProfileView.vue | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/frontend/src/views/ProfileView.vue b/frontend/src/views/ProfileView.vue index 538830a6c..3dd44c70f 100644 --- a/frontend/src/views/ProfileView.vue +++ b/frontend/src/views/ProfileView.vue @@ -282,7 +282,7 @@ export default { const isLoading = ref(true) const tabLoading = ref(false) const selectedTab = ref('summary') - const followTab = ref('followers') + const followTab = ref('followers') const levelInfo = computed(() => { const exp = user.value.experience || 0 @@ -336,9 +336,11 @@ export default { } const fetchTimeline = async () => { - const postsRes = await fetch(`${API_BASE_URL}/api/users/${username}/posts?limit=50`) - const repliesRes = await fetch(`${API_BASE_URL}/api/users/${username}/replies?limit=50`) - const tagsRes = await fetch(`${API_BASE_URL}/api/users/${username}/tags?limit=50`) + const [postsRes, repliesRes, tagsRes] = await Promise.all([ + fetch(`${API_BASE_URL}/api/users/${username}/posts?limit=50`), + fetch(`${API_BASE_URL}/api/users/${username}/replies?limit=50`), + fetch(`${API_BASE_URL}/api/users/${username}/tags?limit=50`) + ]) const posts = postsRes.ok ? await postsRes.json() : [] const replies = repliesRes.ok ? await repliesRes.json() : [] const tags = tagsRes.ok ? await tagsRes.json() : [] @@ -367,8 +369,10 @@ export default { } const fetchFollowUsers = async () => { - const followerRes = await fetch(`${API_BASE_URL}/api/users/${username}/followers`) - const followingRes = await fetch(`${API_BASE_URL}/api/users/${username}/following`) + const [followerRes, followingRes] = await Promise.all([ + fetch(`${API_BASE_URL}/api/users/${username}/followers`), + fetch(`${API_BASE_URL}/api/users/${username}/following`) + ]) followers.value = followerRes.ok ? await followerRes.json() : [] followings.value = followingRes.ok ? await followingRes.json() : [] } From fb3eb2646d62883a7b8dbef8ef479dd16082bb19 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 5 Aug 2025 15:31:30 +0800 Subject: [PATCH 04/13] Reapply "feat: handle ios safari keyboard" This reverts commit dc73a74e1cc8521a18d9e85a4e9148c08ea8763e. --- frontend/src/main.js | 2 ++ frontend/src/utils/iosKeyboardFix.js | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 frontend/src/utils/iosKeyboardFix.js diff --git a/frontend/src/main.js b/frontend/src/main.js index 6fe6cf3a4..ab33e3954 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -12,6 +12,7 @@ import { checkToken, clearToken, isLogin } from './utils/auth' import { loginWithGoogle } from './utils/google' import { initTheme } from './utils/theme' import { clearVditorStorage } from './utils/clearVditorStorage' +import { initIOSKeyboardFix } from './utils/iosKeyboardFix' // 采用本地开发环境 // export const API_DOMAIN = 'http://127.0.0.1' @@ -34,6 +35,7 @@ export const toast = useToast() initTheme() clearVditorStorage() +initIOSKeyboardFix() const app = createApp(App) app.use(router) diff --git a/frontend/src/utils/iosKeyboardFix.js b/frontend/src/utils/iosKeyboardFix.js new file mode 100644 index 000000000..d7bee160c --- /dev/null +++ b/frontend/src/utils/iosKeyboardFix.js @@ -0,0 +1,23 @@ +export function initIOSKeyboardFix() { + if (typeof window === 'undefined' || !window.visualViewport) return; + + const ua = navigator.userAgent || ''; + const isIOS = /iP(ad|hone|od)/.test(ua); + if (!isIOS) return; + + const viewport = window.visualViewport; + const adjustScroll = () => { + window.scrollTo(0, viewport.offsetTop); + }; + + viewport.addEventListener('resize', adjustScroll); + viewport.addEventListener('scroll', adjustScroll); + + let lastScrollY = 0; + document.addEventListener('focusin', () => { + lastScrollY = window.scrollY; + }); + document.addEventListener('focusout', () => { + window.scrollTo(0, lastScrollY); + }); +} From 1edaa507322dc4ddbf54804f231b02cf9efebef6 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 5 Aug 2025 15:46:31 +0800 Subject: [PATCH 05/13] Revert "Reapply "feat: handle ios safari keyboard"" This reverts commit fb3eb2646d62883a7b8dbef8ef479dd16082bb19. --- frontend/src/main.js | 2 -- frontend/src/utils/iosKeyboardFix.js | 23 ----------------------- 2 files changed, 25 deletions(-) delete mode 100644 frontend/src/utils/iosKeyboardFix.js diff --git a/frontend/src/main.js b/frontend/src/main.js index ab33e3954..6fe6cf3a4 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -12,7 +12,6 @@ import { checkToken, clearToken, isLogin } from './utils/auth' import { loginWithGoogle } from './utils/google' import { initTheme } from './utils/theme' import { clearVditorStorage } from './utils/clearVditorStorage' -import { initIOSKeyboardFix } from './utils/iosKeyboardFix' // 采用本地开发环境 // export const API_DOMAIN = 'http://127.0.0.1' @@ -35,7 +34,6 @@ export const toast = useToast() initTheme() clearVditorStorage() -initIOSKeyboardFix() const app = createApp(App) app.use(router) diff --git a/frontend/src/utils/iosKeyboardFix.js b/frontend/src/utils/iosKeyboardFix.js deleted file mode 100644 index d7bee160c..000000000 --- a/frontend/src/utils/iosKeyboardFix.js +++ /dev/null @@ -1,23 +0,0 @@ -export function initIOSKeyboardFix() { - if (typeof window === 'undefined' || !window.visualViewport) return; - - const ua = navigator.userAgent || ''; - const isIOS = /iP(ad|hone|od)/.test(ua); - if (!isIOS) return; - - const viewport = window.visualViewport; - const adjustScroll = () => { - window.scrollTo(0, viewport.offsetTop); - }; - - viewport.addEventListener('resize', adjustScroll); - viewport.addEventListener('scroll', adjustScroll); - - let lastScrollY = 0; - document.addEventListener('focusin', () => { - lastScrollY = window.scrollY; - }); - document.addEventListener('focusout', () => { - window.scrollTo(0, lastScrollY); - }); -} From 0957a5c132bd9e4e9de34098d53ba7a73982386b Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 5 Aug 2025 18:13:01 +0800 Subject: [PATCH 06/13] =?UTF-8?q?feat:=20=E8=AE=BE=E7=BD=AE=E4=B8=BA?= =?UTF-8?q?=E5=A4=96=E5=B1=82=E6=BB=9A=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/openisle/config/SecurityConfig.java | 4 ++-- frontend/public/manifest.json | 2 +- frontend/src/App.vue | 4 ++++ frontend/src/assets/global.css | 9 +++++---- frontend/src/components/CallbackPage.vue | 2 -- frontend/src/components/MenuComponent.vue | 3 ++- frontend/src/views/AboutPageView.vue | 4 +--- frontend/src/views/ActivityListPageView.vue | 3 +-- frontend/src/views/EditPostPageView.vue | 3 +-- frontend/src/views/ForgotPasswordPageView.vue | 3 +-- frontend/src/views/HomePageView.vue | 9 +++++---- frontend/src/views/LoginPageView.vue | 3 +-- frontend/src/views/MessagePageView.vue | 5 +---- frontend/src/views/NewPostPageView.vue | 3 +-- frontend/src/views/NotFoundPageView.vue | 3 +-- frontend/src/views/PostPageView.vue | 8 +++----- frontend/src/views/ProfileView.vue | 4 +--- frontend/src/views/SettingsPageView.vue | 3 +-- frontend/src/views/SignupPageView.vue | 3 +-- frontend/src/views/SignupReasonPageView.vue | 3 +-- frontend/src/views/SiteStatsPageView.vue | 3 +-- 21 files changed, 35 insertions(+), 49 deletions(-) diff --git a/backend/src/main/java/com/openisle/config/SecurityConfig.java b/backend/src/main/java/com/openisle/config/SecurityConfig.java index 852ea1c5c..5c9572837 100644 --- a/backend/src/main/java/com/openisle/config/SecurityConfig.java +++ b/backend/src/main/java/com/openisle/config/SecurityConfig.java @@ -77,8 +77,8 @@ public class SecurityConfig { "http://127.0.0.1", "http://localhost:8080", "http://localhost", - "http://30.211.97.254:8080", - "http://30.211.97.254", + "http://30.211.98.193:8080", + "http://30.211.98.193", "http://192.168.7.70", "http://192.168.7.70:8080", websiteUrl, diff --git a/frontend/public/manifest.json b/frontend/public/manifest.json index 5bc639a6d..4504e9927 100644 --- a/frontend/public/manifest.json +++ b/frontend/public/manifest.json @@ -2,7 +2,7 @@ "name": "OpenIsle", "short_name": "OpenIsle", "start_url": "/", - "display": "standalone", + "display": "fullscreen", "icons": [ { "src": "/icon-192.png", diff --git a/frontend/src/App.vue b/frontend/src/App.vue index f60db5054..0fb771ef4 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -68,9 +68,13 @@ export default { .menu-container {} .content { + /* height: calc(100vh - var(--header-height)); */ + padding-top: var(--header-height); flex: 1; max-width: 100%; transition: max-width 0.3s ease; + background-color: var(--background-color); + min-height: calc(100vh - var(--header-height)); } .content.menu-open { diff --git a/frontend/src/assets/global.css b/frontend/src/assets/global.css index 5f0786489..fd6eefb5e 100644 --- a/frontend/src/assets/global.css +++ b/frontend/src/assets/global.css @@ -8,7 +8,8 @@ --header-text-color: black; --menu-background-color: white; --background-color: white; - --background-color-blur: rgba(255, 255, 255, 0.57); + /* --background-color-blur: rgba(255, 255, 255, 0.57); */ + --background-color-blur: var(--background-color); --menu-border-color: lightgray; --normal-border-color: lightgray; --menu-selected-background-color: rgba(208, 250, 255, 0.659); @@ -34,7 +35,8 @@ --header-text-color: white; --menu-background-color: #333; --background-color: #333; - --background-color-blur: #333333a4; + /* --background-color-blur: #333333a4; */ + --background-color-blur: var(--background-color); --menu-border-color: #555; --normal-border-color: #555; --menu-selected-background-color: rgba(255, 255, 255, 0.1); @@ -54,10 +56,9 @@ body { font-family: 'Roboto', sans-serif; background-color: var(--normal-background-color); color: var(--text-color); - overflow: hidden; /* 禁止滚动 */ + /* overflow: hidden; 禁止滚动 */ } - /************************* * Vditor 自定义皮肤覆写 *************************/ diff --git a/frontend/src/components/CallbackPage.vue b/frontend/src/components/CallbackPage.vue index 003d12a62..764b15a11 100644 --- a/frontend/src/components/CallbackPage.vue +++ b/frontend/src/components/CallbackPage.vue @@ -18,8 +18,6 @@ export default { diff --git a/frontend/src/views/LoginPageView.vue b/frontend/src/views/LoginPageView.vue index 4a33fb508..26d926a90 100644 --- a/frontend/src/views/LoginPageView.vue +++ b/frontend/src/views/LoginPageView.vue @@ -125,8 +125,7 @@ export default { flex-direction: row; align-items: center; justify-content: center; - height: calc(100vh - var(--header-height)); - padding-top: var(--header-height); + height: 100%; width: 100%; background-color: var(--background-color); } diff --git a/frontend/src/views/MessagePageView.vue b/frontend/src/views/MessagePageView.vue index 75c5a357c..c11d82efa 100644 --- a/frontend/src/views/MessagePageView.vue +++ b/frontend/src/views/MessagePageView.vue @@ -626,11 +626,9 @@ export default { height: 300px; } - .message-page { background-color: var(--background-color); - height: calc(100vh - var(--header-height)); - padding-top: var(--header-height); + height: 100%; overflow-y: auto; } @@ -639,7 +637,6 @@ export default { top: 1px; z-index: 200; background-color: var(--background-color-blur); - backdrop-filter: blur(10px); display: flex; flex-direction: row; justify-content: space-between; diff --git a/frontend/src/views/NewPostPageView.vue b/frontend/src/views/NewPostPageView.vue index 83aff279d..1038df159 100644 --- a/frontend/src/views/NewPostPageView.vue +++ b/frontend/src/views/NewPostPageView.vue @@ -261,8 +261,7 @@ export default { display: flex; justify-content: center; background-color: var(--background-color); - height: calc(100vh - var(--header-height)); - padding-top: var(--header-height); + height: 100%; padding-right: 20px; padding-left: 20px; overflow-y: auto; diff --git a/frontend/src/views/NotFoundPageView.vue b/frontend/src/views/NotFoundPageView.vue index 86304faa9..5b623cafe 100644 --- a/frontend/src/views/NotFoundPageView.vue +++ b/frontend/src/views/NotFoundPageView.vue @@ -17,8 +17,7 @@ export default { display: flex; flex-direction: column; align-items: center; - height: calc(100vh - var(--header-height)); - padding-top: var(--header-height); + height: 100%; text-align: center; background-color: var(--background-color); } diff --git a/frontend/src/views/PostPageView.vue b/frontend/src/views/PostPageView.vue index 5e16bdd72..32119d98e 100644 --- a/frontend/src/views/PostPageView.vue +++ b/frontend/src/views/PostPageView.vue @@ -650,7 +650,7 @@ export default { background-color: var(--background-color); display: flex; flex-direction: row; - height: 100vh; + height: 100%; } .loading-container { @@ -665,13 +665,12 @@ export default { overflow-y: auto; scrollbar-width: none; padding: 20px; - height: calc(100% - 40px - var(--header-height)); + height: calc(100% - 40px); width: calc(85% - 40px); - padding-top: calc(var(--header-height) + 20px); + padding-top: 20px; } .post-page-scroller-container { - padding-top: var(--header-height); display: flex; flex-direction: column; width: 15%; @@ -974,7 +973,6 @@ export default { .post-page-main-container { width: calc(100% - 20px); padding: 10px; - padding-top: calc(var(--header-height) + 10px); } .article-title { diff --git a/frontend/src/views/ProfileView.vue b/frontend/src/views/ProfileView.vue index 3dd44c70f..4470100dd 100644 --- a/frontend/src/views/ProfileView.vue +++ b/frontend/src/views/ProfileView.vue @@ -497,8 +497,7 @@ export default { .profile-page { background-color: var(--background-color); - height: calc(100vh - var(--header-height)); - padding-top: var(--header-height); + height: 100%; overflow-y: auto; overflow-x: hidden; } @@ -643,7 +642,6 @@ export default { top: 1px; z-index: 200; background-color: var(--background-color-blur); - backdrop-filter: blur(10px); display: flex; flex-direction: row; padding: 0 20px; diff --git a/frontend/src/views/SettingsPageView.vue b/frontend/src/views/SettingsPageView.vue index 74ef61422..089ef7a77 100644 --- a/frontend/src/views/SettingsPageView.vue +++ b/frontend/src/views/SettingsPageView.vue @@ -239,8 +239,7 @@ export default { .settings-page { background-color: var(--background-color); padding: 40px; - height: calc(100vh - var(--header-height) - 80px); - padding-top: calc(var(--header-height) + 40px); + height: calc(100% - 80px); overflow-y: auto; } diff --git a/frontend/src/views/SignupPageView.vue b/frontend/src/views/SignupPageView.vue index eea683ebd..0868b5923 100644 --- a/frontend/src/views/SignupPageView.vue +++ b/frontend/src/views/SignupPageView.vue @@ -222,8 +222,7 @@ export default { flex-direction: row; align-items: center; justify-content: center; - height: calc(100vh - var(--header-height)); - padding-top: var(--header-height); + height: 100%; width: 100%; background-color: var(--background-color); } diff --git a/frontend/src/views/SignupReasonPageView.vue b/frontend/src/views/SignupReasonPageView.vue index 3f76bbea3..1bd4183e4 100644 --- a/frontend/src/views/SignupReasonPageView.vue +++ b/frontend/src/views/SignupReasonPageView.vue @@ -82,8 +82,7 @@ export default { justify-content: center; align-items: center; background-color: var(--background-color); - height: calc(100vh - var(--header-height)); - padding-top: var(--header-height); + height: 100%; } .reason-title { diff --git a/frontend/src/views/SiteStatsPageView.vue b/frontend/src/views/SiteStatsPageView.vue index aab6bca2d..f0c1904b1 100644 --- a/frontend/src/views/SiteStatsPageView.vue +++ b/frontend/src/views/SiteStatsPageView.vue @@ -48,7 +48,6 @@ onMounted(loadData) max-width: var(--page-max-width); background-color: var(--background-color); margin: 0 auto; - height: calc(100vh - var(--header-height) - 40px); - padding-top: calc(var(--header-height) + 20px); + height: 100%; } From 3e4b94f1f211f6694bfc0b566f94f8a7d0b0c56b Mon Sep 17 00:00:00 2001 From: Tim <135014430+nagisa77@users.noreply.github.com> Date: Tue, 5 Aug 2025 18:24:45 +0800 Subject: [PATCH 07/13] =?UTF-8?q?feat:=20=E9=80=9A=E7=94=A8=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E5=8A=A0=E8=BD=BD=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/utils/loadMore.js | 31 ++++++++++++++++++++++++++ frontend/src/views/HomePageView.vue | 27 +++++----------------- frontend/src/views/MessagePageView.vue | 2 -- 3 files changed, 36 insertions(+), 24 deletions(-) create mode 100644 frontend/src/utils/loadMore.js diff --git a/frontend/src/utils/loadMore.js b/frontend/src/utils/loadMore.js new file mode 100644 index 000000000..c4ffb9cb1 --- /dev/null +++ b/frontend/src/utils/loadMore.js @@ -0,0 +1,31 @@ +import { ref, onMounted, onUnmounted, onActivated, nextTick } from 'vue' + +export function useScrollLoadMore(loadMore, offset = 50) { + const savedScrollTop = ref(0) + + const handleScroll = () => { + const scrollTop = window.scrollY || document.documentElement.scrollTop + const scrollHeight = document.documentElement.scrollHeight + const windowHeight = window.innerHeight + savedScrollTop.value = scrollTop + if (scrollHeight - (scrollTop + windowHeight) <= offset) { + loadMore() + } + } + + onMounted(() => { + window.addEventListener('scroll', handleScroll, { passive: true }) + }) + + onUnmounted(() => { + window.removeEventListener('scroll', handleScroll) + }) + + onActivated(() => { + nextTick(() => { + window.scrollTo({ top: savedScrollTop.value }) + }) + }) + + return { savedScrollTop } +} diff --git a/frontend/src/views/HomePageView.vue b/frontend/src/views/HomePageView.vue index 4813b02a4..bbae20c0b 100644 --- a/frontend/src/views/HomePageView.vue +++ b/frontend/src/views/HomePageView.vue @@ -1,5 +1,5 @@ @@ -397,11 +382,9 @@ export default {