index.vue 21 KB

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