Ver código fonte

docs: add login-left-panel and article-center design docs

Sisyphus 2 meses atrás
pai
commit
dbed74b743

+ 564 - 0
docs/superpowers/plans/2026-07-02-login-left-panel-redesign.md

@@ -0,0 +1,564 @@
+# Login 左侧品牌区重新设计 实施计划
+
+> **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:** 将 cfc-web 登录页左侧品牌区从五行沙盘 SVG 重构为五维能量轮盘动画,使用五维品牌色系
+
+**Architecture:** 单文件修改(`Login.vue`),只改 template 和 scoped style,不涉及 script。保留右侧表单区域不变。
+
+**Tech Stack:** Vue 2 Options API, CSS3 Animations, SVG
+
+**设计文档:** `docs/superpowers/specs/2026-07-02-login-left-panel-redesign.md`
+
+---
+
+## 文件结构
+
+| 文件 | 操作 | 说明 |
+|------|------|------|
+| `cfc-web/src/views/Login.vue` | 修改 | 替换全部 brand-panel 模板和样式 |
+
+---
+
+### Task 1: 更新品牌区背景 + 整体布局
+
+**Files:**
+- Modify: `cfc-web/src/views/Login.vue:1-884`
+
+- [ ] **Step 1: 替换背景渐变色和布局微调**
+
+修改 `.brand-panel` 的背景和 `.brand-content` 的布局:
+
+```css
+/* 替换现有 .brand-panel 背景 (line ~413-419) */
+.brand-panel {
+  flex: 0 0 55%;
+  position: relative;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: linear-gradient(160deg,
+    #1A0F00 0%,
+    #2D1810 30%,
+    #3D2B1F 60%,
+    #4A3020 100%);
+  overflow: hidden;
+}
+
+/* 替换 .brand-panel::before 背景纹理 (line ~423-433) */
+.brand-panel::before {
+  content: '';
+  position: absolute;
+  top: 0; left: 0; right: 0; bottom: 0;
+  background:
+    radial-gradient(ellipse 100% 40% at 50% 30%, rgba(255, 215, 0, 0.04) 0%, transparent 70%),
+    radial-gradient(ellipse 80% 60% at 80% 80%, rgba(255, 140, 66, 0.05) 0%, transparent 70%),
+    radial-gradient(circle 50% 50% at 20% 80%, rgba(99, 102, 241, 0.03) 0%, transparent 60%);
+  pointer-events: none;
+  z-index: 0;
+}
+
+/* 调整 .brand-content 布局 (line ~435-448) */
+.brand-content {
+  position: relative;
+  z-index: 1;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  max-width: 480px;
+  width: 100%;
+  padding: 32px 36px;
+  color: #fff;
+  min-height: 100vh;
+  box-sizing: border-box;
+}
+```
+
+- [ ] **Step 2: 更新品牌头部样式**
+
+```css
+/* 替换 .brand-header (line ~451-457) */
+.brand-header {
+  flex-shrink: 0;
+  display: flex;
+  align-items: center;
+  gap: 14px;
+  margin-bottom: 6px;
+}
+
+/* .logo-img 保持不变 (line ~459-464) */
+
+/* .brand-titles 不变 (line ~466-470) */
+
+/* 替换 .brand-cn (line ~472-480) */
+.brand-cn {
+  font-size: 24px;
+  font-weight: 700;
+  letter-spacing: 4px;
+  line-height: 1.3;
+  background: linear-gradient(135deg, #FFE066 0%, #F59E0B 50%, #FFE066 100%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+}
+
+/* .brand-dot 不变 (line ~482-486) */
+
+/* .brand-en 不变 (line ~488-494) */
+```
+
+- [ ] **Step 3: 更新品牌主张区域样式**
+
+```css
+/* 替换 .brand-mission 相关样式 (line ~497-524) */
+.brand-mission {
+  flex-shrink: 0;
+  text-align: center;
+  margin-bottom: 8px;
+}
+
+.mission-title {
+  font-size: 20px;
+  font-weight: 700;
+  letter-spacing: 2px;
+  margin: 0 0 4px;
+  line-height: 1.4;
+}
+
+.mission-title .highlight {
+  background: linear-gradient(135deg, #FFE066, #F59E0B);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+}
+
+.mission-desc {
+  font-size: 13px;
+  opacity: 0.55;
+  letter-spacing: 1px;
+  margin: 0;
+  font-weight: 300;
+}
+```
+
+- [ ] **Step 4: 更新底部统计 + 角色标签样式**
+
+替换 `.brand-values` 部分为 `.brand-footer`:
+
+```css
+/* 替换 .brand-values (line ~608-647) */
+.brand-footer {
+  flex-shrink: 0;
+  width: 100%;
+  margin-top: 4px;
+}
+
+.stats-row {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  gap: 0;
+  margin-bottom: 10px;
+}
+
+.stat-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 0 16px;
+}
+
+.stat-num {
+  font-size: 22px;
+  font-weight: 700;
+  background: linear-gradient(135deg, #FFE066, #F59E0B);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+  line-height: 1.2;
+}
+
+.stat-label {
+  font-size: 10px;
+  opacity: 0.5;
+  letter-spacing: 1px;
+  margin-top: 1px;
+}
+
+.stat-divider {
+  width: 1px;
+  height: 28px;
+  background: rgba(255, 255, 255, 0.12);
+}
+
+.role-tags {
+  display: flex;
+  gap: 10px;
+  justify-content: center;
+}
+
+.role-tag {
+  display: inline-block;
+  padding: 3px 14px;
+  font-size: 11px;
+  border: 1px solid;
+  border-radius: 20px;
+  opacity: 0.5;
+  transition: opacity 0.3s;
+  letter-spacing: 1px;
+}
+
+.role-tag:hover {
+  opacity: 0.9;
+}
+```
+
+---
+
+### Task 2: 替换模板中的五维沙盘为能量轮盘
+
+**Files:**
+- Modify: `cfc-web/src/views/Login.vue:1-293`
+
+- [ ] **Step 1: 替换 brand-panel 的 template 内容**
+
+把 template 中的 `.brand-panel` 内部(lines 4-219)全部替换为:
+
+```html
+<div class="login-page">
+  <!-- 左侧品牌展示区 — 五维能量轮盘 -->
+  <div class="brand-panel">
+    <div class="brand-content">
+
+      <!-- ===== Logo + 品牌标识 ===== -->
+      <div class="brand-header">
+        <img src="/logo.png" alt="浠艾福" class="logo-img" />
+        <div class="brand-titles">
+          <span class="brand-cn">亿图腾<span class="brand-dot">·</span>浠艾福</span>
+          <span class="brand-en">Care Family</span>
+        </div>
+      </div>
+
+      <!-- ===== 五维能量轮盘 ===== -->
+      <div class="orbit-section">
+        <div class="orbit-container">
+          <!-- 中心"家"徽章 -->
+          <div class="orbit-center-node">
+            <span class="center-text">家</span>
+          </div>
+
+          <!-- 轨道装饰环 -->
+          <svg class="orbit-ring-svg" viewBox="0 0 340 340" xmlns="http://www.w3.org/2000/svg">
+            <circle cx="170" cy="170" r="148" fill="none" stroke="rgba(255,255,255,0.05)" stroke-width="1" />
+            <circle cx="170" cy="170" r="144" fill="none" stroke="rgba(255,215,0,0.08)" stroke-width="0.5" stroke-dasharray="2,4" class="orbital-dash" />
+
+            <!-- 相生弧线 (身→智→富→行→心→身) -->
+            <defs>
+              <marker id="orbitArrow" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
+                <polygon points="0,0 10,3.5 0,7" fill="#FFD700" opacity="0.6"/>
+              </marker>
+            </defs>
+
+            <!-- 五边形弧线连接 -->
+            <path d="M 170,26 A 144,144 0 0,1 293,95" fill="none" stroke="#FFD700" stroke-width="1.5" stroke-opacity="0.35" class="arc-gen" marker-end="url(#orbitArrow)" />
+            <path d="M 293,95 A 144,144 0 0,1 256,293" fill="none" stroke="#FFD700" stroke-width="1.5" stroke-opacity="0.35" class="arc-gen" marker-end="url(#orbitArrow)" />
+            <path d="M 256,293 A 144,144 0 0,1 84,293" fill="none" stroke="#FFD700" stroke-width="1.5" stroke-opacity="0.35" class="arc-gen" marker-end="url(#orbitArrow)" />
+            <path d="M 84,293 A 144,144 0 0,1 47,95" fill="none" stroke="#FFD700" stroke-width="1.5" stroke-opacity="0.35" class="arc-gen" marker-end="url(#orbitArrow)" />
+            <path d="M 47,95 A 144,144 0 0,1 170,26" fill="none" stroke="#FFD700" stroke-width="1.5" stroke-opacity="0.35" class="arc-gen" marker-end="url(#orbitArrow)" />
+
+            <!-- 轨道粒子 -->
+            <circle cx="170" cy="22" r="2" fill="#FFE066" opacity="0.5" class="orbit-particle" />
+            <circle cx="297" cy="92" r="2" fill="#FFE066" opacity="0.5" class="orbit-particle" />
+            <circle cx="262" cy="298" r="2" fill="#FFE066" opacity="0.5" class="orbit-particle" />
+            <circle cx="78" cy="298" r="2" fill="#FFE066" opacity="0.5" class="orbit-particle" />
+            <circle cx="43" cy="92" r="2" fill="#FFE066" opacity="0.5" class="orbit-particle" />
+          </svg>
+
+          <!-- 五维节点 (绝对定位公转) -->
+          <!-- 身(橙) -->
+          <div class="orbit-node" style="--node-color:#FF8C42; --orbit-angle:0deg; --orbit-delay:0s;">
+            <span class="node-icon">🌏</span>
+            <span class="node-label">身</span>
+          </div>
+          <!-- 智(紫) -->
+          <div class="orbit-node" style="--node-color:#6366F1; --orbit-angle:72deg; --orbit-delay:-3s;">
+            <span class="node-icon">⚔️</span>
+            <span class="node-label">智</span>
+          </div>
+          <!-- 富(金) -->
+          <div class="orbit-node" style="--node-color:#F59E0B; --orbit-angle:144deg; --orbit-delay:-6s;">
+            <span class="node-icon">💧</span>
+            <span class="node-label">富</span>
+          </div>
+          <!-- 行(绿) -->
+          <div class="orbit-node" style="--node-color:#10B981; --orbit-angle:216deg; --orbit-delay:-9s;">
+            <span class="node-icon">🌿</span>
+            <span class="node-label">行</span>
+          </div>
+          <!-- 心(粉) -->
+          <div class="orbit-node" style="--node-color:#FF6B9D; --orbit-angle:288deg; --orbit-delay:-12s;">
+            <span class="node-icon">🔥</span>
+            <span class="node-label">心</span>
+          </div>
+
+          <!-- 图例 -->
+          <div class="orbit-legend">
+            <span class="legend-item">
+              <svg width="20" height="6" viewBox="0 0 20 6"><line x1="0" y1="3" x2="14" y2="3" stroke="#FFD700" stroke-width="1.5"/><polygon points="14,3 18,1 18,5" fill="#FFD700"/></svg>
+              <span>相生</span>
+            </span>
+          </div>
+        </div>
+      </div>
+
+      <!-- ===== 核心主张 ===== -->
+      <div class="brand-mission">
+        <h1 class="mission-title">给全家的<span class="highlight">一站式幸福提案</span></h1>
+        <p class="mission-desc">
+          AI 智慧家庭成长平台 · 五维能量驱动全家持续成长
+        </p>
+      </div>
+
+      <!-- ===== 数据 + 角色标签 ===== -->
+      <div class="brand-footer">
+        <div class="stats-row">
+          <div class="stat-item">
+            <span class="stat-num">120,000+</span>
+            <span class="stat-label">家庭信赖</span>
+          </div>
+          <div class="stat-divider"></div>
+          <div class="stat-item">
+            <span class="stat-num">1,000+</span>
+            <span class="stat-label">专业人员</span>
+          </div>
+          <div class="stat-divider"></div>
+          <div class="stat-item">
+            <span class="stat-num">5</span>
+            <span class="stat-label">幸福维度</span>
+          </div>
+        </div>
+        <div class="role-tags">
+          <span class="role-tag" style="border-color:#6366F1;color:#818CF8">家庭客户</span>
+          <span class="role-tag" style="border-color:#FF6B9D;color:#FF8CB3">服务商</span>
+          <span class="role-tag" style="border-color:#10B981;color:#34D399">平台运营</span>
+        </div>
+      </div>
+
+    </div>
+  </div>
+
+  <!-- 右侧登录表单区 (不变) -->
+  ...
+```
+
+---
+
+### Task 3: 添加五维能量轮盘 CSS 动画
+
+**Files:**
+- Modify: `cfc-web/src/views/Login.vue:526-607` (样式区域)
+
+- [ ] **Step 1: 替换 sand-table 相关样式为 orbit 样式**
+
+删除旧沙盘相关CSS(lines 527-606),替换为:
+
+```css
+/* ==================== 五维能量轮盘 ==================== */
+.orbit-section {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  min-height: 0;
+  margin: -6px 0;
+}
+
+.orbit-container {
+  position: relative;
+  width: 300px;
+  height: 300px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+/* 轨道SVG装饰 */
+.orbit-ring-svg {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1;
+  overflow: visible;
+}
+
+/* 虚线轨道动画 */
+.orbital-dash {
+  animation: rotateDash 20s linear infinite;
+  transform-origin: 170px 170px;
+}
+
+@keyframes rotateDash {
+  0%   { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
+
+/* 相生弧线流光 */
+.arc-gen {
+  stroke-dasharray: 8 6;
+  animation: flowArc 1.2s linear infinite;
+}
+
+@keyframes flowArc {
+  0%   { stroke-dashoffset: 0; }
+  100% { stroke-dashoffset: -14; }
+}
+
+/* 轨道粒子公转 */
+.orbit-particle {
+  animation: orbitParticle 8s linear infinite;
+  transform-origin: 170px 170px;
+}
+
+@keyframes orbitParticle {
+  0%   { opacity: 0;   transform: rotate(0deg)   translateX(148px) rotate(0deg); }
+  12%  { opacity: 0.6; }
+  88%  { opacity: 0.6; }
+  100% { opacity: 0;   transform: rotate(360deg) translateX(148px) rotate(-360deg); }
+}
+
+/* 中心节点 */
+.orbit-center-node {
+  position: relative;
+  z-index: 3;
+  width: 68px;
+  height: 68px;
+  border-radius: 50%;
+  background: linear-gradient(135deg, #FFD700, #F59E0B);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  box-shadow:
+    0 0 20px rgba(245, 158, 11, 0.3),
+    0 0 60px rgba(245, 158, 11, 0.1);
+  animation: pulseCenter 3s ease-in-out infinite;
+}
+
+.center-text {
+  font-size: 24px;
+  font-weight: 700;
+  color: #fff;
+  letter-spacing: 2px;
+  text-shadow: 0 1px 4px rgba(0,0,0,0.15);
+}
+
+@keyframes pulseCenter {
+  0%, 100% { box-shadow: 0 0 20px rgba(245, 158, 11, 0.3), 0 0 60px rgba(245, 158, 11, 0.1); transform: scale(1); }
+  50%      { box-shadow: 0 0 30px rgba(245, 158, 11, 0.5), 0 0 80px rgba(245, 158, 11, 0.2); transform: scale(1.05); }
+}
+
+/* 五维节点公转 */
+.orbit-node {
+  position: absolute;
+  z-index: 2;
+  width: 50px;
+  height: 50px;
+  border-radius: 50%;
+  background: var(--node-color);
+  border: 2px solid rgba(255, 255, 255, 0.2);
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  box-shadow: 0 0 12px rgba(0,0,0,0.15), inset 0 1px 2px rgba(255,255,255,0.15);
+  animation: orbitRotate 15s linear infinite;
+  animation-delay: var(--orbit-delay);
+  left: calc(50% - 25px);
+  top: calc(50% - 25px);
+  transform-origin: center;
+}
+
+/* 轨道公转 */
+@keyframes orbitRotate {
+  0%   { transform: rotate(var(--orbit-angle)) translateX(125px) rotate(calc(-1 * var(--orbit-angle))); }
+  100% { transform: rotate(calc(var(--orbit-angle) + 360deg)) translateX(125px) rotate(calc(-1 * var(--orbit-angle) - 360deg)); }
+}
+
+.node-icon {
+  font-size: 14px;
+  line-height: 1;
+  margin-bottom: 1px;
+}
+
+.node-label {
+  font-size: 11px;
+  font-weight: 700;
+  color: #fff;
+  line-height: 1;
+  text-shadow: 0 1px 2px rgba(0,0,0,0.1);
+}
+
+/* 图例 */
+.orbit-legend {
+  position: absolute;
+  bottom: -10px;
+  left: 50%;
+  transform: translateX(-50%);
+  z-index: 2;
+}
+
+.legend-item {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+  font-size: 9px;
+  opacity: 0.4;
+  color: #fff;
+  letter-spacing: 1px;
+}
+
+.legend-item svg {
+  display: block;
+}
+```
+
+- [ ] **Step 2: 移除旧的沙盘相关 CSS**
+
+删除以下不再使用的 CSS 规则(找到并移除):
+- `.sand-table-wrap` 及其所有子规则
+- `.brand-values` 及其所有子规则
+- `.value-item`, `.value-icon`, `.value-label`, `.value-arrow`, `.value-subtitle`
+- `.sand-table-svg` 相关动画
+- 删除 `@keyframes` 中不再使用的:`nodeBreathe`(保留旧名但不再引用也可删除)
+
+- [ ] **Step 3: 更新响应式 CSS 微调**
+
+在 `@media screen and (max-width: 900px)` 中,确保 `.orbit-section` 在隐藏时随 `.brand-panel` 一起隐藏(已有 `.brand-panel { display: none; }` 处理了)。
+
+---
+
+### Task 4: 验证
+
+**Files:**
+- Verify: `cfc-web/src/views/Login.vue`
+
+- [ ] **Step 1: LSP 诊断检查**
+
+Run: LSP diagnostics on Login.vue
+Expected: 无错误,无警告
+
+- [ ] **Step 2: 编译验证**
+
+```bash
+cd /sc-data/cfc/cfc-web && npx vue-cli-service build --mode production 2>&1 | tail -20
+```
+
+Expected: Build 成功,无错误
+
+- [ ] **Step 3: 最终清理**
+
+确认已删除所有旧的沙盘 SVG 标记和不再使用的 CSS 规则。
+确认右侧表单区域未受影响。

+ 184 - 0
docs/superpowers/specs/2026-07-02-login-left-panel-redesign.md

@@ -0,0 +1,184 @@
+# 登录页左侧品牌区重新设计
+
+**日期:** 2026-07-02
+**状态:** 设计已确认
+
+## 概述
+
+重新设计 cfc-web 管理端登录页(Login.vue)的左侧品牌展示区。以「五维能量轮盘」为核心视觉元素,采用五维品牌色系,替换当前的五行沙盘 SVG。
+
+## 设计方向
+
+- **参考来源:** `web/` 企业官网的视觉语言(dimension-orbit 动画、卡片化风格、色彩运用)
+- **色彩体系:** 五维品牌色(身橙/智紫/富金/行绿/心粉)
+- **整体风格:** 热忱现代,品牌感强,动画流畅
+
+## 布局结构
+
+```
+┌──────────────────────────────────┐
+│ 品牌 Logo + 标题                  │  顶部固定
+├──────────────────────────────────┤
+│                                  │
+│  五维能量轮盘 (主视觉元素)          │  弹性居中
+│  - 中心: "家" 金色徽章            │  max 300×300px
+│  - 五维节点公转 (72°等分)          │
+│  - 相生连接线 + 流光动画           │
+│                                  │
+├──────────────────────────────────┤
+│  "给全家的 一站式幸福提案"          │  品牌主张
+│  "AI 智慧家庭成长平台..."          │
+├──────────────────────────────────┤
+│  统计: 120,000+ / 1,000+ / 5     │  底部信息
+│  角色标签: 家庭客户/服务商/平台运营  │
+└──────────────────────────────────┘
+```
+
+## 配色方案
+
+### 背景渐变
+
+```
+#1A0F00 (#top)
+  ↓  径向光晕 + 极淡暖金粒子
+#2D1810 (#mid)
+  ↓
+#3D2B1F (#bottom)
+```
+
+### 五维色系
+
+| 维度 | 颜色 | HEX | 用途 |
+|:----:|:----:|:----:|------|
+| 身(土) | 橙 | `#FF8C42` | 节点1 + 标签边框 |
+| 智(金) | 紫 | `#6366F1` | 节点2 + 标签边框 |
+| 富(水) | 金 | `#F59E0B` | 节点3 + 标签边框 |
+| 行(木) | 绿 | `#10B981` | 节点4 + 标签边框 |
+| 心(火) | 粉 | `#FF6B9D` | 节点5 + 标签边框 |
+
+### 文字色
+
+| 用途 | 样式 |
+|------|------|
+| 品牌名(中文) | 金色渐变 `#FFE066 → #F59E0B` |
+| 品牌名(英文) | 白色 opacity 0.5 |
+| 核心标题 | 金色渐变 `#FFE066 → #F59E0B` |
+| 副标题 | 白色 opacity 0.55 |
+| 统计数字 | 金色渐变 |
+| 统计标签 | 白色 opacity 0.5 |
+| 角色标签 | 对应维度色,opacity 0.5 |
+
+## 组件结构
+
+### 1. 品牌头部(brand-header)
+
+```
+  [logo.png]  亿图腾·浠艾福
+               Care Family
+```
+
+- 与当前布局一致,微调字距
+- `margin-bottom: 12px`
+
+### 2. 五维能量轮盘(dimension-orbit-section)
+
+容器:`300×300px`,`position: relative`,`margin: 0 auto`
+
+#### 中心节点(center-node)
+- 72×72px 正圆
+- 背景:`linear-gradient(135deg, #FFD700, #F59E0B)`
+- 文字:"家" 白色 24px 700
+- 动画:`pulseCenter` 3s ease-in-out infinite
+
+#### 轨道节点(orbit-nodes)
+5 个节点通过 CSS `transform: rotate(Ndeg) translateX(Rpx)` 实现公转:
+
+| 节点 | 初始角度 | 颜色 | 内容 |
+|:----:|:--------:|:----:|:----:|
+| 身 | 0° | `#FF8C42` | 🌏 + 身 |
+| 智 | 72° | `#6366F1` | ⚔️ + 智 |
+| 富 | 144° | `#F59E0B` | 💧 + 富 |
+| 行 | 216° | `#10B981` | 🌿 + 行 |
+| 心 | 288° | `#FF6B9D` | 🔥 + 心 |
+
+- 节点尺寸:52×52px 正圆
+- 边框:2px solid color,微弱内阴影
+- 文字颜色:白色
+- 动画:`orbit 15s linear infinite`
+- 通过 `animation-delay` 错开 5 个节点的起始相位(每个延迟 0s, 3s, 6s, 9s, 12s)
+
+#### 轨道 && 连接线
+- 外层装饰轨道:半径 130px,细线 `stroke: rgba(255,255,255,0.06)`,虚线点缀
+- 相生弧线:连接相邻维度节点,组成五边形
+  - 使用 SVG `<path>` 绘制弧线
+  - 颜色:`#FFD700` 透明度 0.6
+  - 动画:流光效果 `flowArc 1.2s linear infinite`
+- 相克线(简化):用较淡的细虚线从中心向外辐射,或省略
+- 图例:底部中央显示"相生" + "相克" 的小图例
+
+#### 粒子装饰
+- 5 颗微小粒子沿轨道外缘缓慢公转
+- 尺寸 2px,金色
+- 动画:`orbitParticle 8s linear infinite`
+
+### 3. 品牌主张(brand-mission)
+
+```
+h1: 给全家的 <金色高亮>一站式幸福提案</金色高亮>
+p:  AI 智慧家庭成长平台 · 五维能量驱动全家持续成长
+```
+
+- 标题 20px 700
+- 描述 13px 300
+
+### 4. 底部信息(brand-footer)
+
+#### 统计行
+```
+120,000+  |  1,000+  |  5
+家庭信赖   |  专业人员 |  幸福维度
+```
+
+- 数字 22px 700 金色渐变
+- 标签 10px opacity 0.5
+- 竖线分隔 1px 白色 opacity 0.1, 高 28px
+
+#### 角色标签
+```
+[家庭客户]  [服务商]  [平台运营]
+```
+
+- 圆角 20px,字号 11px
+- 边框色 + 文字色分别对应五维色系中最接近的三种颜色
+- 家庭客户 → 智(紫) `#6366F1`
+- 服务商 → 心(粉) `#FF6B9D`
+- 平台运营 → 行(绿) `#10B981`
+
+## 动画清单
+
+| 动画 | 目标 | 周期 | 说明 |
+|------|------|:----:|------|
+| `pulseCenter` | 中心"家"节点 | 3s | 呼吸缩放 + 发光强弱变化 |
+| `nodeOrbit` | 五维节点 | 15s | 围绕中心公转(匀速) |
+| `flowArc` | 相生弧线 | 1.2s | 虚线偏移产生流动感 |
+| `pulseLine` | 相克线 | 2.2s | 透明度脉冲 |
+| `orbitParticle` | 轨道粒子 | 8s | 沿轨道公转 |
+| `nodeBreathe` | 节点自身 | 3.2s | 节点呼吸放大效果 |
+
+## 响应式
+
+| 断点 | 行为 |
+|:----:|------|
+| >900px | 完整双栏布局,左侧 55% |
+| ≤900px | 隐藏左侧品牌区,表单全屏(与当前一致) |
+
+## 重用说明
+
+此设计仅修改 `Login.vue` 中的 `.brand-panel` 相关模板和样式。
+- 不修改右侧 `.form-panel` 区域
+- 不修改 Script 部分
+- 不修改组件结构(SliderCaptcha 等)
+
+## 修改文件
+
+- `cfc-web/src/views/Login.vue` — 模板(<template> 中左侧 brand-panel 区域)+ 样式(<style> scoped 中 brand-panel 相关样式)

+ 174 - 0
docs/superpowers/specs/2026-07-03-article-center-design.md

@@ -0,0 +1,174 @@
+# 小程序文章主页设计方案
+
+**日期**:2026-07-03
+**状态**:已确认
+
+---
+
+## 一、页面入口与导航
+
+**路径**:`/pages/article-center/index`(子包新建)
+
+**入口**:
+- 发现页"更多 ›" → `/pages/article-center/index`(修复现有 bug)
+- 个人中心 ProfileMenu → 新增"成长文章"菜单入口
+
+**Tab 导航**(顶部横向滚动):
+```
+全部推荐 | 身 | 智 | 心 | 行 | 富
+```
+
+- **全部推荐** = 个性化流,按当前访问用户的综合画像(年龄、发育阶段、兴趣等)排序
+- **五维 Tab** = 该维度的文章分类列表
+
+**浮动按钮**:右下角 📝 写成长记录
+
+---
+
+## 二、文章列表
+
+**卡片结构**:
+- 封面图 16:9
+- 分类标签 + 阅读时长
+- 标题(最多2行)
+- 摘要(最多2行)
+- 作者 + 日期 + 收藏数
+- 底部:五维能量彩条(颜色对应维度)
+
+**列表交互**:
+- 下拉刷新、上拉加载(分页)
+- 点击 → 进入文章详情
+
+**列表状态**:骨架屏 / 空状态插画 / 加载失败重试
+
+---
+
+## 三、文章详情
+
+**路径**:`/pages/article-center/article-detail`(子包新建)
+
+**页面结构**:
+- 封面图(widthFix)
+- 分类 · 阅读时长
+- 标题
+- 作者 · 日期
+- 五维权重彩条
+- 正文(rich-text)
+- 底部悬浮:阅读完成按钮
+
+**阅读完成流程**:
+1. 用户点击/滚动到底部 → 显示 loading "AI 正在根据你的情况出题..."
+2. 后端根据**文章内容 + 用户综合画像**生成 2 道题
+3. 展示题目 → 用户提交答案
+4. 计分成功 → toast "获得 N 积分"
+5. 生成阅读记录,推送至家长/孩子报告
+
+---
+
+## 四、轻量发布 — 写成长记录
+
+**入口**:右下角浮动按钮
+
+**弹出页面**:`/pages/article-center/article-edit`(新页面)
+
+**字段**:
+| 字段 | 必填 | 说明 |
+|------|------|------|
+| 标题 | 是 | 最多 50 字 |
+| 封面图 | 否 | 上传或拍照 |
+| 正文 | 是 | 富文本,最多 2000 字 |
+| 可见范围 | 否 | 默认"仅家庭";可选"公开" |
+| 孩子标签 | 否 | 家长写孩子动态时绑定 |
+
+**维度补充**:关联维度可选;不选则后端自动分析内容补充
+
+**草稿**:自动本地缓存草稿,退出页面提示"是否保存草稿"
+
+**发布状态**:
+- **仅家庭**:直接发布,无需审核,立即对家庭可见
+- **公开**:提交后进审核队列,通过后全量展示
+
+---
+
+## 五、发布记录
+
+**路径**:`/pages/article-center/my-posts`(新页面)
+
+**列表展示**:标题 + 封面图 + 发布时间 + 状态标签
+
+**状态**:
+- 草稿(未发布)
+- 审核中(公开文章)
+- 已发布
+- 已拒绝(含拒绝原因)
+
+**右上角入口**:发表页"历史"按钮
+
+---
+
+## 六、积分与能量激励
+
+**发布积分**:
+| 类型 | 积分 |
+|------|------|
+| 家庭内部可见发布并通过 | 10 分 |
+| 公开文章发布并通过审核 | 30 分 |
+| 被点赞/评论 | +2 分/次 |
+
+**阅读积分**:
+- AI 出题回答完成:+5 分
+
+**能量分配**:
+- 按文章关联维度的能量比计算(非均分)
+- 假设文章维度权重为 [身:20%, 智:30%, 富:10%, 行:15%, 心:25%],总能量 +10
+- 各维度能量 = 10 × 各维度百分比
+
+---
+
+## 七、消息通知
+
+- 管理员审核通过 → 消息通知作者
+- 被点赞/评论 → 消息通知
+- AI 出题完成 → 静默
+
+---
+
+## 八、孩子端 vs 家长端
+
+- **孩子访问**:内容按年龄过滤 + 行/富维度内容隐藏
+- **家长访问**:全量内容 + 商业内容
+- 孩子读完后 → 家长可在报告里看到阅读记录和 AI 答题情况
+
+---
+
+## 九、需要后端新增接口
+
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| `/api/articles/ai-questions` | POST | 根据文章内容+用户画像生成2道题 |
+| `/api/articles/submit-answers` | POST | 提交阅读答题,更新积分 |
+| `/api/articles/publish` | POST | 发布成长记录(家庭/公开) |
+| `/api/articles/my-posts` | POST | 我的发布列表 |
+| `/api/articles/approve` | POST | 管理员审核(web端) |
+
+---
+
+## 十、文件清单
+
+| 文件 | 说明 |
+|------|------|
+| `pages/article-center/index.vue` | 文章主页(列表+Tab) |
+| `pages/article-center/article-detail.vue` | 文章详情 |
+| `pages/article-center/article-edit.vue` | 写成长记录 |
+| `pages/article-center/my-posts.vue` | 我的发布 |
+| `pages.json` | 注册以上页面 |
+
+---
+
+## 十一、依赖现有能力
+
+- 现有 `pages/mind-detail/articles.vue` 的列表 UI 模式
+- 现有 `DimensionWeightPicker.vue` 组件
+- 现有五维能量 API
+- 现有 Dify AI 集成
+- 现有积分/能量系统