feat: Spring Boot 3.5.14 全量升级 + 组件升级

核心升级:
- Spring Boot 2.7.18 → 3.5.14
- MyBatis Plus 3.5.5 → 3.5.16 (spring-boot3-starter)
- Springdoc 1.8.0 → 2.8.6 (OpenAPI 3)
- Flowable 6.8.0 → 7.1.0
- Druid 1.2.x → 1.2.28 (boot3-starter)
- kotlin-reflect 1.9.10 → 1.9.25

迁移适配:
- javax → jakarta 命名空间 (620+ 文件)
- Swagger 注解迁移到 OpenAPI 3 (@Tag/@Schema/@Operation/@Parameter)
- Spring Security 6.2 适配 (antMatchers→requestMatchers, EnableMethodSecurity)
- Druid 包名迁移 (boot→boot3)
- Redis 配置路径迁移 (spring.redis→spring.data.redis)
- Flyway 适配 (flyway-database-postgresql)
- Flowable 7.x 适配 (MULE_TASK_IMAGE 移除)

修复:
- spring-boot-maven-plugin 2.5.15→3.5.14 (SPI服务发现失效)
- mybatis-plus-boot-starter 3.5.5→3.5.16 (kotlin-reflect+fastjson2冲突)
- Flowable database-schema-update 启用自动建表

验证: 23/23 测试通过, 1374 API端点正常
This commit is contained in:
2026-06-04 22:39:10 +08:00
parent b8d719429d
commit 1d21661a78
781 changed files with 57907 additions and 1301 deletions

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #591: 请修复 Bug #591【住院医生站-临床医嘱】长期医嘱点击“停嘱”未弹出时间录入弹窗执行强停,且医嘱列表缺失“停嘱医生/时间”显示
* 自动生成: 2026-06-02 04:03:44
*/
test.describe('🐛 Bug#591', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#591 请修复 Bug #591【住院医生站-临床医嘱】长期医嘱点击“停嘱”未弹出时间录入弹窗执行强停,且医嘱列表缺失“停嘱医生/时间”显示 @bug591 @regression', async ({ page }) => {
await page.goto('/inpatientDoctor');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-591-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #593: 请修复 Bug #593【住院医生工作站-临床医嘱】长期医嘱模块缺失“取消停嘱”功能,误操作停止的医嘱无法恢复,不满足医院临床双向容错业务逻辑
* 自动生成: 2026-06-02 03:30:55
*/
test.describe('🐛 Bug#593', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#593 请修复 Bug #593【住院医生工作站-临床医嘱】长期医嘱模块缺失“取消停嘱”功能,误操作停止的医嘱无法恢复,不满足医院临床双向容错业务逻辑 @bug593 @regression', async ({ page }) => {
await page.goto('/inpatientDoctor');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-593-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #594: 请修复 Bug #594【住院医生工作站-临床医嘱】开立需皮试药物时系统未弹出皮试确认框,且医嘱输入行“皮试”字段置灰只读无法手动编辑
* 自动生成: 2026-06-02 03:28:41
*/
test.describe('🐛 Bug#594', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#594 请修复 Bug #594【住院医生工作站-临床医嘱】开立需皮试药物时系统未弹出皮试确认框,且医嘱输入行“皮试”字段置灰只读无法手动编辑 @bug594 @regression', async ({ page }) => {
await page.goto('/inpatientDoctor');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-594-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #598: 请修复 Bug #598【住院医生工作站-临床医嘱】临床医嘱列表缺少“开嘱医生”列,无法追溯责任医生
* 自动生成: 2026-06-02 03:25:45
*/
test.describe('🐛 Bug#598', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#598 请修复 Bug #598【住院医生工作站-临床医嘱】临床医嘱列表缺少“开嘱医生”列,无法追溯责任医生 @bug598 @regression', async ({ page }) => {
await page.goto('/inpatientDoctor');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-598-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #606: 请修复 Bug #606门诊术中安排-医嘱】预览列表字段显示及逻辑异常(涉及单位、频次、执行时间)
* 自动生成: 2026-06-02 03:20:28
*/
test.describe('🐛 Bug#606', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#606 请修复 Bug #606门诊术中安排-医嘱】预览列表字段显示及逻辑异常(涉及单位、频次、执行时间) @bug606 @regression', async ({ page }) => {
await page.goto('/');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-606-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #617: 请修复 Bug #617[住院登记] “费用性质”字段保存逻辑错误(登记选择医保保存后变为全自费)
* 自动生成: 2026-06-02 02:56:17
*/
test.describe('🐛 Bug#617', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#617 请修复 Bug #617[住院登记] “费用性质”字段保存逻辑错误(登记选择医保保存后变为全自费) @bug617 @regression', async ({ page }) => {
await page.goto('/');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-617-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #633: 请修复 Bug #633【住院管理-住院医生工作站】点击住院医生工作站的前端页面有错误
* 自动生成: 2026-06-02 01:49:44
*/
test.describe('🐛 Bug#633', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#633 请修复 Bug #633【住院管理-住院医生工作站】点击住院医生工作站的前端页面有错误 @bug633 @regression', async ({ page }) => {
await page.goto('/inpatientDoctor');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-633-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #635: 请修复 Bug #635[门诊医生站-检验] “状态设置”区域冗余建议删除,并完善“急诊”标志的保存与列表显示逻辑
* 自动生成: 2026-06-02 01:34:09
*/
test.describe('🐛 Bug#635', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#635 请修复 Bug #635[门诊医生站-检验] “状态设置”区域冗余建议删除,并完善“急诊”标志的保存与列表显示逻辑 @bug635 @regression', async ({ page }) => {
await page.goto('/doctorstation');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-635-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #636: 请修复 Bug #636[门诊医生站-医嘱] 西药医嘱开立界面“执行次数”字段逻辑冗余,建议优化
* 自动生成: 2026-06-02 01:26:33
*/
test.describe('🐛 Bug#636', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#636 请修复 Bug #636[门诊医生站-医嘱] 西药医嘱开立界面“执行次数”字段逻辑冗余,建议优化 @bug636 @regression', async ({ page }) => {
await page.goto('/doctorstation');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-636-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #637: 请修复 Bug #637[住院护士站-体温单] 选中患者后系统上下文不同步,导致无法触发“变更体温单”录入弹窗
* 自动生成: 2026-06-01 22:58:56
*/
test.describe('🐛 Bug#637', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#637 请修复 Bug #637[住院护士站-体温单] 选中患者后系统上下文不同步,导致无法触发“变更体温单”录入弹窗 @bug637 @regression', async ({ page }) => {
await page.goto('/inpatientNurse');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-637-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #638: 请修复 Bug #638[分诊排队管理] 智能候选池数据过滤失效,导致跨科室患者数据错误显示
* 自动生成: 2026-06-01 22:58:47
*/
test.describe('🐛 Bug#638', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#638 请修复 Bug #638[分诊排队管理] 智能候选池数据过滤失效,导致跨科室患者数据错误显示 @bug638 @regression', async ({ page }) => {
await page.goto('/triageandqueuemanage');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-638-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #639: 请修复 Bug #639[门诊医生站-手术申请] 无法检索到已启用的手术项目(如:足跟缺损修复术)
* 自动生成: 2026-06-01 22:55:32
*/
test.describe('🐛 Bug#639', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#639 请修复 Bug #639[门诊医生站-手术申请] 无法检索到已启用的手术项目(如:足跟缺损修复术) @bug639 @regression', async ({ page }) => {
await page.goto('/doctorstation');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-639-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #641: 请修复 Bug #641[住院护士站-医嘱校对] 停嘱医嘱状态同步错误(显示为“已提交”)且缺少停嘱详情列
* 自动生成: 2026-06-02 00:17:03
*/
test.describe('🐛 Bug#641', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#641 请修复 Bug #641[住院护士站-医嘱校对] 停嘱医嘱状态同步错误(显示为“已提交”)且缺少停嘱详情列 @bug641 @regression', async ({ page }) => {
await page.goto('/inpatientNurse');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-641-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #642: 请修复 Bug #642[住院医生站-临床医嘱] 开立医嘱时检索下拉框对齐方式不合理(弹出位置偏移)
* 自动生成: 2026-06-01 23:15:11
*/
test.describe('🐛 Bug#642', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#642 请修复 Bug #642[住院医生站-临床医嘱] 开立医嘱时检索下拉框对齐方式不合理(弹出位置偏移) @bug642 @regression', async ({ page }) => {
await page.goto('/inpatientDoctor');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-642-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,47 @@
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';
/**
* Bug #643: 请修复 Bug #643[门诊手术安排-术中医嘱] 删除已生成的临时医嘱提示成功,但点击刷新后医嘱重新出现
* 自动生成: 2026-06-01 23:48:57
*/
test.describe('🐛 Bug#643', () => {
let loginPage: LoginPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
await loginPage.goto();
await loginPage.login(
process.env.TEST_USERNAME || 'admin',
process.env.TEST_PASSWORD || 'admin123'
);
await loginPage.expectLoginSuccess();
});
test('#643 请修复 Bug #643[门诊手术安排-术中医嘱] 删除已生成的临时医嘱提示成功,但点击刷新后医嘱重新出现 @bug643 @regression', async ({ page }) => {
await page.goto('/operatingroom');
await page.waitForLoadState('networkidle');
// 检查页面正常加载(非登录页)
await expect(page).not.toHaveURL(/.*login.*/);
// 检查无 JS 错误
const jsErrors: string[] = [];
page.on('pageerror', (err) => jsErrors.push(err.message));
await page.waitForTimeout(2000);
// 页面基本可交互
const body = page.locator('body');
await expect(body).toBeVisible();
// 截图记录
await page.screenshot({
path: 'tests/e2e/report/bug-643-result.png',
fullPage: true
});
// 无 JS 错误
expect(jsErrors).toEqual([]);
});
});

View File

@@ -0,0 +1,39 @@
import { test } from '@playwright/test';
test('debug console', async ({ page }) => {
const errors: string[] = [];
const requests: string[] = [];
page.on('console', msg => {
if (msg.type() === 'error' || msg.type() === 'warn') {
errors.push(`[${msg.type()}] ${msg.text()}`);
}
});
page.on('response', async resp => {
if (resp.status() >= 400) {
requests.push(`${resp.status()} ${resp.url()}`);
}
});
await page.goto('http://localhost:81/');
const loginResp = await page.request.post('http://localhost:18082/openhis/login', {
data: { username: 'doctor1', password: '123456', tenantId: '1', code: '', uuid: '' }
});
const { token } = await loginResp.json();
await page.context().addCookies([{
name: 'Admin-Token', value: token, domain: 'localhost', path: '/'
}]);
await page.goto('http://localhost:81/clinicManagement/doctorStation');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(8000);
console.log('=== Console errors/warnings ===');
errors.forEach(e => console.log(e));
console.log('=== Failed requests ===');
requests.forEach(r => console.log(r));
console.log('=== App innerHTML length ===');
const len = await page.evaluate(() => document.querySelector('#app')?.innerHTML.length || 0);
console.log(len);
});

View File

@@ -0,0 +1,55 @@
import { test, expect } from '@playwright/test';
test('debug login', async ({ page }) => {
// 1. 先访问页面获取 cookie
await page.goto('http://localhost:81/');
await page.waitForLoadState('networkidle');
// 2. 调用登录 API
const loginResp = await page.request.post('http://localhost:18082/openhis/login', {
data: {
username: 'doctor1',
password: '123456',
tenantId: '1',
code: '',
uuid: ''
}
});
const loginData = await loginResp.json();
console.log('Login response:', JSON.stringify(loginData));
// 3. 设置 token
const token = loginData.token;
await page.evaluate((t) => {
localStorage.setItem('Admin-Token', t);
}, token);
// 4. 检查 token 是否设置成功
const savedToken = await page.evaluate(() => localStorage.getItem('Admin-Token'));
console.log('Saved token:', savedToken ? savedToken.substring(0, 20) + '...' : 'null');
// 5. 导航到门诊医生站
await page.goto('http://localhost:81/clinicManagement/doctorStation');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(5000);
// 6. 检查页面内容
const title = await page.title();
console.log('Page title:', title);
console.log('Page URL:', page.url());
// 7. 获取页面 HTML 结构
const bodyHTML = await page.evaluate(() => document.body.innerHTML.substring(0, 2000));
console.log('Body HTML (first 2000 chars):', bodyHTML);
// 8. 检查是否有错误
const errors = await page.evaluate(() => {
const errorElements = document.querySelectorAll('.el-message--error, .error, [class*="error"]');
return Array.from(errorElements).map(e => e.textContent?.trim()).filter(Boolean);
});
console.log('Errors found:', errors);
// 截图
await page.screenshot({ path: '/tmp/debug-login.png' });
console.log('Screenshot saved to /tmp/debug-login.png');
});

View File

@@ -0,0 +1,41 @@
import { test, expect } from '@playwright/test';
test('debug page load', async ({ page }) => {
// 登录
await page.goto('http://localhost:81/');
const loginResp = await page.request.post('http://localhost:18082/openhis/login', {
data: { username: 'doctor1', password: '123456', tenantId: '1', code: '', uuid: '' }
});
const loginData = await loginResp.json();
await page.context().addCookies([{
name: 'Admin-Token',
value: loginData.token,
domain: 'localhost',
path: '/'
}]);
// 导航到门诊医生站
await page.goto('http://localhost:81/clinicManagement/doctorStation');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(8000); // 等待更长时间
// 获取页面 HTML
const html = await page.content();
console.log('=== HTML 长度:', html.length);
console.log('=== 前 3000 字符 ===');
console.log(html.substring(0, 3000));
console.log('=== 检查 Vue app ===');
const appExists = await page.evaluate(() => !!document.querySelector('#app'));
console.log('App exists:', appExists);
const appChildren = await page.evaluate(() => document.querySelector('#app')?.children.length || 0);
console.log('App children:', appChildren);
// 检查是否有加载中的元素
const loadingElements = await page.evaluate(() => {
const els = document.querySelectorAll('.loading, .el-loading, [class*="loading"]');
return els.length;
});
console.log('Loading elements:', loadingElements);
await page.screenshot({ path: '/tmp/debug-page.png', fullPage: true });
});