日期: 2025-10-24
需求: 从组长端点击项目后,进入纯净的项目详情页,不显示管理员端的侧边栏导航等UI元素
从组长端点击项目后,跳转到 /admin/project-detail/:projectId/order:
使用 wxwork 路由而非 admin 路由:
| 路由类型 | 路径格式 | 特点 | 
|---|---|---|
| ❌ 管理员端路由 | /admin/project-detail/:projectId/order | 包含AdminLayout(侧边栏+顶部栏) | 
| ✅ wxwork路由 | /wxwork/:cid/project/:projectId/order | 纯净页面,无任何布局包裹 | 
// src/app/app.routes.ts 第184-235行
{
  path: 'admin',
  loadComponent: () => import('./pages/admin/admin-layout/admin-layout').then(m => m.AdminLayout),
  children: [
    // ... 其他路由
    {
      path: 'project-detail/:projectId',
      loadComponent: () => import('../modules/project/pages/project-detail/project-detail.component').then(m => m.ProjectDetailComponent),
      children: [
        { path: 'order', ... },
        { path: 'requirements', ... },
        // ...
      ]
    }
  ]
}
特点:
// src/app/app.routes.ts 第312-377行
{
  path: 'wxwork/:cid',
  children: [
    {
      path: 'project/:projectId',
      loadComponent: () => import('../modules/project/pages/project-detail/project-detail.component').then(m => m.ProjectDetailComponent),
      children: [
        { path: 'order', ... },
        { path: 'requirements', ... },
        // ...
      ]
    }
  ]
}
特点:
文件: src/app/pages/team-leader/dashboard/dashboard.ts
位置: 第2204-2219行
修改内容:
// 查看项目详情 - 跳转到纯净的项目详情页(无管理端UI)
viewProjectDetails(projectId: string): void {
  if (!projectId) {
    console.warn('⚠️ 项目ID为空,无法跳转');
    return;
  }
  
  // 获取公司ID
  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
  
  // 跳转到wxwork路由的项目详情页(纯净页面,无管理端侧边栏)
  // 路由格式:/wxwork/:cid/project/:projectId/order
  this.router.navigate(['/wxwork', cid, 'project', projectId, 'order']);
  
  console.log('✅ 组长端跳转到纯净项目详情页:', projectId);
}
关键点:
localStorage.getItem('company') 获取cDL6R1hgSi['/wxwork', cid, 'project', projectId, 'order']/wxwork/cDL6R1hgSi/project/iKvYck89zE/order文件: src/app/pages/team-leader/dashboard/dashboard.html
位置: 第233行
修改内容:
<!-- ❌ 旧代码:使用routerLink -->
<h4 [routerLink]="['/admin/project-detail', project.id, 'order']" 
    (click)="$event.stopPropagation()">
  {{ project.name }}
</h4>
<!-- ✅ 新代码:使用click事件 -->
<h4 (click)="viewProjectDetails(project.id); $event.stopPropagation()" 
    style="cursor: pointer;">
  {{ project.name }}
</h4>
改进点:
routerLink,统一使用 viewProjectDetails() 方法cursor: pointer 样式,鼠标悬停显示手型$event.stopPropagation() 防止事件冒泡┌─────────────────────────────────────────┐
│ 系统管理后台 [管理员顶部栏]              │
├──────┬──────────────────────────────────┤
│ 侧   │ 项目详情页内容                    │
│ 边   │ ├─ 订单分配                       │
│ 栏   │ ├─ 确认需求                       │
│      │ ├─ 交付执行                       │
│ 导   │ └─ 售后归档                       │
│ 航   │                                   │
│      │                                   │
└──────┴──────────────────────────────────┘
缺点:
┌─────────────────────────────────────────┐
│ 项目详情页内容(全屏)                   │
│ ├─ 订单分配                              │
│ ├─ 确认需求                              │
│ ├─ 交付执行                              │
│ └─ 售后归档                              │
│                                          │
│                                          │
│                                          │
│                                          │
└─────────────────────────────────────────┘
优点:
清除或设置cid
// 在浏览器控制台执行
// 方式1: 使用真实的公司ID
localStorage.setItem("company", "cDL6R1hgSi");
   
// 方式2: 清除cid,测试默认值
localStorage.removeItem("company");
刷新浏览器
Ctrl+Shift+R (Windows/Linux)
Cmd+Shift+R (Mac)
访问组长端Dashboard
http://localhost:4200/team-leader/dashboard
点击任意项目卡片
验证URL和页面
预期URL:
   http://localhost:4200/wxwork/cDL6R1hgSi/project/iKvYck89zE/order
预期页面表现:
| 测试项 | 操作 | 预期结果 | 
|---|---|---|
| 有cid | localStorage.setItem("company", "abc123") | 跳转到 /wxwork/abc123/project/... | 
| 无cid | localStorage.removeItem("company") | 跳转到 /wxwork/cDL6R1hgSi/project/...(默认值) | 
| 点击标题 | 点击项目名称 | 跳转到纯净项目详情页 | 
| 点击按钮 | 点击"查看详情" | 跳转到纯净项目详情页 | 
| 点击卡片 | 点击卡片空白处 | 跳转到纯净项目详情页 | 
| 不同项目 | 点击3个不同项目 | 每次跳转到不同的projectId | 
| 刷新页面 | F5刷新 | 页面保持,数据不丢失 | 
| 后退按钮 | 点击浏览器后退 | 返回组长端Dashboard | 
格式: /admin/project-detail/:projectId/order
示例: /admin/project-detail/iKvYck89zE/order
访问者: 管理员
特点: 有侧边栏、顶部栏
适用: 后台管理操作
格式: /wxwork/:cid/project/:projectId/order
示例: /wxwork/cDL6R1hgSi/project/iKvYck89zE/order
访问者: 组长、设计师、客服
特点: 无任何布局,全屏显示
适用: 项目协作查看
格式: /designer/project-detail/:id
示例: /designer/project-detail/iKvYck89zE
访问者: 设计师
特点: 设计师专用界面
适用: 设计师工作视图
✅ src/app/pages/team-leader/dashboard/dashboard.ts
viewProjectDetails() 方法✅ src/app/pages/team-leader/dashboard/dashboard.html
routerLink 改为 (click) 事件src/app/app.routes.ts - 路由配置(已有wxwork路由)src/modules/project/pages/project-detail/project-detail.component.ts - 项目详情组件src/pages/admin/admin-layout/admin-layout.ts - 管理员布局(不使用)const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
用途:
存储位置: localStorage['company']
默认值: cDL6R1hgSi
this.router.navigate(['/wxwork', cid, 'project', projectId, 'order']);
| 参数位置 | 参数名 | 说明 | 示例 | 
|---|---|---|---|
| 参数1 | 'wxwork' | 路由前缀 | 固定值 | 
| 参数2 | cid | 公司ID | 'cDL6R1hgSi' | 
| 参数3 | 'project' | 项目路由 | 固定值 | 
| 参数4 | projectId | 项目ID | 'iKvYck89zE' | 
| 参数5 | 'order' | 当前阶段 | 'order'/'requirements'/'delivery'/'aftercare' | 
用户可以在项目详情页切换阶段:
/wxwork/:cid/project/:projectId/order        ← 订单分配
/wxwork/:cid/project/:projectId/requirements ← 确认需求
/wxwork/:cid/project/:projectId/delivery     ← 交付执行
/wxwork/:cid/project/:projectId/aftercare    ← 售后归档
src/app/app.routes.ts - 完整路由配置docs/task/2025102218-team-leader-project-detail-navigation.md - 组长端项目跳转功能docs/task/2025102217-wxwork-sdk-init-fix.md - 企微SDK初始化修复rules/wxwork/guard-wxwork.md - 企微路由守卫文档/admin/project-detail/:projectId/order/wxwork/:cid/project/:projectId/order功能实现完成! ✨
现在从组长端点击项目,会进入纯净的项目详情页,不再显示管理员端的侧边栏和顶部导航栏!