index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  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. appStore.setIndexRefersh(true)
  475. if (!aloneChecked.value) {
  476. return Toast({
  477. title: "请阅读并同意用户协议和隐私政策",
  478. icon: "none"
  479. });
  480. }
  481. const res = await getPhoneNumber(e);
  482. console.log('res', res);
  483. if (res) {
  484. appStore.LOGIN({
  485. token: res.data.token
  486. });
  487. // 保存过期时间(999天后过期)
  488. const expiresTime = Math.round(new Date() / 1000) + 999 * 24 * 60 * 60;
  489. Cache.set(EXPIRES_TIME, expiresTime, 0);
  490. await getUserInfoFn(res.data);
  491. }
  492. }
  493. onLoad(() => {
  494. console.log(appStore.$wxConfig)
  495. merchantId.value = appStore.merchantId || '';
  496. getLogoImage();
  497. });
  498. onMounted(() => {
  499. uni.getSystemInfo({
  500. success(res) {
  501. platform.value = res.platform.toLowerCase();
  502. if (platform.value === "ios" && res.system.split(" ")[1] >= 13) {
  503. appleShow.value = true;
  504. }
  505. },
  506. });
  507. });
  508. </script>
  509. <style lang="scss" scoped>
  510. ::v-deep .u-status-bar {
  511. background: transparent;
  512. background-color: transparent !important;
  513. }
  514. ::v-deep .u-navbar__content {
  515. background: transparent;
  516. background-color: transparent !important;
  517. }
  518. .login-wrapper {
  519. //background: url('https://sb-admin.oss-cn-shenzhen.aliyuncs.com/shuibei-mini/new-mini/login@2x.png');
  520. background-repeat: no-repeat;
  521. background-size: 100% 624rpx;
  522. background-color: #FFFFFF;
  523. }
  524. .appLogin {
  525. .hds {
  526. display: flex;
  527. justify-content: center;
  528. align-items: center;
  529. font-size: 24rpx;
  530. color: #b4b4b4;
  531. .line {
  532. width: 68rpx;
  533. height: 1rpx;
  534. background: #cccccc;
  535. }
  536. p {
  537. margin: 0 20rpx;
  538. }
  539. }
  540. .btn-wrapper {
  541. display: flex;
  542. align-items: center;
  543. justify-content: center;
  544. margin-top: 30rpx;
  545. .btn {
  546. display: flex;
  547. align-items: center;
  548. justify-content: center;
  549. width: 68rpx;
  550. height: 68rpx;
  551. border-radius: 50%;
  552. }
  553. .apple-btn {
  554. display: flex;
  555. align-items: center;
  556. justify-content: center;
  557. margin-left: 30rpx;
  558. background: #000;
  559. border-radius: 34rpx;
  560. font-size: 40rpx;
  561. .icon-s-pingguo {
  562. color: #fff;
  563. font-size: 40rpx;
  564. }
  565. }
  566. .iconfont {
  567. font-size: 40rpx;
  568. color: #fff;
  569. }
  570. .wx {
  571. margin-right: 30rpx;
  572. background-color: #61c64f;
  573. }
  574. .mima {
  575. background-color: #28b3e9;
  576. }
  577. .yanzheng {
  578. background-color: #f89c23;
  579. }
  580. }
  581. }
  582. .code img {
  583. width: 100%;
  584. height: 100%;
  585. }
  586. .acea-row.row-middle {
  587. input {
  588. margin-left: 20rpx;
  589. display: block;
  590. }
  591. }
  592. .login-wrapper {
  593. height: 100vh;
  594. .shading {
  595. padding: 72rpx 78rpx;
  596. display: flex;
  597. justify-content: center;
  598. flex-direction: column;
  599. position: relative;
  600. z-index: 1;
  601. view {
  602. color: #333333;
  603. font-size: 36rpx;
  604. font-weight: bold;
  605. &:first-child {
  606. font-size: 48rpx;
  607. margin-bottom: 16rpx;
  608. }
  609. }
  610. .ip-pic {
  611. width: 261rpx;
  612. height: 480rpx;
  613. position: absolute;
  614. right: 14rpx;
  615. bottom: calc(-76rpx - 88rpx);
  616. }
  617. }
  618. .whiteBg {
  619. // margin-top: 100rpx;
  620. background: #FFFFFF;
  621. border-radius: 48rpx 48rpx 0rpx 0rpx;
  622. position: relative;
  623. z-index: 5;
  624. .whiteBg-tab {
  625. color: #666666;
  626. display: flex;
  627. align-items: center;
  628. height: 88rpx;
  629. text-align: center;
  630. //background: url('https://sb-admin.oss-cn-shenzhen.aliyuncs.com/shuibei-mini/new-mini/logintab1.png');
  631. background-repeat: no-repeat;
  632. background-size: cover;
  633. .active {
  634. width: 407rpx;
  635. view {
  636. color: #F8C008;
  637. font-weight: bold;
  638. position: relative;
  639. &::after {
  640. left: 50%;
  641. bottom: -12rpx;
  642. content: '';
  643. transform: translateX(-50%);
  644. position: absolute;
  645. width: 32rpx;
  646. height: 8rpx;
  647. background: #F8C008;
  648. border-radius: 4rpx;
  649. }
  650. }
  651. }
  652. .noActive {
  653. flex: 1;
  654. }
  655. }
  656. .whiteBg-tabs {
  657. //background: url('https://sb-admin.oss-cn-shenzhen.aliyuncs.com/shuibei-mini/new-mini/logintab.png');
  658. background-repeat: no-repeat;
  659. background-size: cover;
  660. }
  661. .list {
  662. padding: 0 80rpx;
  663. margin-top: 120rpx;
  664. .item {
  665. display: flex;
  666. height: 88rpx;
  667. align-items: center;
  668. justify-content: space-between;
  669. padding: 0 8rpx 0 24rpx;
  670. background: #F9F7F0;
  671. border-radius: 16rpx;
  672. margin-bottom: 32rpx;
  673. .texts {
  674. flex: 1;
  675. font-size: 28rpx;
  676. }
  677. .code {
  678. padding: 0;
  679. margin: 0;
  680. width: 188rpx;
  681. display: flex;
  682. align-items: center;
  683. height: 72rpx;
  684. justify-content: center;
  685. background: #FFFFFF;
  686. border-radius: 16rpx;
  687. color: #F8C008;
  688. font-size: 28rpx;
  689. font-weight: bold;
  690. border: none;
  691. &::after {
  692. width: 0;
  693. border: none;
  694. }
  695. }
  696. }
  697. }
  698. .logon {
  699. display: flex;
  700. align-items: center;
  701. justify-content: center;
  702. height: 88rpx;
  703. background-color: #F8C008;
  704. border-radius: 16rpx;
  705. color: #333333;
  706. font-size: 32rpx;
  707. font-weight: bold;
  708. }
  709. .logonWX {
  710. display: flex;
  711. align-items: center;
  712. justify-content: center;
  713. // height: 88rpx;
  714. background-color: #fff;
  715. border: none !important;
  716. border-radius: 16rpx;
  717. color: #ffffff;
  718. font-size: 32rpx;
  719. }
  720. .logonWX[disabled] {
  721. background-color: #BEEDC7;
  722. }
  723. }
  724. .privacy-box {
  725. font-size: 24rpx;
  726. padding: 0 80rpx;
  727. display: flex;
  728. align-items: center;
  729. image {
  730. width: 28rpx;
  731. height: 28rpx;
  732. margin-right: 8rpx;
  733. }
  734. .privacy-text {
  735. color: #F8C008;
  736. vertical-align: top;
  737. }
  738. }
  739. }
  740. .footer {
  741. padding: 48rpx 80rpx 72rpx;
  742. }
  743. .back_extend {
  744. //position: fixed;
  745. //top: 50px;
  746. //left: 10px;
  747. //font-size: 26rpx;
  748. //color: #999;
  749. }
  750. .wx-login-tip {
  751. display: flex;
  752. align-items: center;
  753. width: 590rpx;
  754. margin: 0 auto;
  755. justify-content: space-between;
  756. .login-line {
  757. width: 193rpx;
  758. height: 1rpx;
  759. background-color: #F1F3F8;
  760. }
  761. .wx-tip {
  762. font-size: 28rpx;
  763. line-height: 44rpx;
  764. color: #999;
  765. flex: 1;
  766. width: 100rpx;
  767. text-align: center;
  768. display: block;
  769. }
  770. }
  771. .wx-login-btn {
  772. width: 590rpx;
  773. margin: 0 auto;
  774. display: flex;
  775. align-items: center;
  776. justify-content: center;
  777. margin-top: 32rpx;
  778. padding-bottom: 30rpx;
  779. .wx-icon {
  780. width: 92rpx;
  781. height: 92rpx;
  782. }
  783. }
  784. </style>