From 51af5f4f1ce200777457ec1181921993da2c017f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E7=94=B7?= Date: Fri, 1 May 2026 01:14:10 +0800 Subject: [PATCH] fix: org-filtered teacher list and fix teacher selection redirect loop - Replace getValidTeachers() with getAllTeachers() for org-scoped teacher list - Fix chooseTeacher() to use async/await with error handling instead of reload - After claiming teacher, refresh mine list and navigate without page reload - Fix chooseRole STUDENT branch: clear teacher and redirect to teacher-select - Remove auto-select on role switch (user should pick explicitly) Co-Authored-By: Claude Opus 4.7 --- src/pages/index.vue | 27 +++++++++++++++++---------- src/store/user.ts | 15 +++++++++------ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/pages/index.vue b/src/pages/index.vue index d11a5fb..e6e9499 100644 --- a/src/pages/index.vue +++ b/src/pages/index.vue @@ -75,9 +75,9 @@ export default defineComponent({ props: ["params"], setup({ params }) { const router = useRouter(); - const { store, setRole, getValidTeachers, chooseRole, claimTeacher, update } = useUser(router); + const { store, setRole, getAllTeachers, chooseRole, claimTeacher, getMyTeachers, update } = useUser(router); const { store: orgStore, loadMyOrgs, switchOrg } = useOrg(); - const { tryAutoSelect } = useTeacher(); + const { tryAutoSelect, switchTeacher } = useTeacher(); let { unionid, openid, status, nickName, avatarUrl, scene, tongzhi_id, page_path } = params; console.log(params) console.log("loaded at...", Date.now()) @@ -90,13 +90,26 @@ export default defineComponent({ openid, scene, avatarUrl, nickName, status } - getValidTeachers(); + getAllTeachers(); - const teachers = computed(() => store.teachers.valid.map(x => ({text: x.real_name, value: x.hty_id}))) + const teachers = computed(() => store.teachers.all.map(x => ({text: x.real_name, value: x.hty_id}))) const has_teacher = computed(() => store.teachers.mine.length > 0); const is_student = computed(() => store.currentRole === HtyBaseRoles.STUDENT); + const chooseTeacher = async (teacher_id: string, teacher_name: string) => { + try { + await showConfirmDialog({message: "确认选择【" + teacher_name + "】老师?"}) + await claimTeacher(store.current.hty_id, teacher_id); + // Refresh teachers and select + await getMyTeachers(); + switchTeacher(teacher_id); + await router.push('/student/home'); + } catch (e) { + console.error('choose teacher failed', e); + } + }; + onMounted(async () => { console.log('on mounted'); // update openid @@ -193,12 +206,6 @@ export default defineComponent({ } }) - const chooseTeacher = async (teacher_id: string, teacher_name: string) => { - await showConfirmDialog({message: "确认选择【" + teacher_name + "】老师?"}) - await claimTeacher(store.current.hty_id, teacher_id); - window.location.reload(); - }; - return { is_registered, is_enabled, teachers, is_student, has_login, authorized, activeRoles, chooseRole, setRole, store, chooseTeacher, diff --git a/src/store/user.ts b/src/store/user.ts index 78bfae8..1784d01 100644 --- a/src/store/user.ts +++ b/src/store/user.ts @@ -574,12 +574,6 @@ export default function useUser(router?: Router) { setKey("current_role", role); getUnreadTongzhis(); - // Auto-select first teacher when student role is chosen - if (role === HtyBaseRoles.STUDENT && store.teachers.mine.length > 0) { - const { tryAutoSelect } = useTeacher(); - tryAutoSelect(store.teachers.mine); - } - if (prev !== role && !window.location.pathname.split('/').includes(role.toLowerCase())) { let len = window.history.length; // clear session history to prevent user go back to pages of prev role @@ -588,6 +582,15 @@ export default function useUser(router?: Router) { router?.push("/tongzhi") } else if (role === HtyBaseRoles.GUEST) { router?.push('/guest') + } else if (role === HtyBaseRoles.STUDENT) { + // Clear teacher and redirect to teacher selection + const { clearTeacher } = useTeacher(); + clearTeacher(); + if (store.teachers.mine.length > 0) { + router?.push('/student/teacher-select'); + } else { + router?.push('/'); + } } else { // go to profile page router?.push('/' + role.toLowerCase() + '/profile')