You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

899 lines
20 KiB

4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
4 weeks ago
  1. <template>
  2. <view class="main">
  3. <!-- 顶部状态栏占位 -->
  4. <view class="top" :style="{height:iSMT+'px'}"></view>
  5. <deepExploration_header></deepExploration_header>
  6. <view class="search">
  7. <input v-model="searchName" class="searchInput" type="text" placeholder="请输入股票名称、股票代码"
  8. placeholder-style="color: #A6A6A6; font-size: 22rpx;" />
  9. <image @click="searchStock" class="seachIcon" src="/static/deepExploration-images/search.png"
  10. mode="aspectFill"></image>
  11. </view>
  12. <view class="content">
  13. <view class="select">
  14. <image class="img" :src="navItems[currentIndex].icon" mode=""></image>
  15. <view v-for="(item, index) in navItems" :key="index" class="selectItem"
  16. :class="{ active: currentIndex === index }" @click="handleModel(index)">
  17. <button class="btn"></button>
  18. </view>
  19. </view>
  20. <view class="graphAndTxt">
  21. <view class="graph">
  22. <view class="graph_header">
  23. <view class="left">TESA</view>
  24. <view class="center">
  25. <image class="last" src="/static/deepExploration-images/last.png" mode="aspectFill"></image>
  26. <text>Taewlkj.sejssssssssf</text>
  27. <image class="next" src="/static/deepExploration-images/next.png" mode="aspectFill"></image>
  28. </view>
  29. <view class="right">2025/10/26</view>
  30. </view>
  31. <view class="graph_data">
  32. <text>435.900</text>
  33. <text>22.410</text>
  34. <text>5.120%</text>
  35. </view>
  36. <view class="graph_content">
  37. <view class="charts-box">
  38. <!-- uCharts 蜡烛图组件 -->
  39. <qiun-data-charts type="candle" :opts="opts" :chartData="chartData" :disableScroll="true"
  40. :ontouch="true" :onzoom="true" />
  41. </view>
  42. </view>
  43. </view>
  44. <view class="txt">
  45. <view class="txtHeader">
  46. <image src="/static/deepExploration-images/plus.png" mode="aspectFill"></image>
  47. <text>{{navItems[currentIndex].name}}</text>
  48. </view>
  49. <view class="txtContent">
  50. <view v-if="loading" class="loading">加载中...</view>
  51. <rich-text :nodes="htmlContent"></rich-text>
  52. </view>
  53. </view>
  54. </view>
  55. </view>
  56. <!-- 底部切换栏 -->
  57. <footerBar class="static-footer" :type="type"></footerBar>
  58. </view>
  59. </template>
  60. <script setup>
  61. import {
  62. ref,
  63. onMounted
  64. } from 'vue'
  65. import deepExploration_header from '@/components/deepExploration_header.vue'
  66. import footerBar from '@/components/footerBar.vue'
  67. import {
  68. onLoad
  69. } from '@dcloudio/uni-app'
  70. import {
  71. getModel1First,
  72. getModel1Second,
  73. getModel2First,
  74. getModel2Second,
  75. getModel3First,
  76. getModel3Second,
  77. getModel4First,
  78. getModel4Second,
  79. getModeldefault,
  80. getData
  81. } from '/api/deepExploration/deepExploration.js'
  82. import marked from 'marked'; // 引入 marked 库
  83. import hljs from 'highlight.js';
  84. import 'highlight.js/styles/atom-one-dark.css'; // 可替换为其他主题
  85. // 响应式变量定义
  86. const type = ref('deepExploration')
  87. const iSMT = ref(0)
  88. const currentIndex = ref(0)
  89. const navItems = ref([{
  90. name: '主力追踪',
  91. icon: '/static/deepExploration-images/1.png'
  92. },
  93. {
  94. name: '主力雷达',
  95. icon: '/static/deepExploration-images/2.png'
  96. },
  97. {
  98. name: '主力解码',
  99. icon: '/static/deepExploration-images/3.png'
  100. },
  101. {
  102. name: '主力资金流',
  103. icon: '/static/deepExploration-images/4.png'
  104. },
  105. ])
  106. //搜索股票
  107. const searchStock = () => {
  108. htmlContent.value = ''
  109. console.log('搜索参数:', stockName.value);
  110. if (currentIndex.value ) {
  111. handleModels()
  112. getServerData()
  113. } else {
  114. uni.showToast({
  115. title: '请选择模块',
  116. icon: 'none',
  117. duration: 2000
  118. })
  119. }
  120. }
  121. //点击四大模块
  122. const handleModel = async(index) => {
  123. htmlContent.value = ''
  124. currentIndex.value = index
  125. await handleModels()
  126. }
  127. const stockName = ref('')
  128. const searchName = ref('')
  129. const stockCode = ref('')
  130. const language = ref('')
  131. const recordId = ref('')
  132. const parentId = ref('')
  133. const stockId = ref('')
  134. const market = ref('')
  135. const loading = ref(true);
  136. const error = ref('');
  137. const htmlContent = ref('');
  138. const markdownContent = ref('');
  139. const renderer = new marked.Renderer();
  140. renderer.heading = function(text, level) {
  141. return `<p>${text}</p>`;
  142. };
  143. // 初始化 marked 配置(支持代码高亮)
  144. marked.setOptions({
  145. highlight: (code, lang) => {
  146. if (lang && hljs.getLanguage(lang)) {
  147. return hljs.highlight(code, {
  148. language: lang
  149. }).value;
  150. }
  151. return hljs.highlightAuto(code).value;
  152. },
  153. renderer,
  154. breaks: true, // 换行转<br>
  155. gfm: true, // 支持GitHub flavored Markdown
  156. sanitize: false, // 保留HTML标签(如<span style>)
  157. });
  158. //获取模型数据
  159. const handleModels = async () => {
  160. try {
  161. // markdownContent.value = '\n## 📊 主力追踪分析:\n\n### 🕵️ 主力行为\n\t1. 📊 该股庄家中长期筹码成本价格为 360.249,短期资金成本价格为 412.577。该股筹码分散,当日筹码成本价格为 444.330。\n\t2. 🔍 近日没有出现主力集中吸筹。\n\t3. 📈 近期主力持仓比例大于散户持仓比例。 当日主力持仓增加。 当日散户持仓减少。\n\n### 📊 空间维度:\n\t- 📉 预测低一值: <font color=\"#13c2c2\">443.092</font> \n - 📈 预测高一值: <font color=\"#ff4d4f\">466.458</font>\n\t- 📉 预测低二值: <font color=\"#13c2c2\">447.354</font>\n\t- 📈 预测高二值: <font color=\"#ff4d4f\">462.514</font>\n\t<font color=\"#722ed1\">AI智能均线空头排列,当前卖盘小于买盘</font>\n\n### 综合作战\n\t\t\t<font color=\"#fa8c16\">当前股票处于安全区,牵牛绳为红色,出现蓝色推进K线。</font>\n\t\t\t<font color=\"#eb2f96\">该股整体趋势相对较强,个股正处于推进上涨的关键阶段。若当前持有该股票,建议继续持有,进行持续跟踪。若当前无该股票,建议持续跟踪,等待适当时机再进行介入。</font>\n\n---\n<font color=\"#8c8c8c\">*该内容由AI生成,仅供参考,投资有风险,请注意甄别。*</font>\n '
  162. // htmlContent.value = marked.parse(markdownContent.value);
  163. loading.value = true;
  164. if (searchName.value == '') {
  165. console.log('没有搜索',searchName.value);
  166. const rresult = await handleDefault()
  167. // markdownContent.value = res.data.markdown
  168. htmlContent.value = marked.parse(markdownContent.value);
  169. }else{
  170. console.log('搜索',searchName.value);
  171. const result = await getModel1First({
  172. content: searchName.value,
  173. language: "cn",
  174. marketList: "hk,cn,usa,my,sg,vi,in,gb",
  175. model: currentIndex.value+1
  176. })
  177. console.log('result', result);
  178. if (result.code == 200) {
  179. stockCode.value = result.data.code
  180. stockName.value = result.data.name
  181. recordId.value = result.data.recordId
  182. parentId.value = result.data.parentId
  183. stockId.value = result.data.stockId
  184. language.value = result.data.language
  185. market.value = result.data.market
  186. } else {
  187. return
  188. }
  189. const res = await getModel1Second({
  190. language: language.value,
  191. recordId: recordId.value,
  192. parentId: parentId.value,
  193. stockId: stockId.value,
  194. token: 'pCtw6AYK0EHAaIexoFHsbZjtsfEAIhcmwkCFm6uKko8VPfMvyDiODL9v9c0veic9fIpQbvT8zN4sH/Si6Q'
  195. })
  196. if (res.code == 200) {
  197. const rawMarkdown = res.data.markdown;
  198. const adaptedMarkdown = rawMarkdown.replace(/^### /gm, ''); // 全局替换行首的###
  199. markdownContent.value = adaptedMarkdown;
  200. // markdownContent.value = res.data.markdown
  201. htmlContent.value = marked.parse(markdownContent.value);
  202. }
  203. console.log('res', res);
  204. }
  205. } catch {
  206. error.value = e.message || '加载失败,请重试';
  207. } finally {
  208. loading.value = false;
  209. }
  210. }
  211. const handleDefault = async () => {
  212. const result = await getModeldefault({
  213. token: "pCtw6AYK0EHAaIexoFHsbZjtsfEAIhcmwkCFm6uKko8VPfMvyDiODL9v9c0veic9fIpQbvT8zN4sH/Si6Q",
  214. model: currentIndex.value+1
  215. })
  216. const rawMarkdown = result.data.markdown;
  217. const adaptedMarkdown = rawMarkdown.replace(/^### /gm, ''); // 全局替换行首的###
  218. markdownContent.value = adaptedMarkdown;
  219. htmlContent.value = marked.parse(markdownContent.value);
  220. }
  221. const getServerData = async() =>{
  222. const result = await getData({
  223. market: market.value || '',
  224. code: searchName || '',
  225. language: "cn",
  226. brainPrivilegeState: 1,
  227. marketList: "usa.sg.my.hk.cn.can.vi.th.in.gb"
  228. })
  229. console.log('k线数据',result);
  230. }
  231. // 1. K线图配置
  232. const opts = ref({
  233. rotate: false,
  234. rotateLock: false,
  235. color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", "#ea7ccc"],
  236. padding: [15, 15, 0, 15],
  237. dataLabel: false,
  238. enableScroll: true,
  239. enableMarkLine: false,
  240. legend: {},
  241. xAxis: {
  242. labelCount: 4,
  243. itemCount: 30,
  244. disableGrid: true,
  245. gridColor: "#CCCCCC",
  246. gridType: "solid",
  247. dashLength: 4,
  248. scrollShow: false,
  249. scrollAlign: "left",
  250. scrollColor: "#A6A6A6",
  251. scrollBackgroundColor: "#EFEBEF",
  252. labelColor: "#8C8C8C",
  253. fontSize: 9
  254. },
  255. yAxis: {
  256. labelColor: "#8C8C8C",
  257. fontSize: 9
  258. },
  259. extra: {
  260. candle: {
  261. color: {
  262. upLine: "#f04864",
  263. upFill: "#f04864",
  264. downLine: "#2fc25b",
  265. downFill: "#2fc25b"
  266. },
  267. average: {
  268. show: false,
  269. name: ["MA5", "MA10", "MA30"],
  270. day: [5, 10, 20],
  271. color: ["#1890ff", "#2fc25b", "#facc14"]
  272. }
  273. },
  274. markLine: {
  275. type: "dash",
  276. dashLength: 5,
  277. data: [{
  278. value: 2150,
  279. lineColor: "#f04864",
  280. showLabel: false
  281. },
  282. {
  283. value: 2350,
  284. lineColor: "#f04864",
  285. showLabel: false
  286. }
  287. ]
  288. },
  289. tooltip: {
  290. showCategory: true
  291. }
  292. }
  293. })
  294. // 2. K线图数据(响应式定义)
  295. const chartData = ref({})
  296. // 获取K线数据函数(直接定义,无需methods)
  297. // const getServerData = () => {
  298. // // 模拟服务器请求延时
  299. // setTimeout(() => {
  300. // const res = {
  301. // "categories": [
  302. // "2025/08/25",
  303. // "2025/08/26",
  304. // "2025/08/27",
  305. // "2025/08/28",
  306. // "2025/08/29",
  307. // "2025/09/01",
  308. // "2025/09/02",
  309. // "2025/09/03",
  310. // "2025/09/04",
  311. // "2025/09/05",
  312. // "2025/09/08",
  313. // "2025/09/09",
  314. // "2025/09/10",
  315. // "2025/09/11",
  316. // "2025/09/12",
  317. // "2025/09/15",
  318. // "2025/09/16",
  319. // "2025/09/17",
  320. // "2025/09/18",
  321. // "2025/09/19",
  322. // "2025/09/22",
  323. // "2025/09/23",
  324. // "2025/09/24",
  325. // "2025/09/25",
  326. // "2025/09/26",
  327. // "2025/09/29",
  328. // "2025/09/30",
  329. // "2025/10/09",
  330. // "2025/10/10",
  331. // "2025/10/13",
  332. // "2025/10/14",
  333. // "2025/10/15",
  334. // "2025/10/16",
  335. // "2025/10/17",
  336. // "2025/10/20",
  337. // "2025/10/21",
  338. // "2025/10/22",
  339. // "2025/10/23",
  340. // "2025/10/24",
  341. // "2025/10/27"
  342. // ],
  343. // series: [{
  344. // "name": "贵州茅台",
  345. // "data": [
  346. // [
  347. // 1470.01,
  348. // 1496.0,
  349. // 1466.0,
  350. // 1499.33
  351. // ],
  352. // [
  353. // 1490.32,
  354. // 1474.23,
  355. // 1480.01,
  356. // 1481.61
  357. // ],
  358. // [
  359. // 1481.88,
  360. // 1484.93,
  361. // 1448.0,
  362. // 1448.0
  363. // ],
  364. // [
  365. // 1447.97,
  366. // 1456.1,
  367. // 1438.77,
  368. // 1446.1
  369. // ],
  370. // [
  371. // 1453.0,
  372. // 1482.58,
  373. // 1452.0,
  374. // 1480.0
  375. // ],
  376. // [
  377. // 1482.2,
  378. // 1488.0,
  379. // 1465.7,
  380. // 1476.1
  381. // ],
  382. // [
  383. // 1478.66,
  384. // 1509.0,
  385. // 1478.0,
  386. // 1491.3
  387. // ],
  388. // [
  389. // 1491.0,
  390. // 1503.5,
  391. // 1466.0,
  392. // 1480.55
  393. // ],
  394. // [
  395. // 1472.0,
  396. // 1479.3,
  397. // 1460.47,
  398. // 1480.66
  399. // ],
  400. // [
  401. // 1471.0,
  402. // 1486.97,
  403. // 1464.0,
  404. // 1483.0
  405. // ],
  406. // [
  407. // 1483.0,
  408. // 1506.44,
  409. // 1477.5,
  410. // 1501.23
  411. // ],
  412. // [
  413. // 1505.0,
  414. // 1509.95,
  415. // 1493.42,
  416. // 1505.0
  417. // ],
  418. // [
  419. // 1506.66,
  420. // 1529.95,
  421. // 1496.0,
  422. // 1522.01
  423. // ],
  424. // [
  425. // 1522.01,
  426. // 1526.02,
  427. // 1508.5,
  428. // 1523.5
  429. // ],
  430. // [
  431. // 1526.0,
  432. // 1538.02,
  433. // 1510.53,
  434. // 1516.0
  435. // ],
  436. // [
  437. // 1515.87,
  438. // 1517.48,
  439. // 1501.5,
  440. // 1515.1
  441. // ],
  442. // [
  443. // 1515.1,
  444. // 1520.99,
  445. // 1496.21,
  446. // 1499.98
  447. // ],
  448. // [
  449. // 1499.99,
  450. // 1510.28,
  451. // 1490.01,
  452. // 1493.0
  453. // ],
  454. // [
  455. // 1492.0,
  456. // 1497.8,
  457. // 1463.5,
  458. // 1467.96
  459. // ],
  460. // [
  461. // 1467.99,
  462. // 1475.5,
  463. // 1457.01,
  464. // 1467.97
  465. // ],
  466. // [
  467. // 1465.09,
  468. // 1467.97,
  469. // 1450.01,
  470. // 1453.35
  471. // ],
  472. // [
  473. // 1450.5,
  474. // 1457.5,
  475. // 1440.0,
  476. // 1447.42
  477. // ],
  478. // [
  479. // 1434.07,
  480. // 1456.78,
  481. // 1434.07,
  482. // 1442.0
  483. // ],
  484. // [
  485. // 1442.83,
  486. // 1445.21,
  487. // 1436.0,
  488. // 1439.0
  489. // ],
  490. // [
  491. // 1441.18,
  492. // 1447.11,
  493. // 1428.01,
  494. // 1435.0
  495. // ],
  496. // [
  497. // 1439.38,
  498. // 1469.99,
  499. // 1435.0,
  500. // 1460.86
  501. // ],
  502. // [
  503. // 1460.0,
  504. // 1460.76,
  505. // 1440.0,
  506. // 1443.99
  507. // ],
  508. // [
  509. // 1436.0,
  510. // 1439.38,
  511. // 1420.0,
  512. // 1436.78
  513. // ],
  514. // [
  515. // 1437.6,
  516. // 1439.94,
  517. // 1427.5,
  518. // 1430.0
  519. // ],
  520. // [
  521. // 1415.7,
  522. // 1422.85,
  523. // 1415.12,
  524. // 1419.2
  525. // ],
  526. // [
  527. // 1429.99,
  528. // 1464.0,
  529. // 1429.99,
  530. // 1451.02
  531. // ],
  532. // [
  533. // 1450.98,
  534. // 1463.0,
  535. // 1445.08,
  536. // 1462.0
  537. // ],
  538. // [
  539. // 1461.92,
  540. // 1484.95,
  541. // 1458.88,
  542. // 1484.91
  543. // ],
  544. // [
  545. // 1483.1,
  546. // 1488.0,
  547. // 1454.03,
  548. // 1455.0
  549. // ],
  550. // [
  551. // 1455.0,
  552. // 1469.5,
  553. // 1454.88,
  554. // 1457.93
  555. // ],
  556. // [
  557. // 1459.0,
  558. // 1469.94,
  559. // 1455.5,
  560. // 1462.26
  561. // ],
  562. // [
  563. // 1462.08,
  564. // 1465.73,
  565. // 1456.0,
  566. // 1458.7
  567. // ],
  568. // [
  569. // 1455.0,
  570. // 1468.8,
  571. // 1447.2,
  572. // 1467.98
  573. // ],
  574. // [
  575. // 1467.95,
  576. // 1478.88,
  577. // 1449.34,
  578. // 1450.0
  579. // ],
  580. // [
  581. // 1440.0,
  582. // 1452.49,
  583. // 1435.99,
  584. // 1440.41
  585. // ]
  586. // ],
  587. // }]
  588. // }
  589. // // 给响应式变量赋值(需修改.value)
  590. // chartData.value = JSON.parse(JSON.stringify(res))
  591. // }, 500)
  592. // }
  593. // 生命周期钩子:组件挂载后执行(替代onReady)
  594. onMounted(() => {
  595. iSMT.value = uni.getSystemInfoSync().statusBarHeight
  596. getServerData() // 调用数据获取函数
  597. })
  598. // 页面加载时执行
  599. onLoad((e) => {
  600. if (e.index) {
  601. currentIndex.value = e.index - 1
  602. console.log('模块:', currentIndex.value)
  603. }
  604. if (e.stockName) {
  605. stockName.value = e.stockName
  606. console.log('股票名称:', stockName.value)
  607. }
  608. })
  609. </script>
  610. <style scoped lang="scss">
  611. .main {
  612. width: 100%;
  613. min-height: 100vh;
  614. background-color: #fff;
  615. padding-bottom: 120rpx;
  616. .search {
  617. position: relative;
  618. display: flex;
  619. align-items: center;
  620. background-color: #F3F3F3;
  621. width: calc(100% - 60rpx);
  622. height: 80rpx;
  623. border-radius: 50rpx;
  624. box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
  625. padding: 0 40rpx;
  626. margin: 15rpx 30rpx 0 30rpx;
  627. .seachIcon {
  628. position: absolute;
  629. right: 50rpx;
  630. width: 32rpx;
  631. height: 32rpx;
  632. }
  633. .searchInput {
  634. color: #111;
  635. }
  636. }
  637. .content {
  638. margin-top: 30rpx;
  639. padding-top: 30rpx;
  640. background-color: rgb(248, 248, 248);
  641. .select {
  642. position: relative;
  643. margin-bottom: -5rpx;
  644. .img {
  645. width: 750rpx;
  646. height: 198rpx;
  647. }
  648. .selectItem {
  649. .btn {
  650. position: absolute;
  651. width: 120rpx;
  652. height: 150rpx;
  653. background-color: transparent;
  654. &::after {
  655. border: none;
  656. }
  657. }
  658. &:nth-of-type(1) .btn {
  659. top: 30rpx;
  660. left: 60rpx;
  661. }
  662. &:nth-of-type(2) .btn {
  663. top: 30rpx;
  664. left: 230rpx;
  665. }
  666. &:nth-of-type(3) .btn {
  667. top: 30rpx;
  668. left: 400rpx;
  669. }
  670. &:nth-of-type(4) .btn {
  671. top: 30rpx;
  672. left: 570rpx;
  673. }
  674. }
  675. }
  676. .graphAndTxt {
  677. background-color: #fff;
  678. border-radius: 50rpx 50rpx 0 0;
  679. padding: 68.6rpx 36.5rpx 0 36.5rpx;
  680. .graph {
  681. border: 1rpx solid #e2e2e2;
  682. border-radius: 30rpx 30rpx 0 0;
  683. .graph_header {
  684. padding: 32rpx 20.5rpx 0 24rpx;
  685. display: flex;
  686. align-items: center;
  687. .left {
  688. color: #333333;
  689. font-family: "PingFang SC";
  690. font-size: 15px;
  691. font-style: normal;
  692. font-weight: 400;
  693. line-height: 15px;
  694. }
  695. .center {
  696. margin-left: 105rpx;
  697. display: flex;
  698. align-items: center;
  699. text {
  700. width: 160rpx;
  701. height: 36rpx;
  702. padding-left: 10rpx;
  703. color: #000000;
  704. white-space: nowrap;
  705. overflow: hidden;
  706. text-overflow: ellipsis;
  707. text-align: center;
  708. font-family: "PingFang SC";
  709. font-size: 18px;
  710. font-style: normal;
  711. font-weight: 500;
  712. line-height: 18px;
  713. }
  714. .last {
  715. width: 15rpx;
  716. height: 20rpx;
  717. margin-right: 30rpx;
  718. }
  719. .next {
  720. width: 15rpx;
  721. height: 20rpx;
  722. margin-left: 30rpx;
  723. }
  724. }
  725. .right {
  726. margin-left: 50rpx;
  727. color: #6a6a6a;
  728. font-family: "PingFang SC";
  729. font-size: 13px;
  730. font-style: normal;
  731. font-weight: 400;
  732. line-height: 15px;
  733. }
  734. }
  735. .graph_data {
  736. display: flex;
  737. padding: 48rpx 24rpx;
  738. text {
  739. display: flex;
  740. color: #25ba5d;
  741. font-family: "PingFang SC";
  742. font-size: 17px;
  743. line-height: 17px;
  744. }
  745. text:nth-child(2) {
  746. margin-left: 120rpx;
  747. }
  748. text:nth-child(3) {
  749. margin-left: 150rpx;
  750. }
  751. }
  752. .graph_content {
  753. .charts-box {
  754. width: 100%;
  755. height: 100%;
  756. }
  757. }
  758. }
  759. .txt {
  760. background-color: #F3F3F3;
  761. margin-top: 48rpx;
  762. border-radius: 30rpx;
  763. .txtHeader {
  764. padding: 30rpx 24rpx;
  765. image {
  766. width: 20rpx;
  767. height: 20rpx;
  768. }
  769. text {
  770. background-color: #FFFFFF;
  771. color: #000000;
  772. padding: 0 22rpx;
  773. border-radius: 22rpx;
  774. font-size: 28rpx;
  775. font-weight: 400;
  776. line-height: 37rpx;
  777. }
  778. }
  779. .txtContent {
  780. min-height: 200rpx;
  781. padding: 20rpx 30rpx;
  782. margin-bottom: 100rpx;
  783. ::v-deep * {
  784. box-sizing: border-box;
  785. width: 100% !important; // 强制所有解析后的标签占满容器宽度
  786. white-space: normal !important; // 取消强制不换行
  787. word-wrap: break-word !important; // 长词/长数字自动换行
  788. }
  789. // 标题样式(确保换行)
  790. ::v-deep h2 {
  791. font-size: 32rpx;
  792. color: #333;
  793. margin: 25rpx 0 15rpx;
  794. line-height: 1.5;
  795. }
  796. // 段落样式(核心换行控制)
  797. ::v-deep p {
  798. font-size: 26rpx;
  799. color: #666;
  800. margin: 15rpx 0;
  801. line-height: 1.8; // 增加行高,提升可读性
  802. text-align: justify; // 两端对齐,避免单侧参差不齐
  803. }
  804. // 列表样式(纵向排列)
  805. ::v-deep ul,
  806. ::v-deep ol {
  807. margin: 15rpx 0 15rpx 30rpx;
  808. }
  809. ::v-deep li {
  810. margin: 10rpx 0;
  811. line-height: 1.6;
  812. }
  813. // 加载状态样式
  814. .loading {
  815. text-align: center;
  816. padding: 50rpx 0;
  817. color: #666;
  818. font-size: 26rpx;
  819. }
  820. }
  821. }
  822. }
  823. }
  824. .static-footer {
  825. position: fixed;
  826. bottom: 0;
  827. width: 100%;
  828. }
  829. }
  830. * {
  831. box-sizing: border-box;
  832. }
  833. </style>