index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. <template>
  2. <view class="wisdom-container">
  3. <!-- Tabbar 切换过渡页 -->
  4. <tab-transition v-if="showTabTransition" dimCode="wisdom" />
  5. <!-- 1. 品牌头部 -->
  6. <PageBanner theme="wisdom"
  7. tagline="学以启智 · 慧及未来"
  8. quote="知者不惑,仁者不忧" />
  9. <!-- 2. 游客专属区块 -->
  10. <template v-if="!isLoggedIn">
  11. <LoginGuideCard
  12. title="登录后查看全家智慧成长数据"
  13. :items="[
  14. '查看全家认知能量数据和测评报告',
  15. '记录每日成长,获取智慧能量',
  16. '参与认知训练,提升综合能力'
  17. ]" />
  18. <WisdomTips />
  19. </template>
  20. <!-- 3. 五维能量条(登录后) -->
  21. <FamilyEnergyBar
  22. v-if="isLoggedIn"
  23. dimensionCode="wisdom"
  24. :sandboxData="sandboxData"
  25. :dualDimension="dualDimension" />
  26. <!-- 4. 家庭成员关系图谱(登录后) -->
  27. <FamilyRelationGraph
  28. v-if="isLoggedIn && familyMembersVisible.length > 0"
  29. dimensionCode="wisdom"
  30. :selfId="activeChildId"
  31. :members="familyMembersVisible"
  32. :energyMap="energyMapForGraph"
  33. :intimacyMap="intimacyMapForGraph"
  34. @memberTap="goMemberDetail" />
  35. <!-- 5. 用户快捷入口 -->
  36. <UserQuickEntry
  37. v-if="isLoggedIn"
  38. :userName="userName"
  39. roleName="家长"
  40. :currentChildName="activeChildName"
  41. :children="children"
  42. @childChanged="onChildChanged"
  43. @scrollTo="scrollToSection" />
  44. <!-- 6. 功能入口 -->
  45. <view class="func-section" v-if="sectionVisible('func_entries')">
  46. <view class="func-grid">
  47. <view class="func-item" v-for="item in funcList" :key="item.label" @click="onFuncClick(item)">
  48. <view class="func-icon-wrap">
  49. <text class="func-icon">{{ item.icon }}</text>
  50. </view>
  51. <text class="func-label">{{ item.label }}</text>
  52. </view>
  53. </view>
  54. </view>
  55. <!-- 7. 认知摘要区(登录后) -->
  56. <view class="section" v-if="isLoggedIn">
  57. <view class="section-header">
  58. <text class="section-title">认知概览</text>
  59. <text class="section-more" @click="goCognitiveReport">查看详情 ›</text>
  60. </view>
  61. <view class="cognition-summary" v-if="cognitiveReport">
  62. <view class="summary-main">
  63. <text class="summary-score">{{ cognitiveReport.overallScore || '--' }}</text>
  64. <text class="summary-label">综合认知评分</text>
  65. </view>
  66. <view class="summary-detail">
  67. <text class="summary-min" v-if="lowestDimension">
  68. 待提升: {{ lowestDimension.label }} ({{ lowestDimension.score }})
  69. </text>
  70. </view>
  71. </view>
  72. <view class="cognition-empty" v-else>
  73. <text class="empty-tip">暂无认知测评数据</text>
  74. <text class="empty-sub">完成DAN评估后查看详细报告</text>
  75. </view>
  76. </view>
  77. <!-- 8. 自己出题入口卡(登录后) -->
  78. <view class="section highlight-card" v-if="isLoggedIn" @click="goSelfQuiz">
  79. <view class="highlight-card-inner">
  80. <view class="highlight-card-left">
  81. <text class="highlight-icon">✏️</text>
  82. </view>
  83. <view class="highlight-card-right">
  84. <text class="highlight-title">自己出题自己答</text>
  85. <text class="highlight-desc">元认知训练:自己出题、自己判分,提升学习能力</text>
  86. </view>
  87. <text class="highlight-arrow">›</text>
  88. </view>
  89. </view>
  90. <!-- 9. 训练中心入口卡(登录后) -->
  91. <view class="section highlight-card" v-if="isLoggedIn" @click="goTrainingHub">
  92. <view class="highlight-card-inner">
  93. <view class="highlight-card-left">
  94. <text class="highlight-icon">🧠</text>
  95. </view>
  96. <view class="highlight-card-right">
  97. <text class="highlight-title">认知训练中心</text>
  98. <text class="highlight-desc">舒尔特方格 · 猜数字 — 多维度认知训练游戏</text>
  99. </view>
  100. <text class="highlight-arrow">›</text>
  101. </view>
  102. </view>
  103. <!-- 10. 维度任务 -->
  104. <DimensionTasks
  105. v-if="isLoggedIn"
  106. dimensionCode="wisdom"
  107. :tasks="dimensionTasks"
  108. @taskClick="onTaskClick"
  109. @moreTasks="goTasks" />
  110. <!-- 11. 维度活动 -->
  111. <DimensionActivities
  112. dimensionCode="wisdom"
  113. :activities="dimensionActivities"
  114. @activityClick="goActivityDetail"
  115. @moreActivities="goMoreActivities" />
  116. <!-- 12. 维度商品 -->
  117. <DimensionProducts
  118. dimensionCode="wisdom"
  119. :products="dimensionProducts"
  120. @productClick="goProductDetail"
  121. @moreProducts="goMoreProducts" />
  122. <!-- 推荐阅读 -->
  123. <view class="section" v-if="sectionVisible('recommended_reading') && wisdomArticles.length > 0">
  124. <view class="section-header">
  125. <text class="section-title">推荐阅读</text>
  126. </view>
  127. <view class="article-list">
  128. <view class="article-card" v-for="article in wisdomArticles" :key="article.id" @click="goArticleDetail(article.id)">
  129. <view class="article-category" :style="{ background: article.categoryColor }">
  130. <text class="article-category-text">{{ article.category }}</text>
  131. </view>
  132. <text class="article-title">{{ article.title }}</text>
  133. <text class="article-summary">{{ article.summary }}</text>
  134. <view class="article-meta">
  135. <view class="meta-item">
  136. <text class="meta-icon">&#x1F4D6;</text>
  137. <text class="meta-text">{{ article.views }}</text>
  138. </view>
  139. <view class="meta-item">
  140. <text class="meta-icon">&#x1F44D;</text>
  141. <text class="meta-text">{{ article.likes }}</text>
  142. </view>
  143. <text class="article-date">{{ article.date }}</text>
  144. </view>
  145. </view>
  146. </view>
  147. </view>
  148. <!-- 13. 智慧小贴士 -->
  149. <view class="section" v-if="sectionVisible('wisdom_tips')">
  150. <view class="section-header">
  151. <text class="section-title">智慧小贴士</text>
  152. </view>
  153. <view class="tips-list">
  154. <view class="tip-card" v-for="item in wisdomTips" :key="item.id">
  155. <text class="tip-title">{{ item.title }}</text>
  156. <text class="tip-summary">{{ item.summary }}</text>
  157. </view>
  158. </view>
  159. </view>
  160. <!-- 14. 快捷操作按钮 -->
  161. <view class="section quick-actions" v-if="isLoggedIn">
  162. <view class="action-btn" @click="goCognitiveReport">
  163. <text class="action-icon">📊</text>
  164. <text class="action-text">认知报告</text>
  165. </view>
  166. <view class="action-btn" @click="goTrainingHub">
  167. <text class="action-icon">🧠</text>
  168. <text class="action-text">认知训练</text>
  169. </view>
  170. <view class="action-btn" @click="goAssessment">
  171. <text class="action-icon">📋</text>
  172. <text class="action-text">测评预约</text>
  173. </view>
  174. <view class="action-btn" @click="goHome">
  175. <text class="action-icon">🏠</text>
  176. <text class="action-text">返回首页</text>
  177. </view>
  178. </view>
  179. <!-- 底部占位 -->
  180. <view class="bottom-spacer"></view>
  181. </view>
  182. </template>
  183. <script>
  184. import TabTransition from '../../components/tab-transition.vue'
  185. import PageBanner from '../../components/PageBanner.vue'
  186. import LoginGuideCard from '../../components/LoginGuideCard.vue'
  187. import WisdomTips from '../../components/WisdomTips.vue'
  188. import FamilyEnergyBar from '../../components/FamilyEnergyBar.vue'
  189. import UserQuickEntry from '../../components/UserQuickEntry.vue'
  190. import DimensionTasks from '../../components/DimensionTasks.vue'
  191. import DimensionActivities from '../../components/DimensionActivities.vue'
  192. import DimensionProducts from '../../components/DimensionProducts.vue'
  193. import FamilyRelationGraph from '../../components/FamilyRelationGraph.vue'
  194. import { getVisibleSections, getChildren, getTodayTasksByCategory, getActivityList, getProductsByDomain, getFamilyEnergySandbox, getAssessmentLatestResult, getFeaturedArticles } from '../../utils/api.js'
  195. export default {
  196. components: { TabTransition, PageBanner, LoginGuideCard, WisdomTips, FamilyEnergyBar, UserQuickEntry, DimensionTasks, DimensionActivities, DimensionProducts, FamilyRelationGraph },
  197. data() {
  198. return {
  199. isLoggedIn: false,
  200. role: null,
  201. showTabTransition: false,
  202. activeChildId: null,
  203. activeChildName: '',
  204. userName: '',
  205. children: [],
  206. familyMembersVisible: [],
  207. sandboxData: null,
  208. dualDimension: null,
  209. visibleSections: [],
  210. cognitiveReport: null,
  211. lowestDimension: null,
  212. dimensionTasks: [],
  213. dimensionActivities: [],
  214. dimensionProducts: [],
  215. articles: [],
  216. funcList: [
  217. { icon: '\u{1F4CA}', label: '认知报告', needLogin: true, page: '/pages/wisdom/cognitive-report' },
  218. { icon: '\u{270F}\uFE0F', label: '自己出题', needLogin: true, page: '/pages/wisdom/self-quiz' },
  219. { icon: '\u{1F9E0}', label: '训练中心', needLogin: true, page: '/pages/wisdom/training-hub' },
  220. { icon: '\u{1F3AF}', label: '测评预约', needLogin: false, page: '/pages/assessment/apply' },
  221. { icon: '\u{1F4D6}', label: '阅读天地', needLogin: false, page: '/pages/mind/articles' }
  222. ],
  223. wisdomTips: [
  224. { id: 1, title: '认知发展的关键期', summary: '儿童认知发展存在关键期窗口,抓住每个阶段的核心能力培养机会。' },
  225. { id: 2, title: '元认知训练的意义', summary: '教会孩子"学会如何学习",通过自我监控和反思提升学习效率。' },
  226. { id: 3, title: '专注力的培养方法', summary: '从短时间专注起步,逐步延长专注时长,配合舒尔特方格等训练工具。' },
  227. { id: 4, title: '多维度认知刺激', summary: '综合运用视、听、触等多种感官刺激,促进大脑神经网络全面发展。' }
  228. ]
  229. }
  230. },
  231. computed: {
  232. energyMapForGraph: function() {
  233. var map = {}
  234. if (this.sandboxData && this.sandboxData.members) {
  235. for (var i = 0; i < this.sandboxData.members.length; i++) {
  236. var m = this.sandboxData.members[i]
  237. map[m.memberId || m.id] = {
  238. bodyScore: m.bodyScore || 0,
  239. mindScore: m.mindScore || 0,
  240. actionScore: m.actionScore || 0,
  241. wisdomScore: m.wisdomScore || 0
  242. }
  243. }
  244. }
  245. return map
  246. },
  247. intimacyMapForGraph: function() {
  248. return {}
  249. },
  250. wisdomArticles: function() {
  251. if (!this.articles || this.articles.length === 0) return []
  252. var result = []
  253. for (var i = 0; i < this.articles.length; i++) {
  254. var a = this.articles[i]
  255. if (a.relatedDimensions && a.relatedDimensions.indexOf('wisdom') !== -1) {
  256. result.push(a)
  257. }
  258. }
  259. if (result.length === 0) return this.articles.slice(0, 5)
  260. return result.slice(0, 5)
  261. }
  262. },
  263. onShow() {
  264. // Tabbar 切换过渡动画(最少停留 1 秒)
  265. this.showTabTransition = true
  266. var self = this
  267. setTimeout(function() {
  268. self.showTabTransition = false
  269. }, 1100)
  270. var token = uni.getStorageSync('token')
  271. this.isLoggedIn = !!token
  272. if (this.isLoggedIn) {
  273. this.role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || null
  274. this.userName = uni.getStorageSync('nickname') || uni.getStorageSync('userName') || '家长'
  275. }
  276. this.loadSectionConfig()
  277. if (this.isLoggedIn) {
  278. this.loadChildren()
  279. this.loadFamilyMembersVisible()
  280. this.loadCognitiveReport()
  281. }
  282. this.loadDimensionActivities()
  283. this.loadDimensionProducts()
  284. // 游客也能浏览文章
  285. this.loadFeaturedArticles()
  286. },
  287. methods: {
  288. loadSectionConfig: function() {
  289. var baseSections = ['func_entries', 'wisdom_tips']
  290. if (!uni.getStorageSync('token')) {
  291. this.visibleSections = baseSections
  292. return
  293. }
  294. var role = uni.getStorageSync('currentRole') || uni.getStorageSync('role') || null
  295. var self = this
  296. getVisibleSections({ pageKey: 'wisdom', role: role }).then(function(res) {
  297. if (res.code === 200 && res.data) {
  298. var keys = res.data.map(function(s) { return s.sectionKey })
  299. var merged = baseSections.slice()
  300. keys.forEach(function(k) { if (merged.indexOf(k) === -1) merged.push(k) })
  301. self.visibleSections = merged
  302. }
  303. }).catch(function(e) {
  304. self.visibleSections = ['func_entries', 'wisdom_tips']
  305. })
  306. },
  307. loadChildren: function() {
  308. var self = this
  309. getChildren().then(function(res) {
  310. if (res.code === 200 && res.data) {
  311. self.children = res.data
  312. if (self.children.length > 0) {
  313. var activeId = uni.getStorageSync('currentChildId')
  314. if (activeId) {
  315. for (var i = 0; i < self.children.length; i++) {
  316. if (self.children[i].id == activeId) {
  317. self.activeChildId = activeId
  318. self.activeChildName = self.children[i].nickname || self.children[i].name || ''
  319. break
  320. }
  321. }
  322. }
  323. if (!self.activeChildId) {
  324. self.activeChildId = self.children[0].id
  325. self.activeChildName = self.children[0].nickname || self.children[0].name || ''
  326. uni.setStorageSync('currentChildId', self.activeChildId)
  327. }
  328. }
  329. }
  330. }).catch(function(e) {})
  331. },
  332. loadFamilyMembersVisible: function() {
  333. var self = this
  334. getFamilyEnergySandbox().then(function(res) {
  335. if (res && res.data) {
  336. self.sandboxData = res.data.sandboxData || null
  337. self.dualDimension = res.data.dualDimension || null
  338. if (res.data.members) {
  339. self.familyMembersVisible = res.data.members
  340. }
  341. }
  342. }).catch(function(e) {})
  343. },
  344. loadCognitiveReport: function() {
  345. var self = this
  346. var childId = this.activeChildId
  347. if (!childId) return
  348. getAssessmentLatestResult(childId).then(function(res) {
  349. if (res.code === 200 && res.data) {
  350. self.cognitiveReport = res.data
  351. self.findLowestDimension(res.data)
  352. }
  353. }).catch(function(e) {})
  354. },
  355. findLowestDimension: function(report) {
  356. var dims = [
  357. { key: 'perceptionScore', label: '感知能力' },
  358. { key: 'focusScore', label: '专注力' },
  359. { key: 'memoryScore', label: '记忆力' },
  360. { key: 'logicScore', label: '逻辑思维' },
  361. { key: 'spatialScore', label: '空间思维' },
  362. { key: 'processingSpeedScore', label: '加工速度' }
  363. ]
  364. var lowest = null
  365. var minVal = Infinity
  366. for (var i = 0; i < dims.length; i++) {
  367. var val = report[dims[i].key]
  368. if (val !== null && val !== undefined && val < minVal) {
  369. minVal = val
  370. lowest = { label: dims[i].label, score: val }
  371. }
  372. }
  373. this.lowestDimension = lowest
  374. },
  375. onChildChanged: function(childId) {
  376. this.activeChildId = childId
  377. uni.setStorageSync('currentChildId', childId)
  378. for (var i = 0; i < this.children.length; i++) {
  379. if (this.children[i].id == childId) {
  380. this.activeChildName = this.children[i].nickname || this.children[i].name || ''
  381. break
  382. }
  383. }
  384. this.loadFamilyMembersVisible()
  385. this.loadCognitiveReport()
  386. },
  387. loadDimensionTasks: function() {
  388. var self = this
  389. var childId = this.activeChildId
  390. if (!childId) return
  391. getTodayTasksByCategory(childId, 'wisdom').then(function(res) {
  392. if (res && res.data) {
  393. self.dimensionTasks = res.data.slice(0, 5)
  394. }
  395. }).catch(function(e) {})
  396. },
  397. loadDimensionActivities: function() {
  398. var self = this
  399. getActivityList({ dimensionCode: 'wisdom', page: 1, size: 5 }).then(function(res) {
  400. if (res && res.data) {
  401. self.dimensionActivities = res.data.records || res.data
  402. }
  403. }).catch(function(e) {})
  404. },
  405. loadDimensionProducts: function() {
  406. var self = this
  407. getProductsByDomain('wisdom', 1, 4).then(function(res) {
  408. if (res && res.data) {
  409. self.dimensionProducts = res.data.records || res.data
  410. }
  411. }).catch(function(e) {})
  412. },
  413. sectionVisible: function(key) {
  414. return this.visibleSections.length === 0 || this.visibleSections.indexOf(key) !== -1
  415. },
  416. onFuncClick: function(item) {
  417. if (item.needLogin && !this.isLoggedIn) {
  418. uni.showModal({
  419. title: '提示',
  420. content: '请先登录后使用此功能',
  421. success: function(res) { if (res.confirm) uni.navigateTo({ url: '/pages/login/login' }) }
  422. })
  423. return
  424. }
  425. if (item.page) {
  426. var nativeTabs = ['/pages/tasks/tasks', '/pages/index/index', '/pages/body/index', '/pages/mind/index', '/pages/action/index', '/pages/wisdom/index', '/pages/profile/profile']
  427. if (nativeTabs.indexOf(item.page) !== -1) {
  428. uni.switchTab({ url: item.page })
  429. } else {
  430. uni.navigateTo({ url: item.page })
  431. }
  432. }
  433. },
  434. scrollToSection: function(section) {},
  435. goMemberDetail: function(memberId) {
  436. uni.navigateTo({ url: '/pages/wisdom/member-wisdom-detail?memberId=' + memberId })
  437. },
  438. goCognitiveReport: function() {
  439. uni.navigateTo({ url: '/pages/wisdom/cognitive-report' })
  440. },
  441. goSelfQuiz: function() {
  442. uni.navigateTo({ url: '/pages/wisdom/self-quiz' })
  443. },
  444. goTrainingHub: function() {
  445. uni.navigateTo({ url: '/pages/wisdom/training-hub' })
  446. },
  447. goAssessment: function() {
  448. uni.navigateTo({ url: '/pages/assessment/apply' })
  449. },
  450. goHome: function() {
  451. uni.switchTab({ url: '/pages/index/index' })
  452. },
  453. onTaskClick: function(task) {},
  454. goTasks: function() { uni.switchTab({ url: '/pages/tasks/tasks' }) },
  455. goActivityDetail: function(id) {},
  456. goMoreActivities: function() {},
  457. goProductDetail: function(id) {
  458. var token = uni.getStorageSync('token')
  459. if (token) {
  460. uni.navigateTo({ url: '/pages/discover/product-detail/product-detail?id=' + id })
  461. } else {
  462. uni.navigateTo({ url: '/pages/login/login?redirect=' + encodeURIComponent('/pages/wisdom/index') })
  463. }
  464. },
  465. goMoreProducts: function() {},
  466. loadFeaturedArticles: function() {
  467. var self = this
  468. getFeaturedArticles({ size: 5 }).then(function(res) {
  469. if (res.code === 200 && res.data) {
  470. var gradientColors = [
  471. 'linear-gradient(135deg, #6366F1, #818CF8)',
  472. 'linear-gradient(135deg, #8B5CF6, #A78BFA)',
  473. 'linear-gradient(135deg, #5B9BD5, #8FC5E8)',
  474. 'linear-gradient(135deg, #10B981, #34D399)',
  475. 'linear-gradient(135deg, #F97316, #FB923C)'
  476. ]
  477. var list = Array.isArray(res.data) ? res.data : (res.data.records || [])
  478. self.articles = list.map(function(item, index) {
  479. return {
  480. id: item.id,
  481. category: item.categoryName || '智慧文章',
  482. categoryColor: gradientColors[index % gradientColors.length],
  483. title: item.title || '',
  484. summary: item.summary || '',
  485. views: item.viewCount ? String(item.viewCount) : '0',
  486. likes: '0',
  487. date: item.publishedAt ? item.publishedAt.slice(0, 10) : '',
  488. relatedDimensions: item.relatedDimensions || []
  489. }
  490. })
  491. }
  492. }).catch(function() {})
  493. },
  494. goArticleDetail: function(id) {
  495. uni.navigateTo({ url: '/pages/wisdom/article-detail?id=' + id })
  496. }
  497. }
  498. }
  499. </script>
  500. <style scoped>
  501. .wisdom-container {
  502. min-height: 100vh;
  503. background: #f5f7fa;
  504. padding-bottom: 120rpx;
  505. }
  506. .func-section {
  507. margin: -40rpx 20rpx 0;
  508. position: relative;
  509. z-index: 2;
  510. }
  511. .func-grid {
  512. background: #fff;
  513. border-radius: 24rpx;
  514. padding: 30rpx 16rpx;
  515. display: flex;
  516. box-shadow: 0 4rpx 20rpx rgba(0,0,0,0.06);
  517. }
  518. .func-item {
  519. flex: 1;
  520. display: flex;
  521. flex-direction: column;
  522. align-items: center;
  523. }
  524. .func-item:active {
  525. opacity: 0.7;
  526. }
  527. .func-icon-wrap {
  528. width: 88rpx;
  529. height: 88rpx;
  530. border-radius: 50%;
  531. background: #FFF8E1;
  532. display: flex;
  533. align-items: center;
  534. justify-content: center;
  535. margin-bottom: 10rpx;
  536. }
  537. .func-icon {
  538. font-size: 40rpx;
  539. }
  540. .func-label {
  541. font-size: 24rpx;
  542. color: #333;
  543. font-weight: 500;
  544. }
  545. /* ===== Section ===== */
  546. .section {
  547. margin: 20rpx 20rpx;
  548. }
  549. .section-header {
  550. display: flex;
  551. justify-content: space-between;
  552. align-items: center;
  553. margin-bottom: 20rpx;
  554. }
  555. .section-title {
  556. font-size: 30rpx;
  557. font-weight: bold;
  558. color: #333;
  559. }
  560. .section-more {
  561. font-size: 24rpx;
  562. color: #999;
  563. }
  564. /* ===== 认知概览 ===== */
  565. .cognition-summary {
  566. background: linear-gradient(135deg, #FFD700, #FFA500);
  567. border-radius: 20rpx;
  568. padding: 30rpx;
  569. display: flex;
  570. flex-direction: row;
  571. align-items: center;
  572. }
  573. .summary-main {
  574. text-align: center;
  575. margin-right: 30rpx;
  576. padding-right: 30rpx;
  577. border-right: 2rpx solid rgba(255,255,255,0.3);
  578. }
  579. .summary-score {
  580. font-size: 60rpx;
  581. font-weight: bold;
  582. color: #fff;
  583. display: block;
  584. }
  585. .summary-label {
  586. font-size: 22rpx;
  587. color: rgba(255,255,255,0.85);
  588. display: block;
  589. margin-top: 4rpx;
  590. }
  591. .summary-detail {
  592. flex: 1;
  593. }
  594. .summary-dan {
  595. font-size: 28rpx;
  596. color: #fff;
  597. font-weight: bold;
  598. display: block;
  599. margin-bottom: 8rpx;
  600. }
  601. .summary-min {
  602. font-size: 24rpx;
  603. color: rgba(255,255,255,0.85);
  604. display: block;
  605. }
  606. .cognition-empty {
  607. background: #fff;
  608. border-radius: 16rpx;
  609. padding: 40rpx;
  610. text-align: center;
  611. box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
  612. }
  613. .empty-tip {
  614. font-size: 26rpx;
  615. color: #999;
  616. display: block;
  617. }
  618. .empty-sub {
  619. font-size: 22rpx;
  620. color: #ccc;
  621. margin-top: 6rpx;
  622. display: block;
  623. }
  624. /* ===== 高亮卡片 ===== */
  625. .highlight-card {
  626. margin: 20rpx;
  627. }
  628. .highlight-card-inner {
  629. display: flex;
  630. flex-direction: row;
  631. align-items: center;
  632. background: linear-gradient(135deg, #FFF8E1, #fff);
  633. border: 2rpx solid #FFD700;
  634. border-radius: 20rpx;
  635. padding: 24rpx;
  636. }
  637. .highlight-card:active {
  638. opacity: 0.8;
  639. }
  640. .highlight-card-left {
  641. width: 72rpx;
  642. height: 72rpx;
  643. border-radius: 18rpx;
  644. background: #FFD700;
  645. display: flex;
  646. align-items: center;
  647. justify-content: center;
  648. margin-right: 20rpx;
  649. }
  650. .highlight-icon {
  651. font-size: 36rpx;
  652. }
  653. .highlight-card-right {
  654. flex: 1;
  655. }
  656. .highlight-title {
  657. font-size: 28rpx;
  658. font-weight: bold;
  659. color: #B8860B;
  660. display: block;
  661. margin-bottom: 4rpx;
  662. }
  663. .highlight-desc {
  664. font-size: 22rpx;
  665. color: #999;
  666. display: block;
  667. }
  668. .highlight-arrow {
  669. font-size: 36rpx;
  670. color: #ccc;
  671. margin-left: 10rpx;
  672. }
  673. /* ===== 小贴士 ===== */
  674. .tips-list {
  675. display: flex;
  676. flex-direction: column;
  677. }
  678. .tip-card {
  679. background: #fff;
  680. border-radius: 16rpx;
  681. padding: 24rpx;
  682. margin-bottom: 16rpx;
  683. box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
  684. border-left: 6rpx solid #FFD700;
  685. }
  686. .tip-title {
  687. font-size: 26rpx;
  688. font-weight: bold;
  689. color: #333;
  690. display: block;
  691. margin-bottom: 8rpx;
  692. }
  693. .tip-summary {
  694. font-size: 24rpx;
  695. color: #999;
  696. line-height: 1.5;
  697. display: block;
  698. }
  699. /* ===== 快捷操作 ===== */
  700. .quick-actions {
  701. display: flex;
  702. flex-direction: row;
  703. justify-content: space-around;
  704. margin: 20rpx;
  705. }
  706. .action-btn {
  707. display: flex;
  708. flex-direction: column;
  709. align-items: center;
  710. background: #fff;
  711. border-radius: 16rpx;
  712. padding: 20rpx 30rpx;
  713. box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.06);
  714. flex: 1;
  715. margin: 0 8rpx;
  716. }
  717. .action-btn:active {
  718. opacity: 0.7;
  719. }
  720. .action-icon {
  721. font-size: 36rpx;
  722. margin-bottom: 8rpx;
  723. }
  724. .action-text {
  725. font-size: 22rpx;
  726. color: #333;
  727. }
  728. .bottom-spacer {
  729. height: 20rpx;
  730. }
  731. </style>