FamilyTianpanCard.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710
  1. <template>
  2. <!-- 家庭天盘卡片 — 心维度专属 (#FF6B9D 火) -->
  3. <view class="tianpan-card" v-if="visible">
  4. <!-- 卡片头部 -->
  5. <view class="tp-header">
  6. <view class="tp-header-left">
  7. <view class="tp-icon-badge">
  8. <text class="tp-icon-text">&#x2637;</text>
  9. </view>
  10. <view class="tp-header-info">
  11. <text class="tp-title">家庭天盘</text>
  12. <text class="tp-subtitle">五行能量 · 每日更新</text>
  13. </view>
  14. </view>
  15. <view class="tp-header-action" @click="goDetail">
  16. <text class="tp-action-text">&#x2192;</text>
  17. </view>
  18. </view>
  19. <!-- 三栏展示 -->
  20. <view class="tp-body">
  21. <!-- 今日运势 -->
  22. <view class="tp-col tp-col-fortune">
  23. <text class="tp-col-icon">&#x2B50;</text>
  24. <text class="tp-col-label">今日运势</text>
  25. <view class="tp-fortune-badge" :class="'fortune-level-' + fortuneLevel">
  26. <text class="tp-fortune-text">{{ fortuneText }}</text>
  27. </view>
  28. <text class="tp-fortune-desc">{{ fortuneDesc }}</text>
  29. </view>
  30. <!-- 今日心情 -->
  31. <view class="tp-col tp-col-mood">
  32. <text class="tp-col-icon">{{ moodEmoji }}</text>
  33. <text class="tp-col-label">今日心情</text>
  34. <text class="tp-mood-value">{{ moodText }}</text>
  35. <view class="tp-mood-bar-track">
  36. <view class="tp-mood-bar-fill" :style="{ width: moodPercent + '%' }"></view>
  37. </view>
  38. </view>
  39. <!-- 吉位 -->
  40. <view class="tp-col tp-col-direction">
  41. <text class="tp-col-icon">&#x1F9ED;</text>
  42. <text class="tp-col-label">今日吉位</text>
  43. <view class="tp-compass-wrap">
  44. <canvas
  45. canvas-id="tianpanCompass"
  46. id="tianpanCompass"
  47. type="2d"
  48. class="tp-compass-canvas"
  49. @touchstart="handleTouchStart"
  50. ></canvas>
  51. </view>
  52. <text class="tp-direction-value">{{ luckyDirection }}</text>
  53. </view>
  54. </view>
  55. <!-- 底部周报提示 -->
  56. <view class="tp-footer" v-if="weeklyTip">
  57. <text class="tp-footer-icon">&#x1F4A1;</text>
  58. <text class="tp-footer-text">{{ weeklyTip }}</text>
  59. </view>
  60. <!-- 今日宜忌提示 -->
  61. <view class="tp-advice-section">
  62. <view class="tp-advice-item">
  63. <text class="tp-advice-icon">♦</text>
  64. <text class="tp-advice-label">宜:</text>
  65. <text class="tp-advice-text">{{ getAdvice(true) }}</text>
  66. </view>
  67. <view class="tp-advice-item">
  68. <text class="tp-advice-icon">✖</text>
  69. <text class="tp-advice-label">忌:</text>
  70. <text class="tp-advice-text">{{ getAdvice(false) }}</text>
  71. </view>
  72. </view>
  73. <!-- 查看详情入口 -->
  74. <view class="tp-detail-btn" @click="goDetail">
  75. <text class="tp-detail-text">查看家庭天盘详情 &#x2192;</text>
  76. </view>
  77. </view>
  78. </template>
  79. <script>
  80. /**
  81. * FamilyTianpanCard — 家庭天盘概览卡片(嵌入心维度页面)
  82. *
  83. * Props:
  84. * fortune — { level: 0-4, text, description }
  85. * mood — { emoji, text, score: 0-100 }
  86. * dominantElement — 'wood'|'fire'|'earth'|'metal'|'water'
  87. * weeklyTip — string 本周提示
  88. * visible — boolean 是否显示
  89. *
  90. * 吉位 Canvas 绘制五元素罗盘,高亮吉位方向。
  91. */
  92. export default {
  93. name: 'FamilyTianpanCard',
  94. props: {
  95. fortune: {
  96. type: Object,
  97. default: function() { return null }
  98. },
  99. mood: {
  100. type: Object,
  101. default: function() { return null }
  102. },
  103. dominantElement: {
  104. type: String,
  105. default: ''
  106. },
  107. weeklyTip: {
  108. type: String,
  109. default: ''
  110. },
  111. visible: {
  112. type: Boolean,
  113. default: true
  114. }
  115. },
  116. data: function() {
  117. return {
  118. canvasCtx: null,
  119. canvasReady: false,
  120. _compassW: 0,
  121. _compassH: 0,
  122. themeColor: '#FF6B9D', // 默认火维度颜色
  123. _animFrameId: null,
  124. _clickableAreas: [],
  125. // 五行 → 方位映射
  126. elementDirMap: {
  127. wood: '东',
  128. fire: '南',
  129. earth: '中',
  130. metal: '西',
  131. water: '北'
  132. },
  133. // 方位 → 颜色映射
  134. dirColorMap: {
  135. '东': '#10B981',
  136. '南': '#FF6B9D',
  137. '中': '#FF8C42',
  138. '西': '#6366F1',
  139. '北': '#3B82F6'
  140. },
  141. // 方位 → 角度(从北顺时针,Canvas 默认从右/东开始)
  142. dirAngleMap: {
  143. '东': Math.PI / 2,
  144. '南': Math.PI,
  145. '中': 0,
  146. '西': -Math.PI / 2,
  147. '北': 0
  148. }
  149. }
  150. },
  151. computed: {
  152. fortuneLevel: function() {
  153. if (!this.fortune) return 2
  154. return this.fortune.level !== undefined ? this.fortune.level : 2
  155. },
  156. fortuneText: function() {
  157. if (!this.fortune || !this.fortune.text) return '平'
  158. return this.fortune.text
  159. },
  160. fortuneDesc: function() {
  161. if (!this.fortune || !this.fortune.description) return '今日宜静心养性'
  162. return this.fortune.description
  163. },
  164. moodEmoji: function() {
  165. if (this.mood && this.mood.emoji) return this.mood.emoji
  166. return '\u{1F60A}' // 默认笑脸
  167. },
  168. moodText: function() {
  169. if (this.mood && this.mood.text) return this.mood.text
  170. return '平静'
  171. },
  172. moodPercent: function() {
  173. if (this.mood && this.mood.score !== undefined) return this.mood.score
  174. return 60
  175. },
  176. luckyDirection: function() {
  177. if (this.dominantElement && this.elementDirMap[this.dominantElement]) {
  178. return this.elementDirMap[this.dominantElement] + '方'
  179. }
  180. return '东方'
  181. },
  182. luckyElementColor: function() {
  183. var dir = this.luckyDirection
  184. return this.dirColorMap[dir] || '#FF6B9D'
  185. }
  186. },
  187. watch: {
  188. visible: function(val) {
  189. if (val) {
  190. var self = this
  191. setTimeout(function() {
  192. self.initCanvas()
  193. }, 300)
  194. }
  195. },
  196. dominantElement: function() {
  197. if (this.canvasReady) {
  198. this.drawCompass()
  199. }
  200. }
  201. },
  202. mounted: function() {
  203. if (this.visible) {
  204. var self = this
  205. setTimeout(function() {
  206. self.initCanvas()
  207. }, 500)
  208. }
  209. },
  210. methods: {
  211. goDetail: function() {
  212. uni.navigateTo({
  213. url: '/pages/mind-detail/family-dashboard'
  214. })
  215. },
  216. /**
  217. * 获取当日宜忌建议
  218. * @param {boolean} isGood - 是否获取宜(true)或忌(false)
  219. */
  220. getAdvice: function(isGood) {
  221. const advice = {
  222. 木: {
  223. good: '植树种花、亲近自然,交友聚会增进感情,制定计划规划未来',
  224. bad: '冲动消费、盲目扩张,长期熬夜、透支健康,与人争执失和气'
  225. },
  226. 火: {
  227. good: '社交活动、表达感想,旅行出游、放松心情,运动健身、增强活力',
  228. bad: '过度劳累、身体透支,情绪激动、失去理智,暴饮暴食、饮酒无度'
  229. },
  230. 土: {
  231. good: '规律作息、健康管理,家务整理、创造舒适,学习充电、稳固提升',
  232. bad: '情绪压抑、独自忍耐,忽视身体、健康警讯,盲目保守、错失机会'
  233. },
  234. 金: {
  235. good: '整理环境、创造秩序,专注工作、提升效率,投资理财、稳健收益',
  236. bad: '过度拘谨、缺乏变通,忽略情感、人情冷漠,欲望过多、贪求不满'
  237. },
  238. 水: {
  239. good: '阅读思考、拓展思维,社交活动、增进人脉,创意思考、寻找机遇',
  240. bad: '犹豫不决、错过良机,过度幻想、缺乏行动,沉迷游戏、浪费时光'
  241. }
  242. }
  243. // 默认值(如果五行未知或未提供)
  244. if (!this.fortune || !this.fortune.dominantElement) {
  245. return isGood ? '保持心情愉悦,积极面对每一天' : '避免负面情绪,不过度劳累'
  246. }
  247. const element = this.fortune.dominantElement
  248. return advice[element][isGood ? 'good' : 'bad']
  249. },
  250. initCanvas: function() {
  251. var self = this
  252. var query = uni.createSelectorQuery().in(self)
  253. query.select('#tianpanCompass')
  254. .fields({ node: true, size: true })
  255. .exec(function(res) {
  256. if (!res || !res[0] || !res[0].node) return
  257. var ctx = res[0].node.getContext('2d')
  258. var dpr = uni.getSystemInfoSync().pixelRatio || 2
  259. var w = res[0].width
  260. var h = res[0].height
  261. // 高分辨率适配
  262. res[0].node.width = w * dpr
  263. res[0].node.height = h * dpr
  264. ctx.scale(dpr, dpr)
  265. self.canvasCtx = ctx
  266. self.canvasReady = true
  267. self._compassW = w
  268. self._compassH = h
  269. // 设置初始主题色(火维度)
  270. self.themeColor = '#FF6B9D'
  271. if (self.fortune && self.fortune.dominantElement) {
  272. var elementColors = {
  273. 木: '#10B981', 火: '#FF6B9D', 土: '#FF8C42', 金: '#6366F1', 水: '#3B82F6'
  274. }
  275. self.themeColor = elementColors[self.fortune.dominantElement]
  276. }
  277. // 启动动画
  278. self.startAnimation()
  279. })
  280. },
  281. handleTouchStart: function(e) {
  282. // 儿童模式交互
  283. if (this.$store.state.role === 'child') {
  284. this.handleCompassClick(e)
  285. }
  286. },
  287. clearCanvas: function() {
  288. if (!this.canvasReady || !this.canvasCtx) return
  289. var ctx = this.canvasCtx
  290. var width = this._compassW
  291. var height = this._compassH
  292. ctx.clearRect(0, 0, width, height)
  293. },
  294. startAnimation: function() {
  295. var self = this
  296. if (this._animFrameId) {
  297. cancelAnimationFrame(this._animFrameId)
  298. }
  299. var animFrameId = null
  300. var lastTime = 0
  301. function animationLoop(timestamp) {
  302. if (!self.canvasCtx || !self.canvasReady) {
  303. cancelAnimationFrame(animFrameId)
  304. return
  305. }
  306. // 控制帧率
  307. if (timestamp - lastTime < 16) {
  308. animFrameId = requestAnimationFrame(animationLoop)
  309. return
  310. }
  311. lastTime = timestamp
  312. self.clearCanvas()
  313. self.drawCompassWithAnimation(timestamp)
  314. animFrameId = requestAnimationFrame(animationLoop)
  315. }
  316. this._animFrameId = requestAnimationFrame(animationLoop)
  317. },
  318. drawCompass: function() {
  319. // 兼容旧调用
  320. this.drawCompassWithAnimation(0)
  321. },
  322. drawCompassWithAnimation: function(timestamp) {
  323. var ctx = this.canvasCtx
  324. if (!ctx) return
  325. var w = this._compassW || 100
  326. var h = this._compassH || 100
  327. var cx = w / 2
  328. var cy = h / 2
  329. var outerR = Math.min(cx, cy) - 4
  330. // 清空
  331. ctx.clearRect(0, 0, w, h)
  332. // 五个方位: 北(上), 东(右), 南(下), 西(左), 中(中心)
  333. var directions = [
  334. { label: '北', element: 'water', angle: -Math.PI / 2 },
  335. { label: '东', element: 'wood', angle: 0 },
  336. { label: '南', element: 'fire', angle: Math.PI / 2 },
  337. { label: '西', element: 'metal', angle: Math.PI },
  338. { label: '中', element: 'earth', angle: null }
  339. ]
  340. var elementColors = {
  341. wood: '#10B981',
  342. fire: '#FF6B9D',
  343. earth: '#FF8C42',
  344. metal: '#6366F1',
  345. water: '#3B82F6'
  346. }
  347. var luckyDir = this.luckyDirection.replace('方', '')
  348. var luckyColor = this.luckyElementColor
  349. // 外圈背景
  350. ctx.beginPath()
  351. ctx.arc(cx, cy, outerR, 0, Math.PI * 2)
  352. ctx.fillStyle = '#FFF5F7'
  353. ctx.fill()
  354. ctx.strokeStyle = luckyColor + '40'
  355. ctx.lineWidth = 1.5
  356. ctx.stroke()
  357. // 绘制四个方位的扇区
  358. for (var i = 0; i < 4; i++) {
  359. var d = directions[i]
  360. var color = elementColors[d.element]
  361. // 扇区线
  362. ctx.beginPath()
  363. ctx.moveTo(cx, cy)
  364. var ex = cx + outerR * Math.cos(d.angle)
  365. var ey = cy + outerR * Math.sin(d.angle)
  366. ctx.lineTo(ex, ey)
  367. ctx.strokeStyle = color + '30'
  368. ctx.lineWidth = 1
  369. ctx.stroke()
  370. // 方位标签
  371. var labelR = outerR * 0.7
  372. var lx = cx + labelR * Math.cos(d.angle)
  373. var ly = cy + labelR * Math.sin(d.angle)
  374. var isLucky = d.label === luckyDir
  375. if (isLucky) {
  376. // 吉位高亮圆
  377. ctx.beginPath()
  378. ctx.arc(lx, ly, 12, 0, Math.PI * 2)
  379. ctx.fillStyle = luckyColor + '20'
  380. ctx.fill()
  381. ctx.strokeStyle = luckyColor
  382. ctx.lineWidth = 1.5
  383. ctx.stroke()
  384. }
  385. ctx.fillStyle = isLucky ? luckyColor : '#9CA3AF'
  386. ctx.font = (isLucky ? 'bold ' : '') + '10px sans-serif'
  387. ctx.textAlign = 'center'
  388. ctx.textBaseline = 'middle'
  389. ctx.fillText(d.label, lx, ly)
  390. }
  391. // 中心点
  392. ctx.beginPath()
  393. ctx.arc(cx, cy, 5, 0, Math.PI * 2)
  394. ctx.fillStyle = luckyColor
  395. ctx.fill()
  396. ctx.strokeStyle = '#FFFFFF'
  397. ctx.lineWidth = 1.5
  398. ctx.stroke()
  399. }
  400. },
  401. }
  402. </script>
  403. <style scoped>
  404. .tianpan-card {
  405. margin: 20rpx 30rpx;
  406. background: #FFFFFF;
  407. border-radius: 24rpx;
  408. padding: 28rpx 24rpx;
  409. /* Claymorphism 双阴影 */
  410. box-shadow: 0 4rpx 16rpx rgba(255, 107, 157, 0.12),
  411. 0 2rpx 4rpx rgba(0, 0, 0, 0.04);
  412. border: 1rpx solid rgba(255, 107, 157, 0.08);
  413. overflow: hidden;
  414. }
  415. /* ===== 头部 ===== */
  416. .tp-header {
  417. display: flex;
  418. flex-direction: row;
  419. align-items: center;
  420. justify-content: space-between;
  421. margin-bottom: 24rpx;
  422. padding-bottom: 20rpx;
  423. border-bottom: 1rpx solid rgba(255, 107, 157, 0.10);
  424. }
  425. .tp-header-left {
  426. display: flex;
  427. flex-direction: row;
  428. align-items: center;
  429. }
  430. .tp-icon-badge {
  431. width: 64rpx;
  432. height: 64rpx;
  433. border-radius: 20rpx;
  434. background: linear-gradient(135deg, #FF6B9D, #FF8FB1);
  435. display: flex;
  436. align-items: center;
  437. justify-content: center;
  438. margin-right: 16rpx;
  439. box-shadow: 0 4rpx 12rpx rgba(255, 107, 157, 0.30);
  440. }
  441. .tp-icon-text {
  442. font-size: 32rpx;
  443. color: #FFFFFF;
  444. }
  445. .tp-header-info {
  446. display: flex;
  447. flex-direction: column;
  448. }
  449. .tp-title {
  450. font-size: 30rpx;
  451. font-weight: 700;
  452. color: #1E293B;
  453. }
  454. .tp-subtitle {
  455. font-size: 22rpx;
  456. color: #94A3B8;
  457. margin-top: 2rpx;
  458. }
  459. .tp-header-action {
  460. width: 56rpx;
  461. height: 56rpx;
  462. border-radius: 28rpx;
  463. background: #FFF0F3;
  464. display: flex;
  465. align-items: center;
  466. justify-content: center;
  467. }
  468. .tp-action-text {
  469. font-size: 28rpx;
  470. color: #FF6B9D;
  471. font-weight: 600;
  472. }
  473. .tp-header-action:active {
  474. opacity: 0.7;
  475. }
  476. /* ===== 三栏 body ===== */
  477. .tp-body {
  478. display: flex;
  479. flex-direction: row;
  480. justify-content: space-between;
  481. }
  482. .tp-col {
  483. flex: 1;
  484. display: flex;
  485. flex-direction: column;
  486. align-items: center;
  487. padding: 16rpx 8rpx;
  488. border-radius: 20rpx;
  489. background: #FAFBFC;
  490. }
  491. .tp-col-fortune {
  492. margin-right: 12rpx;
  493. }
  494. .tp-col-mood {
  495. margin-left: 6rpx;
  496. margin-right: 6rpx;
  497. }
  498. .tp-col-direction {
  499. margin-left: 12rpx;
  500. }
  501. /* 列通用 */
  502. .tp-col-icon {
  503. font-size: 36rpx;
  504. margin-bottom: 8rpx;
  505. }
  506. .tp-col-label {
  507. font-size: 22rpx;
  508. color: #94A3B8;
  509. margin-bottom: 12rpx;
  510. font-weight: 500;
  511. }
  512. /* 运势 */
  513. .tp-fortune-badge {
  514. padding: 6rpx 20rpx;
  515. border-radius: 20rpx;
  516. margin-bottom: 8rpx;
  517. }
  518. .fortune-level-0 {
  519. background: #FFEBEE;
  520. }
  521. .fortune-level-0 .tp-fortune-text {
  522. color: #D32F2F;
  523. }
  524. .fortune-level-1 {
  525. background: #FFF3E0;
  526. }
  527. .fortune-level-1 .tp-fortune-text {
  528. color: #E65100;
  529. }
  530. .fortune-level-2 {
  531. background: #FFFDE7;
  532. }
  533. .fortune-level-2 .tp-fortune-text {
  534. color: #F9A825;
  535. }
  536. .fortune-level-3 {
  537. background: #F3E5F5;
  538. }
  539. .fortune-level-3 .tp-fortune-text {
  540. color: #7B1FA2;
  541. }
  542. .fortune-level-4 {
  543. background: #FFCDD2;
  544. }
  545. .fortune-level-4 .tp-fortune-text {
  546. color: #B71C1C;
  547. }
  548. .tp-fortune-text {
  549. font-size: 26rpx;
  550. font-weight: 700;
  551. }
  552. .tp-fortune-desc {
  553. font-size: 20rpx;
  554. color: #94A3B8;
  555. text-align: center;
  556. line-height: 1.4;
  557. }
  558. /* 心情 */
  559. .tp-mood-value {
  560. font-size: 26rpx;
  561. font-weight: 600;
  562. color: #1E293B;
  563. margin-bottom: 10rpx;
  564. }
  565. .tp-mood-bar-track {
  566. width: 100%;
  567. height: 10rpx;
  568. background: #E2E8F0;
  569. border-radius: 5rpx;
  570. overflow: hidden;
  571. }
  572. .tp-mood-bar-fill {
  573. height: 100%;
  574. background: linear-gradient(90deg, #FF6B9D, #FF8FB1);
  575. border-radius: 5rpx;
  576. transition: width 0.5s;
  577. }
  578. /* 吉位罗盘 */
  579. .tp-compass-wrap {
  580. width: 120rpx;
  581. height: 120rpx;
  582. margin-bottom: 8rpx;
  583. }
  584. .tp-compass-canvas {
  585. width: 120rpx;
  586. height: 120rpx;
  587. }
  588. .tp-direction-value {
  589. font-size: 24rpx;
  590. font-weight: 700;
  591. color: #FF6B9D;
  592. }
  593. /* ===== 底部提示 ===== */
  594. .tp-footer {
  595. display: flex;
  596. flex-direction: row;
  597. align-items: flex-start;
  598. margin-top: 20rpx;
  599. padding: 16rpx;
  600. background: #FFF5F0;
  601. border-radius: 14rpx;
  602. }
  603. .tp-footer-icon {
  604. font-size: 24rpx;
  605. margin-right: 8rpx;
  606. flex-shrink: 0;
  607. }
  608. .tp-footer-text {
  609. font-size: 22rpx;
  610. color: #8B6914;
  611. line-height: 1.5;
  612. flex: 1;
  613. }
  614. /* ===== 今日宜忌 ===== */
  615. .tp-advice-section {
  616. margin: 20rpx 0;
  617. padding: 16rpx;
  618. background-color: rgba(255, 255, 255, 0.7);
  619. border-radius: 16rpx;
  620. }
  621. .tp-advice-item {
  622. display: flex;
  623. flex-direction: row;
  624. align-items: center;
  625. margin-bottom: 10rpx;
  626. }
  627. .tp-advice-item:last-child {
  628. margin-bottom: 0;
  629. }
  630. .tp-advice-icon {
  631. font-size: 24rpx;
  632. color: #FF6B9D;
  633. margin-right: 12rpx;
  634. }
  635. .tp-advice-label {
  636. font-size: 22rpx;
  637. font-weight: 600;
  638. color: #FF6B9D;
  639. margin-right: 12rpx;
  640. min-width: 60rpx;
  641. }
  642. .tp-advice-text {
  643. font-size: 22rpx;
  644. color: #374151;
  645. flex: 1;
  646. line-height: 1.4;
  647. }
  648. /* ===== 查看详情按钮 ===== */
  649. .tp-detail-btn {
  650. margin-top: 16rpx;
  651. text-align: center;
  652. padding: 14rpx;
  653. background: linear-gradient(135deg, #FFF0F3, #FFE0E8);
  654. border-radius: 14rpx;
  655. }
  656. .tp-detail-btn:active {
  657. opacity: 0.7;
  658. }
  659. .tp-detail-text {
  660. font-size: 24rpx;
  661. color: #FF6B9D;
  662. font-weight: 600;
  663. }
  664. </style>