You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

995 lines
21 KiB

  1. <template>
  2. <view class="login-registration-container">
  3. <!-- 自定义导航栏 -->
  4. <view
  5. class="custom-navbar"
  6. :style="{ paddingTop: safeAreaInsets?.top + 'px' }"
  7. >
  8. <view class="nav-left">
  9. <image
  10. class="icons"
  11. @click="goToBack"
  12. src="../../../static/icons/back.png"
  13. alt="返回首页"
  14. />
  15. </view>
  16. <view class="nav-right">
  17. <image
  18. class="icons"
  19. src="../../../static/icons/Headset.png"
  20. alt="联系客服"
  21. />
  22. </view>
  23. </view>
  24. <!-- Logo -->
  25. <!-- <image class="logo" src="/static/logo.png" mode="aspectFit"></image> -->
  26. <!-- 欢迎语 -->
  27. <text class="welcome-text">找回密码</text>
  28. <!-- 邮箱/手机号切换 -->
  29. <view v-if="!isRecovering" class="switch-container">
  30. <text
  31. class="switch-item"
  32. :class="{ active: switchType === 'Email' }"
  33. @click="switchEmail"
  34. >邮箱</text
  35. >
  36. <text
  37. class="switch-item"
  38. :class="{ active: switchType === 'Phone' }"
  39. @click="switchPhone"
  40. >手机号</text
  41. >
  42. </view>
  43. <view v-else class="switch-container-occupy"> </view>
  44. <!-- 输入框 -->
  45. <view v-if="isRecovering" class="input-container">
  46. <view v-if="switchType === 'Email'">
  47. <!-- 修改邮箱输入框容器将图标包含在内 -->
  48. <view class="input-with-icon">
  49. <image
  50. class="input-icon"
  51. src="../../../static/icons/Unlock.png"
  52. alt=""
  53. />
  54. <input
  55. class="input-field"
  56. type="text"
  57. placeholder="输入新密码"
  58. v-model="newPassword"
  59. />
  60. <image
  61. class="input-icon-eye"
  62. @click="newPasswordLookFirst=!newPasswordLookFirst"
  63. :src="
  64. newPasswordLookFirst
  65. ? '../../../static/icons/unlook.png'
  66. : '../../../static/icons/look.png'
  67. "
  68. alt=""
  69. />
  70. </view>
  71. <view class="input-with-icon">
  72. <image
  73. class="input-icon"
  74. src="../../../static/icons/Unlock.png"
  75. alt=""
  76. />
  77. <input
  78. class="input-field"
  79. type="text"
  80. placeholder="再次确认"
  81. v-model="password"
  82. />
  83. <image
  84. class="input-icon-eye"
  85. @click="newPasswordLookSecond=!newPasswordLookSecond"
  86. :src="
  87. newPasswordLookSecond
  88. ? '../../../static/icons/unlook.png'
  89. : '../../../static/icons/look.png'
  90. "
  91. alt=""
  92. />
  93. </view>
  94. </view>
  95. </view>
  96. <view v-else class="input-container">
  97. <view v-if="switchType === 'Email'">
  98. <!-- 修改邮箱输入框容器将图标包含在内 -->
  99. <view class="input-with-icon">
  100. <image
  101. class="input-icon"
  102. src="../../../static/icons/Mail.png"
  103. alt=""
  104. />
  105. <input
  106. class="input-field"
  107. type="text"
  108. placeholder="请输入邮箱"
  109. v-model="email"
  110. />
  111. <view>
  112. <button
  113. class="send-code-btn-email"
  114. :disabled="isCodeBtnDisabled"
  115. :class="{ 'send-code-btn-disabled': isCodeBtnDisabled }"
  116. @click="sendCode"
  117. >
  118. <text
  119. class="send-code-text"
  120. :class="{ 'send-code-btn-disabled-text': isCodeBtnDisabled }"
  121. >{{ codeBtnText }}</text
  122. >
  123. </button>
  124. </view>
  125. </view>
  126. <view class="input-with-icon">
  127. <image
  128. class="input-icon"
  129. src="../../../static/icons/Text-recognition.png"
  130. alt=""
  131. />
  132. <input
  133. class="input-field"
  134. type="text"
  135. placeholder="请输入验证码"
  136. v-model="password"
  137. />
  138. </view>
  139. </view>
  140. <view v-if="switchType === 'Phone'" class="phone-input-container">
  141. <view class="country-code-selector" @click="showCountryPicker">
  142. <image
  143. class="country-flag-img"
  144. src="../../../static/icons/Iphone.png"
  145. mode="aspectFit"
  146. ></image>
  147. <text class="country-code">{{ selectedCountry.code }}</text>
  148. <!-- <text class="arrow-down"></text> -->
  149. </view>
  150. <input
  151. class="input-field phone-input"
  152. type="number"
  153. placeholder="输入手机号"
  154. v-model="phone"
  155. @input="onPhoneInput"
  156. />
  157. <view>
  158. <button
  159. class="send-code-btn"
  160. :disabled="isCodeBtnDisabled"
  161. :class="{ 'send-code-btn-disabled': isCodeBtnDisabled }"
  162. @click="sendCode"
  163. >
  164. <text
  165. class="send-code-text"
  166. :class="{ 'send-code-btn-disabled-text': isCodeBtnDisabled }"
  167. >{{ codeBtnText }}</text
  168. >
  169. </button>
  170. </view>
  171. </view>
  172. <view v-if="switchType === 'Phone'" class="input-with-icon">
  173. <image
  174. class="input-icon"
  175. src="../../../static/icons/Text-recognition.png"
  176. alt=""
  177. />
  178. <input
  179. class="input-field"
  180. type="text"
  181. placeholder="请输入验证码"
  182. v-model="password"
  183. />
  184. </view>
  185. </view>
  186. <!-- 用户协议 -->
  187. <view @click="changeCheckbox" class="agreement-container-one">
  188. <text
  189. class="agreement-text-one"
  190. :style="!isRecovering ? 'visibility: hidden' : 'visibility: visible'"
  191. >
  192. 密码最少8位数
  193. </text>
  194. </view>
  195. <!-- 注册按钮 -->
  196. <button class="register-btn" @click="register">
  197. {{ isRecovering ? "确认" : "下一步" }}
  198. </button>
  199. <!-- 或者 -->
  200. <text class="or-text-one" @click="goToRegistration"
  201. >如果您还没有账号点击注册
  202. <image class="to-icon" src="../../../static/icons/To.png"></image>
  203. </text>
  204. <!-- 或者 -->
  205. <text class="or-text" @click="goToLogin">已有账号登录 </text>
  206. <!-- 同意弹窗 -->
  207. <uniPopup ref="agreementPopup" type="dialog">
  208. <view class="popup-content">
  209. <text class="popup-title">同意并继续</text>
  210. <text class="popup-message">请阅读并同意服务协议和隐私权限</text>
  211. <button class="agree-button" @click="handleAgree">
  212. <text class="agree-text">同意</text>
  213. </button>
  214. </view>
  215. </uniPopup>
  216. <footerBar class="static-footer" :type="type"></footerBar>
  217. </view>
  218. </template>
  219. <script setup>
  220. import { ref } from "vue";
  221. // 导入完整的国家列表
  222. import countryList from "../login/list";
  223. import footerBar from "../../../components/footerBar-cn.vue";
  224. import uniPopup from "../../../uni_modules/uni-popup/components/uni-popup/uni-popup.vue";
  225. import { verificationPhone, verificationEmail } from "../login/verification";
  226. const type = ref("member");
  227. const email = ref("");
  228. const password = ref("");
  229. const newPassword = ref("");
  230. const phone = ref("");
  231. const country = ref("+86");
  232. const agreed = ref(false);
  233. const switchType = ref("Phone"); // 默认是邮箱注册
  234. const { safeAreaInsets } = uni.getSystemInfoSync();
  235. const codeBtnText = ref("获取验证码");
  236. const isCodeBtnDisabled = ref(false); // 添加验证码按钮禁用状态
  237. const checkboxUrl = ref("../../../static/icons/Check-one-false.png");
  238. const isRecovering = ref(false);
  239. const newPasswordLookFirst = ref(false);
  240. const newPasswordLookSecond = ref(false);
  241. // 使用从list.js导入的完整国家列表数据
  242. const countries = ref(
  243. countryList.list.map((item) => ({
  244. name: item.name,
  245. code: `+${item.tel}`,
  246. flag: item.flag,
  247. short: item.short,
  248. en: item.en,
  249. }))
  250. );
  251. // 默认选中的国家(中国)
  252. const selectedCountry = ref(
  253. countries.value.find((country) => country.short === "CN") ||
  254. countries.value[0]
  255. );
  256. // 显示国家选择器
  257. function showCountryPicker() {
  258. uni.showActionSheet({
  259. itemList: countries.value.map(
  260. (country) => `${country.name} ${country.code}`
  261. ),
  262. success: function (res) {
  263. selectedCountry.value = countries.value[res.tapIndex];
  264. },
  265. });
  266. }
  267. function goToBack() {
  268. // 返回上一页
  269. uni.navigateBack(-1);
  270. }
  271. function switchEmail() {
  272. // 切换到邮箱注册
  273. switchType.value = "Email";
  274. }
  275. function switchPhone() {
  276. // 切换到手机注册
  277. switchType.value = "Phone";
  278. }
  279. // function register() {
  280. // if (switchType.value === "Email") {
  281. // // 登录逻辑
  282. // if (!email.value) {
  283. // uni.showToast({
  284. // title: "请输入邮箱地址",
  285. // icon: "none",
  286. // });
  287. // return;
  288. // }
  289. // // 发送登录请求
  290. // console.log("登录:", email.value);
  291. // }
  292. // if (switchType.value === "Phone") {
  293. // // 登录逻辑
  294. // if (!phone.value) {
  295. // uni.showToast({
  296. // title: "请输入手机号码",
  297. // icon: "none",
  298. // });
  299. // return;
  300. // }
  301. // // 发送登录请求
  302. // console.log("登录:", phone.value);
  303. // }
  304. // }
  305. function register() {
  306. if (switchType.value === "Phone") {
  307. // 登录逻辑
  308. if (!phone.value) {
  309. uni.showToast({
  310. title: "请输入手机号码",
  311. icon: "none",
  312. });
  313. return;
  314. }
  315. if (!password.value) {
  316. uni.showToast({
  317. title: "请输入验证码",
  318. icon: "none",
  319. });
  320. return;
  321. }
  322. const phoneAll = `${country.value}${phone.value}`;
  323. console.log("完整手机号" + phoneAll);
  324. if (validatePhoneNumber(country.value, phone.value)) {
  325. console.log("登录成功:", phoneAll);
  326. }
  327. // 发送登录请求
  328. // console.log("登录:", phone.value);
  329. }
  330. if (switchType.value === "Email") {
  331. // 登录逻辑
  332. if (!email.value) {
  333. uni.showToast({
  334. title: "请输入邮箱地址",
  335. icon: "none",
  336. });
  337. return;
  338. }
  339. if (!password.value) {
  340. uni.showToast({
  341. title: "请输入验证码",
  342. icon: "none",
  343. });
  344. return;
  345. }
  346. const bool = verificationEmail(email.value);
  347. console.log("验证是否成功", bool);
  348. // 检查格式是否正确
  349. if (!bool) {
  350. uni.showToast({
  351. title: "邮箱格式不正确",
  352. icon: "none",
  353. });
  354. return;
  355. }
  356. // 发送登录请求
  357. console.log("登录:", email.value);
  358. }
  359. // if (!agreed.value) {
  360. // // 显示同意弹窗
  361. // agreementPopup.value.open();
  362. // return;
  363. // }
  364. isRecovering.value = !isRecovering.value;
  365. // 如果已经同意,则继续登录流程
  366. // uni.showToast({
  367. // title: "登录成功",
  368. // icon: "success",
  369. // });
  370. }
  371. function goToLogin() {
  372. // 跳转到登录页
  373. uni.navigateTo({
  374. url: "/pages/start/login/login",
  375. });
  376. }
  377. function onPhoneInput(e) {
  378. // 确保只允许输入数字
  379. const value = e.detail.value;
  380. // 使用 isNaN 检查是否为有效数字
  381. if (isNaN(value)) {
  382. phone.value = "";
  383. } else {
  384. phone.value = value;
  385. }
  386. }
  387. // function sendCode() {
  388. // // 如果按钮已禁用,则不执行后续逻辑
  389. // if (isCodeBtnDisabled.value) return;
  390. // // 设置按钮为禁用状态
  391. // isCodeBtnDisabled.value = true;
  392. // codeBtnText.value = "重新发送";
  393. // let time = 6;
  394. // const timer = setInterval(() => {
  395. // time--;
  396. // codeBtnText.value = "重新发送 " + time + "S";
  397. // if (time <= 0) {
  398. // clearInterval(timer);
  399. // codeBtnText.value = "重新发送";
  400. // // 倒计时结束后启用按钮
  401. // isCodeBtnDisabled.value = false;
  402. // }
  403. // }, 1000);
  404. // return;
  405. // }
  406. function sendCode() {
  407. if (switchType.value === "Phone") {
  408. if (!phone.value) {
  409. uni.showToast({
  410. title: "请输入手机号",
  411. icon: "none",
  412. });
  413. return;
  414. }
  415. const bool = verificationPhone(country.value, phone.value);
  416. console.log("验证是否成功", bool);
  417. // 检查格式是否正确
  418. if (!bool) {
  419. uni.showToast({
  420. title: "手机号格式不正确",
  421. icon: "none",
  422. });
  423. return;
  424. }
  425. }
  426. if (switchType.value === "Email") {
  427. if (!email.value) {
  428. uni.showToast({
  429. title: "请输入邮箱地址",
  430. icon: "none",
  431. });
  432. return;
  433. }
  434. const bool = verificationEmail(email.value);
  435. console.log("验证是否成功", bool);
  436. // 检查格式是否正确
  437. if (!bool) {
  438. uni.showToast({
  439. title: "邮箱格式不正确",
  440. icon: "none",
  441. });
  442. return;
  443. }
  444. }
  445. // 如果按钮已禁用,则不执行后续逻辑
  446. if (isCodeBtnDisabled.value) return;
  447. // 设置按钮为禁用状态
  448. isCodeBtnDisabled.value = true;
  449. codeBtnText.value = "重新发送";
  450. let time = 6;
  451. const timer = setInterval(() => {
  452. time--;
  453. codeBtnText.value = "重新发送 " + time + "s";
  454. if (time <= 0) {
  455. clearInterval(timer);
  456. codeBtnText.value = "重新发送";
  457. // 倒计时结束后启用按钮
  458. isCodeBtnDisabled.value = false;
  459. }
  460. }, 1000);
  461. return;
  462. }
  463. function openAgreement() {
  464. // 打开用户协议
  465. console.log("打开用户协议");
  466. uni.navigateTo({
  467. url: "/pages/start/agreement/agreement",
  468. });
  469. }
  470. function openPrivacy() {
  471. // 打开隐私政策
  472. console.log("打开隐私政策");
  473. uni.navigateTo({
  474. url: "/pages/start/privacy/privacy",
  475. });
  476. }
  477. function changeCheckbox() {
  478. agreed.value = !agreed.value;
  479. checkboxUrl.value = agreed.value
  480. ? "../../../static/icons/Check-one-true.png"
  481. : "../../../static/icons/Check-one-false.png";
  482. }
  483. // 验证手机号是否正确
  484. function validatePhoneNumber(countryCode, phoneNumber) {
  485. // 检查是否为空
  486. if (!phoneNumber || phoneNumber.trim() === "") {
  487. uni.showToast({
  488. title: "手机号不能为空",
  489. icon: "none",
  490. });
  491. return false;
  492. }
  493. const bool = verificationPhone(countryCode, phoneNumber);
  494. console.log("验证是否成功", bool);
  495. // 检查格式是否正确
  496. if (!bool) {
  497. uni.showToast({
  498. title: "手机号格式不正确",
  499. icon: "none",
  500. });
  501. return false;
  502. }
  503. // 去掉+号后检查长度(手机号通常在7到15位之间)
  504. const cleanNumber = phoneNumber.replace(/^\+/, "");
  505. if (cleanNumber.length < 7 || cleanNumber.length > 15) {
  506. uni.showToast({
  507. title: "手机号长度不正确",
  508. icon: "none",
  509. });
  510. return false;
  511. }
  512. return true;
  513. }
  514. // 添加弹窗引用
  515. const agreementPopup = ref(null);
  516. // 处理同意按钮点击
  517. function handleAgree() {
  518. // 关闭弹窗
  519. agreementPopup.value.close();
  520. // 设置为已同意
  521. agreed.value = true;
  522. checkboxUrl.value = "../../../static/icons/Check-one-true.png";
  523. // 继续登录流程
  524. }
  525. </script>
  526. <style scoped>
  527. .login-registration-container {
  528. display: flex;
  529. flex-direction: column;
  530. align-items: center;
  531. justify-content: center;
  532. padding: 0 70rpx;
  533. height: 100vh;
  534. background-color: #ffffff;
  535. }
  536. /* 自定义导航栏样式 */
  537. .custom-navbar {
  538. position: absolute;
  539. top: 0;
  540. left: 0;
  541. /* z-index: 999; */
  542. width: 90%;
  543. height: 80rpx;
  544. display: flex;
  545. justify-content: space-between;
  546. align-items: center;
  547. padding: 10rpx 40rpx;
  548. margin-bottom: 20rpx;
  549. }
  550. .nav-left,
  551. .nav-right {
  552. flex: 1;
  553. }
  554. .nav-right {
  555. display: flex;
  556. justify-content: flex-end;
  557. }
  558. .nav-left {
  559. display: flex;
  560. justify-content: flex-start;
  561. }
  562. .icons {
  563. margin: 20rpx;
  564. width: 40rpx;
  565. height: 40rpx;
  566. /* margin-right: 10rpx; */
  567. }
  568. .back-btn,
  569. .headphone-btn {
  570. font-size: 36rpx;
  571. font-weight: bold;
  572. color: #333333;
  573. padding: 10rpx;
  574. }
  575. .logo {
  576. width: 120rpx;
  577. height: 120rpx;
  578. margin-bottom: 60rpx;
  579. border-radius: 20%;
  580. }
  581. .welcome-text {
  582. font-size: 48rpx;
  583. font-weight: bold;
  584. color: #333333;
  585. margin-bottom: 60rpx;
  586. /* text-align: left; */
  587. /* align-self: flex-start; */
  588. }
  589. .switch-container {
  590. display: flex;
  591. margin-bottom: 40rpx;
  592. align-self: flex-start;
  593. }
  594. .switch-item {
  595. font-size: 28rpx;
  596. color: #999999;
  597. padding: 10rpx 20rpx;
  598. position: relative;
  599. }
  600. .switch-item::after {
  601. content: "";
  602. position: absolute;
  603. bottom: 0;
  604. left: 50%;
  605. transform: translateX(-50%);
  606. width: 60%;
  607. /* 控制边框宽度 */
  608. height: 2rpx;
  609. background-color: transparent;
  610. }
  611. .switch-item.active {
  612. color: #333333;
  613. font-weight: 700;
  614. }
  615. .switch-item.active::after {
  616. content: "";
  617. position: absolute;
  618. top: 60rpx;
  619. bottom: 0;
  620. left: 50%;
  621. transform: translateX(-50%);
  622. width: 30%;
  623. /* 控制边框宽度 */
  624. height: 7rpx;
  625. background-color: #333333;
  626. }
  627. .input-container {
  628. width: 100%;
  629. }
  630. /* 添加图标输入框样式 */
  631. .input-with-icon {
  632. display: flex;
  633. align-items: center;
  634. width: 100%;
  635. height: 80rpx;
  636. border-bottom: 2rpx solid #e5e5e5;
  637. margin-bottom: 20rpx;
  638. }
  639. .input-icon {
  640. width: 40rpx;
  641. height: 40rpx;
  642. margin: 0 20rpx;
  643. }
  644. .input-icon-eye {
  645. width: 40rpx;
  646. height: 20rpx;
  647. margin: 0 20rpx;
  648. }
  649. .input-field {
  650. flex: 1;
  651. height: 80rpx;
  652. padding: 15rpx 0;
  653. font-size: 28rpx;
  654. color: #333333;
  655. border: none;
  656. background-color: transparent;
  657. }
  658. .phone-input-container {
  659. display: flex;
  660. align-items: center;
  661. width: 95.8%;
  662. height: 80rpx;
  663. /* border-radius: 20rpx; */
  664. /* border: 2rpx solid #e5e5e5; */
  665. /* background-color: #f5f5f5; */
  666. padding: 0 10rpx;
  667. border-bottom: 2rpx solid #e5e5e5;
  668. margin-bottom: 20rpx;
  669. }
  670. .country-code-selector {
  671. display: flex;
  672. align-items: center;
  673. padding: 0 10rpx;
  674. padding-bottom: 1rpx;
  675. height: 100%;
  676. /* border-right: 2rpx solid #e5e5e5; */
  677. /* background-color: #f5f5f5; */
  678. border-radius: 20rpx 0 0 20rpx;
  679. }
  680. .country-code {
  681. font-size: 28rpx;
  682. color: #333333;
  683. margin-right: 10rpx;
  684. }
  685. .country-flag-img {
  686. width: 40rpx;
  687. height: 40rpx;
  688. margin-right: 10rpx;
  689. }
  690. .arrow-down {
  691. font-size: 20rpx;
  692. color: #999999;
  693. }
  694. .phone-input {
  695. flex: 1;
  696. width: auto;
  697. height: 100%;
  698. border: none;
  699. background-color: transparent;
  700. padding: 0 0rpx;
  701. }
  702. .send-code-btn {
  703. width: 200rpx;
  704. height: 60rpx;
  705. display: inline-flex;
  706. padding: 0rpx 10rpx;
  707. justify-content: center;
  708. align-items: center;
  709. gap: 10px;
  710. border-radius: 4px;
  711. background: #000;
  712. }
  713. .send-code-btn-email {
  714. width: 200rpx;
  715. height: 60rpx;
  716. display: inline-flex;
  717. padding: 0rpx 10rpx;
  718. justify-content: center;
  719. align-items: center;
  720. gap: 10px;
  721. border-radius: 4px;
  722. background: #000;
  723. margin-right: 15rpx;
  724. }
  725. .send-code-btn-disabled {
  726. background: #e6e6e6;
  727. /* 禁用状态下的灰色背景 */
  728. }
  729. .send-code-btn-disabled-text {
  730. color: #999999 !important;
  731. }
  732. .send-code-text {
  733. color: #fff;
  734. font-size: 28rpx;
  735. }
  736. .agreement-container-one {
  737. display: flex;
  738. align-items: center;
  739. align-self: flex-start;
  740. margin-bottom: 80rpx;
  741. }
  742. .agreement-container {
  743. display: flex;
  744. align-items: center;
  745. margin-bottom: 40rpx;
  746. margin-top: -75.5rpx;
  747. align-self: flex-start;
  748. }
  749. .checkbox {
  750. width: 30rpx;
  751. height: 30rpx;
  752. margin-left: 20rpx;
  753. /* flex: content; */
  754. }
  755. .agreement-text-one {
  756. font-size: 22rpx;
  757. color: #666666;
  758. text-align: center;
  759. margin-left: 10rpx;
  760. }
  761. .agreement-text {
  762. margin-left: 20rpx;
  763. font-size: 24rpx;
  764. color: #666666;
  765. }
  766. .link {
  767. color: #333333;
  768. font-weight: bold;
  769. text-decoration: underline;
  770. }
  771. .register-btn {
  772. width: 100%;
  773. height: 80rpx;
  774. background-color: #000000;
  775. color: white;
  776. font-size: 32rpx;
  777. font-weight: bold;
  778. border-radius: 40rpx;
  779. margin-bottom: 40rpx;
  780. }
  781. .or-text {
  782. flex-direction: column;
  783. font-size: 24rpx;
  784. color: #999999;
  785. margin-top: 294rpx;
  786. margin-bottom: -22rpx;
  787. }
  788. .to-icon {
  789. width: 10rpx;
  790. height: 16rpx;
  791. }
  792. .or-text-one {
  793. flex-direction: column;
  794. font-size: 24rpx;
  795. color: #999999;
  796. }
  797. .third-party-login {
  798. width: 100%;
  799. margin-bottom: 60rpx;
  800. }
  801. .third-party-text {
  802. color: #ffffff;
  803. font-weight: bold;
  804. white-space: pre;
  805. }
  806. .third-party-btn {
  807. width: 100%;
  808. height: 80rpx;
  809. background-color: rgb(0, 0, 0);
  810. border: 2rpx solid #e5e5e5;
  811. border-radius: 40rpx;
  812. display: flex;
  813. align-items: center;
  814. justify-content: center;
  815. margin-bottom: 20rpx;
  816. font-size: 28rpx;
  817. color: #333333;
  818. }
  819. .google-icon,
  820. .apple-icon {
  821. width: 60rpx;
  822. height: 60rpx;
  823. margin-right: 20rpx;
  824. }
  825. .existing-account {
  826. display: flex;
  827. align-items: center;
  828. }
  829. .account-text {
  830. font-size: 24rpx;
  831. color: #666666;
  832. }
  833. .login-link {
  834. font-size: 24rpx;
  835. font-weight: bold;
  836. color: #333333;
  837. margin-left: 10rpx;
  838. text-decoration: underline;
  839. }
  840. .static-footer {
  841. position: fixed;
  842. bottom: 0;
  843. }
  844. /* 弹窗样式 */
  845. .popup-content {
  846. background-color: #ffffff;
  847. padding: 40rpx;
  848. text-align: center;
  849. border-radius: 10rpx;
  850. width: 550rpx;
  851. }
  852. .popup-title {
  853. font-size: 36rpx;
  854. font-weight: bold;
  855. color: #333;
  856. margin-bottom: 80rpx;
  857. text-align: center; /* 水平居中 */
  858. display: flex; /* 使用flex布局 */
  859. justify-content: center; /* 水平居中 */
  860. align-items: center; /* 垂直居中 */
  861. }
  862. .popup-message {
  863. font-size: 28rpx;
  864. color: #000000;
  865. margin-bottom: 80rpx;
  866. text-align: center; /* 水平居中 */
  867. display: flex; /* 使用flex布局 */
  868. justify-content: center; /* 水平居中 */
  869. align-items: center; /* 垂直居中 */
  870. }
  871. .agree-button {
  872. width: 300rpx;
  873. height: 80rpx;
  874. background-color: #000000;
  875. border-radius: 40rpx;
  876. display: flex; /* 添加flex布局 */
  877. align-items: center; /* 垂直居中 */
  878. justify-content: center; /* 水平居中 */
  879. }
  880. .agree-text {
  881. color: #ffffff;
  882. font-size: 34rpx;
  883. /* 添加垂直居中相关样式 */
  884. display: flex;
  885. align-items: center;
  886. justify-content: center;
  887. line-height: 1; /* 确保文字垂直居中 */
  888. }
  889. .switch-container-occupy {
  890. margin-top: 100rpx;
  891. }
  892. </style>