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.

719 lines
18 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
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">{{stockCode}}</view>
  24. <view class="center">
  25. <text>{{stockName}}</text>
  26. </view>
  27. <view class="right">{{stockTime}}</view>
  28. </view>
  29. <view class="graph_data">
  30. <text>{{stockPrice}}</text>
  31. <text>{{stockChange}}</text>
  32. <text>{{stockAdd}}</text>
  33. </view>
  34. <view class="graph_content">
  35. <view class="charts-box">
  36. <!-- uCharts 蜡烛图组件 -->
  37. <qiun-data-charts type="candle" :opts="opts" :chartData="chartData" :disableScroll="true"
  38. :ontouch="true" :onzoom="true" :key="chartKey" />
  39. </view>
  40. </view>
  41. </view>
  42. <view class="txt">
  43. <view class="txtHeader">
  44. <image src="/static/deepExploration-images/plus.png" mode="aspectFill"></image>
  45. <text>{{navItems[currentIndex].name}}</text>
  46. </view>
  47. <view class="txtContent">
  48. <view v-if="loading" class="loading">加载中...</view>
  49. <rich-text :nodes="htmlContent"></rich-text>
  50. </view>
  51. </view>
  52. </view>
  53. </view>
  54. <!-- 底部切换栏 -->
  55. <footerBar class="static-footer" :type="type"></footerBar>
  56. </view>
  57. </template>
  58. <script setup>
  59. import {
  60. ref,
  61. onMounted,
  62. watch
  63. } from 'vue'
  64. import deepExploration_header from '@/components/deepExploration_header.vue'
  65. import footerBar from '@/components/footerBar.vue'
  66. import {
  67. onLoad
  68. } from '@dcloudio/uni-app'
  69. import {
  70. getModel1First,
  71. getModel1Second,
  72. getModel2First,
  73. getModel2Second,
  74. getModel3First,
  75. getModel3Second,
  76. getModel4First,
  77. getModel4Second,
  78. getModeldefault,
  79. getData
  80. } from '/api/deepExploration/deepExploration.js'
  81. import marked from 'marked'; // 引入 marked 库
  82. import hljs from 'highlight.js';
  83. import 'highlight.js/styles/atom-one-dark.css'; // 可替换为其他主题
  84. import {
  85. useDeepExplorationStore
  86. } from '@/stores/modules/deepExploration'
  87. const deepExplorationStore = useDeepExplorationStore()
  88. const historyData = ref({})
  89. // 响应式变量定义
  90. const type = ref('deepExploration')
  91. const iSMT = ref(0)
  92. const currentIndex = ref(0)
  93. const navItems = ref([{
  94. name: '主力追踪',
  95. icon: '/static/deepExploration-images/1.png'
  96. },
  97. {
  98. name: '主力雷达',
  99. icon: '/static/deepExploration-images/2.png'
  100. },
  101. {
  102. name: '主力解码',
  103. icon: '/static/deepExploration-images/3.png'
  104. },
  105. {
  106. name: '主力资金流',
  107. icon: '/static/deepExploration-images/4.png'
  108. },
  109. ])
  110. //搜索股票
  111. const searchStock = () => {
  112. htmlContent.value = ''
  113. console.log('搜索参数:', stockName.value, currentIndex.value);
  114. if (currentIndex.value >= 0 && currentIndex.value <= 3) {
  115. handleModels()
  116. } else {
  117. uni.showToast({
  118. title: '请选择模块',
  119. icon: 'none',
  120. duration: 2000
  121. })
  122. }
  123. }
  124. //点击四大模块
  125. const handleModel = async (index) => {
  126. htmlContent.value = ''
  127. currentIndex.value = index
  128. await handleModels()
  129. // await getServerData()
  130. }
  131. const stockName = ref('Tesla Inc.')
  132. const searchName = ref('')
  133. const stockCode = ref('TSLA')
  134. const language = ref('')
  135. const recordId = ref('')
  136. const parentId = ref('')
  137. const stockId = ref('')
  138. const market = ref('')
  139. const stockTime = ref('2025/10/24')
  140. const loading = ref(true);
  141. const error = ref('');
  142. const htmlContent = ref('');
  143. const markdownContent = ref('');
  144. const renderer = new marked.Renderer();
  145. renderer.heading = function(text, level) {
  146. return `<p>${text}</p>`;
  147. };
  148. // 初始化 marked 配置(支持代码高亮)
  149. marked.setOptions({
  150. highlight: (code, lang) => {
  151. if (lang && hljs.getLanguage(lang)) {
  152. return hljs.highlight(code, {
  153. language: lang
  154. }).value;
  155. }
  156. return hljs.highlightAuto(code).value;
  157. },
  158. renderer,
  159. breaks: true, // 换行转<br>
  160. gfm: true, // 支持GitHub flavored Markdown
  161. sanitize: false, // 保留HTML标签(如<span style>)
  162. });
  163. //获取模型数据
  164. const handleModels = async () => {
  165. try {
  166. // 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 '
  167. // htmlContent.value = marked.parse(markdownContent.value);
  168. loading.value = true;
  169. if (searchName.value == '') {
  170. console.log('没有搜索', searchName.value);
  171. handleDefault()
  172. } else {
  173. console.log('搜索', searchName.value);
  174. const result = await getModel1First({
  175. content: searchName.value,
  176. language: "cn",
  177. marketList: "hk,cn,usa,my,sg,vi,in,gb",
  178. model: currentIndex.value + 1
  179. })
  180. console.log('result', result);
  181. if (result.code == 200) {
  182. stockCode.value = result.data.code
  183. // stockName.value = result.data.name
  184. recordId.value = result.data.recordId
  185. parentId.value = result.data.parentId
  186. stockId.value = result.data.stockId
  187. language.value = result.data.language
  188. market.value = result.data.market
  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. await getServerData()
  205. } else if (result.code == 400) {
  206. markdownContent.value = result.message;
  207. htmlContent.value = marked.parse(markdownContent.value);
  208. } else {
  209. return
  210. }
  211. }
  212. } catch (e) {
  213. error.value = e.message || '加载失败,请重试';
  214. } finally {
  215. loading.value = false;
  216. }
  217. }
  218. const handleDefault = async () => {
  219. const result = await getModeldefault({
  220. token: "pCtw6AYK0EHAaIexoFHsbZjtsfEAIhcmwkCFm6uKko8VPfMvyDiODL9v9c0veic9fIpQbvT8zN4sH/Si6Q",
  221. model: currentIndex.value + 1
  222. })
  223. if (result.code == 200) {
  224. const rawMarkdown = result.data.markdown;
  225. const adaptedMarkdown = rawMarkdown.replace(/^### /gm, ''); // 全局替换行首的###
  226. markdownContent.value = adaptedMarkdown;
  227. htmlContent.value = marked.parse(markdownContent.value);
  228. } else {
  229. }
  230. }
  231. const stockPrice = ref('435.900')
  232. const stockAdd = ref('22.410')
  233. const stockChange = ref('5.120%')
  234. const chartKey = ref(0);
  235. const getServerData = async () => {
  236. const result = await getData({
  237. market: market.value || '',
  238. code: searchName.value || '',
  239. language: "cn",
  240. brainPrivilegeState: 1,
  241. marketList: "usa.sg.my.hk.cn.can.vi.th.in.gb"
  242. })
  243. console.log('k线数据', result);
  244. stockName.value = result.data.StockInformation.Name || 'Tesla Inc.'
  245. stockCode.value = result.data.StockInformation.Code || 'TSLA'
  246. stockTime.value = result.data.StockInformation.Time || '2025/10/29'
  247. stockChange.value = result.data.StockInformation.Zhang || '5.120%'
  248. stockAdd.value = result.data.StockInformation.ZhangFu || '22.410'
  249. stockPrice.value = result.data.StockInformation.Price || '435.900'
  250. if (result.data.chartData) {
  251. chartData.value = {
  252. ...JSON.parse(JSON.stringify(result.data.chartData))
  253. }
  254. chartKey.value++;
  255. console.log('chartData', chartData.value);
  256. }
  257. }
  258. // 1. K线图配置
  259. const opts = ref({
  260. rotate: false,
  261. rotateLock: false,
  262. color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", "#ea7ccc"],
  263. padding: [15, 15, 0, 15],
  264. dataLabel: false,
  265. enableScroll: true,
  266. enableMarkLine: false,
  267. legend: {},
  268. xAxis: {
  269. labelCount: 4,
  270. itemCount: 30,
  271. disableGrid: true,
  272. gridColor: "#CCCCCC",
  273. gridType: "solid",
  274. dashLength: 4,
  275. scrollShow: false,
  276. scrollAlign: "left",
  277. scrollColor: "#A6A6A6",
  278. scrollBackgroundColor: "#EFEBEF",
  279. labelColor: "#8C8C8C",
  280. fontSize: 9
  281. },
  282. yAxis: {
  283. labelColor: "#8C8C8C",
  284. fontSize: 9
  285. },
  286. extra: {
  287. candle: {
  288. color: {
  289. upLine: "#f04864",
  290. upFill: "#f04864",
  291. downLine: "#2fc25b",
  292. downFill: "#2fc25b"
  293. },
  294. average: {
  295. show: false,
  296. name: ["MA5", "MA10", "MA30"],
  297. day: [5, 10, 20],
  298. color: ["#1890ff", "#2fc25b", "#facc14"]
  299. }
  300. },
  301. markLine: {
  302. type: "dash",
  303. dashLength: 5,
  304. data: [{
  305. value: 2150,
  306. lineColor: "#f04864",
  307. showLabel: false
  308. },
  309. {
  310. value: 2350,
  311. lineColor: "#f04864",
  312. showLabel: false
  313. }
  314. ]
  315. },
  316. tooltip: {
  317. showCategory: true
  318. }
  319. }
  320. })
  321. // 2. K线图数据(响应式定义)
  322. const chartData = ref({
  323. categories: [],
  324. series: [{
  325. name: '',
  326. data: []
  327. }]
  328. })
  329. //获取K线数据函数(直接定义,无需methods)
  330. // const getServerData1 = () => {
  331. // // 模拟服务器请求延时
  332. // setTimeout(() => {
  333. // const res = {
  334. // "categories": [
  335. // "2025/10/23",
  336. // "2025/10/24",
  337. // "2025/10/27"
  338. // ],
  339. // series: [{
  340. // "name": "贵州茅台",
  341. // "data": [
  342. // [
  343. // 1455.0,
  344. // 1468.8,
  345. // 1447.2,
  346. // 1467.98
  347. // ],
  348. // [
  349. // 1467.95,
  350. // 1478.88,
  351. // 1449.34,
  352. // 1450.0
  353. // ],
  354. // [
  355. // 1440.0,
  356. // 1452.49,
  357. // 1435.99,
  358. // 1440.41
  359. // ]
  360. // ],
  361. // }]
  362. // }
  363. // // 给响应式变量赋值(需修改.value)
  364. // chartData.value = JSON.parse(JSON.stringify(res))
  365. // }, 500)
  366. // }
  367. let unwatch = null;
  368. // 生命周期钩子:组件挂载后执行(替代onReady)
  369. onMounted(async () => {
  370. iSMT.value = uni.getSystemInfoSync().statusBarHeight
  371. await getServerData() // 调用数据获取函数
  372. await handleModels()
  373. unwatch = watch(
  374. () => deepExplorationStore.deepExplorationInfo, // 监听的目标值(函数返回,避免响应式丢失)
  375. (newVal, oldVal) => {
  376. console.log('deepExplorationInfo 变化了:', newVal)
  377. historyData.value = {
  378. ...newVal
  379. }
  380. console.log(historyData.value.wokeFlowData);
  381. console.log('222', historyData.value.stockData.StockInformation);
  382. //工作流数据
  383. const rawMarkdown = historyData.value.wokeFlowData.One.markdown;
  384. const adaptedMarkdown = rawMarkdown.replace(/^### /gm, ''); // 全局替换行首的###
  385. markdownContent.value = adaptedMarkdown;
  386. // markdownContent.value = res.data.markdown
  387. htmlContent.value = marked.parse(markdownContent.value);
  388. //k线
  389. chartData.value = {
  390. ...JSON.parse(JSON.stringify(historyData.value.stockData.chartData))
  391. }
  392. chartKey.value++;
  393. console.log('chartData', chartData.value);
  394. stockName.value = historyData.value.stockData.StockInformation.Name || 'Tesla Inc.'
  395. stockCode.value = historyData.value.stockData.StockInformation.Code || 'TSLA'
  396. stockTime.value = historyData.value.stockData.StockInformation.Time || '2025/10/29'
  397. stockChange.value = historyData.value.stockData.StockInformation.Zhang || '5.120%'
  398. stockAdd.value = historyData.value.stockData.StockInformation.ZhangFu || '22.410'
  399. stockPrice.value = historyData.value.stockData.StockInformation.Price || '435.900'
  400. }, {
  401. deep: true,
  402. immediate: true
  403. } // 开启深度监听(对象内部属性变化也能触发)
  404. )
  405. })
  406. // 页面加载时执行
  407. onLoad((e) => {
  408. if (e.index) {
  409. currentIndex.value = e.index - 1
  410. console.log('模块:', currentIndex.value)
  411. }
  412. if (e.stockName) {
  413. searchName.value = e.stockName
  414. console.log('股票名称:', searchName.value)
  415. }
  416. })
  417. </script>
  418. <style scoped lang="scss">
  419. .main {
  420. width: 100%;
  421. min-height: 100vh;
  422. background-color: #fff;
  423. padding-bottom: 120rpx;
  424. .search {
  425. position: relative;
  426. display: flex;
  427. align-items: center;
  428. background-color: #F3F3F3;
  429. width: calc(100% - 60rpx);
  430. height: 80rpx;
  431. border-radius: 50rpx;
  432. box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
  433. padding: 0 40rpx;
  434. margin: 15rpx 30rpx 0 30rpx;
  435. .seachIcon {
  436. position: absolute;
  437. right: 50rpx;
  438. width: 32rpx;
  439. height: 32rpx;
  440. }
  441. .searchInput {
  442. color: #111;
  443. }
  444. }
  445. .content {
  446. margin-top: 30rpx;
  447. padding-top: 30rpx;
  448. background-color: rgb(248, 248, 248);
  449. .select {
  450. position: relative;
  451. margin-bottom: -5rpx;
  452. .img {
  453. width: 750rpx;
  454. height: 198rpx;
  455. }
  456. .selectItem {
  457. .btn {
  458. position: absolute;
  459. width: 120rpx;
  460. height: 150rpx;
  461. background-color: transparent;
  462. &::after {
  463. border: none;
  464. }
  465. }
  466. &:nth-of-type(1) .btn {
  467. top: 30rpx;
  468. left: 60rpx;
  469. }
  470. &:nth-of-type(2) .btn {
  471. top: 30rpx;
  472. left: 230rpx;
  473. }
  474. &:nth-of-type(3) .btn {
  475. top: 30rpx;
  476. left: 400rpx;
  477. }
  478. &:nth-of-type(4) .btn {
  479. top: 30rpx;
  480. left: 570rpx;
  481. }
  482. }
  483. }
  484. .graphAndTxt {
  485. background-color: #fff;
  486. border-radius: 50rpx 50rpx 0 0;
  487. padding: 68.6rpx 36.5rpx 0 36.5rpx;
  488. .graph {
  489. border: 1rpx solid #e2e2e2;
  490. border-radius: 30rpx 30rpx 0 0;
  491. .graph_header {
  492. padding: 32rpx 20.5rpx 0 24rpx;
  493. display: flex;
  494. align-items: center;
  495. .left {
  496. color: #333333;
  497. font-family: "PingFang SC";
  498. font-size: 15px;
  499. font-style: normal;
  500. font-weight: 400;
  501. line-height: 15px;
  502. }
  503. .center {
  504. margin-left: 155rpx;
  505. display: flex;
  506. align-items: center;
  507. text {
  508. width: 160rpx;
  509. height: 36rpx;
  510. padding-left: 10rpx;
  511. color: #000000;
  512. white-space: nowrap;
  513. overflow: hidden;
  514. text-overflow: ellipsis;
  515. text-align: center;
  516. font-family: "PingFang SC";
  517. font-size: 18px;
  518. font-style: normal;
  519. font-weight: 500;
  520. line-height: 18px;
  521. }
  522. }
  523. .right {
  524. margin-left: 60rpx;
  525. color: #6a6a6a;
  526. font-family: "PingFang SC";
  527. font-size: 13px;
  528. font-style: normal;
  529. font-weight: 400;
  530. line-height: 15px;
  531. }
  532. }
  533. .graph_data {
  534. display: flex;
  535. padding: 48rpx 24rpx;
  536. text {
  537. display: flex;
  538. color: #25ba5d;
  539. font-family: "PingFang SC";
  540. font-size: 17px;
  541. line-height: 17px;
  542. }
  543. text:nth-child(2) {
  544. margin-left: 120rpx;
  545. }
  546. text:nth-child(3) {
  547. margin-left: 150rpx;
  548. }
  549. }
  550. .graph_content {
  551. min-height: 500rpx;
  552. .charts-box {
  553. width: 100%;
  554. height: 100%;
  555. }
  556. }
  557. }
  558. .txt {
  559. background-color: #F3F3F3;
  560. margin-top: 48rpx;
  561. border-radius: 30rpx;
  562. .txtHeader {
  563. padding: 30rpx 24rpx;
  564. image {
  565. width: 20rpx;
  566. height: 20rpx;
  567. }
  568. text {
  569. background-color: #FFFFFF;
  570. color: #000000;
  571. padding: 0 22rpx;
  572. border-radius: 22rpx;
  573. font-size: 28rpx;
  574. font-weight: 400;
  575. line-height: 37rpx;
  576. }
  577. }
  578. .txtContent {
  579. min-height: 200rpx;
  580. padding: 20rpx 30rpx;
  581. margin-bottom: 100rpx;
  582. ::v-deep * {
  583. box-sizing: border-box;
  584. width: 100% !important; // 强制所有解析后的标签占满容器宽度
  585. white-space: normal !important; // 取消强制不换行
  586. word-wrap: break-word !important; // 长词/长数字自动换行
  587. }
  588. // 标题样式(确保换行)
  589. ::v-deep h2 {
  590. font-size: 32rpx;
  591. color: #333;
  592. margin: 25rpx 0 15rpx;
  593. line-height: 1.5;
  594. }
  595. // 段落样式(核心换行控制)
  596. ::v-deep p {
  597. font-size: 26rpx;
  598. color: #666;
  599. margin: 15rpx 0;
  600. line-height: 1.8; // 增加行高,提升可读性
  601. text-align: justify; // 两端对齐,避免单侧参差不齐
  602. }
  603. // 列表样式(纵向排列)
  604. ::v-deep ul,
  605. ::v-deep ol {
  606. margin: 15rpx 0 15rpx 30rpx;
  607. }
  608. ::v-deep li {
  609. margin: 10rpx 0;
  610. line-height: 1.6;
  611. }
  612. // 加载状态样式
  613. .loading {
  614. text-align: center;
  615. padding: 50rpx 0;
  616. color: #666;
  617. font-size: 26rpx;
  618. }
  619. }
  620. }
  621. }
  622. }
  623. .static-footer {
  624. position: fixed;
  625. bottom: 0;
  626. width: 100%;
  627. }
  628. }
  629. * {
  630. box-sizing: border-box;
  631. }
  632. </style>