self-check-result.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. <template>
  2. <view class="scr-page">
  3. <!-- Loading -->
  4. <view class="scr-loading" v-if="loading">
  5. <text class="scr-loading-text">加载中...</text>
  6. </view>
  7. <template v-else>
  8. <!-- 总分横幅 -->
  9. <view class="scr-hero">
  10. <view class="scr-hero-badge">
  11. <text class="scr-hero-title">五维幸福总分</text>
  12. <view class="scr-hero-score-row">
  13. <text class="scr-hero-score">{{ result.totalScore }}</text>
  14. <text class="scr-hero-total">/45</text>
  15. </view>
  16. <view class="scr-hero-level" :class="'level-' + overallLevel">
  17. <text>{{ overallLevelName }}</text>
  18. </view>
  19. </view>
  20. <text class="scr-hero-date" v-if="result.createdAt">自检时间:{{ formatDate(result.createdAt) }}</text>
  21. </view>
  22. <!-- 雷达图 -->
  23. <view class="scr-card">
  24. <view class="scr-card-title">
  25. <text class="scr-card-title-text">五维能量雷达</text>
  26. <text class="scr-card-sub">身·智·富·行·心</text>
  27. </view>
  28. <view class="scr-canvas-wrap">
  29. <canvas
  30. type="2d"
  31. id="selfCheckRadar"
  32. class="scr-canvas"
  33. @ready="onCanvasReady"
  34. ></canvas>
  35. </view>
  36. </view>
  37. <!-- 维度得分 -->
  38. <view class="scr-card">
  39. <view class="scr-card-title">
  40. <text class="scr-card-title-text">维度得分</text>
  41. <text class="scr-card-sub">满分9分/维</text>
  42. </view>
  43. <view class="scr-dim-list">
  44. <view class="scr-dim-item" v-for="dim in result.dimensions" :key="dim.dimension">
  45. <view class="scr-dim-head">
  46. <view class="scr-dim-label">
  47. <view class="scr-dim-dot" :style="{ background: dim.color }"></view>
  48. <text class="scr-dim-name">{{ dim.name }}</text>
  49. <text class="scr-dim-element">{{ dim.element }}</text>
  50. </view>
  51. <view class="scr-dim-score-wrap">
  52. <text class="scr-dim-score" :style="{ color: dim.color }">{{ dim.score }}</text>
  53. <text class="scr-dim-score-max">/9</text>
  54. </view>
  55. </view>
  56. <view class="scr-dim-bar">
  57. <view class="scr-dim-bar-fill" :style="{ width: (dim.score / 9 * 100) + '%', background: dim.color }"></view>
  58. </view>
  59. <view class="scr-dim-foot">
  60. <text class="scr-dim-level" :class="'lvl-' + dim.level">{{ dim.levelName }}</text>
  61. <text class="scr-dim-summary">{{ dim.summary }}</text>
  62. </view>
  63. </view>
  64. </view>
  65. </view>
  66. <!-- 五行相生寻源建议(P0-2) -->
  67. <view class="scr-card" v-if="result.advices && result.advices.length > 0">
  68. <view class="scr-card-title">
  69. <text class="scr-card-title-text">五行相生 · 寻源建议</text>
  70. <text class="scr-card-sub">低分维度 {{ result.advices.length }} 项</text>
  71. </view>
  72. <view class="scr-advice-intro">低于6分的维度,先别硬补——从"生"它的上游借力,同时避开"克"它的压制源:</view>
  73. <view class="scr-advice-item" v-for="adv in result.advices" :key="adv.dimension">
  74. <!-- 低分维度 -->
  75. <view class="scr-advice-dim-row">
  76. <view class="scr-advice-dim-badge" :style="{ background: adv.color }">
  77. <text class="scr-advice-dim-name">{{ adv.dimensionName }}</text>
  78. <text class="scr-advice-dim-elem">{{ adv.element }}</text>
  79. </view>
  80. <text class="scr-advice-dim-score">{{ adv.score }}分</text>
  81. </view>
  82. <!-- 相生寻源 -->
  83. <view class="scr-advice-flow">
  84. <view class="scr-flow-node">
  85. <view class="scr-flow-dot" :style="{ background: adv.upstreamColor }"></view>
  86. <text class="scr-flow-label">上游 · {{ adv.upstreamName }}({{ adv.upstreamElement }})</text>
  87. </view>
  88. <text class="scr-flow-arrow">⟶</text>
  89. <text class="scr-flow-action">{{ adv.upstreamReason }}</text>
  90. </view>
  91. <!-- 相克寻源 -->
  92. <view class="scr-advice-flow">
  93. <view class="scr-flow-node">
  94. <view class="scr-flow-dot" :style="{ background: adv.restrainerColor }"></view>
  95. <text class="scr-flow-label">压制 · {{ adv.restrainerName }}({{ adv.restrainerElement }})</text>
  96. </view>
  97. <text class="scr-flow-arrow">⛔</text>
  98. <text class="scr-flow-action">{{ adv.restrainerReason }}</text>
  99. </view>
  100. <!-- 行动建议 -->
  101. <view class="scr-advice-action">
  102. <text class="scr-advice-action-label">本周行动</text>
  103. <text class="scr-advice-action-text">{{ adv.action }}</text>
  104. </view>
  105. </view>
  106. </view>
  107. <!-- 全部健康提示 -->
  108. <view class="scr-card" v-else>
  109. <view class="scr-all-healthy">
  110. <text class="scr-all-healthy-icon">🌿</text>
  111. <text class="scr-all-healthy-text">五维状态均健康,请继续保持这份平衡!</text>
  112. </view>
  113. </view>
  114. <!-- 历史与重测 -->
  115. <view class="scr-footer">
  116. <button class="scr-btn scr-btn-primary" @click="goHistory">历史记录</button>
  117. <button class="scr-btn scr-btn-outline" @click="retake">重新自检</button>
  118. </view>
  119. </template>
  120. </view>
  121. </template>
  122. <script>
  123. import { getSelfCheckLatest, getSelfCheckHistory } from '@/utils/api'
  124. export default {
  125. data() {
  126. return {
  127. loading: true,
  128. result: null,
  129. selfCheckId: '',
  130. canvasContext: null,
  131. canvasWidth: 340,
  132. canvasHeight: 340,
  133. // 雷达图轴序(对应 tianpan 木火土金水,顺时针)
  134. axes: ['木', '火', '土', '金', '水'],
  135. elementKeys: ['action', 'mind', 'body', 'wisdom', 'wealth'],
  136. elementColors: ['#10B981', '#FF6B9D', '#FF8C42', '#6366F1', '#F59E0B'],
  137. levelMap: {
  138. healthy: '健康',
  139. attention: '留意',
  140. tense: '紧绷'
  141. }
  142. }
  143. },
  144. computed: {
  145. overallLevel: function() {
  146. var total = this.result ? (this.result.totalScore || 0) : 0
  147. if (total >= 35) return 'healthy'
  148. if (total >= 20) return 'attention'
  149. return 'tense'
  150. },
  151. overallLevelName: function() {
  152. return this.levelMap[this.overallLevel] || '留意'
  153. }
  154. },
  155. onLoad: function(options) {
  156. this.selfCheckId = options && options.id ? options.id : ''
  157. this.loadResult()
  158. },
  159. methods: {
  160. loadResult: function() {
  161. var self = this
  162. // 优先使用刚提交时缓存的结果,避免多一次请求
  163. var cached = uni.getStorageSync('lastSelfCheckResult')
  164. if (cached && cached.id) {
  165. this.result = cached
  166. this.loading = false
  167. this.drawRadar()
  168. return
  169. }
  170. getSelfCheckLatest().then(function(res) {
  171. self.loading = false
  172. if (res.code === 200 && res.data) {
  173. self.result = res.data
  174. self.drawRadar()
  175. } else {
  176. uni.showToast({ title: (res && res.message) || '暂无自检记录', icon: 'none' })
  177. }
  178. }).catch(function() {
  179. self.loading = false
  180. uni.showToast({ title: '加载失败', icon: 'none' })
  181. })
  182. },
  183. onCanvasReady: function(res) {
  184. if (!res || !res[0] || !res[0].node) {
  185. return
  186. }
  187. var ctx = res[0].node.getContext('2d')
  188. var dpr = uni.getWindowInfo().pixelRatio
  189. this.canvasContext = ctx
  190. this.canvasContext.scale(dpr, dpr)
  191. this.drawRadar()
  192. },
  193. drawRadar: function() {
  194. if (!this.canvasContext || !this.result) {
  195. return
  196. }
  197. var ctx = this.canvasContext
  198. var w = this.canvasWidth
  199. var h = this.canvasHeight
  200. var cx = w / 2
  201. var cy = h / 2
  202. var r = w * 0.34
  203. var angleStep = (Math.PI * 2) / 5
  204. // 清空画布
  205. ctx.clearRect(0, 0, w, h)
  206. ctx.fillStyle = '#FFF8F0'
  207. ctx.fillRect(0, 0, w, h)
  208. // 维度分数映射
  209. var scores = {}
  210. var dims = this.result.dimensions || []
  211. for (var i = 0; i < dims.length; i++) {
  212. scores[dims[i].dimension] = dims[i].score || 0
  213. }
  214. // 背景五边形(三层网格)
  215. for (var layer = 1; layer <= 3; layer++) {
  216. ctx.beginPath()
  217. for (var g = 0; g < 5; g++) {
  218. var gAngle = g * angleStep - Math.PI / 2
  219. var gx = cx + r * (layer / 3) * Math.cos(gAngle)
  220. var gy = cy + r * (layer / 3) * Math.sin(gAngle)
  221. if (g === 0) {
  222. ctx.moveTo(gx, gy)
  223. } else {
  224. ctx.lineTo(gx, gy)
  225. }
  226. }
  227. ctx.closePath()
  228. ctx.strokeStyle = 'rgba(249, 114, 22, 0.15)'
  229. ctx.lineWidth = 1
  230. ctx.stroke()
  231. }
  232. // 轴线 + 标签
  233. for (var j = 0; j < 5; j++) {
  234. var a2 = j * angleStep - Math.PI / 2
  235. var lx = cx + r * Math.cos(a2)
  236. var ly = cy + r * Math.sin(a2)
  237. ctx.beginPath()
  238. ctx.moveTo(cx, cy)
  239. ctx.lineTo(lx, ly)
  240. ctx.strokeStyle = this.elementColors[j] + '44'
  241. ctx.lineWidth = 1
  242. ctx.stroke()
  243. var labelX = cx + (r + 18) * Math.cos(a2)
  244. var labelY = cy + (r + 18) * Math.sin(a2)
  245. ctx.fillStyle = this.elementColors[j]
  246. ctx.font = 'bold 13px sans-serif'
  247. ctx.textAlign = 'center'
  248. ctx.textBaseline = 'middle'
  249. ctx.fillText(this.axes[j], labelX, labelY)
  250. }
  251. // 数据驱动多边形
  252. ctx.beginPath()
  253. for (var m = 0; m < 5; m++) {
  254. var ang = m * angleStep - Math.PI / 2
  255. var key = this.elementKeys[m]
  256. var ratio = (scores[key] || 0) / 9
  257. var dataR = r * ratio
  258. var dx = cx + dataR * Math.cos(ang)
  259. var dy = cy + dataR * Math.sin(ang)
  260. if (m === 0) {
  261. ctx.moveTo(dx, dy)
  262. } else {
  263. ctx.lineTo(dx, dy)
  264. }
  265. }
  266. ctx.closePath()
  267. ctx.fillStyle = 'rgba(249, 114, 22, 0.2)'
  268. ctx.fill()
  269. ctx.strokeStyle = '#F97316'
  270. ctx.lineWidth = 2
  271. ctx.stroke()
  272. // 数据节点圆点 + 分数标签
  273. for (var n = 0; n < 5; n++) {
  274. var ang2 = n * angleStep - Math.PI / 2
  275. var key2 = this.elementKeys[n]
  276. var ratio2 = (scores[key2] || 0) / 9
  277. var dataR2 = r * ratio2
  278. var px = cx + dataR2 * Math.cos(ang2)
  279. var py = cy + dataR2 * Math.sin(ang2)
  280. ctx.beginPath()
  281. ctx.arc(px, py, 4, 0, Math.PI * 2)
  282. ctx.fillStyle = this.elementColors[n]
  283. ctx.fill()
  284. var pctLabelR = dataR2 + (ratio2 > 0.35 ? -16 : 18)
  285. var pLabelX = cx + pctLabelR * Math.cos(ang2)
  286. var pLabelY = cy + pctLabelR * Math.sin(ang2)
  287. ctx.fillStyle = this.elementColors[n]
  288. ctx.font = 'bold 11px sans-serif'
  289. ctx.textAlign = 'center'
  290. ctx.textBaseline = 'middle'
  291. ctx.fillText(String(scores[key2] || 0), pLabelX, pLabelY)
  292. }
  293. },
  294. formatDate: function(dateStr) {
  295. if (!dateStr) {
  296. return ''
  297. }
  298. var d = new Date(dateStr)
  299. var pad = function(n) { return n < 10 ? '0' + n : '' + n }
  300. return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()) + ' ' + pad(d.getHours()) + ':' + pad(d.getMinutes())
  301. },
  302. goHistory: function() {
  303. getSelfCheckHistory().then(function(res) {
  304. if (res.code === 200 && res.data && res.data.length > 0) {
  305. uni.showToast({ title: '已生成 ' + res.data.length + ' 条记录', icon: 'none' })
  306. } else {
  307. uni.showToast({ title: '暂无历史记录', icon: 'none' })
  308. }
  309. }).catch(function() {
  310. uni.showToast({ title: '暂无历史记录', icon: 'none' })
  311. })
  312. },
  313. retake: function() {
  314. uni.redirectTo({ url: '/pages/family/self-check' })
  315. }
  316. }
  317. }
  318. </script>
  319. <style scoped>
  320. .scr-page {
  321. min-height: 100vh;
  322. background: #F5FAFE;
  323. padding: 24rpx 30rpx 120rpx;
  324. box-sizing: border-box;
  325. }
  326. .scr-loading {
  327. display: flex;
  328. justify-content: center;
  329. align-items: center;
  330. height: 60vh;
  331. }
  332. .scr-loading-text {
  333. font-size: 28rpx;
  334. color: #999;
  335. }
  336. /* 总分横幅 */
  337. .scr-hero {
  338. background: linear-gradient(135deg, #F97316, #FF8C42);
  339. border-radius: 24rpx;
  340. padding: 40rpx 30rpx;
  341. margin-bottom: 24rpx;
  342. box-shadow: 0 6rpx 20rpx rgba(249, 114, 22, 0.25);
  343. }
  344. .scr-hero-badge {
  345. display: flex;
  346. flex-direction: column;
  347. align-items: center;
  348. }
  349. .scr-hero-title {
  350. font-size: 26rpx;
  351. color: rgba(255, 255, 255, 0.9);
  352. }
  353. .scr-hero-score-row {
  354. display: flex;
  355. align-items: baseline;
  356. margin-top: 10rpx;
  357. }
  358. .scr-hero-score {
  359. font-size: 88rpx;
  360. font-weight: 700;
  361. color: #fff;
  362. }
  363. .scr-hero-total {
  364. font-size: 30rpx;
  365. color: rgba(255, 255, 255, 0.7);
  366. margin-left: 6rpx;
  367. }
  368. .scr-hero-level {
  369. margin-top: 14rpx;
  370. padding: 8rpx 28rpx;
  371. border-radius: 24rpx;
  372. font-size: 26rpx;
  373. font-weight: 600;
  374. background: rgba(255, 255, 255, 0.92);
  375. }
  376. .scr-hero-level.level-healthy { color: #2E7D32; }
  377. .scr-hero-level.level-attention { color: #E65100; }
  378. .scr-hero-level.level-tense { color: #C62828; }
  379. .scr-hero-date {
  380. display: block;
  381. text-align: center;
  382. font-size: 22rpx;
  383. color: rgba(255, 255, 255, 0.8);
  384. margin-top: 16rpx;
  385. }
  386. /* 通用卡片 */
  387. .scr-card {
  388. background: #fff;
  389. border-radius: 24rpx;
  390. padding: 30rpx 26rpx;
  391. margin-bottom: 24rpx;
  392. box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05);
  393. }
  394. .scr-card-title {
  395. display: flex;
  396. align-items: baseline;
  397. justify-content: space-between;
  398. margin-bottom: 24rpx;
  399. }
  400. .scr-card-title-text {
  401. font-size: 32rpx;
  402. font-weight: 600;
  403. color: #333;
  404. }
  405. .scr-card-sub {
  406. font-size: 22rpx;
  407. color: #999;
  408. }
  409. /* 雷达图 */
  410. .scr-canvas-wrap {
  411. display: flex;
  412. justify-content: center;
  413. }
  414. .scr-canvas {
  415. width: 340px;
  416. height: 340px;
  417. }
  418. /* 维度得分 */
  419. .scr-dim-list {
  420. display: flex;
  421. flex-direction: column;
  422. }
  423. .scr-dim-item {
  424. margin-bottom: 28rpx;
  425. }
  426. .scr-dim-item:last-child {
  427. margin-bottom: 0;
  428. }
  429. .scr-dim-head {
  430. display: flex;
  431. align-items: center;
  432. justify-content: space-between;
  433. }
  434. .scr-dim-label {
  435. display: flex;
  436. align-items: center;
  437. }
  438. .scr-dim-dot {
  439. width: 28rpx;
  440. height: 28rpx;
  441. border-radius: 50%;
  442. margin-right: 12rpx;
  443. }
  444. .scr-dim-name {
  445. font-size: 30rpx;
  446. font-weight: 600;
  447. color: #333;
  448. }
  449. .scr-dim-element {
  450. font-size: 22rpx;
  451. color: #999;
  452. margin-left: 10rpx;
  453. }
  454. .scr-dim-score-wrap {
  455. display: flex;
  456. align-items: baseline;
  457. }
  458. .scr-dim-score {
  459. font-size: 40rpx;
  460. font-weight: 700;
  461. }
  462. .scr-dim-score-max {
  463. font-size: 22rpx;
  464. color: #BBB;
  465. }
  466. .scr-dim-bar {
  467. height: 12rpx;
  468. background: #F0F0F0;
  469. border-radius: 6rpx;
  470. margin-top: 14rpx;
  471. overflow: hidden;
  472. }
  473. .scr-dim-bar-fill {
  474. height: 100%;
  475. border-radius: 6rpx;
  476. transition: width 0.5s ease;
  477. }
  478. .scr-dim-foot {
  479. display: flex;
  480. align-items: center;
  481. margin-top: 12rpx;
  482. }
  483. .scr-dim-level {
  484. font-size: 22rpx;
  485. padding: 4rpx 16rpx;
  486. border-radius: 16rpx;
  487. margin-right: 14rpx;
  488. flex-shrink: 0;
  489. }
  490. .scr-dim-level.lvl-healthy { background: #E8F5E9; color: #2E7D32; }
  491. .scr-dim-level.lvl-attention { background: #FFF8E1; color: #F57F17; }
  492. .scr-dim-level.lvl-tense { background: #FFEBEE; color: #C62828; }
  493. .scr-dim-summary {
  494. flex: 1;
  495. font-size: 24rpx;
  496. color: #888;
  497. line-height: 1.4;
  498. }
  499. /* 寻源建议 */
  500. .scr-advice-intro {
  501. font-size: 24rpx;
  502. color: #666;
  503. line-height: 1.6;
  504. background: #FFF7ED;
  505. border-radius: 12rpx;
  506. padding: 16rpx 20rpx;
  507. margin-bottom: 24rpx;
  508. }
  509. .scr-advice-item {
  510. border: 2rpx solid #F0E6DC;
  511. border-radius: 16rpx;
  512. padding: 24rpx;
  513. margin-bottom: 20rpx;
  514. }
  515. .scr-advice-item:last-child {
  516. margin-bottom: 0;
  517. }
  518. .scr-advice-dim-row {
  519. display: flex;
  520. align-items: center;
  521. justify-content: space-between;
  522. margin-bottom: 18rpx;
  523. }
  524. .scr-advice-dim-badge {
  525. display: flex;
  526. align-items: center;
  527. padding: 8rpx 20rpx;
  528. border-radius: 20rpx;
  529. }
  530. .scr-advice-dim-name {
  531. font-size: 28rpx;
  532. font-weight: 700;
  533. color: #fff;
  534. margin-right: 8rpx;
  535. }
  536. .scr-advice-dim-elem {
  537. font-size: 22rpx;
  538. color: rgba(255, 255, 255, 0.9);
  539. }
  540. .scr-advice-dim-score {
  541. font-size: 26rpx;
  542. font-weight: 600;
  543. color: #C62828;
  544. }
  545. .scr-advice-flow {
  546. display: flex;
  547. align-items: flex-start;
  548. margin-bottom: 12rpx;
  549. }
  550. .scr-flow-node {
  551. display: flex;
  552. align-items: center;
  553. flex-shrink: 0;
  554. width: 200rpx;
  555. }
  556. .scr-flow-dot {
  557. width: 20rpx;
  558. height: 20rpx;
  559. border-radius: 50%;
  560. margin-right: 8rpx;
  561. flex-shrink: 0;
  562. }
  563. .scr-flow-label {
  564. font-size: 24rpx;
  565. font-weight: 600;
  566. color: #333;
  567. }
  568. .scr-flow-arrow {
  569. flex-shrink: 0;
  570. font-size: 24rpx;
  571. color: #F97316;
  572. margin: 0 10rpx;
  573. }
  574. .scr-flow-action {
  575. flex: 1;
  576. font-size: 24rpx;
  577. color: #666;
  578. line-height: 1.5;
  579. }
  580. .scr-advice-action {
  581. display: flex;
  582. align-items: flex-start;
  583. background: #F5FAFE;
  584. border-radius: 12rpx;
  585. padding: 16rpx 20rpx;
  586. margin-top: 10rpx;
  587. }
  588. .scr-advice-action-label {
  589. flex-shrink: 0;
  590. font-size: 22rpx;
  591. font-weight: 600;
  592. color: #F97316;
  593. margin-right: 12rpx;
  594. padding: 2rpx 0;
  595. }
  596. .scr-advice-action-text {
  597. flex: 1;
  598. font-size: 24rpx;
  599. color: #333;
  600. line-height: 1.5;
  601. }
  602. /* 全部健康 */
  603. .scr-all-healthy {
  604. display: flex;
  605. flex-direction: column;
  606. align-items: center;
  607. padding: 30rpx 0;
  608. }
  609. .scr-all-healthy-icon {
  610. font-size: 72rpx;
  611. margin-bottom: 16rpx;
  612. }
  613. .scr-all-healthy-text {
  614. font-size: 28rpx;
  615. color: #666;
  616. }
  617. /* 底部按钮 */
  618. .scr-footer {
  619. display: flex;
  620. gap: 20rpx;
  621. margin-top: 20rpx;
  622. }
  623. .scr-btn {
  624. flex: 1;
  625. height: 88rpx;
  626. line-height: 88rpx;
  627. font-size: 30rpx;
  628. border-radius: 44rpx;
  629. text-align: center;
  630. border: none;
  631. }
  632. .scr-btn-primary {
  633. background: linear-gradient(135deg, #F97316, #FF8C42);
  634. color: #fff;
  635. font-weight: 600;
  636. }
  637. .scr-btn-outline {
  638. background: #fff;
  639. color: #F97316;
  640. border: 2rpx solid #F97316;
  641. }
  642. </style>