diff --git a/src/components/course-package-store.vue b/src/components/course-package-store.vue index 6777a21..cf1b106 100644 --- a/src/components/course-package-store.vue +++ b/src/components/course-package-store.vue @@ -94,8 +94,11 @@ export default defineComponent({ } else if (isLoggedIn()) { const ok = await queryOrgPackages(); state.error = !ok; + } else { + // Guest, no org_id: load all public packages across all orgs + const ok = await queryPublicPackages(); + state.error = !ok; } - // No orgId and unauth: show empty state, not error state.loading = false; state.loaded = true; }; diff --git a/src/pages/index.vue b/src/pages/index.vue index dce226f..255b57e 100644 --- a/src/pages/index.vue +++ b/src/pages/index.vue @@ -18,8 +18,7 @@ - - + @@ -128,10 +127,6 @@ export default defineComponent({ { value: HtyBaseRoles.TEACHER, label: "老师" }, ]; const has_login = computed(() => !!store.current.hty_id); - const urlOrgId = computed(() => { - const params = new URLSearchParams(window.location.search); - return params.get('org_id') || ''; - }); const is_registered = computed(() => store.current.is_registered); const is_enabled = computed(() => store.current.enabled); const authorized = computed(() => userStatus === UserStates.Authorized); @@ -194,7 +189,7 @@ export default defineComponent({ return { is_registered, is_enabled, is_student, has_teacher, has_login, authorized, activeRoles, chooseRole, setRole, store, - initial_roles, scene, urlOrgId + initial_roles, scene } }, }); diff --git a/src/store/course-package.ts b/src/store/course-package.ts index a0abb6b..8eabb05 100644 --- a/src/store/course-package.ts +++ b/src/store/course-package.ts @@ -37,9 +37,10 @@ export default function useCoursePackage() { return r; } - async function queryPublicPackages(orgId: string, keyword?: string, page = 1, pageSize = 20): Promise { + async function queryPublicPackages(orgId?: string, keyword?: string, page = 1, pageSize = 20): Promise { load_start(); - const params = new URLSearchParams({org_id: orgId, page: String(page), page_size: String(pageSize)}); + const params = new URLSearchParams({page: String(page), page_size: String(pageSize)}); + if (orgId) params.set('org_id', orgId); if (keyword) params.set('keyword', keyword); const {r, d, e} = await request({url: `/api/v1/clazz/course-package/public-packages?${params}`}); load_done(); diff --git a/test-results/.last-run.json b/test-results/.last-run.json new file mode 100644 index 0000000..5fca3f8 --- /dev/null +++ b/test-results/.last-run.json @@ -0,0 +1,4 @@ +{ + "status": "failed", + "failedTests": [] +} \ No newline at end of file diff --git a/tests/debug-role-switcher.spec.ts b/tests/debug-role-switcher.spec.ts new file mode 100644 index 0000000..1f71c85 --- /dev/null +++ b/tests/debug-role-switcher.spec.ts @@ -0,0 +1,86 @@ +import { expect, test } from './fixtures'; + +const moicenUnionid = process.env.MOICEN_E2E_UNIONID?.trim(); + +test('debug role switcher visibility', async ({ page }) => { + test.setTimeout(120_000); + + const q = new URLSearchParams({ unionid: moicenUnionid!, status: '2' }); + await page.goto(`/?${q.toString()}`, { + waitUntil: 'domcontentloaded', + timeout: 60_000, + }); + await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 }); + await page.waitForTimeout(5000); + + const roleSelect = page.getByText('请选择您的登录身份'); + if (await roleSelect.isVisible().catch(() => false)) { + const studentRole = page.locator('.van-grid-item').filter({ hasText: '学生' }); + if (await studentRole.isVisible().catch(() => false)) { + await studentRole.click(); + await page.waitForTimeout(5000); + } + } + + if (page.url().includes('/org/select')) { + const orgCells = page.locator('#app .van-cell-group .van-cell'); + const n = await orgCells.count(); + console.log(`org cells count: ${n}`); + expect(n).toBeGreaterThan(0); + + // Check token before org select + const tokenBefore = await page.evaluate(() => window.localStorage.getItem('Authorization')); + console.log(`token before org select: ${tokenBefore ? 'EXISTS' : 'NONE'}`); + + await orgCells.first().click(); + await page.waitForTimeout(5000); + + // Check URL and token after org select + console.log(`URL after org select click + wait: ${page.url()}`); + const tokenAfter = await page.evaluate(() => window.localStorage.getItem('Authorization')); + console.log(`token after org select: ${tokenAfter ? 'EXISTS' : 'NONE'}`); + const currentRole = await page.evaluate(() => window.localStorage.getItem('CurrentUserRole')); + console.log(`CurrentUserRole: ${currentRole}`); + const teacherId = await page.evaluate(() => window.localStorage.getItem('CurrentTeacherId')); + console.log(`CurrentTeacherId: ${teacherId}`); + + await page.goto('/student/profile', { + waitUntil: 'domcontentloaded', + timeout: 60_000, + }); + await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 }); + + // Immediately check URL after navigation + console.log(`URL right after navigating to /student/profile: ${page.url()}`); + const tokenNav = await page.evaluate(() => window.localStorage.getItem('Authorization')); + console.log(`token after navigate: ${tokenNav ? 'EXISTS' : 'NONE'}`); + } + + await page.waitForTimeout(2000); + console.log(`URL after 2s: ${page.url()}`); + + // Check full state + const state = await page.evaluate(() => { + const keys = Object.keys(window.localStorage); + const store: Record = {}; + for (const k of keys) store[k] = window.localStorage.getItem(k); + return store; + }); + console.log(`localStorage keys: ${JSON.stringify(Object.keys(state))}`); + console.log(`Authorization: ${state['Authorization'] ? 'EXISTS' : 'NONE'}`); + + const els = await page.evaluate(() => { + const result: string[] = []; + document.querySelectorAll('.van-icon').forEach(el => { + result.push(el.className); + }); + return result; + }); + console.log(`icons: ${JSON.stringify(els)}`); + + const profileInfo = await page.locator('.info').isVisible().catch(() => false); + console.log(`profile .info visible: ${profileInfo}`); + + const roleSwitcher = await page.locator('.van-icon-exchange').isVisible().catch(() => false); + console.log(`role switcher visible: ${roleSwitcher}`); +});