Просмотр исходного кода

feat: 简化 AIFloatingAvatar 组件 + 添加到各页面 + 更新 AGENTS.md
- 移除 AIFloatingAvatar 脉冲动画,简化组件
- 在 body/index、index、mind、wisdom、profile、activity 页面添加悬浮头像
- AGENTS.md 新增 :class 绑定规则(小程序不支持方法调用)

User 4 месяцев назад
Родитель
Сommit
24ce6b0acb

+ 1 - 0
cfc-frontend/AGENTS.md

@@ -54,6 +54,7 @@ pages.json 中定义 5 个 TabBar 页面(TabBar 文案,非五维维度名)
 - **NEVER** 跳过 JWT 认证直接调用需登录接口
 - **NEVER** 在本地存储中保存敏感用户信息
 - **NEVER** 在 WXML/Vue 模板中使用可选链 `?.`,微信小程序不支持 → 使用 `&&` 代替(如 `currentWish?.title` 改为 `currentWish && currentWish.title`)
+- **NEVER** 在 `:class` 绑定中调用方法(如 `:class="getStatusClass(item)"`),微信小程序模板编译器不支持带参数的方法调用 → 改用内联表达式(如 `:class="'status-' + item.status"`)或计算属性
 
 ## UNIQUE FEATURES
 

+ 1 - 22
cfc-frontend/components/AIFloatingAvatar.vue

@@ -3,7 +3,6 @@
     <view class="ai-float-avatar" :class="mascotCode">
       <text class="ai-float-icon">{{ mascotIcon }}</text>
     </view>
-    <view class="ai-float-pulse" v-if="showPulse"></view>
   </view>
 </template>
 
@@ -13,16 +12,12 @@ export default {
   data() {
     return {
       mascotCode: 'xibao',
-      mascotIcon: '🌟',
-      showPulse: true
+      mascotIcon: '🌟'
     }
   },
   mounted() {
     this.loadMascot()
   },
-  onShow() {
-    this.loadMascot()
-  },
   methods: {
     loadMascot() {
       var userInfo = uni.getStorageSync('userInfo')
@@ -106,24 +101,8 @@ export default {
   line-height: 1;
 }
 
-/* 脉冲动画 */
-.ai-float-pulse {
-  position: absolute;
-  width: 96rpx;
-  height: 96rpx;
-  border-radius: 50%;
-  background: rgba(249, 115, 22, 0.25);
-  animation: pulseRing 2s ease-out infinite;
-  z-index: 1;
-}
-
 @keyframes floatBounce {
   0%, 100% { transform: translateY(0); }
   50% { transform: translateY(-8rpx); }
 }
-
-@keyframes pulseRing {
-  0% { transform: scale(1); opacity: 0.6; }
-  100% { transform: scale(1.6); opacity: 0; }
-}
 </style>

+ 3 - 1
cfc-frontend/pages/body/index.vue

@@ -188,6 +188,7 @@
 
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
+    <AIFloatingAvatar />
   </view>
 </template>
 
@@ -204,6 +205,7 @@ import DimensionProducts from '../../components/DimensionProducts.vue'
 import DimensionArticles from '../../components/DimensionArticles.vue'
 import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
 import RadarChart from '../../components/RadarChart.vue'
+import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import { getVisibleSections, getEnergyOverview, getChildren, getTodayTasksByCategory, getActivityList, getProductsByDomain, getFamilyEnergySandbox, getVisibleFamilyMembers, getDimensionOverview, getFeaturedArticles } from '../../utils/api.js'
 import config from '../../config.js'
 
@@ -235,7 +237,7 @@ const healthRequest = function(url, data) {
 }
 
 export default {
-  components: { TabTransition, PageBanner, LoginGuideCard, HealthTips, FamilyEnergyBar, UserQuickEntry, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles, FamilyRelationGraph, RadarChart },
+  components: { TabTransition, PageBanner, LoginGuideCard, HealthTips, FamilyEnergyBar, UserQuickEntry, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles, FamilyRelationGraph, RadarChart, AIFloatingAvatar },
   data() {
     return {
       isLoggedIn: false,

+ 4 - 1
cfc-frontend/pages/index/index.vue

@@ -189,6 +189,7 @@
         <text>加载中...</text>
       </view>
     </transition>
+    <AIFloatingAvatar />
   </view>
 </view>
 </template>
@@ -200,6 +201,7 @@ import ChildIndex from './child-index.vue'
 import PageBanner from '../../components/PageBanner.vue'
 import WuxingSandbox from '../../components/wuxing-sandbox.vue'
 import TabTransition from '../../components/tab-transition.vue'
+import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import { acceptParentInvite, productList, getActivityList, getFeaturedArticles } from '../../utils/api.js'
 
 var DIMENSIONS = [
@@ -216,7 +218,8 @@ export default {
     ChildIndex,
     PageBanner,
     WuxingSandbox,
-    TabTransition
+    TabTransition,
+    AIFloatingAvatar
   },
   data() {
     // 从 storage 预取登录态/角色,确保首次渲染即正确(WeChat 渲染层/逻辑层分离架构下 onLoad 执行前已渲染)

+ 3 - 1
cfc-frontend/pages/mind/index.vue

@@ -266,6 +266,7 @@
 
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
+    <AIFloatingAvatar />
   </view>
 </template>
 
@@ -282,11 +283,12 @@ import DimensionProducts from '../../components/DimensionProducts.vue'
 import DimensionArticles from '../../components/DimensionArticles.vue'
 import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
 import PsychCrisisBanner from '../../components/PsychCrisisBanner.vue'
+import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import { getVisibleSections, getFeaturedArticles, getEmiReport, getDailyTip, getFamilyEnergySandbox, getTodayTasksByCategory, getActivityList, getProductsByDomain, getChildren, getVisibleFamilyMembers, getEnergyOverview } from '../../utils/api.js'
 import config from '../../config.js'
 
 export default {
-  components: { TabTransition, PageBanner, RadarChart, LoginGuideCard, FamilyEnergyBar, UserQuickEntry, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles, FamilyRelationGraph, PsychCrisisBanner },
+  components: { TabTransition, PageBanner, RadarChart, LoginGuideCard, FamilyEnergyBar, UserQuickEntry, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles, FamilyRelationGraph, PsychCrisisBanner, AIFloatingAvatar },
   data() {
     return {
       isLoggedIn: false,

+ 4 - 1
cfc-frontend/pages/profile/profile.vue

@@ -49,6 +49,7 @@
       <!-- 菜单列表 -->
       <ProfileMenu :role="role" @invite-generate="onInviteGenerate" />
     </template>
+    <AIFloatingAvatar />
   </view>
 </template>
 
@@ -60,6 +61,7 @@ import ProfileStats from './components/ProfileStats.vue'
 import ProfileBadges from './components/ProfileBadges.vue'
 import ProfileGrowth from './components/ProfileGrowth.vue'
 import ProfileMenu from './components/ProfileMenu.vue'
+import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 
 export default {
   components: {
@@ -69,7 +71,8 @@ export default {
     ProfileStats,
     ProfileBadges,
     ProfileGrowth,
-    ProfileMenu
+    ProfileMenu,
+    AIFloatingAvatar
   },
   data() {
     return {

+ 3 - 1
cfc-frontend/pages/wisdom/index.vue

@@ -139,6 +139,7 @@
 
     <!-- 底部占位 -->
     <view class="bottom-spacer"></view>
+    <AIFloatingAvatar />
   </view>
 </template>
 
@@ -154,10 +155,11 @@ import DimensionActivities from '../../components/DimensionActivities.vue'
 import DimensionProducts from '../../components/DimensionProducts.vue'
 import DimensionArticles from '../../components/DimensionArticles.vue'
 import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
+import AIFloatingAvatar from '../../components/AIFloatingAvatar.vue'
 import { getVisibleSections, getChildren, getTodayTasksByCategory, getActivityList, getProductsByDomain, getFamilyEnergySandbox, getAssessmentLatestResult, getFeaturedArticles } from '../../utils/api.js'
 
 export default {
-  components: { TabTransition, PageBanner, LoginGuideCard, RadarChart, FamilyEnergyBar, UserQuickEntry, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles, FamilyRelationGraph },
+  components: { TabTransition, PageBanner, LoginGuideCard, RadarChart, FamilyEnergyBar, UserQuickEntry, DimensionTasks, DimensionActivities, DimensionProducts, DimensionArticles, FamilyRelationGraph, AIFloatingAvatar },
   data() {
     return {
       isLoggedIn: false,