txw/docs/superpowers/plans/2026-04-05-工作台界面实现计划.md

411 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 工作台界面实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 根据 `prd/工作台.html` 原型,在用户中心 (`/yhzx`) 下新增工作台视图,包含统计卡片区、常用功能区、政策公告区,并重构侧边栏菜单结构。
**Architecture:**
- 新建 `views/gzt/` 目录,创建工作台主视图 `index.vue` 和子视图(概览、我的供给、我的需求、绿色交易、订单管理)
- 复用现有 `glxtSy.vue` 的侧边栏布局结构t-menu将其菜单配置重构为与原型一致的分组
- 工作台视图放在 `/yhzx/gzt` 路由下
**Tech Stack:** Vue2 + TDesign + Less
---
## 文件变更总览
| 操作 | 文件路径 |
|------|---------|
| 创建 | `src/pages/index/views/gzt/index.vue` |
| 创建 | `src/pages/index/views/gzt/components/StatsCard.vue` |
| 创建 | `src/pages/index/views/gzt/components/QuickActions.vue` |
| 创建 | `src/pages/index/views/gzt/components/PolicyNews.vue` |
| 创建 | `src/pages/index/views/gzt/config.js` |
| 修改 | `src/pages/index/views/glxtSy/glxtSy.vue` |
| 修改 | `src/pages/index/router/routes.js` |
---
## Task 1: 创建工作台目录结构和配置文件
**文件:**
- 创建: `src/pages/index/views/gzt/config.js`
- 创建: `src/pages/index/views/gzt/components/`
- 创建: `src/pages/index/views/gzt/index.vue`
- [ ] **Step 1: 创建 views/gzt 目录结构**
`src/pages/index/views/gzt/` 下创建:
- `config.js` - 工作台侧边栏菜单配置
- `components/` - 子组件目录
- `index.vue` - 工作台主视图
config.js 内容:
```javascript
// 工作台侧边栏菜单配置
// 注意name 字段对应路由名,路由注册在 routes.js 中
// "绿色交易"、"消息中心" 使用已注册路由;其余为待注册占位路由
export default {
// 业务导航分组
bizMenu: [
{
id: 'gzt',
title: '工作台',
icon: 'home',
name: 'gzt',
isActive: true,
},
{
id: 'gaikuang',
title: '概览',
icon: 'dashboard',
name: 'gaikuang', // TODO: 待注册路由
},
{
id: 'wdgj',
title: '我的供给',
icon: 'list',
name: 'wdgj', // TODO: 待注册路由
},
{
id: 'wdxq',
title: '我的需求',
icon: 'search',
name: 'wdxq', // TODO: 待注册路由
},
{
id: 'lsjy',
title: '绿色交易',
icon: 'swap',
name: 'lsjy', // 已注册路由
},
{
id: 'ddgl',
title: '订单管理',
icon: 'order',
name: 'ddgl', // TODO: 待注册路由
},
],
// 账号管理分组(对应原型中的分隔线下半部分)
accountMenu: [
{
id: 'zhgl',
title: '账户设置',
icon: 'setting',
name: 'zhgl', // TODO: 待注册路由
},
{
id: 'xxxzx',
title: '消息中心',
icon: 'mail',
name: 'ggwhgl', // 已注册路由(对应消息中心)
},
],
};
```
---
## Task 2: 创建 StatsCard 统计卡片组件
**文件:**
- 创建: `src/pages/index/views/gzt/components/StatsCard.vue`
- [ ] **Step 1: 创建 StatsCard.vue**
根据原型工作台有4个统计卡片
| 卡片 | 数值 | 圆形颜色 | 跳转路由 |
|------|------|---------|---------|
| 我的供给 | 5条 | 亮绿色 #E8FFEA + 绿色边框 #48C666 | `/yhzx/wdgj`(待注册,见 Task 7|
| 我的需求 | 2条 | 灰色 #EDEDED | `/yhzx/wdxq`(待注册,见 Task 7|
| 绿色交易 | 1条 | 灰色 #EDEDED | `/yhzx/lsjy`(已注册)|
| 待处理消息 | 6条 | 灰色 #EDEDED | `/yhzx/ggwhgl`(已注册)|
组件 Props
```javascript
props: {
title: String, // 卡片标题
count: [String, Number], // 数值
unit: { type: String, default: '条' }, // 单位
bgColor: { type: String, default: '#EDEDED' }, // 圆形背景色
borderColor: { type: String, default: 'transparent' }, // 边框色(仅"我的供给"有绿色边框)
iconName: String, // TDesign 图标名称
to: String, // 跳转路由
}
```
**图标规范:** 使用 TDesign 图标组件 `<t-icon name={iconName} />`,各卡片对应图标:
| 卡片 | 图标名称 |
|------|---------|
| 我的供给 | `upload``publish` |
| 我的需求 | `request``edit` |
| 绿色交易 | `swap` |
| 待处理消息 | `mail` |
样式要点:
- 圆形背景 56×56px使用 `border-radius: 50%`
- 数字使用 26px 加粗字体
- "条"使用 12px 灰色字体
- 卡片宽度 116px整体高度 56px
- 使用 `cursor: pointer`hover 时有轻微放大效果
---
## Task 3: 创建 QuickActions 常用功能组件
**文件:**
- 创建: `src/pages/index/views/gzt/components/QuickActions.vue`
- [ ] **Step 1: 创建 QuickActions.vue**
四个快捷功能按钮(根据原型),使用现有实际注册路由:
| 按钮 | 路由 | 说明 |
|------|------|------|
| 发布服务 | `/yhzx/tfwgj` | 现有碳服务供给页,可复用 |
| 发布数据 | `/yhzx/tfwgj?action=publishData` | 复用碳服务供给页action=publishData |
| 发布需求 | `/yhzx/tfwxq` | 现有碳服务需求页 |
| 质证申请 | `/yhzx/zzgl` | **新建路由**,对应原型"质证申请"功能 |
**注意:** `/yhzx/zzgl` 路由需在 routes.js 中注册(见 Task 7
样式要点:
- 使用 `t-button` 组件
- 按钮样式:白色背景 + 绿色边框 (#48C666) + 绿色文字
- 横向排列gap 16px
- 按钮宽度自适应文字padding 12px 24px
---
## Task 4: 创建 PolicyNews 政策公告组件
**文件:**
- 创建: `src/pages/index/views/gzt/components/PolicyNews.vue`
- [ ] **Step 1: 创建 PolicyNews.vue**
三条政策公告列表,右侧边栏样式(位置 x=1099, y=283
每条公告包含:
- 左侧竖线标记4px宽不同颜色区分重要程度
- 第一条:蓝色 #3491FA
- 第二条:黄色 #FADC19
- 第三条:灰色 #C7C7C7
- 标题文字14px#666666超出宽度时换行line-height 21px
公告示例数据:
```javascript
newsList: [
{
id: 1,
title: '关于做好2026年全国碳排放权交易市场有关工作的通知',
leftBorderColor: '#3491FA',
},
{
id: 2,
title: '第一财经研究院碳市场月报2026年全国碳市场相关工作安排出炉碳…',
leftBorderColor: '#FADC19',
},
{
id: 3,
title: '2026年全国碳市场重点工作来了!从存证到清缴,一步都不能少',
leftBorderColor: '#C7C7C7',
},
]
```
**组件 Props**
```javascript
props: {
title: String, // 区域标题,如"政策公告"
newsList: { // 公告列表
type: Array,
default: () => [],
},
}
newsList 项结构`{ id, title, leftBorderColor }`
区域标题 "政策公告" - 18px 加粗位置在公告列表上方
---
## Task 5: 创建工作台主视图 index.vue
**文件:**
- 创建: `src/pages/index/views/gzt/index.vue`
- [ ] **Step 1: 创建工作台主视图 index.vue**
根据原型布局页面宽度 1366px
```
┌─────────────────────────────────────────────────────────────┐
│ 欢迎回来 │
│ ─────────────────────────────────────────────────────────── │
│ [我的供给5条] [我的需求2条] [绿色交易1条] [待处理消息6条] │
│ ─────────────────────────────────────────────────────────── │
│ │
│ 常用功能 │
│ [发布服务] [发布数据] [发布需求] [质证申请] │
│ ┌──────────────────┐ │
│ │ 政策公告 │ │
│ │ ▌公告1 │ │
│ │ ▌公告2 │ │
│ │ ▌公告3 │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
布局要点:
- 主内容区使用 Flexbox左右分布
- 左侧:欢迎语 + 统计卡片横向4列gap 20px+ 常用功能(标题 + 按钮组)
- 右侧:政策公告区(固定宽度 249px位置 x=1099
- 统计卡片区域有灰色分隔线(横向,从欢迎语下方到右侧边缘)
- 常用功能区域也有灰色分隔线
样式要点:
- "欢迎回来"18px#666666颜色
- 页面背景色:#F5F5F5与侧边栏背景一致
- 内容区白色背景卡片,白色内边距
- 使用 Less 嵌套语法,`lang="less" scoped`
---
## Task 6: 重构 glxtSy.vue 侧边栏菜单
**文件:**
- 修改: `src/pages/index/views/glxtSy/glxtSy.vue`
- [ ] **Step 1: 更新 cdList 菜单配置**
将现有 `cdList` 重构为与原型一致的分组结构,使用 `config.js` 中的配置:
```javascript
import gztConfig from './gzt/config';
data() {
return {
// ... existing data
cdList: [
// 上部分:业务导航(与原型"工作台"分组一致)
...gztConfig.bizMenu,
// 分隔线通过CSS实现不作为菜单项
// 下部分:账号管理
...gztConfig.accountMenu,
],
};
}
```
- [ ] **Step 2: 添加"工作台"高亮逻辑**
当前 `defaultValue` 设为 `'qyrz'`,需改为根据路由动态判断:
```javascript
defaultValue: 'gzt', // 默认选中工作台
```
- [ ] **Step 3: 更新 gotoPage 方法**
确保跳转到工作台子路由时侧边栏正确高亮。
**布局说明:** `glxtSy.vue` 自身提供左侧侧边栏和右侧内容区,顶部导航由 `Main.vue` 提供(固定 64px 高度Footer 在 glxtSy.vue 中已被注释掉(无需处理)。工作台视图不需要额外的 Nav 或 Footer 组件。
**原型顶部导航说明:** 原型 `prd/工作台.html` 中的顶部导航(可信碳信息网 Logo、菜单项、用户信息、"+ 发布信息"按钮)属于全局布局层,由 `Main.vue``new-nav/index.vue` 组件提供,不在工作台视图范围内。
---
## Task 7: 配置工作台路由
**文件:**
- 修改: `src/pages/index/router/routes.js`
- [ ] **Step 1: 添加 gzt 路由 lazy-load 函数**
在 routes.js 顶部添加:
```javascript
// 工作台
function gzt() {
return import(/* webpackChunkName: "gzt" */ '@/pages/index/views/gzt/index.vue');
}
```
- [ ] **Step 2: 在 yhzx 路由的 children 中添加 gzt 子路由**
`yhzx` 路由的 `children` 数组中添加:
```javascript
{
path: 'gzt',
component: gzt,
name: 'gzt',
meta: {
title: '工作台',
},
},
```
注意:现有 `yhzx` 路由使用父子路由结构(`children: [...]`),子路由通过 `router-view``glxtSy.vue` 右侧内容区渲染,因此只需要添加子路由即可。
- [ ] **Step 3: 添加 wdgj我的供给路由**
`yhzx` 路由的 `children` 数组中添加:
```javascript
{
path: 'wdgj',
component: gzt, // 复用 gzt 组件作为占位视图,后续替换为我的供给页
name: 'wdgj',
meta: {
title: '我的供给',
},
},
```
- [ ] **Step 4: 添加 wdxq我的需求路由**
`yhzx` 路由的 `children` 数组中添加:
```javascript
{
path: 'wdxq',
component: gzt, // 复用 gzt 组件作为占位视图,后续替换为我的需求页
name: 'wdxq',
meta: {
title: '我的需求',
},
},
```
- [ ] **Step 5: 添加 zzgl质证申请路由**
`yhzx` 路由的 `children` 数组末尾添加(对应快捷功能"质证申请"按钮):
```javascript
{
path: 'zzgl',
component: gzt, // 复用 gzt 组件作为占位视图,后续替换为质证申请页
name: 'zzgl',
meta: {
title: '质证申请',
},
},
```
**本计划范围说明:** 工作台侧边栏菜单中的"概览"、"我的供给"、"我的需求"、"订单管理"在本计划中仅注册路由占位视图组件在后续计划中实现。当前计划只实现工作台主视图gzt/index.vue及必要的子路由配置。
---
## 依赖关系
```
Task 1 (目录结构/config) ← 无依赖,最先完成
Task 7 (路由gzt/wdgj/wdxq/zzgl) ← 依赖 Task 1
Task 2 (StatsCard) ← 依赖 Task 1, 7
Task 3 (QuickActions) ← 依赖 Task 1, 7
Task 4 (PolicyNews) ← 依赖 Task 1
Task 5 (index.vue) ← 依赖 Task 2, 3, 4
Task 6 (侧边栏重构) ← 依赖 Task 1
```
**建议执行顺序:** Task 1 → Task 7 → Task 2/3/4/5/6可并行
**说明:** Task 7 需先于组件创建任务Task 2-6完成因组件中 `this.$router.push()` 调用依赖对应路由已注册。Task 4 (PolicyNews) 无路由依赖,可与 Task 2/3 并行执行。