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 <noreply@anthropic.com>
This commit is contained in:
2026-05-01 01:14:10 +08:00
parent e7b70b2ba8
commit 51af5f4f1c
2 changed files with 26 additions and 16 deletions
+17 -10
View File
@@ -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,
+9 -6
View File
@@ -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')