download.vue 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920
  1. <template>
  2. <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
  3. <cwg-header :title="t('Downloadpage.item1')" />
  4. <view id="custom_Downloadpage">
  5. <view class="main-content">
  6. <cwg-asset-tabs v-model="activeName" :tabs="tabsConfig" />
  7. <view v-if="activeName == 'MT4'">
  8. <view class="download-section">
  9. <view class="section-header">
  10. <view class="section-title" v-t="'Downloadpage.item2'" />
  11. <view class="section-subtitle" v-t="'Downloadpage.item3'" />
  12. </view>
  13. <view class="download-cards">
  14. <cwg-link type="download" class="download-card"
  15. :url="myLink + '/mt/cwgmarketssvgltd4setup.exe'"
  16. downloadName="cwgmarketssvgltd4setup.exe">
  17. <image class="card-icon" src="/static/images/windows-os-1-48.png" alt=""
  18. mode="widthFix" />
  19. <view class="card-info">
  20. <view class="card-title" v-t="'Downloadpage.item4'" />
  21. <view class="card-desc" v-t="'Downloadpage.item5'" />
  22. </view>
  23. <view class="download-badge">Windows</view>
  24. </cwg-link>
  25. <cwg-link type="download" class="download-card" :url="myLink + '/mt/mt4.zip'"
  26. downloadName="mt4.zip">
  27. <image class="card-icon" src="/static/images/windows-os-1-48.png" alt=""
  28. mode="widthFix" />
  29. <view class="card-info">
  30. <view class="card-title" v-t="'Downloadpage.item4-1'" />
  31. <view class="card-desc" v-t="'Downloadpage.item5'" />
  32. </view>
  33. <view class="download-badge">ZIP</view>
  34. </cwg-link>
  35. <cwg-link type="download" class="download-card" :url="myLink + '/mt/MetaTrader4.pkg'"
  36. downloadName="MetaTrader4.pkg">
  37. <image class="card-icon" src="/static/images/apple-os-1-48.png" alt=""
  38. mode="widthFix" />
  39. <view class="card-info">
  40. <view class="card-title" v-t="'Downloadpage.item6'" />
  41. <view class="card-desc" v-t="'Downloadpage.item5'" />
  42. </view>
  43. <view class="download-badge download-badge-apple">macOS</view>
  44. </cwg-link>
  45. </view>
  46. </view>
  47. <view class="download-section web-section">
  48. <view class="section-header">
  49. <view class="section-title" v-t="'Downloadpage.item38'" />
  50. </view>
  51. <view class="download-cards">
  52. <cwg-link type="html" class="download-card download-card-web" target="_blank"
  53. :url="'https://www.' + link + '.com/' + getLang(lang) + '/mt4/web'">
  54. <view class="card-info">
  55. <view class="card-title" v-t="'Downloadpage.item40'" />
  56. </view>
  57. <text class="icon-arrow">→</text>
  58. </cwg-link>
  59. </view>
  60. </view>
  61. <view class="download-section mobile-section">
  62. <view class="section-header">
  63. <view class="section-title" v-t="'Downloadpage.item7'" />
  64. </view>
  65. <view class="mobile-cards">
  66. <view class="mobile-card">
  67. <view class="mobile-card-header">
  68. <image class="card-icon" src="/static/images/android-os-3-72.png" alt=""
  69. mode="widthFix" />
  70. <view class="card-info">
  71. <view class="card-title" v-t="'Downloadpage.item8'" />
  72. <view class="card-desc" v-t="'Downloadpage.item9'" />
  73. </view>
  74. </view>
  75. <view class="qr-codes">
  76. <view class="qr-item">
  77. <view class="qr-label">Google Play</view>
  78. <QrCode :text="mt41" :logoImage="logoImage"></QrCode>
  79. </view>
  80. <view class="qr-item">
  81. <view class="qr-label">MetaTrader .Apk</view>
  82. <QrCode :text="mt42" :logoImage="logoImage"></QrCode>
  83. </view>
  84. </view>
  85. </view>
  86. <view class="mobile-card">
  87. <view class="mobile-card-header">
  88. <image class="card-icon" src="/static/images/apple-os-3-72.png" alt=""
  89. mode="widthFix" />
  90. <view class="card-info">
  91. <view class="card-title" v-t="'Downloadpage.item8'" />
  92. <view class="card-desc" v-t="'Downloadpage.item10'" />
  93. </view>
  94. </view>
  95. <view class="qr-codes qr-codes-single">
  96. <view class="qr-item">
  97. <view class="qr-label">App Store</view>
  98. <QrCode :text="mt43" :logoImage="logoImage"></QrCode>
  99. </view>
  100. </view>
  101. </view>
  102. </view>
  103. </view>
  104. </view>
  105. <view v-if="activeName == 'MT5'">
  106. <view class="download-section">
  107. <view class="section-header">
  108. <view class="section-title" v-t="'Downloadpage.item11'" />
  109. <view class="section-subtitle" v-t="'Downloadpage.item12'" />
  110. </view>
  111. <view class="download-cards">
  112. <cwg-link type="download" class="download-card"
  113. :url="myLink + '/mt/cwgmarketssvg5setup.exe'" downloadName="cwgmarketssvg5setup.exe">
  114. <image class="card-icon" src="/static/images/windows-os-1-48.png" alt=""
  115. mode="widthFix" />
  116. <view class="card-info">
  117. <view class="card-title" v-t="'Downloadpage.item4'" />
  118. <view class="card-desc" v-t="'Downloadpage.item5'" />
  119. </view>
  120. <view class="download-badge">Windows</view>
  121. </cwg-link>
  122. <cwg-link type="download" class="download-card" :url="myLink + '/mt/mt5.zip'"
  123. downloadName="mt5.zip">
  124. <image class="card-icon" src="/static/images/windows-os-1-48.png" alt=""
  125. mode="widthFix" />
  126. <view class="card-info">
  127. <view class="card-title" v-t="'Downloadpage.item4-1'" />
  128. <view class="card-desc" v-t="'Downloadpage.item5'" />
  129. </view>
  130. <view class="download-badge">ZIP</view>
  131. </cwg-link>
  132. <cwg-link type="download" class="download-card" :url="myLink + '/mt/MetaTrader5.pkg'"
  133. downloadName="MetaTrader5.dmg">
  134. <image class="card-icon" src="/static/images/apple-os-1-48.png" alt=""
  135. mode="widthFix" />
  136. <view class="card-info">
  137. <view class="card-title" v-t="'Downloadpage.item6'" />
  138. <view class="card-desc" v-t="'Downloadpage.item5'" />
  139. </view>
  140. <view class="download-badge download-badge-apple">macOS</view>
  141. </cwg-link>
  142. </view>
  143. </view>
  144. <view class="download-section web-section">
  145. <view class="section-header">
  146. <view class="section-title" v-t="'Downloadpage.item39'" />
  147. </view>
  148. <view class="download-cards">
  149. <cwg-link type="html" class="download-card download-card-web" target="_blank"
  150. :url="'https://www.' + link + '.com/' + getLang(lang) + '/mt5/web'">
  151. <view class="card-info">
  152. <view class="card-title" v-t="'Downloadpage.item40'" />
  153. </view>
  154. <text class="icon-arrow">→</text>
  155. </cwg-link>
  156. </view>
  157. </view>
  158. <view class="download-section mobile-section">
  159. <view class="section-header">
  160. <view class="section-title" v-t="'Downloadpage.item13'" />
  161. </view>
  162. <view class="mobile-cards">
  163. <view class="mobile-card">
  164. <view class="mobile-card-header">
  165. <image class="card-icon" src="/static/images/android-os-3-72.png" alt=""
  166. mode="widthFix" />
  167. <view class="card-info">
  168. <view class="card-title" v-t="'Downloadpage.item8'" />
  169. <view class="card-desc" v-t="'Downloadpage.item14'" />
  170. </view>
  171. </view>
  172. <view class="qr-codes">
  173. <view class="qr-item">
  174. <view class="qr-label">Google Play</view>
  175. <QrCode :text="mt51" :logoImage="logoImage"></QrCode>
  176. </view>
  177. <view class="qr-item">
  178. <view class="qr-label">MetaTrader .Apk</view>
  179. <QrCode :text="mt52" :logoImage="logoImage"></QrCode>
  180. </view>
  181. </view>
  182. </view>
  183. <view class="mobile-card">
  184. <view class="mobile-card-header">
  185. <image class="card-icon" src="/static/images/apple-os-3-72.png" alt=""
  186. mode="widthFix" />
  187. <view class="card-info">
  188. <view class="card-title" v-t="'Downloadpage.item8'" />
  189. <view class="card-desc" v-t="'Downloadpage.item15'" />
  190. </view>
  191. </view>
  192. <view class="qr-codes qr-codes-single">
  193. <view class="qr-item">
  194. <view class="qr-label">App Store</view>
  195. <QrCode :text="mt53" :logoImage="logoImage"></QrCode>
  196. </view>
  197. </view>
  198. </view>
  199. </view>
  200. </view>
  201. </view>
  202. <view v-if="activeName == 'Instruments'">
  203. <view class="instruments-banner">
  204. <view class="banner-content">
  205. <view class="banner-title" v-t="'Downloadpage.item18'" />
  206. <view class="banner-subtitle" v-t="'Downloadpage.item19'" />
  207. </view>
  208. <view class="banner-buttons">
  209. <cwg-link type="download" class="banner-btn" style="padding: 10px 25px;min-width: 220px;"
  210. url="https://mt.tradingcentral.cn/download"
  211. v-if="['cn', 'zhHant'].indexOf(Session.Get('lang')) != -1">
  212. <view v-t="'Downloadpage.item20'" />
  213. <view class="btn-tag">中国大陆用户</view>
  214. </cwg-link>
  215. <cwg-link type="download" class="banner-btn" style="padding: 10px 25px;min-width: 220px;"
  216. url="https://mt.tradingcentral.com/download"
  217. v-if="['cn', 'zhHant'].indexOf(Session.Get('lang')) != -1">
  218. <view v-t="'Downloadpage.item20'" />
  219. <view class="btn-tag">港澳台地区及海外用户</view>
  220. </cwg-link>
  221. <cwg-link type="download" class="banner-btn" url="https://mt.tradingcentral.com/download"
  222. v-if="['cn', 'zhHant'].indexOf(Session.Get('lang')) == -1">
  223. <span v-t="'Downloadpage.item20'"></span>
  224. </cwg-link>
  225. </view>
  226. </view>
  227. <view class="features-grid">
  228. <view class="feature-item">
  229. <view class="feature-icon">
  230. <i class="iconfenxi1 iconfont"></i>
  231. </view>
  232. <view class="feature-content">
  233. <view class="feature-title" v-t="'Downloadpage.item21'" />
  234. <view class="feature-desc" v-t="'Downloadpage.item22'" />
  235. </view>
  236. </view>
  237. <view class="feature-item">
  238. <view class="feature-icon">
  239. <i class="iconlazhutu iconfont"></i>
  240. </view>
  241. <view class="feature-content">
  242. <view class="feature-title" v-t="'Downloadpage.item23'" />
  243. <view class="feature-desc" v-t="'Downloadpage.item24'" />
  244. </view>
  245. </view>
  246. <view class="feature-item">
  247. <view class="feature-icon">
  248. <i class="iconzhibiao iconfont"></i>
  249. </view>
  250. <view class="feature-content">
  251. <view class="feature-title" v-t="'Downloadpage.item25'" />
  252. <view class="feature-desc" v-t="'Downloadpage.item26'" />
  253. </view>
  254. </view>
  255. </view>
  256. <view class="info-section">
  257. <view class="info-block">
  258. <view class="info-title"><span v-t="'Downloadpage.item27'"></span></view>
  259. <view class="info-content">
  260. <view class="info-item">
  261. <view v-t="'Downloadpage.item28'" class="info-label" />
  262. <view v-t="'Downloadpage.item29'" class="info-text" />
  263. </view>
  264. <view class="info-item info-item-border">
  265. <view v-t="'Downloadpage.item30'" class="info-label" />
  266. <view v-t="'Downloadpage.item31'" class="info-text" />
  267. </view>
  268. </view>
  269. </view>
  270. </view>
  271. <view class="info-section">
  272. <view class="info-block">
  273. <view class="info-title"><span v-t="'Downloadpage.item32'"></span></view>
  274. <view class="info-subtitle" v-t="'Downloadpage.item33'" />
  275. <view class="info-content">
  276. <view class="info-item">
  277. <view v-t="'Downloadpage.item34'" class="info-label" />
  278. <view v-t="'Downloadpage.item35'" class="info-text" />
  279. <view class="info-image">
  280. <image src="/static/images/tc-bg1.jpg" alt="" mode="widthFix" />
  281. </view>
  282. </view>
  283. <view class="info-item">
  284. <view v-t="'Downloadpage.item36'" class="info-label" />
  285. <view v-t="'Downloadpage.item37'" class="info-text" />
  286. </view>
  287. </view>
  288. </view>
  289. </view>
  290. </view>
  291. </view>
  292. </view>
  293. </cwg-page-wrapper>
  294. </template>
  295. <script setup lang="ts">
  296. import { ref, computed, onMounted } from 'vue'
  297. import QrCode from "@/components/QRCode.vue"
  298. // import logoImage from "@/assets/images/MTBG.jpg"
  299. import { useI18n } from 'vue-i18n'
  300. const { t, locale } = useI18n()
  301. // ---------- 存储辅助函数(模拟原 Session) ----------
  302. const Session = {
  303. Get(key: string, parse = false) {
  304. const value = uni.getStorageSync(key)
  305. if (parse && value) {
  306. try {
  307. return JSON.parse(value)
  308. } catch {
  309. return value
  310. }
  311. }
  312. return value
  313. }
  314. }
  315. // ---------- 响应式数据 ----------
  316. const activeName = ref('MT4')
  317. const link = ref('')
  318. const myLink = ref('')
  319. const logoImageRef = ref('') // 保持变量名 logoImage
  320. const mt41 = ref('https://www.metatrader4.com/en/download#download-block-android?server=CWGMarketsSVGLtd-Demo,CWGMarketsSVGLtd-Live')
  321. const mt42 = ref('') // 稍后动态计算
  322. const mt43 = ref('https://apps.apple.com/us/app/metatrader-4/id496212596?server=CWGMarketsSVGLtd-Demo,CWGMarketsSVGLtd-Live')
  323. const mt51 = ref('https://download.metatrader.com/cdn/mobile/mt5/android?server=CWGMarketsSVG-Demo,CWGMarketsSVG-Live')
  324. const mt52 = ref('')
  325. const mt53 = ref('https://download.metatrader.com/cdn/mobile/mt5/ios?server=CWGMarketsSVG-Demo,CWGMarketsSVG-Live')
  326. // ---------- 辅助函数:获取当前域名主体(兼容 H5) ----------
  327. const getDomainMain = () => {
  328. // 在 uni-app H5 环境下可使用 window.location
  329. // 若在其他环境(如 App 内嵌 webview)可能没有 window,这里做兼容
  330. if (typeof window !== 'undefined' && window.location && window.location.host) {
  331. const parts = window.location.host.split('.')
  332. return parts.length > 1 ? parts[1] : ''
  333. }
  334. // 降级方案:从配置或空字符串
  335. return ''
  336. }
  337. const getOrigin = () => {
  338. if (typeof window !== 'undefined' && window.location && window.location.origin) {
  339. return window.location.origin
  340. }
  341. return ''
  342. }
  343. const tabsConfig = computed(() => [
  344. { text: 'MT4', value: 'MT4' },
  345. { text: 'MT5', value: 'MT5' },
  346. ])
  347. // ---------- 计算属性 ----------
  348. const country = computed(() => {
  349. const user = Session.Get("user", true)
  350. return user?.customInfo?.country
  351. })
  352. const lang = computed(() => {
  353. return Session.Get('lang')
  354. })
  355. // ---------- 方法 ----------
  356. const getLang = (lang: string) => {
  357. let val = 'en'
  358. if (lang == 'cn') {
  359. val = 'cn'
  360. } else if (lang == 'zhHant') {
  361. val = 'zh'
  362. } else {
  363. val = 'en'
  364. }
  365. return val
  366. }
  367. // ---------- 生命周期 ----------
  368. onMounted(() => {
  369. // 计算动态链接
  370. const domainMain = getDomainMain()
  371. const origin = getOrigin()
  372. link.value = domainMain
  373. myLink.value = origin
  374. // 原 mt42 动态拼接
  375. mt42.value = `https://secure.${domainMain}.com/metatrader/metatrader4.apk`
  376. // 原 mt52 动态拼接
  377. mt52.value = `${origin}/mt/metatrader5.apk`
  378. })
  379. // 组件导出(可选,defineOptions 保留组件名)
  380. defineOptions({
  381. name: "custom_Downloadpage"
  382. })
  383. </script>
  384. <style lang="scss" scoped>
  385. @import "@/uni.scss";
  386. #custom_Downloadpage {
  387. width: 100%;
  388. height: 100%;
  389. .main-content {
  390. width: 100%;
  391. height: calc(100% - px2rpx(50));
  392. padding: px2rpx(10);
  393. box-sizing: border-box;
  394. overflow-y: auto;
  395. }
  396. .download-section {
  397. background: #fff;
  398. border-radius: px2rpx(12);
  399. padding: px2rpx(24) px2rpx(20);
  400. margin-bottom: px2rpx(16);
  401. box-shadow: 0 px2rpx(2) px2rpx(12) rgba(0, 0, 0, 0.06);
  402. .section-header {
  403. text-align: center;
  404. margin-bottom: px2rpx(24);
  405. }
  406. .section-title {
  407. font-size: px2rpx(20);
  408. font-weight: 600;
  409. color: #333;
  410. margin-bottom: px2rpx(8);
  411. }
  412. .section-subtitle {
  413. font-size: px2rpx(14);
  414. color: #666;
  415. line-height: 1.5;
  416. }
  417. }
  418. .download-cards {
  419. display: flex;
  420. justify-content: center;
  421. flex-wrap: wrap;
  422. gap: px2rpx(16);
  423. }
  424. .download-card {
  425. display: flex;
  426. flex-direction: column;
  427. align-items: center;
  428. padding: px2rpx(24) px2rpx(20);
  429. background: linear-gradient(135deg, #4990EF 0%, #3A7BE0 100%);
  430. color: #fff;
  431. border-radius: px2rpx(12);
  432. min-width: px2rpx(160);
  433. max-width: px2rpx(200);
  434. text-decoration: none;
  435. transition: all 0.3s ease;
  436. position: relative;
  437. overflow: hidden;
  438. &::before {
  439. content: '';
  440. position: absolute;
  441. top: 0;
  442. left: 0;
  443. right: 0;
  444. bottom: 0;
  445. background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, transparent 100%);
  446. }
  447. &:hover {
  448. transform: translateY(px2rpx(-4));
  449. box-shadow: 0 px2rpx(8) px2rpx(24) rgba(73, 144, 239, 0.35);
  450. }
  451. &:active {
  452. transform: translateY(px2rpx(-2));
  453. }
  454. .card-icon {
  455. width: px2rpx(48);
  456. height: px2rpx(48);
  457. margin-bottom: px2rpx(16);
  458. position: relative;
  459. z-index: 1;
  460. }
  461. .card-info {
  462. text-align: center;
  463. position: relative;
  464. z-index: 1;
  465. .card-title {
  466. font-size: px2rpx(15);
  467. font-weight: 500;
  468. margin-bottom: px2rpx(4);
  469. }
  470. .card-desc {
  471. font-size: px2rpx(12);
  472. opacity: 0.85;
  473. }
  474. }
  475. .download-badge {
  476. margin-top: px2rpx(12);
  477. padding: px2rpx(4) px2rpx(12);
  478. background: rgba(255, 255, 255, 0.2);
  479. border-radius: px2rpx(20);
  480. font-size: px2rpx(11);
  481. font-weight: 500;
  482. position: relative;
  483. z-index: 1;
  484. }
  485. .download-badge-apple {
  486. background: rgba(0, 0, 0, 0.25);
  487. }
  488. }
  489. .download-card-web {
  490. flex-direction: row;
  491. justify-content: space-between;
  492. padding: px2rpx(20) px2rpx(24);
  493. min-width: px2rpx(280);
  494. max-width: 100%;
  495. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  496. .card-info {
  497. text-align: left;
  498. }
  499. .icon-arrow {
  500. font-size: px2rpx(20);
  501. opacity: 0.9;
  502. }
  503. &:hover {
  504. .icon-arrow {
  505. transform: translateX(px2rpx(4));
  506. transition: transform 0.3s ease;
  507. }
  508. }
  509. }
  510. .mobile-section {
  511. .mobile-cards {
  512. display: flex;
  513. flex-direction: column;
  514. gap: px2rpx(20);
  515. }
  516. .mobile-card {
  517. background: #f8f9fa;
  518. border-radius: px2rpx(12);
  519. padding: px2rpx(20);
  520. border: px2rpx(1) solid #eee;
  521. }
  522. .mobile-card-header {
  523. display: flex;
  524. align-items: center;
  525. margin-bottom: px2rpx(20);
  526. .card-icon {
  527. width: px2rpx(40);
  528. height: px2rpx(40);
  529. margin-right: px2rpx(16);
  530. }
  531. .card-info {
  532. text-align: left;
  533. .card-title {
  534. font-size: px2rpx(16);
  535. font-weight: 600;
  536. color: #333;
  537. margin-bottom: px2rpx(4);
  538. }
  539. .card-desc {
  540. font-size: px2rpx(13);
  541. color: #666;
  542. }
  543. }
  544. }
  545. .qr-codes {
  546. display: flex;
  547. justify-content: space-around;
  548. flex-wrap: wrap;
  549. gap: px2rpx(16);
  550. &.qr-codes-single {
  551. justify-content: center;
  552. }
  553. }
  554. .qr-item {
  555. text-align: center;
  556. .qr-label {
  557. font-weight: 600;
  558. font-size: px2rpx(13);
  559. color: #333;
  560. margin-bottom: px2rpx(10);
  561. line-height: 2;
  562. }
  563. }
  564. }
  565. .instruments-banner {
  566. width: 100%;
  567. padding: px2rpx(40) px2rpx(20);
  568. background-image: url('/static/images/tc_bg.png');
  569. background-size: cover;
  570. background-repeat: no-repeat;
  571. background-position: center;
  572. color: #fff;
  573. text-align: center;
  574. border-radius: px2rpx(12);
  575. margin-bottom: px2rpx(16);
  576. box-sizing: border-box;
  577. .banner-content {
  578. margin-bottom: px2rpx(24);
  579. }
  580. .banner-title {
  581. font-size: px2rpx(22);
  582. font-weight: 600;
  583. margin-bottom: px2rpx(8);
  584. }
  585. .banner-subtitle {
  586. font-size: px2rpx(14);
  587. opacity: 0.9;
  588. }
  589. .banner-buttons {
  590. display: flex;
  591. justify-content: center;
  592. flex-wrap: wrap;
  593. gap: px2rpx(12);
  594. }
  595. .banner-btn {
  596. display: inline-flex;
  597. flex-direction: column;
  598. align-items: center;
  599. padding: px2rpx(14) px2rpx(25);
  600. background-color: #EB3F57;
  601. color: #fff;
  602. font-size: px2rpx(14);
  603. text-decoration: none;
  604. border-radius: px2rpx(8);
  605. transition: all 0.3s ease;
  606. min-width: px2rpx(200);
  607. &:hover {
  608. background-color: #d6364d;
  609. transform: translateY(px2rpx(-2));
  610. box-shadow: 0 px2rpx(4) px2rpx(12) rgba(235, 63, 87, 0.4);
  611. }
  612. .btn-tag {
  613. font-size: px2rpx(12);
  614. opacity: 0.85;
  615. margin-top: px2rpx(4);
  616. }
  617. }
  618. }
  619. .features-grid {
  620. background: #fff;
  621. border-radius: px2rpx(12);
  622. padding: px2rpx(24) px2rpx(20);
  623. margin-bottom: px2rpx(16);
  624. box-shadow: 0 px2rpx(2) px2rpx(12) rgba(0, 0, 0, 0.06);
  625. .feature-item {
  626. display: flex;
  627. align-items: center;
  628. padding: px2rpx(20) 0;
  629. border-bottom: px2rpx(1) solid #f0f0f0;
  630. &:last-child {
  631. border-bottom: none;
  632. }
  633. }
  634. .feature-icon {
  635. width: px2rpx(64);
  636. height: px2rpx(64);
  637. display: flex;
  638. align-items: center;
  639. justify-content: center;
  640. background: linear-gradient(135deg, #fef0f0 0%, #ffe8e8 100%);
  641. border-radius: px2rpx(12);
  642. margin-right: px2rpx(16);
  643. flex-shrink: 0;
  644. i {
  645. font-size: px2rpx(32);
  646. color: #EB3F57;
  647. }
  648. }
  649. .feature-content {
  650. flex: 1;
  651. }
  652. .feature-title {
  653. font-size: px2rpx(16);
  654. font-weight: 600;
  655. color: #333;
  656. margin-bottom: px2rpx(6);
  657. }
  658. .feature-desc {
  659. font-size: px2rpx(14);
  660. color: #666;
  661. line-height: 1.6;
  662. }
  663. }
  664. .info-section {
  665. background: #fff;
  666. border-radius: px2rpx(12);
  667. padding: px2rpx(24) px2rpx(20);
  668. margin-bottom: px2rpx(16);
  669. box-shadow: 0 px2rpx(2) px2rpx(12) rgba(0, 0, 0, 0.06);
  670. .info-block {
  671. .info-title {
  672. font-size: px2rpx(20);
  673. font-weight: 600;
  674. text-align: center;
  675. margin-bottom: px2rpx(20);
  676. span {
  677. border-bottom: px2rpx(3) solid #EB3F57;
  678. padding: 0 px2rpx(8) px2rpx(8);
  679. }
  680. }
  681. .info-subtitle {
  682. font-size: px2rpx(14);
  683. color: #666;
  684. text-align: center;
  685. margin-bottom: px2rpx(24);
  686. }
  687. }
  688. .info-content {
  689. .info-item {
  690. padding: px2rpx(20) 0;
  691. border-bottom: px2rpx(1) dashed #e0e0e0;
  692. &:last-child {
  693. border-bottom: none;
  694. }
  695. &.info-item-border {
  696. border-top: px2rpx(1) dashed #e0e0e0;
  697. }
  698. }
  699. .info-label {
  700. font-size: px2rpx(15);
  701. font-weight: 600;
  702. color: #333;
  703. margin-bottom: px2rpx(8);
  704. }
  705. .info-text {
  706. font-size: px2rpx(14);
  707. color: #666;
  708. line-height: 1.6;
  709. }
  710. .info-image {
  711. display: flex;
  712. justify-content: center;
  713. padding-top: px2rpx(24);
  714. image {
  715. max-width: 100%;
  716. border-radius: px2rpx(8);
  717. }
  718. }
  719. }
  720. }
  721. @media (max-width: 768px) {
  722. .download-section {
  723. padding: px2rpx(16) px2rpx(12);
  724. border-radius: px2rpx(8);
  725. .section-title {
  726. font-size: px2rpx(18);
  727. }
  728. }
  729. .download-cards {
  730. gap: px2rpx(12);
  731. }
  732. .download-card {
  733. min-width: px2rpx(140);
  734. padding: px2rpx(16) px2rpx(12);
  735. .card-icon {
  736. width: px2rpx(40);
  737. height: px2rpx(40);
  738. }
  739. .card-info {
  740. .card-title {
  741. font-size: px2rpx(13);
  742. }
  743. .card-desc {
  744. font-size: px2rpx(11);
  745. }
  746. }
  747. }
  748. .download-card-web {
  749. width: 100%;
  750. }
  751. .mobile-section {
  752. .mobile-card {
  753. padding: px2rpx(16);
  754. }
  755. .qr-codes {
  756. gap: px2rpx(12);
  757. }
  758. }
  759. .instruments-banner {
  760. padding: px2rpx(24) px2rpx(16);
  761. border-radius: px2rpx(8);
  762. .banner-title {
  763. font-size: px2rpx(18);
  764. }
  765. .banner-btn {
  766. min-width: px2rpx(160);
  767. padding: px2rpx(12) px2rpx(20);
  768. }
  769. }
  770. .features-grid {
  771. padding: px2rpx(16) px2rpx(12);
  772. border-radius: px2rpx(8);
  773. .feature-item {
  774. flex-direction: column;
  775. text-align: center;
  776. padding: px2rpx(16) 0;
  777. }
  778. .feature-icon {
  779. margin-right: 0;
  780. margin-bottom: px2rpx(12);
  781. }
  782. }
  783. .info-section {
  784. padding: px2rpx(16) px2rpx(12);
  785. border-radius: px2rpx(8);
  786. .info-block {
  787. .info-title {
  788. font-size: px2rpx(18);
  789. }
  790. }
  791. }
  792. }
  793. :deep(.el-tabs) {
  794. .el-tabs__header {
  795. margin-bottom: px2rpx(20);
  796. }
  797. .el-tabs__nav-wrap::after {
  798. height: px2rpx(1);
  799. }
  800. .el-tabs__item {
  801. font-size: px2rpx(15);
  802. color: #999;
  803. padding: 0 px2rpx(20);
  804. height: px2rpx(44);
  805. line-height: px2rpx(44);
  806. &.is-active {
  807. color: #4990EF;
  808. font-weight: 600;
  809. }
  810. }
  811. .el-tabs__active-bar {
  812. height: px2rpx(3);
  813. border-radius: px2rpx(3);
  814. }
  815. }
  816. :deep(uni-image),
  817. :deep(img) {
  818. width: px2rpx(30);
  819. height: px2rpx(30);
  820. object-fit: cover;
  821. border-radius: px2rpx(6);
  822. }
  823. }
  824. </style>