download.vue 33 KB

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