可用入口
diff --git a/client/tests/e2e/login-portal-ux.spec.ts b/client/tests/e2e/login-portal-ux.spec.ts
index cdfd43d2..15531a74 100644
--- a/client/tests/e2e/login-portal-ux.spec.ts
+++ b/client/tests/e2e/login-portal-ux.spec.ts
@@ -587,10 +587,16 @@ test("个人设置默认只展示账号通知和企业微信,不展示权限 c
await page.goto("/settings/profile");
await expect(page.getByRole("heading", { name: "个人设置" })).toBeVisible();
- await expect(page.getByRole("heading", { name: "账号信息" })).toBeVisible();
+ await expect(page.getByRole("heading", { name: "个人资料" })).toBeVisible();
+ await expect(page.getByRole("heading", { name: "密码与安全" })).toBeVisible();
await expect(page.getByRole("heading", { name: "通知设置" })).toBeVisible();
await expect(page.getByRole("heading", { name: "企业微信绑定" })).toBeVisible();
await expect(page.getByText("账号详情")).toBeVisible();
+ await expect(page.getByRole("link", { name: "查看员工档案" })).toHaveCount(0);
+ await expect(page.getByText("审批规则")).not.toBeVisible();
+ await expect(page.getByText("功能开关")).not.toBeVisible();
+ await expect(page.getByText("主数据")).not.toBeVisible();
+ await expect(page.getByText("审计日志")).not.toBeVisible();
await expect(page.getByText("权限摘要")).not.toBeVisible();
await expect(page.getByText("expense.create")).not.toBeVisible();
await expect(page.getByText("leave.submit")).not.toBeVisible();
diff --git a/client/tests/e2e/r124-mobile-entry-matrix.spec.ts b/client/tests/e2e/r124-mobile-entry-matrix.spec.ts
index 316b2c93..798d413b 100644
--- a/client/tests/e2e/r124-mobile-entry-matrix.spec.ts
+++ b/client/tests/e2e/r124-mobile-entry-matrix.spec.ts
@@ -531,6 +531,11 @@ test.describe("R124 企业微信移动入口矩阵", () => {
await mobile.page.getByTestId("mobile-nav-me").click();
await expect(mobile.page).toHaveURL(/\/mobile\/me$/);
await expect(mobile.page.getByTestId("mobile-more-links")).toBeVisible();
+ await expect(mobile.page.getByText("管理入口")).toHaveCount(0);
+ await expect(mobile.page.getByRole("link", { name: /账号资料/ })).toHaveCount(0);
+ await expect(mobile.page.getByRole("link", { name: /人员管理/ })).toHaveCount(0);
+ await expect(mobile.page.getByRole("link", { name: /组织架构/ })).toHaveCount(0);
+ await expect(mobile.page.getByRole("link", { name: /系统设置/ })).toHaveCount(0);
await mobile.page.screenshot({ path: screenshotPath("mobile-me") });
await expectMobilePageContract(mobile.page);
@@ -546,6 +551,12 @@ test.describe("R124 企业微信移动入口矩阵", () => {
await expect(mobile.page).toHaveURL(/\/mobile\/profile$/);
await expect(mobile.page.getByTestId("mobile-profile-page")).toBeVisible();
await expect(mobile.page.getByTestId("mobile-profile-wecom-card")).toBeVisible();
+ await expect(mobile.page.getByRole("heading", { name: "密码与安全" })).toBeVisible();
+ await expect(mobile.page.getByRole("heading", { name: "组织与角色摘要" })).toBeVisible();
+ await expect(mobile.page.getByText("active", { exact: true })).toHaveCount(0);
+ await expect(mobile.page.getByText("manager", { exact: true })).toHaveCount(0);
+ await mobile.page.getByText("查看组织和角色").click();
+ await expect(mobile.page.getByText("审批人、财务")).toBeVisible();
await mobile.page.screenshot({ path: screenshotPath("mobile-profile") });
await expectMobilePageContract(mobile.page);
diff --git a/docs/产品设计规则.md b/docs/产品设计规则.md
index a536547e..362fb057 100644
--- a/docs/产品设计规则.md
+++ b/docs/产品设计规则.md
@@ -121,8 +121,9 @@ A 类页面优先保证真实试运行路径顺畅;B 类页面优先保证台
- 首页不承担常驻新手教学职责;首次欢迎提示只做一次性、可关闭的常用业务入口,最多 3 个,不放个人设置、通知中心或“了解流程”这类说明型入口。
- 审批入口同时服务审批人和发起人:审批人处理待我审批,员工查看我发起的进度。
- 普通员工不应看到不可点或无权限的审批入口;审批、财务、负责人和管理员只能看到服务端允许的动作。
-- 个人设置默认只放个人资料、密码/安全、通知偏好和企业微信绑定;组织归属、直属汇报和角色摘要可折叠展示,不默认暴露权限 code 或完整员工档案维护内容。
+- 个人设置默认只放个人资料、密码/安全、通知偏好和企业微信绑定;组织归属、直属汇报和角色摘要可折叠展示,不默认暴露权限 code、role code、原始账号状态或完整员工档案维护入口。
- 个人设置和管理配置彻底分离:组织、角色、审批规则、功能开关、主数据、审计日志、人员维护和系统配置统一进入 `管理`,不出现在普通员工路径或个人资料页里。
+- 移动端 `我的` 不放管理矩阵;`人员管理`、`组织架构`、`系统设置` 等低频配置只从 PC 管理入口承接。
- PC 侧边栏是小团队任务入口,不是全量模块目录;一级入口必须按角色、权限、频次和真实办事价值收敛。已启用且有权限的 OA 主办业务台账,例如 `合同`、`采购`、`资产`、`项目`,不默认藏到 `更多`,否则会给常用业务增加二次点击负担。
- 审批人、负责人和财务看到 `待我处理`;普通员工默认不显示 `待办` 或 `审批待办` 入口;通知只保留顶部铃铛或通知中心,不进入侧边栏。
- PC 请假入口默认表达为 `请假记录`;提交请假、补卡、外出、加班仍优先走企业微信或移动入口,只有 OA 应急接管或指定管理场景才突出提交入口。