create-account.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805
  1. <template>
  2. <cwg-page-wrapper class="create-page " :isHeaderFixed="true">
  3. <view class="create-card">
  4. <view class="card-bottom user-form crm-form">
  5. <view class="tabs-class">
  6. <cwg-tabs v-model:cativeIndex="cativeIndex" :tabs="tabs" />
  7. </view>
  8. <uni-forms ref="baseForm" :model="formData" labelWidth="200" label-position="top" :rules="rules"
  9. class="base-info-form">
  10. <uni-row class="demo-uni-row uni-row1 uni-row2">
  11. <!-- MT4/MT5 -->
  12. <uni-col :xs="24">
  13. <uni-forms-item :label="t('Custom.NewAccount.Platform')">
  14. <cwg-combox :clearable="false" v-model:value="formData.platform"
  15. :options="platformColumns" :placeholder="t('placeholder.choose')" />
  16. </uni-forms-item>
  17. </uni-col>
  18. <!-- 货币类型 -->
  19. <uni-col :xs="24">
  20. <uni-forms-item :label="t('Custom.NewAccount.Currency')">
  21. <cwg-combox :clearable="false" v-model:value="formData.currency"
  22. :options="currencyColumns" :placeholder="t('placeholder.choose')" />
  23. </uni-forms-item>
  24. </uni-col>
  25. <!-- 杠杆 -->
  26. <uni-col :xs="24">
  27. <uni-forms-item :label="t('Custom.NewAccount.Lever')">
  28. <cwg-combox :clearable="false" :disabled="hidden" v-model:value="formData.leverage"
  29. :options="leverageColumns" :placeholder="t('placeholder.choose')" />
  30. </uni-forms-item>
  31. </uni-col>
  32. <!-- 账户余额 -->
  33. <uni-col :xs="24" v-if="dome">
  34. <uni-forms-item :label="t('Custom.NewAccount.Balance')">
  35. <uni-easyinput type="digit" :clearable="false" v-model="formData.balance"
  36. :placeholder="t('Custom.NewAccount.BalancePlaceholder')" />
  37. </uni-forms-item>
  38. </uni-col>
  39. <!-- 交易密码 -->
  40. <uni-col :xs="24">
  41. <uni-forms-item :label="t('Custom.NewAccount.Password')">
  42. <uni-easyinput :clearable="false" v-model="formData.password"
  43. :placeholder="t('Custom.NewAccount.Password')" />
  44. </uni-forms-item>
  45. </uni-col>
  46. <uni-col :xs="24">
  47. <view class="notice-list">
  48. <view v-for="(item, index) in noticeItems" :key="index"
  49. :class="['notice-item', item.valid ? 'isOK' : '']">
  50. {{ item.label }}
  51. </view>
  52. </view>
  53. </uni-col>
  54. <uni-col :xs="24">
  55. <view class="btn btn-confirm" @click="newAccount">{{ t('Btn.Application') }}</view>
  56. </uni-col>
  57. </uni-row>
  58. </uni-forms>
  59. </view>
  60. <view class="card-content">
  61. <text class="account-name" v-t="currentAccount?.name"></text>
  62. <!-- 点差信息 -->
  63. <view class="info-row">
  64. <view class="info-label">最低入金</view>
  65. <view class="info-value">{{ currentAccount?.minDeposit || '--' }}</view>
  66. </view>
  67. <!-- 点差信息 -->
  68. <view class="info-row">
  69. <view class="info-label">最小点差</view>
  70. <view class="info-value">{{ currentAccount?.minSpread || '--' }}</view>
  71. </view>
  72. <!-- 杠杆信息 -->
  73. <view class="info-row">
  74. <view class="info-label">最大杠杆</view>
  75. <view class="info-value">{{ currentAccount?.maxLeverage || '--' }}</view>
  76. </view>
  77. <view class="info-row">
  78. <view class="info-value"><a href="/static/pdf/PrivacyPolicy2019_01.pdf" target="_blank"
  79. v-t="'news_add_field.OpenAccount.Des2'"></a></view>
  80. </view>
  81. </view>
  82. </view>
  83. <!-- 提交后的弹出框 -->
  84. <uni-popup :show="dialogCheck" mode="center" round="16" @close="closeDia">
  85. <view class="dia-content" v-if="dialogVisible">
  86. <view class="icon">
  87. <text class="iconfont icon-success"></text>
  88. </view>
  89. <view class="des1">{{ t('ApplicationDialog.Des1') }}</view>
  90. <view class="des2">{{ t('ApplicationDialog.Des12') }}</view>
  91. <view class="dialog-footer">
  92. <uv-button type="primary" @click="closeDia">
  93. {{ t('Btn.Confirm') }}
  94. </uv-button>
  95. <uv-button @click="closeDia">
  96. {{ t('Btn.Cancel') }}
  97. </uv-button>
  98. </view>
  99. </view>
  100. <view class="dia-content" v-if="!dialogVisible">
  101. <view class="icon">
  102. <text class="iconfont icon-warning"></text>
  103. </view>
  104. <view class="des1">{{ RES }}</view>
  105. <view class="dialog-footer">
  106. <uv-button type="primary" @click="closeDia">
  107. {{ t('Btn.Confirm') }}
  108. </uv-button>
  109. <uv-button @click="closeDia">
  110. {{ t('Btn.Cancel') }}
  111. </uv-button>
  112. </view>
  113. </view>
  114. </uni-popup>
  115. <!-- 账户开立上限提示弹框 -->
  116. <uni-popup :show="dialogAccountLimit" mode="center" round="16" @close="closeAccountLimitDialog">
  117. <view class="account-limit-content">
  118. <view class="icon">
  119. <text class="iconfont icon-warning"></text>
  120. </view>
  121. <view class="title">{{ t('accountLimit.title') }}</view>
  122. <view class="content">
  123. <view class="limit-text">
  124. <view>{{ t('accountLimit.mt4Message') }}</view>
  125. <view>
  126. <view>{{ t('accountLimit.mt4Condition1') }}</view>
  127. </view>
  128. <view>{{ t('accountLimit.mt4Action') }}</view>
  129. </view>
  130. </view>
  131. <view class="dialog-footer">
  132. <uv-button type="primary" class="confirm-btn" @click="closeAccountLimitDialog">
  133. {{ t('accountLimit.button') }}
  134. </uv-button>
  135. </view>
  136. </view>
  137. </uni-popup>
  138. </cwg-page-wrapper>
  139. </template>
  140. <script setup>
  141. import { ref, reactive, computed, onMounted, watch, nextTick } from 'vue';
  142. import { onLoad } from '@dcloudio/uni-app';
  143. import { customApi } from "@/service/custom";
  144. import useUserStore from "@/stores/use-user-store";
  145. import useRouter from "@/hooks/useRouter";
  146. import { useI18n } from "vue-i18n";
  147. const router = useRouter();
  148. const { t, locale } = useI18n();
  149. const userStore = useUserStore();
  150. // 定义账户数据类型
  151. const standardAccounts = ref([
  152. {
  153. id: 7,
  154. type: 'StandardAccount',
  155. name: 'AccountType.StandardAccount',
  156. showCondition: () => showLogin.value.indexOf('7') === -1,
  157. description: 'Custom.NewAccount.DesLogin5',
  158. minDeposit: '50 USD',
  159. minSpread: '0.01',
  160. maxLeverage: '1:1000',
  161. icon: '/static/images/info/bank-information-1.webp',
  162. },
  163. {
  164. id: 2,
  165. type: 'SeniorAccount',
  166. name: 'AccountType.SeniorAccount',
  167. showCondition: () => showLogin.value.indexOf('2') === -1,
  168. description: 'Custom.NewAccount.DesLogin3',
  169. features: [
  170. { key: 'Custom.NewAccount.DesLogin31', condition: true },
  171. { key: 'Custom.NewAccount.DesLogin32', condition: true },
  172. { key: 'Custom.NewAccount.DesLogin33', condition: true },
  173. { key: 'Custom.NewAccount.DesLogin34', condition: true }
  174. ],
  175. minDeposit: '200 USD',
  176. minSpread: '0.01',
  177. maxLeverage: '1:2000',
  178. icon: '/static/images/info/bank-information-2.webp',
  179. },
  180. {
  181. id: 8,
  182. type: 'CentAccount',
  183. name: 'AccountType.CentAccount',
  184. showCondition: () => showLogin.value.indexOf('8') === -1 && isTimeShow.value,
  185. description: 'Custom.NewAccount.DesLogin8',
  186. features: [
  187. { key: 'Custom.NewAccount.DesLogin81', condition: true },
  188. { key: 'Custom.NewAccount.DesLogin82', condition: true },
  189. { key: 'Custom.NewAccount.DesLogin84', condition: true }
  190. ],
  191. minDeposit: '10 USD',
  192. minSpread: '0.01',
  193. maxLeverage: '1:1000',
  194. icon: '/static/images/info/bank-information-3.webp',
  195. }
  196. ])
  197. const cativeIndex = ref(0)
  198. const tabs = computed(() => ([
  199. { id: 'real', name: '真实' },
  200. { id: 'demo', name: '模拟' }
  201. ]))
  202. const currentAccount = computed(() => {
  203. // 从账户列表中查找匹配的账户
  204. const matched = standardAccounts.value.find(account => account.id == isOpenAccount.value);
  205. // 如果未找到,返回一个默认空对象或 null,模板中需做判空处理
  206. return matched || null;
  207. });
  208. // 数据定义
  209. const pictLoading = ref(false);
  210. const flag = ref(false);
  211. const RES = ref('');
  212. const dialogCheck = ref(false);
  213. const dialogVisible = ref(false);
  214. const showData = ref(null);
  215. const isOpenAccount = ref(0);
  216. const checked = ref('');
  217. const optionsLev = ref([]);
  218. const optionsCur = ref([]);
  219. const dome = ref(null);
  220. const showLogin = ref([]);
  221. const showPage = ref(false);
  222. const isTimeShow = ref(false);
  223. const dialogAccountLimit = ref(false);
  224. const limitPlatform = ref('');
  225. const hidden = ref(true);
  226. const ho = ref('');
  227. // 表单引用
  228. const formRef = ref(null);
  229. // 表单数据
  230. const formData = reactive({
  231. password: '',
  232. currency: '',
  233. leverage: '',
  234. platform: '',
  235. balance: null,
  236. });
  237. // 计算属性
  238. const rule1 = computed(() => {
  239. if (!formData.password) return false;
  240. return /^.{8,15}$/.test(formData.password);
  241. });
  242. const rule2 = computed(() => {
  243. return /^(?=.*?[a-z])(?=.*?[A-Z]).*$/.test(formData.password);
  244. });
  245. const rule3 = computed(() => {
  246. return /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?!.*([~!@&%$^\\(\\)#_]).*\\1.*\\1)[A-Za-z0-9~!@&%$^\\(\\)#_]{8,16}$/.test(
  247. formData.password
  248. );
  249. });
  250. const noticeItems = computed(() => [
  251. { label: t('signup.form.rules.1st'), valid: rule1.value },
  252. { label: t('signup.form.rules.2nd'), valid: rule2.value },
  253. { label: t('signup.form.rules.3rd'), valid: rule3.value }
  254. ])
  255. // 验证规则
  256. const rules = {
  257. password: [
  258. {
  259. validator: (rule, value, callback) => {
  260. if (/^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[~!@&%$^*./\\(\\)\\+\\=#_-])[A-Za-z0-9~!@&%$^*./\\(\\)\\+\\=#_-]{8,16}$/.test(value)) {
  261. callback();
  262. } else {
  263. callback(new Error(t('vaildate.password.format')));
  264. }
  265. },
  266. trigger: 'blur',
  267. required: true
  268. }
  269. ],
  270. platform: [
  271. {
  272. required: true,
  273. message: t('vaildate.select.empty'),
  274. trigger: 'change'
  275. }
  276. ],
  277. currency: [
  278. {
  279. required: true,
  280. message: t('vaildate.select.empty'),
  281. trigger: 'change'
  282. }
  283. ],
  284. leverage: [
  285. {
  286. required: true,
  287. message: t('vaildate.select.empty'),
  288. trigger: 'change'
  289. }
  290. ],
  291. balance: [
  292. {
  293. validator: (rule, value, callback) => {
  294. if (value === null || value === undefined || value === '') {
  295. callback();
  296. return;
  297. }
  298. const numValue = Number(value);
  299. if (isNaN(numValue)) {
  300. callback(new Error(t('vaildate.amount.format')));
  301. return;
  302. }
  303. if (numValue < 0 || numValue > 100000) {
  304. callback(new Error(t('vaildate.amount.amount') + '0-100000'));
  305. return;
  306. }
  307. callback();
  308. },
  309. trigger: ['blur', 'change']
  310. }
  311. ]
  312. };
  313. // 平台选项
  314. const platformColumns = computed(() => {
  315. const columns = [];
  316. if (showData.value && showData.value['mt4s'] && showData.value['mt4s'].length) {
  317. columns.push({ text: 'MT4', value: 'MT4' });
  318. }
  319. if (showData.value && showData.value['mt5s'] && showData.value['mt5s'].length) {
  320. columns.push({ text: 'MT5', value: 'MT5' });
  321. }
  322. return columns;
  323. });
  324. // 货币选项
  325. const currencyColumns = computed(() => {
  326. if (optionsCur.value.length) {
  327. return optionsCur.value.map(item => ({ text: item, value: item }));
  328. }
  329. return [];
  330. });
  331. // 杠杆选项
  332. const leverageColumns = computed(() => {
  333. if (optionsLev.value.length) {
  334. return optionsLev.value.map(item => ({ text: String(item), value: item }));
  335. }
  336. return [];
  337. });
  338. // 方法
  339. const closeDia = () => {
  340. if (formRef.value) {
  341. formRef.value.resetFields();
  342. }
  343. dialogCheck.value = false;
  344. dialogVisible.value = false;
  345. };
  346. const closeAccountLimitDialog = () => {
  347. dialogAccountLimit.value = false;
  348. limitPlatform.value = '';
  349. };
  350. const showAccountLimitDialog = (platform) => {
  351. limitPlatform.value = platform;
  352. dialogAccountLimit.value = true;
  353. };
  354. // 获取必要数据
  355. const getMustData = async (type, isDome) => {
  356. const api = isDome ? customApi.AccountApplyDataDome : customApi.AccountApplyData;
  357. const res = await api({
  358. type: type
  359. });
  360. if (res.code === 200) {
  361. showData.value = res.data;
  362. } else {
  363. uni.showToast({
  364. title: res.msg,
  365. icon: 'none'
  366. });
  367. }
  368. };
  369. // 获取显示权限
  370. const getExcludeShowLogin = async () => {
  371. pictLoading.value = true;
  372. const res = await customApi.excludeShowLogin({});
  373. if (res.code === 200) {
  374. showLogin.value = res.data?.excludeShowLoginTypes || [];
  375. showPage.value = true;
  376. pictLoading.value = false;
  377. } else {
  378. uni.showToast({
  379. title: res.msg,
  380. icon: 'none'
  381. });
  382. pictLoading.value = false;
  383. }
  384. };
  385. // 提交开户
  386. const newAccount = async () => {
  387. if (flag.value) return;
  388. flag.value = true;
  389. const api = dome.value ? customApi.AccountApplyAddDome : customApi.AccountApplyAdd;
  390. const res = await api({
  391. type: isOpenAccount.value,
  392. ...formData
  393. });
  394. if (res.code === 200) {
  395. if (dome.value) {
  396. uni.showToast({
  397. title: t('Msg.Success'),
  398. icon: 'success'
  399. });
  400. }
  401. router.push('/pages/customer/index')
  402. isOpenAccount.value = 0;
  403. dialogCheck.value = true;
  404. dialogVisible.value = true;
  405. if (formRef.value) {
  406. formRef.value.resetFields();
  407. }
  408. flag.value = false;
  409. } else if (res.code === 407) {
  410. showAccountLimitDialog(formData.platform);
  411. flag.value = false;
  412. } else {
  413. RES.value = res.msg;
  414. dialogCheck.value = true;
  415. dialogVisible.value = false;
  416. flag.value = false;
  417. }
  418. };
  419. // 选择平台
  420. const checkPlatform = (pla) => {
  421. if (pla === 'mt5s') {
  422. hidden.value = false;
  423. } else {
  424. hidden.value = true;
  425. }
  426. formData.currency = '';
  427. formData.leverage = '';
  428. optionsLev.value = [];
  429. optionsCur.value = [];
  430. const Cur = [];
  431. showData.value[pla].forEach((item) => {
  432. Cur.push(item.currency);
  433. });
  434. Cur.forEach((item) => {
  435. if (!optionsCur.value.includes(item)) {
  436. optionsCur.value.push(item);
  437. }
  438. });
  439. };
  440. watch(() => formData.platform, (newVal) => {
  441. if (newVal) {
  442. checkPlatform(newVal === 'MT4' ? 'mt4s' : 'mt5s');
  443. }
  444. });
  445. watch(() => formData.currency, (newVal) => {
  446. if (newVal && formData.platform) {
  447. checkCurrency(formData.platform, newVal);
  448. }
  449. });
  450. // 选择货币
  451. const checkCurrency = (pla, cur) => {
  452. formData.leverage = '';
  453. optionsLev.value = [];
  454. const platform = pla === 'MT4' ? 'mt4s' : 'mt5s';
  455. const list = [];
  456. showData.value[platform].forEach((item) => {
  457. if (item.currency === cur) {
  458. list.push(item.leverage);
  459. }
  460. });
  461. formData.leverage = list.reduce((a, b) => Math.max(a, b));
  462. optionsLev.value = list;
  463. };
  464. // 时间判断
  465. const isAfterJuly28 = () => {
  466. // 实现日期判断逻辑
  467. return false;
  468. };
  469. const isTimeShowType8 = () => {
  470. const endTime1 = '2024/9/25 00:00:00';
  471. const timezone = 2;
  472. const offset_GMT = new Date().getTimezoneOffset();
  473. const nowDate = new Date().getTime();
  474. const now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000).getTime();
  475. const end = new Date(endTime1).getTime();
  476. if (now > end) {
  477. isTimeShow.value = true;
  478. }
  479. };
  480. // 余额变化验证
  481. const handleBalanceChange = () => {
  482. if (formRef.value) {
  483. formRef.value.validateField('balance');
  484. }
  485. };
  486. // 打开链接
  487. const openLink = (path) => {
  488. uni.navigateTo({
  489. url: `/pages/webview/index?url=https://www.${ho.value}.com/${path}`
  490. });
  491. };
  492. // 打开PDF
  493. const openPdf = (path) => {
  494. uni.navigateTo({
  495. url: `/pages/webview/index?url=/pdf/${path}`
  496. });
  497. };
  498. // 监听balance变化
  499. watch(() => formData.balance, (newVal, oldVal) => {
  500. if (newVal !== oldVal && newVal !== null && newVal !== undefined) {
  501. nextTick(() => {
  502. if (formRef.value) {
  503. formRef.value.validateField('balance');
  504. }
  505. });
  506. }
  507. });
  508. watch(() => cativeIndex.value, (newVal) => {
  509. dome.value = newVal == 1
  510. });
  511. // 生命周期
  512. onLoad((e) => {
  513. dome.value = e.server == 'demo'
  514. cativeIndex.value = e.server == 'demo' ? 1 : 0
  515. isOpenAccount.value = e.id
  516. const host = window?.location?.host || '';
  517. ho.value = host.split('.')[1] || '';
  518. getExcludeShowLogin();
  519. getMustData(isOpenAccount.value, dome.value);
  520. isTimeShowType8();
  521. });
  522. onMounted(() => {
  523. // 挂载后的操作
  524. });
  525. </script>
  526. <style lang="scss" scoped>
  527. @import "@/uni.scss";
  528. .tit {
  529. text-align: center;
  530. font-size: px2rpx(30);
  531. font-weight: bold;
  532. color: var(--color-slate-900);
  533. margin: px2rpx(24) 0;
  534. }
  535. .des {
  536. color: var(--color-slate-900);
  537. font-size: px2rpx(14);
  538. line-height: 1.5;
  539. margin-bottom: px2rpx(24);
  540. text-align: center;
  541. }
  542. .box {
  543. margin-top: px2rpx(20);
  544. }
  545. .box-text {
  546. margin: px2rpx(20) 0;
  547. .text {
  548. font-size: px2rpx(14);
  549. line-height: px2rpx(24);
  550. text-align: center;
  551. }
  552. }
  553. .b-card {
  554. min-height: px2rpx(683);
  555. margin-bottom: px2rpx(20);
  556. position: relative;
  557. overflow: hidden;
  558. display: flex;
  559. align-items: center;
  560. flex-wrap: wrap;
  561. flex-direction: column;
  562. justify-content: center;
  563. .header {
  564. width: 100%;
  565. text-align: center;
  566. }
  567. .descending {
  568. margin: 0 auto;
  569. margin-top: px2rpx(32);
  570. min-height: px2rpx(160);
  571. .feature {
  572. display: flex;
  573. align-items: flex-start;
  574. justify-content: flex-start;
  575. margin-bottom: px2rpx(16);
  576. }
  577. .icon-success {
  578. display: flex;
  579. align-items: center;
  580. justify-content: center;
  581. width: px2rpx(24);
  582. height: px2rpx(24);
  583. margin-right: px2rpx(12);
  584. background-color: color-mix(in oklab, var(--color-success) 10%, transparent);
  585. }
  586. }
  587. .btn-bottom {
  588. width: 100%;
  589. display: flex;
  590. justify-content: center;
  591. color: var(--color-white);
  592. margin-top: px2rpx(32);
  593. gap: px2rpx(16);
  594. .btn-open {
  595. background-color: var(--color-secondary);
  596. padding: px2rpx(12) px2rpx(20);
  597. }
  598. .btn-try {
  599. background-color: var(--color-slate-150);
  600. color: var(--color-navy-800);
  601. padding: px2rpx(12) px2rpx(20);
  602. }
  603. }
  604. }
  605. :deep(.uni-row1) {
  606. .uni-col {
  607. padding: 0 10px !important;
  608. }
  609. .uni-forms-item {
  610. min-height: px2rpx(79);
  611. margin-bottom: px2rpx(10);
  612. }
  613. }
  614. .btn {
  615. width: 100%;
  616. display: flex;
  617. align-items: center;
  618. justify-content: center;
  619. padding: px2rpx(12) 0;
  620. background-color: var(--color-error);
  621. color: white;
  622. border: none;
  623. font-size: px2rpx(16);
  624. cursor: pointer;
  625. margin: px2rpx(24) 0;
  626. }
  627. .notice-list {
  628. // margin: px2rpx(10) 0;
  629. padding: 0 px2rpx(12) px2rpx(12) 0;
  630. .notice-item {
  631. font-size: px2rpx(14);
  632. color: var(--color-yellow-800);
  633. line-height: px2rpx(24);
  634. }
  635. .isOK {
  636. color: var(--color-success);
  637. }
  638. }
  639. .email-code {
  640. display: flex;
  641. align-items: flex-end;
  642. .email-code-item {
  643. flex: 1;
  644. }
  645. .btn-code {
  646. margin-bottom: px2rpx(18);
  647. width: auto;
  648. padding: px2rpx(10) px2rpx(16);
  649. }
  650. }
  651. .card-bottom {
  652. max-width: px2rpx(566);
  653. margin-top: px2rpx(20);
  654. .tabs-class {
  655. margin: 0 px2rpx(10) px2rpx(20) px2rpx(10);
  656. }
  657. }
  658. .create-card {
  659. display: flex;
  660. gap: px2rpx(30);
  661. justify-content: space-between;
  662. }
  663. @media (max-width: 992px) {
  664. .card-bottom {
  665. width: 100%;
  666. margin-top: px2rpx(20);
  667. }
  668. .create-card {
  669. display: flex;
  670. gap: px2rpx(30);
  671. flex-wrap: wrap;
  672. }
  673. }
  674. .card-content {
  675. margin-top: px2rpx(30);
  676. padding: px2rpx(16);
  677. width: px2rpx(300);
  678. .account-name {
  679. display: block;
  680. font-size: px2rpx(18);
  681. font-weight: 600;
  682. color: #1e2a3a;
  683. padding-bottom: px2rpx(16);
  684. padding-left: px2rpx(20);
  685. border-left: 1px solid #f0f2f5;
  686. }
  687. .info-row {
  688. padding-left: px2rpx(20);
  689. padding-bottom: px2rpx(12);
  690. border-left: 1px solid #f0f2f5;
  691. .info-label {
  692. font-size: px2rpx(15);
  693. line-height: px2rpx(30);
  694. color: #7f8c8d;
  695. }
  696. .info-value {
  697. font-size: px2rpx(14);
  698. font-weight: 500;
  699. color: #1e2a3a;
  700. }
  701. }
  702. .link-wrapper {
  703. display: flex;
  704. align-items: center;
  705. justify-content: flex-end;
  706. margin-top: px2rpx(8);
  707. padding-top: px2rpx(8);
  708. border-top: 1rpx solid #f0f2f5;
  709. .link-text {
  710. font-size: px2rpx(14);
  711. color: #007aff;
  712. margin-right: px2rpx(4);
  713. }
  714. .link-icon {
  715. font-size: px2rpx(14);
  716. color: #007aff;
  717. }
  718. }
  719. }
  720. </style>