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}`);
+});