download.vue 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. <template>
  2. <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
  3. <view class="container">
  4. <view
  5. class="app-page-head card-header d-flex gap-3 flex-wrap align-items-center justify-content-between border-0">
  6. <view class="app-page-head mb-0">
  7. <h1 class="app-page-title" v-t="'Downloadpage.item1'"></h1>
  8. </view>
  9. </view>
  10. <view class="col-lg-12">
  11. <view class="clearfix">
  12. <view class="card">
  13. <view class="card-header">
  14. <view class="nav nav-pills nav-fill card-header-pills">
  15. <view class="nav-item">
  16. <view class="nav-link cursor-pointer" :class="{ 'active': activeName == 'MT4' }"
  17. @click="activeName = 'MT4'">MetaTrader 4</view>
  18. </view>
  19. <view class="nav-item">
  20. <view class="nav-link cursor-pointer" :class="{ 'active': activeName == 'MT5' }"
  21. @click="activeName = 'MT5'">MetaTrader 5</view>
  22. </view>
  23. </view>
  24. </view>
  25. <view class="card-body">
  26. <view class="tab-content">
  27. <view v-if="activeName == 'MT4'">
  28. <view class="row">
  29. <view class="col-12">
  30. <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item2'" />
  31. <p class="mb-5 lh-sm" v-t="'Downloadpage.item3'" />
  32. </view>
  33. <view class="col-lg-4 mb-5">
  34. <cwg-link type="download"
  35. :url="config.Host80 + '/mt/cwgmarketssvgltd4setup.exe'"
  36. downloadName="cwgmarketssvgltd4setup.exe"
  37. title="Downloadpage.item4">
  38. <view class="card card-action action-elevate action-border-primary">
  39. <view class="row g-0">
  40. <view class="col-md-4">
  41. <view
  42. class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
  43. <image src="/static/images/vu/windows.png" alt=""
  44. mode="widthFix" class="img-fluid rounded" />
  45. </view>
  46. </view>
  47. <view class="col-md-8 py-3 d-flex flex-column">
  48. <view class="card-body px-3 py-2">
  49. <view class="badge badge-sm bg-danger mb-1">MT-4</view>
  50. <h4>
  51. <view class="text-dark" v-t="'Downloadpage.item4'" />
  52. </h4>
  53. <p v-t="'Downloadpage.item5'" />
  54. </view>
  55. </view>
  56. </view>
  57. </view>
  58. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  59. <!-- class="fi fi-rr-download"></i> {{-->
  60. <!-- t('Downloadpage.item6-1') }}</view>-->
  61. </cwg-link>
  62. </view>
  63. <view class="col-lg-4 mb-5">
  64. <cwg-link type="download" class="download-card"
  65. :url="config.Host80 + '/mt/mt4.zip'"
  66. downloadName="mt4.zip"
  67. title="Downloadpage.item4-1">
  68. <!-- <view class="btn btn-danger waves-effect waves-light">-->
  69. <!-- <i class="fi fi-rr-download"></i> {{-->
  70. <!-- t('Downloadpage.item6-1') }}-->
  71. <!-- </view>-->
  72. <view class="card card-action action-elevate action-border-primary">
  73. <view class="row g-0">
  74. <view class="col-md-4">
  75. <view
  76. class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
  77. <image src="/static/images/vu/windows.png" alt=""
  78. mode="widthFix" class="img-fluid rounded" />
  79. </view>
  80. </view>
  81. <view class="col-md-8 py-3 d-flex flex-column">
  82. <view class="card-body px-3 py-2">
  83. <view class="badge badge-sm bg-danger mb-1">MT-4</view>
  84. <h4>
  85. <view class="text-dark" v-t="'Downloadpage.item4-1'" />
  86. </h4>
  87. <p v-t="'Downloadpage.item5'" />
  88. </view>
  89. </view>
  90. </view>
  91. </view>
  92. </cwg-link>
  93. </view>
  94. <view class="col-lg-4 mb-5">
  95. <cwg-link type="download" class="download-card"
  96. :url="config.Host80 + '/mt/MetaTrader4.pkg'"
  97. downloadName="MetaTrader4.pkg"
  98. title="Downloadpage.item6">
  99. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  100. <!-- class="fi fi-rr-download"></i> {{-->
  101. <!-- t('Downloadpage.item6-1') }}</view>-->
  102. <view class="card card-action action-elevate action-border-primary">
  103. <view class="row g-0">
  104. <view class="col-md-4">
  105. <view
  106. class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
  107. <image src="/static/images/vu/ios.png" alt=""
  108. mode="widthFix" class="img-fluid rounded" />
  109. </view>
  110. </view>
  111. <view class="col-md-8 py-3 d-flex flex-column">
  112. <view class="card-body px-3 py-2">
  113. <view class="badge badge-sm bg-danger mb-1">MT-4</view>
  114. <h4>
  115. <view class="text-dark" v-t="'Downloadpage.item6'" />
  116. </h4>
  117. <p v-t="'Downloadpage.item5'" />
  118. </view>
  119. </view>
  120. </view>
  121. </view>
  122. </cwg-link>
  123. </view>
  124. <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item38'" />
  125. <view class="col-lg-4 mb-5">
  126. <cwg-link type="html" target="_blank"
  127. :url="'https://www.' + config.host + '.com/' + locale + '/vu-mt4-web-trading/web'"
  128. title="Downloadpage.item38">
  129. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  130. <!-- class="fi fi-rr-download"></i> 开始交易</view>-->
  131. <view class="card card-action action-elevate action-border-primary">
  132. <view class="row g-0">
  133. <view class="col-md-4">
  134. <view
  135. class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
  136. <image src="/static/images/vu/icon-windows-ios.png" alt=""
  137. mode="widthFix" class="img-fluid rounded" />
  138. </view>
  139. </view>
  140. <view class="col-md-8 py-3 d-flex flex-column">
  141. <view class="card-body px-3 py-2">
  142. <view class="badge badge-sm bg-danger mb-1">MT-4</view>
  143. <h4>
  144. <view class="text-dark" v-t="'Downloadpage.item40'" />
  145. </h4>
  146. <p>PC and macOS</p>
  147. </view>
  148. </view>
  149. </view>
  150. </view>
  151. </cwg-link>
  152. </view>
  153. <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item7'" />
  154. <view class="col-lg-6 mb-5">
  155. <cwg-link type="download" class="download-card" :url="mt41"
  156. downloadName="MetaTrader4.abb"
  157. title="Downloadpage.item9">
  158. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  159. <!-- class="fi fi-rr-download"></i> {{-->
  160. <!-- t('Downloadpage.item6-1') }}</view>-->
  161. <view class="card card-action action-elevate action-border-primary">
  162. <view class="row g-0">
  163. <view class="col-md-6">
  164. <view class="card-header border-0 download-qr-header position-relative">
  165. <QrCode :text="mt42" :width="qrSize" :height="qrSize" />
  166. <!-- <image src="/static/images/vu/android.png" alt=""
  167. mode="widthFix" class="img-fluid" /> -->
  168. </view>
  169. </view>
  170. <view class="col-md-6 py-3 d-flex flex-column">
  171. <view class="card-body px-3 py-2">
  172. <view class="badge badge-sm bg-danger mb-1">MT-4</view>
  173. <h4>
  174. <view class="text-dark">Google Play (Android)</view>
  175. </h4>
  176. <p>CWG MT4</p>
  177. </view>
  178. </view>
  179. </view>
  180. </view>
  181. </cwg-link>
  182. </view>
  183. <view class="col-lg-6 mb-5">
  184. <cwg-link type="download" class="download-card" :url="mt42"
  185. downloadName="MetaTrader4.apk"
  186. title="Downloadpage.item9">
  187. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  188. <!-- class="fi fi-rr-download"></i> {{-->
  189. <!-- t('Downloadpage.item6-1') }}</view>-->
  190. <view class="card card-action action-elevate action-border-primary">
  191. <view class="row g-0">
  192. <view class="col-md-6">
  193. <view class="card-header border-0 download-qr-header position-relative overflow-hidden">
  194. <QrCode :text="mt42" :width="qrSize" :height="qrSize" />
  195. <!-- <image src="/static/images/vu/metatrade.png" alt=""
  196. mode="widthFix" class="img-fluid" /> -->
  197. </view>
  198. </view>
  199. <view class="col-md-6 py-3 d-flex flex-column">
  200. <view class="card-body px-3 py-2">
  201. <view class="badge badge-sm bg-danger mb-1">MT-4</view>
  202. <h4>
  203. <view class="text-dark">MetaTrader .Apk</view>
  204. </h4>
  205. <p>CWG MT4</p>
  206. </view>
  207. </view>
  208. </view>
  209. </view>
  210. </cwg-link>
  211. </view>
  212. <view class="col-lg-6 mb-5">
  213. <cwg-link type="download" class="download-card" :url="mt43"
  214. downloadName="MetaTrader4.app"
  215. title="Downloadpage.item10">
  216. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  217. <!-- class="fi fi-rr-download"></i> {{-->
  218. <!-- t('Downloadpage.item6-1') }}</view>-->
  219. <view class="card card-action action-elevate action-border-primary">
  220. <view class="row g-0">
  221. <view class="col-md-6">
  222. <view class="card-header border-0 download-qr-header position-relative overflow-hidden">
  223. <QrCode :text="mt43" :width="qrSize" :height="qrSize" />
  224. <!-- <image src="/static/images/vu/ios-1.png" alt=""
  225. mode="widthFix" class="img-fluid" /> -->
  226. </view>
  227. </view>
  228. <view class="col-md-6 py-3 d-flex flex-column">
  229. <view class="card-body px-3 py-2">
  230. <view class="badge badge-sm bg-danger mb-1">MT-4</view>
  231. <h4>
  232. <view class="text-dark">App Store (IOS)</view>
  233. </h4>
  234. <p>CWG MT4</p>
  235. </view>
  236. </view>
  237. </view>
  238. </view>
  239. </cwg-link>
  240. </view>
  241. </view>
  242. </view>
  243. <view v-if="activeName == 'MT5'">
  244. <view class="row">
  245. <view class="col-12">
  246. <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item11'" />
  247. <p class="mb-5 lh-sm" v-t="'Downloadpage.item3'" />
  248. </view>
  249. <view class="col-lg-4 mb-5">
  250. <cwg-link type="download" class="download-card"
  251. :url="config.Host80 + '/mt/cwgmarketssvg5setup.exe'"
  252. downloadName="cwgmarketssvg5setup.exe"
  253. title="Downloadpage.item4">
  254. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  255. <!-- class="fi fi-rr-download"></i> {{-->
  256. <!-- t('Downloadpage.item6-1') }}</view>-->
  257. <view class="card card-action action-elevate action-border-primary">
  258. <view class="row g-0">
  259. <view class="col-md-4">
  260. <view
  261. class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
  262. <image src="/static/images/vu/windows.png" alt=""
  263. mode="widthFix" class="img-fluid rounded" />
  264. </view>
  265. </view>
  266. <view class="col-md-8 py-3 d-flex flex-column">
  267. <view class="card-body px-3 py-2">
  268. <view class="badge badge-sm bg-danger mb-1">MT-5</view>
  269. <h4>
  270. <view class="text-dark" v-t="'Downloadpage.item4'" />
  271. </h4>
  272. <p v-t="'Downloadpage.item5'" />
  273. </view>
  274. </view>
  275. </view>
  276. </view>
  277. </cwg-link>
  278. </view>
  279. <view class="col-lg-4 mb-5">
  280. <cwg-link type="download" class="download-card"
  281. :url="config.Host80 + '/mt/mt5.zip'"
  282. downloadName="mt5.zip"
  283. title="Downloadpage.item4-1">
  284. <!-- <view class="btn btn-danger waves-effect waves-light">-->
  285. <!-- <i class="fi fi-rr-download"></i> {{-->
  286. <!-- t('Downloadpage.item6-1') }}-->
  287. <!-- </view>-->
  288. <view class="card card-action action-elevate action-border-primary">
  289. <view class="row g-0">
  290. <view class="col-md-4">
  291. <view
  292. class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
  293. <image src="/static/images/vu/windows.png" alt=""
  294. mode="widthFix" class="img-fluid rounded" />
  295. </view>
  296. </view>
  297. <view class="col-md-8 py-3 d-flex flex-column">
  298. <view class="card-body px-3 py-2">
  299. <view class="badge badge-sm bg-danger mb-1">MT-5</view>
  300. <h4>
  301. <view class="text-dark" v-t="'Downloadpage.item4-1'" />
  302. </h4>
  303. <p v-t="'Downloadpage.item5'" />
  304. </view>
  305. </view>
  306. </view>
  307. </view>
  308. </cwg-link>
  309. </view>
  310. <view class="col-lg-4 mb-5">
  311. <cwg-link type="download" class="download-card"
  312. :url="config.Host80 + '/mt/MetaTrader5.pkg'"
  313. downloadName="MetaTrader5.pkg"
  314. title="Downloadpage.item6">
  315. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  316. <!-- class="fi fi-rr-download"></i> {{-->
  317. <!-- t('Downloadpage.item6-1') }}</view>-->
  318. <view class="card card-action action-elevate action-border-primary">
  319. <view class="row g-0">
  320. <view class="col-md-4">
  321. <view
  322. class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
  323. <image src="/static/images/vu/ios.png" alt=""
  324. mode="widthFix" class="img-fluid rounded" />
  325. </view>
  326. </view>
  327. <view class="col-md-8 py-3 d-flex flex-column">
  328. <view class="card-body px-3 py-2">
  329. <view class="badge badge-sm bg-danger mb-1">MT-5</view>
  330. <h4>
  331. <view class="text-dark" v-t="'Downloadpage.item6'" />
  332. </h4>
  333. <p v-t="'Downloadpage.item5'" />
  334. </view>
  335. </view>
  336. </view>
  337. </view>
  338. </cwg-link>
  339. </view>
  340. <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item39'" />
  341. <view class="col-lg-4 mb-5">
  342. <cwg-link type="html"
  343. class="download-card download-card-web" target="_blank"
  344. :url="'https://www.' + config.host + '.com/' + locale + '/mt5/web'"
  345. title="Downloadpage.item39">
  346. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  347. <!-- class="fi fi-rr-download"></i> 开始交易</view>-->
  348. <view class="card card-action action-elevate action-border-primary">
  349. <view class="row g-0">
  350. <view class="col-md-4">
  351. <view
  352. class="card-header border-0 p-0 m-2 position-relative overflow-hidden">
  353. <image src="/static/images/vu/icon-windows-ios.png" alt=""
  354. mode="widthFix" class="img-fluid rounded" />
  355. </view>
  356. </view>
  357. <view class="col-md-8 py-3 d-flex flex-column">
  358. <view class="card-body px-3 py-2">
  359. <view class="badge badge-sm bg-danger mb-1">MT-5</view>
  360. <h4>
  361. <view class="text-dark" v-t="'Downloadpage.item40'" />
  362. </h4>
  363. <p>PC and macOS</p>
  364. </view>
  365. </view>
  366. </view>
  367. </view>
  368. </cwg-link>
  369. </view>
  370. <h3 class="mb-3 fw-bold" v-t="'Downloadpage.item13'" />
  371. <view class="col-lg-6 mb-5">
  372. <cwg-link type="download" class="download-card" :url="mt51"
  373. downloadName="MetaTrader5.abb"
  374. title="Downloadpage.item14">
  375. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  376. <!-- class="fi fi-rr-download"></i> {{-->
  377. <!-- t('Downloadpage.item6-1') }}</view>-->
  378. <view class="card card-action action-elevate action-border-primary">
  379. <view class="row g-0">
  380. <view class="col-md-6">
  381. <view class="card-header border-0 download-qr-header position-relative">
  382. <QrCode :text="mt52" :width="qrSize" :height="qrSize" />
  383. <!-- <image src="/static/images/vu/android.png" alt=""
  384. mode="widthFix" class="img-fluid" /> -->
  385. </view>
  386. </view>
  387. <view class="col-md-6 py-3 d-flex flex-column">
  388. <view class="card-body px-3 py-2">
  389. <view class="badge badge-sm bg-danger mb-1">MT-5</view>
  390. <h4>
  391. <view class="text-dark">Google Play (Android)</view>
  392. </h4>
  393. <p>CWG MT5</p>
  394. </view>
  395. </view>
  396. </view>
  397. </view>
  398. </cwg-link>
  399. </view>
  400. <view class="col-lg-6 mb-5">
  401. <cwg-link type="download" class="download-card" :url="mt52"
  402. downloadName="MetaTrader5.apk"
  403. title="Downloadpage.item14">
  404. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  405. <!-- class="fi fi-rr-download"></i> {{-->
  406. <!-- t('Downloadpage.item6-1') }}</view>-->
  407. <view class="card card-action action-elevate action-border-primary">
  408. <view class="row g-0">
  409. <view class="col-md-6">
  410. <view class="card-header border-0 download-qr-header position-relative overflow-hidden">
  411. <QrCode :text="mt52" :width="qrSize" :height="qrSize" />
  412. <!-- <image src="/static/images/vu/metatrade.png" alt=""
  413. mode="widthFix" class="img-fluid" /> -->
  414. </view>
  415. </view>
  416. <view class="col-md-6 py-3 d-flex flex-column">
  417. <view class="card-body px-3 py-2">
  418. <view class="badge badge-sm bg-danger mb-1">MT-5</view>
  419. <h4>
  420. <view class="text-dark">MetaTrader .Apk</view>
  421. </h4>
  422. <p>CWG MT5</p>
  423. </view>
  424. </view>
  425. </view>
  426. </view>
  427. </cwg-link>
  428. </view>
  429. <view class="col-lg-6 mb-5">
  430. <cwg-link type="download" class="download-card" :url="mt53"
  431. downloadName="MetaTrader5.app"
  432. title="Downloadpage.item15">
  433. <!-- <view class="btn btn-danger waves-effect waves-light"><i-->
  434. <!-- class="fi fi-rr-download"></i> {{-->
  435. <!-- t('Downloadpage.item6-1') }}</view>-->
  436. <view class="card card-action action-elevate action-border-primary">
  437. <view class="row g-0">
  438. <view class="col-md-6">
  439. <view class="card-header border-0 download-qr-header position-relative overflow-hidden">
  440. <QrCode :text="mt53" :width="qrSize" :height="qrSize" />
  441. <!-- <image src="/static/images/vu/ios-1.png" alt=""
  442. mode="widthFix" class="img-fluid" /> -->
  443. </view>
  444. </view>
  445. <view class="col-md-6 py-3 d-flex flex-column">
  446. <view class="card-body px-3 py-2">
  447. <view class="badge badge-sm bg-danger mb-1">MT-5</view>
  448. <h4>
  449. <view class="text-dark">App Store (IOS)</view>
  450. </h4>
  451. <p>CWG MT5</p>
  452. </view>
  453. </view>
  454. </view>
  455. </view>
  456. </cwg-link>
  457. </view>
  458. </view>
  459. </view>
  460. </view>
  461. </view>
  462. </view>
  463. </view>
  464. </view>
  465. </view>
  466. </cwg-page-wrapper>
  467. </template>
  468. <script setup lang="ts">
  469. import { ref, computed, onMounted, nextTick } from 'vue'
  470. import QrCode from "@/components/QRCode.vue"
  471. import { useI18n } from 'vue-i18n'
  472. import config from '@/config';
  473. const { t, locale } = useI18n()
  474. const activeName = ref('MT4')
  475. const logoImageRef = ref('') // 保持变量名 logoImage
  476. const mt41 = ref('https://www.metatrader4.com/en/download#download-block-android?server=CWGMarketsSVGLtd-Demo,CWGMarketsSVGLtd-Live')
  477. const mt42 = ref(`${config.Host80}/metatrader/metatrader4.apk`) // 稍后动态计算
  478. const mt43 = ref('https://apps.apple.com/us/app/metatrader-4/id496212596?server=CWGMarketsSVGLtd-Demo,CWGMarketsSVGLtd-Live')
  479. const mt51 = ref('https://download.metatrader.com/cdn/mobile/mt5/android?server=CWGMarketsSVG-Demo,CWGMarketsSVG-Live')
  480. const mt52 = ref(`${config.Host80}/mt/metatrader5.apk`)
  481. const mt53 = ref('https://download.metatrader.com/cdn/mobile/mt5/ios?server=CWGMarketsSVG-Demo,CWGMarketsSVG-Live')
  482. const qrSize = 160
  483. const tabsConfig = computed(() => [
  484. { text: 'MT4', value: 'MT4' },
  485. { text: 'MT5', value: 'MT5' },
  486. ])
  487. // ---------- 计算属性 ----------
  488. const isZh = computed(() => ['cn', 'zh', 'zhHant'].includes(locale.value))
  489. const showQrcode = ref(false)
  490. onMounted(async () => {
  491. await nextTick()
  492. setTimeout(() => {
  493. showQrcode.value = true
  494. }, 200)
  495. })
  496. </script>
  497. <style lang="scss" scoped>
  498. @import "@/uni.scss";
  499. :deep(.nav-pills .nav-link.active) {
  500. color: #333;
  501. background-color: #FFF5F5;
  502. border: 1px solid #EE1C25;
  503. }
  504. .download-qr-header {
  505. padding: 12px 0;
  506. margin: 0;
  507. display: flex;
  508. align-items: center;
  509. justify-content: center;
  510. }
  511. /* 让 card 本身等高,但内部元素自适应 */
  512. .row {
  513. display: flex;
  514. flex-wrap: wrap;
  515. align-items: stretch;
  516. }
  517. .row > [class*="col-lg-4"] {
  518. display: flex;
  519. flex-direction: column;
  520. }
  521. .card {
  522. flex: 1;
  523. display: flex;
  524. flex-direction: column;
  525. height: 100%;
  526. }
  527. /* 关键修改:让 card-body 不强制占满,只保持默认 */
  528. .card-body {
  529. /* 移除 flex: 1,改为默认值 */
  530. flex: 0 0 auto;
  531. display: block;
  532. }
  533. /* 只有需要弹性填充的特定容器才使用 flex */
  534. .flex-column.d-flex {
  535. flex: 1;
  536. display: flex;
  537. flex-direction: column;
  538. }
  539. /* 按钮底部对齐只在需要的地方使用 */
  540. .card-body .btn {
  541. margin-top: auto;
  542. }
  543. @media screen and (max-width: 768px) {
  544. .img-fluid {
  545. max-width: px2rpx(120);
  546. }
  547. :deep(.qr-container) {
  548. justify-content: flex-start;
  549. }
  550. }
  551. #custom_Downloadpage {
  552. width: 100%;
  553. height: 100%;
  554. .main-content {
  555. width: 100%;
  556. height: calc(100% - px2rpx(50));
  557. padding: px2rpx(10);
  558. box-sizing: border-box;
  559. overflow-y: auto;
  560. }
  561. .download-section {
  562. background: transparent;
  563. border: 1px solid var(--bs-border-color);
  564. border-radius: px2rpx(12);
  565. padding: px2rpx(24) px2rpx(20);
  566. margin-bottom: px2rpx(16);
  567. box-shadow: 0 px2rpx(2) px2rpx(12) rgba(0, 0, 0, 0.06);
  568. .section-header {
  569. text-align: center;
  570. margin-bottom: px2rpx(24);
  571. }
  572. .section-title {
  573. font-size: px2rpx(20);
  574. font-weight: 600;
  575. color: var(--bs-heading-color);
  576. margin-bottom: px2rpx(8);
  577. }
  578. .section-subtitle {
  579. font-size: px2rpx(14);
  580. color: var(--bs-heading-color);
  581. line-height: 1.5;
  582. }
  583. }
  584. .download-cards {
  585. display: flex;
  586. justify-content: center;
  587. flex-wrap: wrap;
  588. gap: px2rpx(16);
  589. }
  590. .download-card {
  591. display: flex;
  592. flex-direction: column;
  593. align-items: center;
  594. padding: px2rpx(24) px2rpx(20);
  595. background: linear-gradient(135deg, #4990EF 0%, #3A7BE0 100%);
  596. color: #fff;
  597. border-radius: px2rpx(12);
  598. min-width: px2rpx(160);
  599. max-width: px2rpx(200);
  600. text-decoration: none;
  601. transition: all 0.3s ease;
  602. position: relative;
  603. overflow: hidden;
  604. &::before {
  605. content: '';
  606. position: absolute;
  607. top: 0;
  608. left: 0;
  609. right: 0;
  610. bottom: 0;
  611. background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, transparent 100%);
  612. }
  613. &:hover {
  614. transform: translateY(px2rpx(-4));
  615. box-shadow: 0 px2rpx(8) px2rpx(24) rgba(73, 144, 239, 0.35);
  616. }
  617. &:active {
  618. transform: translateY(px2rpx(-2));
  619. }
  620. .card-icon {
  621. width: px2rpx(48);
  622. height: px2rpx(48);
  623. margin-bottom: px2rpx(16);
  624. position: relative;
  625. z-index: 1;
  626. }
  627. .card-info {
  628. text-align: center;
  629. position: relative;
  630. z-index: 1;
  631. .card-title {
  632. font-size: px2rpx(15);
  633. font-weight: 500;
  634. margin-bottom: px2rpx(4);
  635. color: #fff;
  636. }
  637. .card-desc {
  638. font-size: px2rpx(12);
  639. opacity: 0.85;
  640. }
  641. }
  642. .download-badge {
  643. margin-top: px2rpx(12);
  644. padding: px2rpx(4) px2rpx(12);
  645. background: rgba(255, 255, 255, 0.2);
  646. border-radius: px2rpx(20);
  647. font-size: px2rpx(11);
  648. font-weight: 500;
  649. position: relative;
  650. z-index: 1;
  651. }
  652. .download-badge-apple {
  653. background: rgba(0, 0, 0, 0.25);
  654. }
  655. }
  656. .download-card-web {
  657. flex-direction: row;
  658. justify-content: space-between;
  659. padding: px2rpx(20) px2rpx(24);
  660. min-width: px2rpx(280);
  661. max-width: 100%;
  662. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  663. .card-info {
  664. text-align: left;
  665. }
  666. .icon-arrow {
  667. font-size: px2rpx(20);
  668. opacity: 0.9;
  669. }
  670. &:hover {
  671. .icon-arrow {
  672. transform: translateX(px2rpx(4));
  673. transition: transform 0.3s ease;
  674. }
  675. }
  676. }
  677. .mobile-section {
  678. .mobile-cards {
  679. display: flex;
  680. flex-direction: column;
  681. gap: px2rpx(20);
  682. }
  683. .mobile-card {
  684. background: transparent;
  685. border-radius: px2rpx(12);
  686. padding: px2rpx(20);
  687. border: px2rpx(1) solid var(--bs-border-color);
  688. }
  689. .mobile-card-header {
  690. display: flex;
  691. align-items: center;
  692. margin-bottom: px2rpx(20);
  693. .card-icon {
  694. width: px2rpx(40);
  695. height: px2rpx(40);
  696. margin-right: px2rpx(16);
  697. background-color: #fff;
  698. overflow: hidden;
  699. border-radius: px2rpx(10);
  700. }
  701. .card-info {
  702. text-align: left;
  703. .card-title {
  704. font-size: px2rpx(16);
  705. font-weight: 600;
  706. color: var(--bs-heading-color);
  707. margin-bottom: px2rpx(4);
  708. }
  709. .card-desc {
  710. font-size: px2rpx(13);
  711. color: var(--bs-heading-color);
  712. }
  713. }
  714. }
  715. .qr-codes {
  716. display: flex;
  717. justify-content: space-around;
  718. flex-wrap: wrap;
  719. gap: px2rpx(16);
  720. &.qr-codes-single {
  721. justify-content: center;
  722. }
  723. }
  724. .qr-item {
  725. text-align: center;
  726. .qr-label {
  727. font-weight: 600;
  728. font-size: px2rpx(13);
  729. color: var(--bs-heading-color);
  730. margin-bottom: px2rpx(10);
  731. line-height: 2;
  732. }
  733. }
  734. }
  735. .instruments-banner {
  736. width: 100%;
  737. padding: px2rpx(40) px2rpx(20);
  738. background-image: url('/static/images/tc_bg.png');
  739. background-size: cover;
  740. background-repeat: no-repeat;
  741. background-position: center;
  742. color: var(--bs-emphasis-color);
  743. text-align: center;
  744. border-radius: px2rpx(12);
  745. margin-bottom: px2rpx(16);
  746. box-sizing: border-box;
  747. .banner-content {
  748. margin-bottom: px2rpx(24);
  749. }
  750. .banner-title {
  751. font-size: px2rpx(22);
  752. font-weight: 600;
  753. margin-bottom: px2rpx(8);
  754. }
  755. .banner-subtitle {
  756. font-size: px2rpx(14);
  757. opacity: 0.9;
  758. }
  759. .banner-buttons {
  760. display: flex;
  761. justify-content: center;
  762. flex-wrap: wrap;
  763. gap: px2rpx(12);
  764. }
  765. .banner-btn {
  766. display: inline-flex;
  767. flex-direction: column;
  768. align-items: center;
  769. padding: px2rpx(14) px2rpx(25);
  770. background-color: #EB3F57;
  771. color: var(--bs-emphasis-color);
  772. font-size: px2rpx(14);
  773. text-decoration: none;
  774. border-radius: px2rpx(8);
  775. transition: all 0.3s ease;
  776. min-width: px2rpx(200);
  777. &:hover {
  778. background-color: #d6364d;
  779. transform: translateY(px2rpx(-2));
  780. box-shadow: 0 px2rpx(4) px2rpx(12) rgba(235, 63, 87, 0.4);
  781. }
  782. .btn-tag {
  783. font-size: px2rpx(12);
  784. opacity: 0.85;
  785. margin-top: px2rpx(4);
  786. }
  787. }
  788. }
  789. .features-grid {
  790. background: transparent;
  791. border: 1px solid var(--bs-border-color);
  792. border-radius: px2rpx(12);
  793. padding: px2rpx(24) px2rpx(20);
  794. margin-bottom: px2rpx(16);
  795. box-shadow: 0 px2rpx(2) px2rpx(12) rgba(0, 0, 0, 0.06);
  796. .feature-item {
  797. display: flex;
  798. align-items: center;
  799. padding: px2rpx(20) 0;
  800. border-bottom: px2rpx(1) solid #f0f0f0;
  801. &:last-child {
  802. border-bottom: none;
  803. }
  804. }
  805. .feature-icon {
  806. width: px2rpx(64);
  807. height: px2rpx(64);
  808. display: flex;
  809. align-items: center;
  810. justify-content: center;
  811. background: linear-gradient(135deg, #fef0f0 0%, #ffe8e8 100%);
  812. border-radius: px2rpx(12);
  813. margin-right: px2rpx(16);
  814. flex-shrink: 0;
  815. i {
  816. font-size: px2rpx(32);
  817. color: #EB3F57;
  818. }
  819. }
  820. .feature-content {
  821. flex: 1;
  822. }
  823. .feature-title {
  824. font-size: px2rpx(16);
  825. font-weight: 600;
  826. color: var(--bs-heading-color);
  827. margin-bottom: px2rpx(6);
  828. }
  829. .feature-desc {
  830. font-size: px2rpx(14);
  831. color: var(--bs-heading-color);
  832. line-height: 1.6;
  833. }
  834. }
  835. .info-section {
  836. background: transparent;
  837. border: 1px solid var(--bs-border-color);
  838. border-radius: px2rpx(12);
  839. padding: px2rpx(24) px2rpx(20);
  840. margin-bottom: px2rpx(16);
  841. box-shadow: 0 px2rpx(2) px2rpx(12) rgba(0, 0, 0, 0.06);
  842. .info-block {
  843. .info-title {
  844. font-size: px2rpx(20);
  845. font-weight: 600;
  846. text-align: center;
  847. margin-bottom: px2rpx(20);
  848. span {
  849. border-bottom: px2rpx(3) solid #EB3F57;
  850. padding: 0 px2rpx(8) px2rpx(8);
  851. }
  852. }
  853. .info-subtitle {
  854. font-size: px2rpx(14);
  855. color: var(--bs-heading-color);
  856. text-align: center;
  857. margin-bottom: px2rpx(24);
  858. }
  859. }
  860. .info-content {
  861. .info-item {
  862. padding: px2rpx(20) 0;
  863. border-bottom: px2rpx(1) dashed #e0e0e0;
  864. &:last-child {
  865. border-bottom: none;
  866. }
  867. &.info-item-border {
  868. border-top: px2rpx(1) dashed #e0e0e0;
  869. }
  870. }
  871. .info-label {
  872. font-size: px2rpx(15);
  873. font-weight: 600;
  874. color: var(--bs-heading-color);
  875. margin-bottom: px2rpx(8);
  876. }
  877. .info-text {
  878. font-size: px2rpx(14);
  879. color: var(--bs-heading-color);
  880. line-height: 1.6;
  881. }
  882. .info-image {
  883. display: flex;
  884. justify-content: center;
  885. padding-top: px2rpx(24);
  886. image {
  887. max-width: 100%;
  888. border-radius: px2rpx(8);
  889. }
  890. }
  891. }
  892. }
  893. @media (max-width: 768px) {
  894. .download-section {
  895. padding: px2rpx(16) px2rpx(12);
  896. border-radius: px2rpx(8);
  897. .section-title {
  898. font-size: px2rpx(18);
  899. }
  900. }
  901. .download-cards {
  902. gap: px2rpx(12);
  903. }
  904. .download-card {
  905. min-width: px2rpx(140);
  906. padding: px2rpx(16) px2rpx(12);
  907. .card-icon {
  908. width: px2rpx(40);
  909. height: px2rpx(40);
  910. }
  911. .card-info {
  912. .card-title {
  913. font-size: px2rpx(13);
  914. }
  915. .card-desc {
  916. font-size: px2rpx(11);
  917. }
  918. }
  919. }
  920. .download-card-web {
  921. width: 100%;
  922. }
  923. .mobile-section {
  924. .mobile-card {
  925. padding: px2rpx(16);
  926. }
  927. .qr-codes {
  928. gap: px2rpx(12);
  929. }
  930. }
  931. .instruments-banner {
  932. padding: px2rpx(24) px2rpx(16);
  933. border-radius: px2rpx(8);
  934. .banner-title {
  935. font-size: px2rpx(18);
  936. }
  937. .banner-btn {
  938. min-width: px2rpx(160);
  939. padding: px2rpx(12) px2rpx(20);
  940. }
  941. }
  942. .features-grid {
  943. padding: px2rpx(16) px2rpx(12);
  944. border-radius: px2rpx(8);
  945. .feature-item {
  946. flex-direction: column;
  947. text-align: center;
  948. padding: px2rpx(16) 0;
  949. }
  950. .feature-icon {
  951. margin-right: 0;
  952. margin-bottom: px2rpx(12);
  953. }
  954. }
  955. .info-section {
  956. padding: px2rpx(16) px2rpx(12);
  957. border-radius: px2rpx(8);
  958. .info-block {
  959. .info-title {
  960. font-size: px2rpx(18);
  961. }
  962. }
  963. }
  964. }
  965. :deep(.el-tabs) {
  966. .el-tabs__header {
  967. margin-bottom: px2rpx(20);
  968. }
  969. .el-tabs__nav-wrap::after {
  970. height: px2rpx(1);
  971. }
  972. .el-tabs__item {
  973. font-size: px2rpx(15);
  974. color: var(--bs-heading-color);
  975. padding: 0 px2rpx(20);
  976. height: px2rpx(44);
  977. line-height: px2rpx(44);
  978. &.is-active {
  979. color: #4990EF;
  980. font-weight: 600;
  981. }
  982. }
  983. .el-tabs__active-bar {
  984. height: px2rpx(3);
  985. border-radius: px2rpx(3);
  986. }
  987. }
  988. :deep(uni-image),
  989. :deep(img) {
  990. width: px2rpx(30);
  991. height: px2rpx(30);
  992. object-fit: cover;
  993. border-radius: px2rpx(6);
  994. }
  995. }
  996. .mt {
  997. width: px2rpx(200) !important;
  998. height: px2rpx(200) !important;
  999. }
  1000. :deep(.pdf-link){
  1001. width: 100%;
  1002. }
  1003. </style>