regist.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. <template>
  2. <cwg-page-wrapper isLoginPage>
  3. <view class="regist-content">
  4. <uni-row class="content">
  5. <uni-col :span="20" :offset="2" :sm="{ span: 14, offset: 5 }">
  6. <view class="regist-header">
  7. <text class="title">{{ t('signup.title') }}</text>
  8. <view class="login-link">
  9. <text class="text">{{ t('Label.Or') }}</text>
  10. <navigator url="/pages/login/index" class="link" hover-class="none">{{ t('signin.login') }}
  11. </navigator>
  12. </view>
  13. </view>
  14. <uni-forms ref="form" :modelValue="formData" :rules="rules" validate-trigger="blur" label-position="top"
  15. label-width="120">
  16. <uni-row :gutter="20" class="formContent">
  17. <uni-col :xs="24" :md="24">
  18. <uni-forms-item name="country" :label="t('newSignup.item3')">
  19. <cwg-combox v-model:value="formData.country" :options="countryOptions" filterable>
  20. </cwg-combox>
  21. </uni-forms-item>
  22. </uni-col>
  23. <uni-col :xs="24" :md="24">
  24. <uni-forms-item name="phone" :label="t('newSignup.item5')">
  25. <uni-easyinput v-model="formData.phone"></uni-easyinput>
  26. </uni-forms-item>
  27. </uni-col>
  28. <uni-col :xs="24" :md="24">
  29. <uni-forms-item name="birthDate" :label="t('newSignup.item18')">
  30. <uni-datetime-picker type="date" v-model="formData.birthDate"
  31. :placeholder="t('newSignup.item19')" @change="checkAge" />
  32. </uni-forms-item>
  33. </uni-col>
  34. <uni-col :xs="24" :md="24">
  35. <uni-forms-item name="email" :label="t('newSignup.item7')">
  36. <uni-easyinput v-model="formData.email"
  37. :placeholder="t('newSignup.item8')"
  38. :disabled="!isAgeValid || !formData.birthDate"></uni-easyinput>
  39. </uni-forms-item>
  40. </uni-col>
  41. <uni-col :xs="24" :md="24">
  42. <uni-forms-item name="emailCode" :label="t('newSignup.item9')">
  43. <uni-easyinput :disabled="!isAgeValid || !formData.birthDate"
  44. v-model="formData.emailCode" :placeholder="t('newSignup.item10')">
  45. <template #right>
  46. <view class="btn-code" @click="(!isAgeValid || !formData.birthDate) ? '' : handleGetCode()">
  47. {{ getCodeString }}
  48. </view>
  49. </template>
  50. </uni-easyinput>
  51. </uni-forms-item>
  52. </uni-col>
  53. <uni-col :xs="24" :md="24">
  54. <view class="agreemnet9">*{{ t('signup.agreemnet9') }}</view>
  55. </uni-col>
  56. <uni-col :xs="24" :md="24">
  57. <uni-forms-item name="password" :label="t('newSignup.item12')">
  58. <uni-easyinput v-model.trim="formData.password"
  59. :disabled="!isAgeValid || !formData.birthDate"
  60. :placeholder="t('newSignup.item13')" type="password"></uni-easyinput>
  61. </uni-forms-item>
  62. </uni-col>
  63. <uni-col :xs="24" :md="24">
  64. <uni-forms-item>
  65. <ul class="pwd">
  66. <li :class="{ fit: rule1 }" v-t="'signup.form.rules.1st'"></li>
  67. <li :class="{ fit: rule2 }" v-t="'signup.form.rules.2nd'"></li>
  68. <li :class="{ fit: rule3 }" v-t="'signup.form.rules.3rd'"></li>
  69. </ul>
  70. </uni-forms-item>
  71. </uni-col>
  72. <uni-col :xs="24" :md="24">
  73. <uni-forms-item v-if="!isRouteHasId" name="linkValue" :label="t('newSignup.item14')">
  74. <uni-easyinput v-model.trim="formData.linkValue"
  75. :disabled="!isAgeValid || !formData.birthDate"
  76. :placeholder="t('newSignup.item15')"
  77. @input="limitAgentIdLength"></uni-easyinput>
  78. </uni-forms-item>
  79. </uni-col>
  80. </uni-row>
  81. <uni-forms-item name="agree">
  82. <view class="check-box" @click="toggleAgree">
  83. <up-checkbox-group v-model="agreeGroup" @change="onAgreeChange">
  84. <up-checkbox size="14" labelSize="14" labelColor="#666666" activeColor="#ea002a"
  85. name="agree"
  86. class="wcg-checkbox"></up-checkbox>
  87. </up-checkbox-group>
  88. <text class="checkbox-label">{{ t('signup.agree') }}</text>
  89. </view>
  90. </uni-forms-item>
  91. <uni-forms-item name="isSubscribeEmail">
  92. <view class="check-box" @click="toggleSubscribeEmail">
  93. <up-checkbox-group v-model="subscribeEmailGroup" @change="onSubscribeEmailChange">
  94. <up-checkbox size="14" labelSize="14" labelColor="#666666" activeColor="#ea002a"
  95. name="subscribeEmail"
  96. class="wcg-checkbox"></up-checkbox>
  97. </up-checkbox-group>
  98. <text class="checkbox-label">{{ t('signup.agree1') }}</text>
  99. </view>
  100. </uni-forms-item>
  101. </uni-forms>
  102. <view>
  103. <u-button class="regiset-btn" @click="register">
  104. {{ t('signup.button') }}
  105. </u-button>
  106. </view>
  107. <view class="des-bottom">
  108. <text v-t="'signup.agreemnet1'"></text>
  109. <a @click="openUrl('pdf/Client_Agreement.pdf')" target="_blank" v-t="'signup.agreemnet2'"></a>
  110. <text v-t="'signup.agreemnet3'"></text>
  111. <a @click="openUrl('pdf/Terms&Conditions.pdf')" target="_blank" v-t="'signup.agreemnet4'"></a>
  112. <text v-t="'signup.agreemnet5'"></text>
  113. <a @click="openUrl('pdf/Privacy_Policy.pdf')" target="_blank" v-t="'signup.agreemnet6'"></a>
  114. <text v-t="'signup.agreemnet7'"></text>
  115. </view>
  116. <!-- <view class="or-title">-->
  117. <!-- <view class="line"></view>-->
  118. <!-- <view class="qr-tit2">OR</view>-->
  119. <!-- <view class="line"></view>-->
  120. <!-- </view>-->
  121. <!-- <uni-row :gutter="20">-->
  122. <!-- <uni-col :xs="24" :md="12">-->
  123. <!-- <u-button class="login-btn">-->
  124. <!-- {{ t('signup.button') }}-->
  125. <!-- </u-button>-->
  126. <!-- </uni-col>-->
  127. <!-- <uni-col :xs="24" :md="12">-->
  128. <!-- <u-button class="login-btn">-->
  129. <!-- {{ t('signup.button') }}-->
  130. <!-- </u-button>-->
  131. <!-- </uni-col>-->
  132. <!-- </uni-row>-->
  133. </uni-col>
  134. </uni-row>
  135. </view>
  136. <!-- <cwg-custom-footer />-->
  137. </cwg-page-wrapper>
  138. </template>
  139. <script setup>
  140. import { ref, watch, onMounted, computed } from 'vue'
  141. import { useI18n } from 'vue-i18n'
  142. import { useEmailCountdown } from '@/hooks/useEmailCountdown'
  143. import { loginApi } from '@/api/login'
  144. import { systemApi } from '@/api/system'
  145. import Config from '@/config/index'
  146. import { showToast } from '@/utils/toast'
  147. import { onLoad } from '@dcloudio/uni-app'
  148. import useUserStore from '@/stores/use-user-store'
  149. import { userToken } from '@/composables/config'
  150. import { userApi } from '@/api/user'
  151. import { openLocalPdf } from '@/utils/pdf.js'
  152. const { t } = useI18n()
  153. const userStore = useUserStore()
  154. const {
  155. time,
  156. text: getCodeString,
  157. canSend,
  158. start,
  159. restore,
  160. } = useEmailCountdown()
  161. const isRouteHasId = ref(false)
  162. const formData = ref({
  163. country: '',
  164. phone: '',
  165. birthDate: '',
  166. email: '',
  167. code: '',
  168. password: '',
  169. linkValue: '',
  170. agree: 0,
  171. isSubscribeEmail: 0,
  172. sourceCode: null,
  173. w: '',
  174. subId: '',
  175. oc: '',
  176. agentId: null,
  177. ibInvalid: null,
  178. })
  179. const rules = {
  180. country: { rules: [{ required: true, errorMessage: t('vaildate.country.empty'), trigger: 'blur' }] },
  181. email: {
  182. rules: [
  183. { required: true, errorMessage: t('vaildate.email.empty'), trigger: 'blur' },
  184. { pattern: Config.Pattern.Email, errorMessage: t('vaildate.email.format'), trigger: 'blur' },
  185. ],
  186. },
  187. emailCode: { rules: [{ required: true, errorMessage: t('vaildate.code.empty'), trigger: 'blur' }] },
  188. password: {
  189. rules: [
  190. { required: true, errorMessage: t('vaildate.password.format'), trigger: 'blur' },
  191. { pattern: Config.Pattern.Password, errorMessage: t('vaildate.password.format'), trigger: 'blur' },
  192. ],
  193. },
  194. agree: {
  195. rules: [
  196. {
  197. validateFunction: (rule, value) => {
  198. if (value) return true
  199. return t('vaildate.agree.empty')
  200. },
  201. trigger: 'change',
  202. },
  203. ],
  204. },
  205. phone: {
  206. rules: [
  207. { required: true, errorMessage: t('vaildate.phone.format'), trigger: 'blur' },
  208. { pattern: Config.Pattern.NonNegInt, errorMessage: t('vaildate.phone.format'), trigger: 'blur' },
  209. ],
  210. },
  211. birthDate: { rules: [{ required: true, errorMessage: t('vaildate.birthDate.empty'), trigger: 'change' }] },
  212. }
  213. const agreeGroup = ref([])
  214. const subscribeEmailGroup = ref([])
  215. watch(() => formData.value.agree, (val) => {
  216. agreeGroup.value = val === 1 ? ['agree'] : []
  217. }, { immediate: true })
  218. watch(() => formData.value.isSubscribeEmail, (val) => {
  219. subscribeEmailGroup.value = val === 1 ? ['subscribeEmail'] : []
  220. }, { immediate: true })
  221. const onAgreeChange = (e) => {
  222. formData.value.agree = e && e.length ? 1 : 0
  223. }
  224. const onSubscribeEmailChange = (e) => {
  225. formData.value.isSubscribeEmail = e && e.length ? 1 : 0
  226. }
  227. const toggleAgree = () => {
  228. const next = agreeGroup.value.length ? [] : ['agree']
  229. agreeGroup.value = next
  230. onAgreeChange(next)
  231. }
  232. const toggleSubscribeEmail = () => {
  233. const next = subscribeEmailGroup.value.length ? [] : ['subscribeEmail']
  234. subscribeEmailGroup.value = next
  235. onSubscribeEmailChange(next)
  236. }
  237. const rule1 = computed(() => {
  238. if (!formData.value.password) return false
  239. return /^.{8,16}$/.test(formData.value.password)
  240. })
  241. const rule2 = computed(() => {
  242. return /^(?=.*?[a-z])(?=.*?[A-Z]).*$/.test(formData.value.password)
  243. })
  244. const rule3 = computed(() => {
  245. return /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?!.*([~!@&%$^\(\)#_]).*\1.*\1)[A-Za-z0-9~!@&%$^\(\)#_]{8,16}$/.test(
  246. formData.value.password,
  247. )
  248. })
  249. const openUrl = (url) => {
  250. openLocalPdf(url)
  251. }
  252. // 检查是否满18周岁
  253. const isAgeValid = computed(() => {
  254. if (!formData.value.birthDate) {
  255. return false // 如果还没选择日期,不允许继续
  256. }
  257. const today = new Date()
  258. const birthDate = new Date(formData.value.birthDate)
  259. let age = today.getFullYear() - birthDate.getFullYear()
  260. const monthDiff = today.getMonth() - birthDate.getMonth()
  261. if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
  262. age--
  263. }
  264. return age >= 18
  265. })
  266. // 检查年龄并提示
  267. const checkAge = () => {
  268. if (formData.value.birthDate && !isAgeValid.value) {
  269. uni.showModal({
  270. title: t('Msg.SystemPrompt'),
  271. content: t('signup.ageRestriction'),
  272. showCancel: false,
  273. confirmText: t('Btn.Confirm'),
  274. success: function(res) {
  275. if (res.confirm) {
  276. // 用户点击确认后的操作
  277. }
  278. },
  279. })
  280. }
  281. }
  282. const limitAgentIdLength = (val) => {
  283. if (val == null || val === '') return
  284. // 推荐码只能输入数字和英文
  285. const filtered = val.toString().replace(/[^0-9a-zA-Z]/g, '').slice(0, 10)
  286. if (formData.value.linkValue !== filtered) {
  287. formData.value.linkValue = filtered
  288. }
  289. }
  290. onLoad((options) => {
  291. if (options) {
  292. formData.value.sourceCode = options.ex || null
  293. formData.value.w = options.w || ''
  294. formData.value.subId = options.SUBID || ''
  295. formData.value.oc = options.oc || ''
  296. formData.value.email = options.emailAdvertisement || ''
  297. console.log(options, '-----')
  298. if (options.id) {
  299. isRouteHasId.value = true
  300. formData.value.agentId = Number(options.id)
  301. formData.value.linkValue = options.commission || ''
  302. switch (options.ibInvalid) {
  303. case 'B0':
  304. formData.value.ibInvalid = 0
  305. break
  306. case 'B1':
  307. formData.value.ibInvalid = 1
  308. break
  309. }
  310. }
  311. }
  312. })
  313. const ho = ref('')
  314. // 账号类型
  315. const accountType = ref(1)
  316. const form = ref(null)
  317. const value = ref('')
  318. const mock_options = ref([])
  319. const countryCode = ref('')
  320. const countryOptions = computed(() => {
  321. return mock_options.value.map(item => ({
  322. text: item.name,
  323. value: item.code,
  324. disabled: item.isOpenAccount == 0 || item.isOpenAccount === null ? true : false,
  325. }))
  326. })
  327. watch(value, (newValue, oldValue) => {
  328. // console.log('v-model', newValue);
  329. })
  330. async function getCountry() {
  331. try {
  332. let res = await systemApi.countryGet({})
  333. if (res.code == 200) { // Code.StatusOK
  334. mock_options.value = res.data
  335. countryCode.value = res.msg
  336. } else {
  337. showToast(res.msg)
  338. }
  339. } catch (error) {
  340. console.error(error)
  341. }
  342. }
  343. // 获取验证码按钮点击
  344. async function handleGetCode() {
  345. if (!formData.value.birthDate) {
  346. showToast(t('vaildate.birthDate.empty'))
  347. return
  348. }
  349. if (!isAgeValid.value) {
  350. showToast(t('signup.ageRestriction'))
  351. return
  352. }
  353. if (!formData.value.country) {
  354. showToast(t('vaildate.country.empty'))
  355. return
  356. }
  357. if (!formData.value.email) {
  358. showToast(t('vaildate.email.empty'))
  359. return
  360. }
  361. if (!Config.Pattern.Email.test(formData.value.email)) {
  362. showToast(t('vaildate.email.format'))
  363. return
  364. }
  365. if (!canSend.value) return
  366. await sendEmailCode()
  367. }
  368. // 发送邮箱验证码
  369. async function sendEmailCode() {
  370. const res = await loginApi.Code({
  371. ...formData.value,
  372. })
  373. if (res.code === 200) {
  374. showToast(t('Msg.CodeSuccess'))
  375. start()
  376. return true
  377. } else {
  378. showToast(t('Msg.CodeFail'))
  379. return false
  380. }
  381. }
  382. const register = async () => {
  383. if (countryCode.value == 'MY' || countryCode.value == 'ID') {
  384. status.value = true
  385. return
  386. }
  387. console.log(123333)
  388. form.value.validate().then(async (res) => {
  389. // 中国(含港澳台)使用 X-System: B,非中国使用 X-System: A
  390. const chinaCountryCodes = ['CN']
  391. const isChina = chinaCountryCodes.includes(formData.value.country)
  392. const xSystemValue = isChina ? 'B' : 'A'
  393. let resData = await loginApi.Register(
  394. { ...formData.value },
  395. { headers: { 'X-System': xSystemValue } },
  396. )
  397. console.log(resData)
  398. if (resData.code == 200) { // Code.StatusOK
  399. showToast(t('Msg.registerSuc'))
  400. login()
  401. } else {
  402. console.log(123)
  403. showToast(resData.msg)
  404. }
  405. }).catch(err => {
  406. console.log('表单错误信息:', err)
  407. showToast(err.msg)
  408. return false
  409. })
  410. }
  411. const login = async () => {
  412. try {
  413. let res = await userApi.login({
  414. loginName: formData.value.email,
  415. password: formData.value.password,
  416. })
  417. if (res.code == 200) { // Code.StatusOK
  418. userToken.value = res.data
  419. getLoginInfo()
  420. } else {
  421. showToast(res.msg)
  422. }
  423. } catch (error) {
  424. console.error(error)
  425. }
  426. }
  427. const getLoginInfo = async () => {
  428. try {
  429. let res = await userApi.getUserInfo()
  430. if (res.code == 200) { // Code.StatusOK
  431. userStore.saveUserInfo(res.data)
  432. showToast(t('Msg.LoginSuccess'))
  433. setTimeout(() => {
  434. uni.reLaunch({
  435. url: '/pages/customer/index',
  436. })
  437. // this.$store.commit("isActiveTab", "0"); (可能需要适配相应的逻辑)
  438. }, 1000)
  439. } else {
  440. showToast(t('Msg.SystemError'))
  441. }
  442. } catch (error) {
  443. console.error(error)
  444. }
  445. }
  446. onMounted(() => {
  447. getCountry()
  448. const hostParts = window.location.host.split('.')
  449. ho.value = hostParts.length > 1 ? hostParts[1] : ''
  450. })
  451. </script>
  452. <style lang="scss"> .pwd {
  453. list-style: none;
  454. padding-left: 0;
  455. margin: 0;
  456. li {
  457. font-size: px2rpx(12);
  458. color: #999;
  459. line-height: px2rpx(20);
  460. position: relative;
  461. padding-left: px2rpx(16);
  462. &::before {
  463. content: '';
  464. position: absolute;
  465. left: 0;
  466. top: 50%;
  467. transform: translateY(-50%);
  468. width: px2rpx(6);
  469. height: px2rpx(6);
  470. border-radius: 50%;
  471. background-color: #999;
  472. }
  473. &.fit {
  474. color: #67c23a;
  475. &::before {
  476. background-color: #67c23a;
  477. }
  478. }
  479. }
  480. }
  481. </style>
  482. <style lang="scss" scoped>
  483. @import "@/uni.scss";
  484. :deep(uni-content) {
  485. padding-left: 0 !important;
  486. }
  487. .regist-page {
  488. height: 100vh;
  489. border: none;
  490. padding: 0;
  491. }
  492. .regist-content {
  493. display: flex;
  494. align-items: center;
  495. justify-content: center;
  496. }
  497. .content {
  498. width: px2rpx(650);
  499. margin: 0 auto;
  500. }
  501. .regist-header {
  502. display: flex;
  503. justify-content: space-between;
  504. align-items: flex-end;
  505. margin: px2rpx(40) 0 px2rpx(20);
  506. padding-bottom: px2rpx(10);
  507. .title {
  508. font-size: px2rpx(28);
  509. font-weight: bold;
  510. color: #141d22;
  511. line-height: 1;
  512. }
  513. .login-link {
  514. font-size: px2rpx(14);
  515. color: #141d22;
  516. display: flex;
  517. align-items: center;
  518. line-height: 1;
  519. .text {
  520. margin-right: px2rpx(4);
  521. }
  522. .link {
  523. color: #005bbb;
  524. text-decoration: none;
  525. border-bottom: 1px dashed #005bbb;
  526. padding-bottom: 2px;
  527. cursor: pointer;
  528. }
  529. }
  530. }
  531. //display: flex;
  532. .logo {
  533. width: 100%;
  534. margin-top: px2rpx(40);
  535. display: flex;
  536. align-items: center;
  537. justify-content: center;
  538. }
  539. .agreemnet9 {
  540. text-align: initial;
  541. color: #e61f1e;
  542. }
  543. .company-icon {
  544. width: px2rpx(234);
  545. }
  546. .account-type {
  547. width: 100%;
  548. margin-top: px2rpx(20);
  549. padding: px2rpx(10);
  550. background-color: $uni-bg-color-hover;
  551. height: px2rpx(60);
  552. box-sizing: border-box;
  553. border-radius: px2rpx(20);
  554. display: flex;
  555. align-items: center;
  556. .type-btn {
  557. width: 50%;
  558. text-align: center;
  559. height: px2rpx(40);
  560. border-radius: px2rpx(20);
  561. line-height: px2rpx(40);
  562. font-size: px2rpx(18);
  563. cursor: pointer;
  564. &.active {
  565. background-color: var(--primary-color);
  566. }
  567. }
  568. }
  569. .formStyle {
  570. height: px2rpx(40);
  571. }
  572. .account-tip {
  573. width: 100%;
  574. text-align: center;
  575. margin: px2rpx(30) 0;
  576. .title {
  577. font-size: px2rpx(26);
  578. font-weight: bold;
  579. }
  580. .tip {
  581. margin-top: px2rpx(5);
  582. color: var(--gray);
  583. }
  584. }
  585. .formContent {
  586. padding: 0 10px;
  587. }
  588. // 修改表单组件高度。
  589. :deep(.uni-stat-box) {
  590. height: 100%;
  591. }
  592. :deep(.uni-select) {
  593. height: 100%;
  594. }
  595. :deep(.uni-easyinput__content) {
  596. height: 100%;
  597. }
  598. :deep(.uni-date-editor) {
  599. height: 100%;
  600. }
  601. :deep(.uni-date-editor--x) {
  602. height: 100%;
  603. }
  604. .btn-code {
  605. width: 30%;
  606. height: 100%;
  607. box-sizing: border-box;
  608. background-color: #102047;
  609. border: 1px solid rgb(229, 229, 229);
  610. color: #fff;
  611. text-align: center;
  612. line-height: px2rpx(38);
  613. border-radius: 0 4px 4px 0;
  614. }
  615. .check-box {
  616. padding: 0 px2rpx(10);
  617. margin-bottom: px2rpx(10);
  618. display: flex;
  619. align-items: center;
  620. cursor: pointer;
  621. .checkbox-label {
  622. font-size: px2rpx(14);
  623. color: #666666;
  624. margin-left: px2rpx(8);
  625. user-select: none;
  626. }
  627. :deep(.u-checkbox) {
  628. display: flex;
  629. align-items: flex-start;
  630. }
  631. }
  632. .regiset-btn {
  633. width: 100%;
  634. height: px2rpx(40);
  635. border-radius: px2rpx(4);
  636. background-color: #ffde02;
  637. color: #333;
  638. font-weight: bold;
  639. }
  640. .or-title {
  641. font-size: px2rpx(16);
  642. line-height: 1.5;
  643. color: #333;
  644. font-weight: 500;
  645. text-align: center;
  646. margin: px2rpx(20) 0 px2rpx(18) 0;
  647. display: flex;
  648. align-items: center;
  649. justify-content: center;
  650. .line {
  651. flex: 1;
  652. height: 1px;
  653. background-color: #e4e4e4;
  654. }
  655. .qr-tit2 {
  656. margin: 0 px2rpx(12);
  657. }
  658. }
  659. .login-btn {
  660. width: 100%;
  661. height: px2rpx(40);
  662. border-radius: px2rpx(20);
  663. background-color: #1EBF42;
  664. color: #fff;
  665. font-weight: bold;
  666. margin-bottom: px2rpx(20);
  667. }
  668. .code-text {
  669. padding-right: px2rpx(20);
  670. }
  671. .des-bottom {
  672. margin-top: px2rpx(20);
  673. line-height: 20px;
  674. color: #000;
  675. font-size: 12px;
  676. a {
  677. color: #e61f1e;
  678. }
  679. }
  680. .des {
  681. width: 100%;
  682. box-sizing: border-box;
  683. text-align: start;
  684. line-height: 20px;
  685. color: #000;
  686. font-size: 12px;
  687. padding: px2rpx(20) px2rpx(30);
  688. //display: none;
  689. :nth-child(n) {
  690. display: inline;
  691. word-break: break-all;
  692. word-wrap: break-word;
  693. }
  694. a {
  695. color: #e61f1e;
  696. }
  697. }
  698. :deep(.u-text__value) {
  699. color: #ea002a !important;
  700. font-size: px2rpx(14) !important;
  701. }
  702. </style>