index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863
  1. <template>
  2. <div class="login-wrapper bglogin">
  3. <up-navbar title="登录" placeholder>
  4. <template #left>
  5. <!-- <view-->
  6. <!-- v-if="appStore?.$wxConfig?.auditModeEnabled"-->
  7. <!-- @click="backHome"-->
  8. <!-- >-->
  9. <!-- <image src="@/static/images/tabbar/1-001.png" style="height: 40rpx;width: 40rpx;"></image>-->
  10. <!-- </view>-->
  11. <view class="back_extend" v-if="appStore?.$wxConfig?.auditModeEnabled" @click="backHome">
  12. {{ "<" }} 回到首页
  13. </view>
  14. </template>
  15. </up-navbar>
  16. <div class="shading">
  17. <view class="">Hello!</view>
  18. <view class="">欢迎来到水贝搬运工</view>
  19. <image src="@/static/images/login_ip.png" class="ip-pic"></image>
  20. </div>
  21. <div class="whiteBg" v-if="formItem === 1">
  22. <view class="whiteBg-tab whiteBg-tabimg" :class="{'whiteBg-tabs whiteBg-tabsimg':current == 1}">
  23. <view @click="current = item.type" :class="{active:current != index,noActive:current == index}"
  24. class="whiteBg-tab-li" v-for="(item,index) in navList" :key="index">
  25. <view class="">{{ item.name }}</view>
  26. </view>
  27. </view>
  28. <div class="list">
  29. <div class="item">
  30. <input type="text" maxlength="11" class="texts" placeholder="输入手机号码" v-model="account" required />
  31. </div>
  32. <template v-if="current == 0">
  33. <div class="item">
  34. <input type="password" class="texts" placeholder="填写登录密码" v-model="password" required />
  35. </div>
  36. </template>
  37. <template v-else-if="current == 1">
  38. <div class="item">
  39. <input type="number" placeholder="填写验证码" class="texts" v-model="captcha" maxlength="6" />
  40. <button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="code">
  41. {{ text }}
  42. </button>
  43. </div>
  44. <div class="item">
  45. <input type="text" class="texts" placeholder="输入邀请码" v-model="inviteCode" />
  46. </div>
  47. </template>
  48. </div>
  49. <div class="privacy-box" @click="aloneChecked = !aloneChecked">
  50. <image v-if="aloneChecked" src="/static/images/select-active@2x.png" mode=""></image>
  51. <image v-else src="/static/images/select@2x.png" mode=""></image>
  52. <view class="">我已阅读并同意</view>
  53. <view class="privacy-text" @click.stop="openPrivacy">《用户协议》</view>
  54. <view class="privacy-text" @click.stop="openPrivacy">《隐私政策》</view>
  55. </div>
  56. <view class="footer">
  57. <button class="logon" @click="loginMobile" v-if="current !== 0">登录</button>
  58. <!-- <button class="logonWX" open-type="getPhoneNumber" @getphonenumber="getPhoneNumberFn" v-if="current !== 0">微信登录</button> -->
  59. <button class="logon" @click="submit" v-if="current === 0">登录</button>
  60. </view>
  61. <view class="wx-login" open-type="getPhoneNumber" @getphonenumber="getPhoneNumberFn" v-if="current !== 0">
  62. <view class="wx-login-tip">
  63. <view class="login-line">
  64. </view>
  65. <text class="wx-tip">第三方登录</text>
  66. <view class="login-line">
  67. </view>
  68. </view>
  69. <view class="wx-login-btn">
  70. <button class="logonWX" open-type="getPhoneNumber" @getphonenumber="getPhoneNumberFn"
  71. v-if="current !== 0">
  72. <image class="wx-icon" src="@/static/images/wxLogin.png" mode="widthFix"></image>
  73. </button>
  74. </view>
  75. </view>
  76. </div>
  77. </div>
  78. </template>
  79. <script setup>
  80. import {
  81. ref,
  82. watch,
  83. onMounted
  84. } from "vue";
  85. import {
  86. onLoad
  87. } from "@dcloudio/uni-app";
  88. import {
  89. useAppStore
  90. } from "@/stores/app";
  91. import {
  92. loginH5,
  93. loginMobile as loginMobileApi,
  94. registerVerify,
  95. register,
  96. getUserInfo,
  97. } from "@/api/user";
  98. import {
  99. getLogo,
  100. appAuth,
  101. appleLogin
  102. } from "@/api/public";
  103. import {
  104. VUE_APP_API_URL
  105. } from "@/utils";
  106. import {
  107. useSendCode
  108. } from "@/hooks/useSendCode";
  109. import Cache from "@/utils/cache";
  110. import {
  111. getPhoneNumber
  112. } from "@/utils/util.js";
  113. import {
  114. useToast
  115. } from "@/hooks/useToast.js";
  116. // import {
  117. // useGoEasy
  118. // } from "@/plugin/goeasy";
  119. // import {
  120. // getGroupchatList
  121. // } from "@/api/customerService";
  122. import {
  123. footprintScan
  124. } from "@/api/merchant.js";
  125. import {
  126. EXPIRES_TIME
  127. } from "@/config/cache";
  128. const appStore = useAppStore();
  129. const {
  130. Toast
  131. } = useToast();
  132. // const {
  133. // connect,
  134. // GoEasy
  135. // } = useGoEasy();
  136. const BACK_URL = "login_back_url";
  137. // Reactive state
  138. const navList = ref([{
  139. name: "快速登录",
  140. type: 1
  141. }, {
  142. name: "账号登录",
  143. type: 0
  144. }]);
  145. const current = ref(1);
  146. const account = ref("");
  147. const inviteCode = ref(""); // 邀请码
  148. const password = ref("");
  149. const captcha = ref("");
  150. const formItem = ref(1);
  151. const type = ref("login");
  152. const logoUrl = ref("");
  153. const keyCode = ref("");
  154. const codeUrl = ref("");
  155. const codeVal = ref("");
  156. const platform = ref("");
  157. const appleShow = ref(false);
  158. const aloneChecked = ref(false);
  159. const merchantId = ref('');
  160. const userInfo = ref({});
  161. // Watch formItem to update type
  162. watch(formItem, (newVal) => {
  163. type.value = newVal === 1 ? "login" : "register";
  164. });
  165. const {
  166. disabled,
  167. text,
  168. sendCode
  169. } = useSendCode();
  170. function openPrivacy() {
  171. // void plus.runtime.openWeb("https://www.shuibeibyg.com/shenhe.html");
  172. goDetail("https://www.shuibeibyg.com/shenhe.html")
  173. }
  174. const goDetail = (url) => {
  175. const webviewPageUrl = `/pages/webview/privacy?path=${url}`;
  176. uni.navigateTo({
  177. url: webviewPageUrl,
  178. fail: (err) => {
  179. console.error("跳转到webview页面失败:", err);
  180. uni.showToast({
  181. title: "跳转失败,请重试",
  182. icon: "none",
  183. duration: 1500,
  184. });
  185. },
  186. });
  187. };
  188. // Get logo image
  189. const getLogoImage = async () => {
  190. try {
  191. const res = await getLogo();
  192. logoUrl.value = res.data.logoUrl || "/static/images/logo2.png";
  193. } catch (err) {
  194. console.error(err);
  195. }
  196. };
  197. // 验证码登录
  198. const loginMobile = async () => {
  199. if (!account.value)
  200. return uni.showToast({
  201. title: "请填写手机号码",
  202. icon: "none"
  203. });
  204. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(account.value))
  205. return uni.showToast({
  206. title: "请输入正确的手机号码",
  207. icon: "none"
  208. });
  209. if (!captcha.value)
  210. return uni.showToast({
  211. title: "请填写验证码",
  212. icon: "none"
  213. });
  214. if (!/^[\w\d]+$/i.test(captcha.value))
  215. return uni.showToast({
  216. title: "请输入正确的验证码",
  217. icon: "none"
  218. });
  219. if (!aloneChecked.value) {
  220. return Toast({
  221. title: "请阅读并同意用户协议和隐私政策",
  222. icon: "none"
  223. });
  224. }
  225. try {
  226. const res = await loginMobileApi({
  227. phone: account.value,
  228. captcha: captcha.value,
  229. platformType: "app",
  230. spread_spid: Cache.get("spread"),
  231. inviteCode: inviteCode.value,
  232. });
  233. // 使用 LOGIN action 保存 token 到缓存
  234. appStore.LOGIN({
  235. token: res.data.token
  236. });
  237. // 保存过期时间(999天后过期)
  238. const expiresTime = Math.round(new Date() / 1000) + 999 * 24 * 60 * 60;
  239. Cache.set(EXPIRES_TIME, expiresTime, 0);
  240. await getUserInfoFn(res.data);
  241. } catch (res) {
  242. const message = typeof res === "object" ? res.message : res;
  243. uni.showToast({
  244. title: message,
  245. icon: "none"
  246. });
  247. }
  248. };
  249. // 注册
  250. const registerFn = async () => {
  251. if (!account.value)
  252. return uni.showToast({
  253. title: "请填写手机号码",
  254. icon: "none"
  255. });
  256. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(account.value))
  257. return uni.showToast({
  258. title: "请输入正确的手机号码",
  259. icon: "none"
  260. });
  261. if (!captcha.value)
  262. return uni.showToast({
  263. title: "请填写验证码",
  264. icon: "none"
  265. });
  266. if (!/^[\w\d]+$/i.test(captcha.value))
  267. return uni.showToast({
  268. title: "请输入正确的验证码",
  269. icon: "none"
  270. });
  271. if (!password.value)
  272. return uni.showToast({
  273. title: "请填写密码",
  274. icon: "none"
  275. });
  276. // 正则1:验证长度6-18位
  277. const lengthReg = /^.{6,18}$/;
  278. // 正则2:必须包含至少1个数字(\d)和至少1个字母(a-zA-Z)
  279. const hasNumAndLetterReg = /(?=.*\d)(?=.*[a-zA-Z])/;
  280. if (!lengthReg.test(password.value)) {
  281. return uni.showToast({
  282. title: "密码长度必须为6-18位",
  283. icon: "none"
  284. });
  285. } else if (!hasNumAndLetterReg.test(password.value)) {
  286. return uni.showToast({
  287. title: "密码必须同时包含数字和字母",
  288. icon: "none"
  289. });
  290. }
  291. try {
  292. const res = await register({
  293. account: account.value,
  294. captcha: captcha.value,
  295. password: password.value,
  296. spread: Cache.get("spread"),
  297. });
  298. uni.showToast({
  299. title: res.message,
  300. icon: "none"
  301. });
  302. formItem.value = 1;
  303. } catch (res) {
  304. uni.showToast({
  305. title: res.message,
  306. icon: "none"
  307. });
  308. }
  309. };
  310. // 发送验证码
  311. const code = async () => {
  312. if (!account.value)
  313. return uni.showToast({
  314. title: "请填写手机号码",
  315. icon: "none"
  316. });
  317. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(account.value))
  318. return uni.showToast({
  319. title: "请输入正确的手机号码",
  320. icon: "none"
  321. });
  322. if (formItem.value === 2) type.value = "register";
  323. try {
  324. const res = await registerVerify(account.value);
  325. uni.showToast({
  326. title: res.message,
  327. icon: "none"
  328. });
  329. sendCode();
  330. } catch (err) {
  331. uni.showToast({
  332. title: err.message,
  333. icon: "none"
  334. });
  335. }
  336. };
  337. // Navigation tab switch
  338. const navTap = (index) => {
  339. current.value = index;
  340. };
  341. // 账号密码登录
  342. const submit = async () => {
  343. appStore.setIndexRefersh(true)
  344. if (!account.value) return Toast({
  345. title: "请填写账号",
  346. icon: "none"
  347. });
  348. if (!/^[\w\d]{5,16}$/i.test(account.value))
  349. return Toast({
  350. title: "请输入正确的账号",
  351. icon: "none"
  352. });
  353. if (!password.value) return Toast({
  354. title: "请填写密码",
  355. icon: "none"
  356. });
  357. if (!aloneChecked.value) {
  358. return Toast({
  359. title: "请阅读并同意用户协议和隐私政策",
  360. icon: "none"
  361. });
  362. }
  363. try {
  364. const {
  365. data
  366. } = await loginH5({
  367. account: account.value,
  368. password: password.value,
  369. platformType: "app",
  370. spread: Cache.get("spread"),
  371. });
  372. appStore.LOGIN({
  373. token: data.token
  374. });
  375. // 保存过期时间(999天后过期)
  376. const expiresTime = Math.round(new Date() / 1000) + 999 * 24 * 60 * 60;
  377. Cache.set(EXPIRES_TIME, expiresTime, 0);
  378. await getUserInfoFn(data);
  379. } catch (err) {
  380. const message = typeof err === "object" ? err.message : err;
  381. uni.showToast({
  382. title: message,
  383. icon: "none",
  384. });
  385. }
  386. };
  387. // 订阅已加入的群组
  388. // function getGroupchatListFn(uid) {
  389. // getGroupchatList({
  390. // userId: uid
  391. // }).then((res) => {
  392. // if (res && res.data && res.data.length > 0) {
  393. // //订阅群消息
  394. // var groupIds = res.data;
  395. // GoEasy.im.subscribeGroup({
  396. // groupIds: groupIds,
  397. // onSuccess: function() {
  398. // //订阅成功
  399. // console.log("Group message subscribe successfully.");
  400. // },
  401. // onFailed: function(error) {
  402. // //订阅失败
  403. // console.log(
  404. // "Failed to subscribe group message, code:" +
  405. // error.code +
  406. // " content:" +
  407. // error.content
  408. // );
  409. // },
  410. // });
  411. // }
  412. // });
  413. // }
  414. const getUserInfoFn = async (data) => {
  415. try {
  416. appStore.SETUID(data.uid);
  417. const res = await getUserInfo();
  418. appStore.UPDATE_USERINFO(res.data);
  419. userInfo.value = res.data;
  420. // connect({
  421. // id: appStore.uid?.toString(),
  422. // data: {
  423. // avatar: appStore.$userInfo?.avatar,
  424. // nickname: appStore.$userInfo?.nickname,
  425. // phone: appStore.$userInfo?.phone,
  426. // uid: appStore.uid?.toString(),
  427. // },
  428. // });
  429. // 订阅已加入的群组
  430. // await getGroupchatListFn(data.uid);
  431. if (merchantId.value != '') {
  432. let obj = {
  433. merchantId: merchantId.value,
  434. userId: res.data.userId
  435. }
  436. await footprintScanFn(obj)
  437. } else {
  438. console.log('============')
  439. appStore.UPDATE_MERCHANT_ID('')
  440. Toast({
  441. title: "登录成功"
  442. });
  443. backHome();
  444. }
  445. } catch (err) {
  446. console.error(err);
  447. uni.showToast({
  448. title: err.msg,
  449. icon: "none"
  450. });
  451. }
  452. };
  453. const backHome = () => {
  454. if (userInfo.value.merchant && userInfo.value.merchant.id) {
  455. uni.navigateTo({
  456. url: "/pages/merchantCenter/index"
  457. })
  458. } else {
  459. uni.switchTab({
  460. url: "/pages/index/index",
  461. });
  462. }
  463. };
  464. const footprintScanFn = async (data) => {
  465. const res = await footprintScan(data);
  466. appStore.USERINFO();
  467. Toast({
  468. title: "登录成功"
  469. });
  470. backHome();
  471. }
  472. const getPhoneNumberFn = async (e) => {
  473. // Toast({ title: "登录中..." });
  474. if (!aloneChecked.value) {
  475. return Toast({
  476. title: "请阅读并同意用户协议和隐私政策",
  477. icon: "none"
  478. });
  479. }
  480. const res = await getPhoneNumber(e);
  481. console.log('res', res);
  482. if (res) {
  483. appStore.LOGIN({
  484. token: res.data.token
  485. });
  486. // 保存过期时间(999天后过期)
  487. const expiresTime = Math.round(new Date() / 1000) + 999 * 24 * 60 * 60;
  488. Cache.set(EXPIRES_TIME, expiresTime, 0);
  489. await getUserInfoFn(res.data);
  490. }
  491. }
  492. onLoad(() => {
  493. console.log(appStore.$wxConfig)
  494. merchantId.value = appStore.merchantId || '';
  495. getLogoImage();
  496. });
  497. onMounted(() => {
  498. uni.getSystemInfo({
  499. success(res) {
  500. platform.value = res.platform.toLowerCase();
  501. if (platform.value === "ios" && res.system.split(" ")[1] >= 13) {
  502. appleShow.value = true;
  503. }
  504. },
  505. });
  506. });
  507. </script>
  508. <style lang="scss" scoped>
  509. ::v-deep .u-status-bar {
  510. background: transparent;
  511. background-color: transparent !important;
  512. }
  513. ::v-deep .u-navbar__content {
  514. background: transparent;
  515. background-color: transparent !important;
  516. }
  517. .login-wrapper {
  518. //background: url('https://sb-admin.oss-cn-shenzhen.aliyuncs.com/shuibei-mini/new-mini/login@2x.png');
  519. background-repeat: no-repeat;
  520. background-size: 100% 624rpx;
  521. background-color: #FFFFFF;
  522. }
  523. .appLogin {
  524. .hds {
  525. display: flex;
  526. justify-content: center;
  527. align-items: center;
  528. font-size: 24rpx;
  529. color: #b4b4b4;
  530. .line {
  531. width: 68rpx;
  532. height: 1rpx;
  533. background: #cccccc;
  534. }
  535. p {
  536. margin: 0 20rpx;
  537. }
  538. }
  539. .btn-wrapper {
  540. display: flex;
  541. align-items: center;
  542. justify-content: center;
  543. margin-top: 30rpx;
  544. .btn {
  545. display: flex;
  546. align-items: center;
  547. justify-content: center;
  548. width: 68rpx;
  549. height: 68rpx;
  550. border-radius: 50%;
  551. }
  552. .apple-btn {
  553. display: flex;
  554. align-items: center;
  555. justify-content: center;
  556. margin-left: 30rpx;
  557. background: #000;
  558. border-radius: 34rpx;
  559. font-size: 40rpx;
  560. .icon-s-pingguo {
  561. color: #fff;
  562. font-size: 40rpx;
  563. }
  564. }
  565. .iconfont {
  566. font-size: 40rpx;
  567. color: #fff;
  568. }
  569. .wx {
  570. margin-right: 30rpx;
  571. background-color: #61c64f;
  572. }
  573. .mima {
  574. background-color: #28b3e9;
  575. }
  576. .yanzheng {
  577. background-color: #f89c23;
  578. }
  579. }
  580. }
  581. .code img {
  582. width: 100%;
  583. height: 100%;
  584. }
  585. .acea-row.row-middle {
  586. input {
  587. margin-left: 20rpx;
  588. display: block;
  589. }
  590. }
  591. .login-wrapper {
  592. height: 100vh;
  593. .shading {
  594. padding: 72rpx 78rpx;
  595. display: flex;
  596. justify-content: center;
  597. flex-direction: column;
  598. position: relative;
  599. z-index: 1;
  600. view {
  601. color: #333333;
  602. font-size: 36rpx;
  603. font-weight: bold;
  604. &:first-child {
  605. font-size: 48rpx;
  606. margin-bottom: 16rpx;
  607. }
  608. }
  609. .ip-pic {
  610. width: 261rpx;
  611. height: 480rpx;
  612. position: absolute;
  613. right: 14rpx;
  614. bottom: calc(-76rpx - 88rpx);
  615. }
  616. }
  617. .whiteBg {
  618. // margin-top: 100rpx;
  619. background: #FFFFFF;
  620. border-radius: 48rpx 48rpx 0rpx 0rpx;
  621. position: relative;
  622. z-index: 5;
  623. .whiteBg-tab {
  624. color: #666666;
  625. display: flex;
  626. align-items: center;
  627. height: 88rpx;
  628. text-align: center;
  629. //background: url('https://sb-admin.oss-cn-shenzhen.aliyuncs.com/shuibei-mini/new-mini/logintab1.png');
  630. background-repeat: no-repeat;
  631. background-size: cover;
  632. .active {
  633. width: 407rpx;
  634. view {
  635. color: #F8C008;
  636. font-weight: bold;
  637. position: relative;
  638. &::after {
  639. left: 50%;
  640. bottom: -12rpx;
  641. content: '';
  642. transform: translateX(-50%);
  643. position: absolute;
  644. width: 32rpx;
  645. height: 8rpx;
  646. background: #F8C008;
  647. border-radius: 4rpx;
  648. }
  649. }
  650. }
  651. .noActive {
  652. flex: 1;
  653. }
  654. }
  655. .whiteBg-tabs {
  656. //background: url('https://sb-admin.oss-cn-shenzhen.aliyuncs.com/shuibei-mini/new-mini/logintab.png');
  657. background-repeat: no-repeat;
  658. background-size: cover;
  659. }
  660. .list {
  661. padding: 0 80rpx;
  662. margin-top: 120rpx;
  663. .item {
  664. display: flex;
  665. height: 88rpx;
  666. align-items: center;
  667. justify-content: space-between;
  668. padding: 0 8rpx 0 24rpx;
  669. background: #F9F7F0;
  670. border-radius: 16rpx;
  671. margin-bottom: 32rpx;
  672. .texts {
  673. flex: 1;
  674. font-size: 28rpx;
  675. }
  676. .code {
  677. padding: 0;
  678. margin: 0;
  679. width: 188rpx;
  680. display: flex;
  681. align-items: center;
  682. height: 72rpx;
  683. justify-content: center;
  684. background: #FFFFFF;
  685. border-radius: 16rpx;
  686. color: #F8C008;
  687. font-size: 28rpx;
  688. font-weight: bold;
  689. border: none;
  690. &::after {
  691. width: 0;
  692. border: none;
  693. }
  694. }
  695. }
  696. }
  697. .logon {
  698. display: flex;
  699. align-items: center;
  700. justify-content: center;
  701. height: 88rpx;
  702. background-color: #F8C008;
  703. border-radius: 16rpx;
  704. color: #333333;
  705. font-size: 32rpx;
  706. font-weight: bold;
  707. }
  708. .logonWX {
  709. display: flex;
  710. align-items: center;
  711. justify-content: center;
  712. // height: 88rpx;
  713. background-color: #fff;
  714. border: none !important;
  715. border-radius: 16rpx;
  716. color: #ffffff;
  717. font-size: 32rpx;
  718. }
  719. .logonWX[disabled] {
  720. background-color: #BEEDC7;
  721. }
  722. }
  723. .privacy-box {
  724. font-size: 24rpx;
  725. padding: 0 80rpx;
  726. display: flex;
  727. align-items: center;
  728. image {
  729. width: 28rpx;
  730. height: 28rpx;
  731. margin-right: 8rpx;
  732. }
  733. .privacy-text {
  734. color: #F8C008;
  735. vertical-align: top;
  736. }
  737. }
  738. }
  739. .footer {
  740. padding: 48rpx 80rpx 72rpx;
  741. }
  742. .back_extend {
  743. //position: fixed;
  744. //top: 50px;
  745. //left: 10px;
  746. //font-size: 26rpx;
  747. //color: #999;
  748. }
  749. .wx-login-tip {
  750. display: flex;
  751. align-items: center;
  752. width: 590rpx;
  753. margin: 0 auto;
  754. justify-content: space-between;
  755. .login-line {
  756. width: 193rpx;
  757. height: 1rpx;
  758. background-color: #F1F3F8;
  759. }
  760. .wx-tip {
  761. font-size: 28rpx;
  762. line-height: 44rpx;
  763. color: #999;
  764. flex: 1;
  765. width: 100rpx;
  766. text-align: center;
  767. display: block;
  768. }
  769. }
  770. .wx-login-btn {
  771. width: 590rpx;
  772. margin: 0 auto;
  773. display: flex;
  774. align-items: center;
  775. justify-content: center;
  776. margin-top: 32rpx;
  777. padding-bottom: 30rpx;
  778. .wx-icon {
  779. width: 92rpx;
  780. height: 92rpx;
  781. }
  782. }
  783. </style>