Files
jiaoyu/frontend/_audit.cjs
T
Zhang Jing Xuan 0841b1a103 智教助手平台:完整初始化
- 前端:Vue3 + TS + Element Plus,24 个页面路由(课件/组题/教案/动画/思维导图/作文批改/命题/课堂/资源/社区等)
- 后端:FastAPI + SQLAlchemy + SQLite,17 个路由模块,AI 服务层含降级模板
- AI:glm-5.x 推理模型已禁用思维链,确保输出真实内容
- 修复:ai_service 两处请求体注入 enable_thinking/thinking disabled
- 测试账号:13900999999 / test1234
2026-07-29 16:29:10 +08:00

77 lines
2.9 KiB
JavaScript

const { chromium } = require("playwright-core");
(async () => {
const browser = await chromium.launch({
executablePath: "C:/Program Files/Google/Chrome/Application/chrome.exe",
args: ["--disable-blink-features=AutomationControlled"],
});
const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
const errors = [];
page.on("console", msg => {
if (msg.type() === "error") errors.push(`CONSOLE: ${msg.text()}`);
});
page.on("pageerror", err => errors.push(`PAGEERROR: ${err.message}`));
const BASE = "http://127.0.0.1:5175";
// Login first via API
const loginResp = await page.request.post("http://127.0.0.1:8010/api/auth/login", {
data: { phone: "13943441149", password: "Test1234" },
headers: { "Content-Type": "application/json" },
});
const loginData = await loginResp.json();
const token = loginData.access_token;
// Inject token into localStorage
await page.goto(BASE + "/login", { waitUntil: "networkidle" });
await page.evaluate(t => {
localStorage.setItem("token", t);
localStorage.setItem("access_token", t);
localStorage.setItem("zj_token", t);
}, token);
const routes = [
"/", "/courseware", "/courseware/create", "/animation", "/exercise",
"/lesson-plan", "/exam", "/essay-grade", "/mindmap", "/materials",
"/resources", "/community", "/classroom", "/assistant", "/profile",
"/admin", "/search",
];
for (const route of routes) {
const routeErrors = [];
page.removeAllListeners("console");
page.removeAllListeners("pageerror");
page.on("console", msg => { if (msg.type() === "error") routeErrors.push(msg.text()); });
page.on("pageerror", err => routeErrors.push(err.message));
try {
await page.goto(BASE + route, { waitUntil: "networkidle", timeout: 15000 });
await page.waitForTimeout(1500);
// Check for empty/blank pages
const bodyText = await page.evaluate(() => document.body.innerText.trim());
const isEmpty = bodyText.length < 10;
const hasRouterView = await page.evaluate(() => {
const app = document.querySelector("#app");
return app && app.children.length > 0;
});
// Filter expected errors (401/403 for admin views)
const realErrors = routeErrors.filter(e =>
!e.includes("401") && !e.includes("403") &&
!e.includes("Failed to fetch") &&
!e.includes("NetworkError")
);
const status = realErrors.length === 0 && !isEmpty && hasRouterView ? "OK" : "CHECK";
const errSummary = realErrors.length > 0 ? ` ERR:[${realErrors.slice(0,2).join(" | ").substring(0,100)}]` : "";
const emptyFlag = isEmpty ? " BLANK" : "";
console.log(`${status} ${route.padEnd(20)} ${bodyText.length}chars${emptyFlag}${errSummary}`);
} catch (e) {
console.log(`FAIL ${route.padEnd(20)} ${e.message.substring(0, 80)}`);
}
}
await browser.close();
})();