index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. <template>
  2. <view class="login-wrapper" :style="colorStyle">
  3. <view class="shading">
  4. <image :src="logoUrl" />
  5. </view>
  6. <view class="whiteBg" v-if="formItem === 1">
  7. <view class="list" v-if="current !== 1">
  8. <form @submit.prevent="submit">
  9. <view class="item">
  10. <view class="acea-row row-middle">
  11. <image src="../static/phone_1.png" style="width: 24rpx; height: 34rpx;"></image>
  12. <input type="text" :placeholder="$t(`输入手机号码`)" v-model="account" maxlength="11" required />
  13. </view>
  14. </view>
  15. <view class="item">
  16. <view class="acea-row row-middle">
  17. <image src="../static/code_1.png" style="width: 28rpx; height: 32rpx;"></image>
  18. <input type="password" :placeholder="$t(`填写登录密码`)" v-model="password" required />
  19. </view>
  20. </view>
  21. </form>
  22. <!-- <navigator class="forgetPwd" hover-class="none" url="/pages/users/retrievePassword/index">
  23. <span class="iconfont icon-wenti"></span>忘记密码
  24. </navigator> -->
  25. </view>
  26. <view class="list" v-if="current !== 0 || appLoginStatus || appleLoginStatus">
  27. <view class="item">
  28. <view class="acea-row row-middle">
  29. <image src="../static/phone_1.png" style="width: 24rpx; height: 34rpx;"></image>
  30. <input type="text" :placeholder="$t(`输入手机号码`)" v-model="account" :maxlength="11" />
  31. </view>
  32. </view>
  33. <view class="item">
  34. <view class="acea-row row-middle">
  35. <image src="../static/code_2.png" style="width: 28rpx; height: 32rpx;"></image>
  36. <input type="text" :placeholder="$t(`填写验证码`)" :maxlength="6" class="codeIput"
  37. v-model="captcha" />
  38. <button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="code">
  39. {{ text }}
  40. </button>
  41. </view>
  42. </view>
  43. <view class="item" v-if="isShowCode">
  44. <view class="acea-row row-middle">
  45. <image src="../static/code_2.png" style="width: 28rpx; height: 32rpx;"></image>
  46. <input type="text" :placeholder="$t(`填写验证码`)" class="codeIput" v-model="codeVal" />
  47. <view class="code" @click="again"><img :src="codeUrl" /></view>
  48. </view>
  49. </view>
  50. </view>
  51. <view class="logon" @click="loginMobile" v-if="current !== 0">{{$t(`登录`)}}</view>
  52. <view class="logon" @click="submit" v-if="current === 0">{{$t(`登录`)}}</view>
  53. <!-- #ifndef APP-PLUS -->
  54. <view class="tips">
  55. <!-- <view v-if="current==0" @click="current = 1">{{$t(`快速登录`)}}</view> -->
  56. <!-- <view v-if="current==1" @click="current = 0">{{$t(`账号登录`)}}</view> -->
  57. </view>
  58. <!-- TODO -->
  59. <!-- <view class="choose">
  60. <view class="reg" @click="forget">忘记密码</view>
  61. <view class="xian">|</view>
  62. <view class="zhuce" @click="zhuce">注册账号</view>
  63. </view> -->
  64. <!-- #endif -->
  65. <!-- #ifdef APP-PLUS -->
  66. <view class="appLogin" v-if="!appLoginStatus && !appleLoginStatus">
  67. <view class="hds">
  68. <span class="line"></span>
  69. <p>{{$t(`其他方式登录`)}}</p>
  70. <span class="line"></span>
  71. </view>
  72. <view class="btn-wrapper">
  73. <view class="btn wx" @click="wxLogin">
  74. <span class="iconfont icon-s-weixindenglu1"></span>
  75. </view>
  76. <view class="btn mima" v-if="current == 1" @click="current =0">
  77. <span class="iconfont icon-s-mimadenglu1"></span>
  78. </view>
  79. <view class="btn yanzheng" v-if="current == 0" @click="current =1">
  80. <span class="iconfont icon-s-yanzhengmadenglu1"></span>
  81. </view>
  82. <view class="apple-btn" @click="appleLogin" v-if="appleShow">
  83. <view class="iconfont icon-s-pingguo"></view>
  84. </view>
  85. </view>
  86. </view>
  87. <!-- #endif -->
  88. <view class="protocol">
  89. <checkbox-group @change='ChangeIsDefault'>
  90. <checkbox :class="inAnimation?'trembling':''" @animationend='inAnimation=false'
  91. :checked="protocol ? true : false" />{{$t(`已阅读并同意`)}} <text class="main-color"
  92. @click="privacy(4)">{{$t(`《用户协议》`)}}</text>
  93. {{$t(`与`)}}<text class="main-color" @click="privacy(3)">{{$t(`《隐私协议》`)}}</text>
  94. </checkbox-group>
  95. </view>
  96. </view>
  97. <view class="bottom">
  98. <view class="ver" v-if="copyRight">{{copyRight}}</view>
  99. <view v-else class="ver">© 2014-2023
  100. <a href="https://www.crmeb.com">www.crmeb.com</a>
  101. </view>
  102. </view>
  103. <Verify @success="success" :captchaType="captchaType" :imgSize="{ width: '330px', height: '155px' }"
  104. ref="verify"></Verify>
  105. </view>
  106. </template>
  107. <script>
  108. import dayjs from "@/plugin/dayjs/dayjs.min.js";
  109. import sendVerifyCode from "@/mixins/SendVerifyCode";
  110. import {
  111. loginH5,
  112. loginMobile,
  113. registerVerify,
  114. register,
  115. getCodeApi,
  116. getUserInfo,
  117. appleLogin
  118. } from "@/api/user";
  119. import attrs, {
  120. required,
  121. alpha_num,
  122. chs_phone
  123. } from "@/utils/validate";
  124. import {
  125. getLogo
  126. } from "@/api/public";
  127. // import cookie from "@/utils/store/cookie";
  128. import {
  129. VUE_APP_API_URL
  130. } from "@/utils";
  131. // #ifdef APP-PLUS
  132. import {
  133. wechatAppAuth
  134. } from '@/api/api.js'
  135. // #endif
  136. const BACK_URL = "login_back_url";
  137. import colors from '@/mixins/color.js';
  138. import Verify from '../components/verify/index.vue';
  139. export default {
  140. name: "Login",
  141. components: {
  142. Verify
  143. },
  144. mixins: [sendVerifyCode, colors],
  145. data: function() {
  146. return {
  147. copyRight: '',
  148. inAnimation: false,
  149. protocol: false,
  150. navList: [this.$t(`快速登录`), this.$t(`账号登录`)],
  151. current: 1,
  152. account: "",
  153. password: "",
  154. captcha: "",
  155. formItem: 1,
  156. type: "login",
  157. logoUrl: "",
  158. keyCode: "",
  159. codeUrl: "",
  160. codeVal: "",
  161. isShowCode: false,
  162. appLoginStatus: false, // 微信登录强制绑定手机号码状态
  163. appUserInfo: null, // 微信登录保存的用户信息
  164. appleLoginStatus: false, // 苹果登录强制绑定手机号码状态
  165. appleUserInfo: null,
  166. appleShow: false, // 苹果登录版本必须要求ios13以上的
  167. keyLock: true
  168. };
  169. },
  170. watch: {
  171. formItem: function(nval, oVal) {
  172. if (nval == 1) {
  173. this.type = 'login'
  174. } else {
  175. this.type = 'register'
  176. }
  177. }
  178. },
  179. onLoad() {
  180. let self = this
  181. uni.getSystemInfo({
  182. success: (res) => {
  183. if (res.platform.toLowerCase() == 'ios' && this.getSystem(res.system)) {
  184. self.appleShow = true
  185. }
  186. }
  187. });
  188. if (uni.getStorageSync('copyRight').copyrightContext) {
  189. this.copyRight = uni.getStorageSync('copyRight').copyrightContext
  190. }
  191. },
  192. mounted: function() {
  193. // this.getCode();
  194. this.getLogoImage();
  195. },
  196. methods: {
  197. ChangeIsDefault(e) {
  198. this.$set(this, 'protocol', !this.protocol);
  199. },
  200. privacy(type) {
  201. uni.navigateTo({
  202. url: "/pages/users/privacy/index?type=" + type
  203. })
  204. },
  205. zhuce() {
  206. uni.navigateTo({
  207. url: "/pages/users/login/register"
  208. })
  209. },
  210. forget() {
  211. uni.navigateTo({
  212. url: "/pages/users/login/forget"
  213. })
  214. },
  215. // IOS 版本号判断
  216. getSystem(system) {
  217. let str
  218. system.toLowerCase().indexOf('ios') === -1 ? str = system : str = system.split(' ')[1]
  219. if (str.indexOf('.'))
  220. return str.split('.')[0] >= 13
  221. return str >= 13
  222. },
  223. // 苹果登录
  224. appleLogin() {
  225. let self = this
  226. this.account = ''
  227. this.captcha = ''
  228. if (!self.protocol) {
  229. this.inAnimation = true
  230. return self.$util.Tips({
  231. title: '请先阅读并同意协议'
  232. });
  233. }
  234. uni.showLoading({
  235. title: this.$t(`登录中`)
  236. })
  237. uni.login({
  238. provider: 'apple',
  239. timeout: 10000,
  240. success(loginRes) {
  241. uni.getUserInfo({
  242. provider: 'apple',
  243. success: function(infoRes) {
  244. self.appleUserInfo = infoRes.userInfo
  245. self.appleLoginApi()
  246. },
  247. fail() {
  248. uni.showToast({
  249. title: self.$t(`获取用户信息失败`),
  250. icon: 'none',
  251. duration: 2000
  252. })
  253. },
  254. complete() {
  255. uni.hideLoading()
  256. }
  257. });
  258. },
  259. fail(error) {
  260. console.log(error)
  261. }
  262. })
  263. },
  264. // 苹果登录Api
  265. appleLoginApi() {
  266. let self = this
  267. appleLogin({
  268. openId: self.appleUserInfo.openId,
  269. email: self.appleUserInfo.email || '',
  270. phone: this.account,
  271. captcha: this.captcha
  272. }).then(({
  273. data
  274. }) => {
  275. if (data.isbind) {
  276. uni.showModal({
  277. title: self.$t(`提示`),
  278. content: self.$t(`请绑定手机号后,继续操作`),
  279. showCancel: false,
  280. success: function(res) {
  281. if (res.confirm) {
  282. self.current = 1
  283. self.appleLoginStatus = true
  284. }
  285. }
  286. });
  287. } else {
  288. self.$store.commit("LOGIN", {
  289. 'token': data.token,
  290. 'time': data.expires_time - self.$Cache.time()
  291. });
  292. let backUrl = self.$Cache.get(BACK_URL) || "/pages/index/index";
  293. self.$Cache.clear(BACK_URL);
  294. self.$store.commit("SETUID", data.userInfo.uid);
  295. uni.reLaunch({
  296. url: backUrl
  297. });
  298. }
  299. }).catch(error => {
  300. uni.showModal({
  301. title: self.$t(`提示`),
  302. content: self.$t(`错误信息`) + `${error}`,
  303. success: function(res) {
  304. if (res.confirm) {
  305. console.log(self.$t(`用户点击确定`));
  306. } else if (res.cancel) {
  307. console.log(self.$t(`用户点击取消`));
  308. }
  309. }
  310. });
  311. })
  312. },
  313. // App微信登录
  314. wxLogin() {
  315. let self = this
  316. this.account = ''
  317. this.captcha = ''
  318. if (!self.protocol) {
  319. this.inAnimation = true
  320. return self.$util.Tips({
  321. title: '请先阅读并同意协议'
  322. });
  323. }
  324. uni.showLoading({
  325. title: self.$t(`登录中`)
  326. })
  327. uni.login({
  328. provider: 'weixin',
  329. success: function(loginRes) {
  330. // 获取用户信息
  331. uni.getUserInfo({
  332. provider: 'weixin',
  333. success: function(infoRes) {
  334. self.appUserInfo = infoRes.userInfo
  335. self.wxLoginApi()
  336. },
  337. fail() {
  338. uni.showToast({
  339. title: self.$t(`获取用户信息失败`),
  340. icon: 'none',
  341. duration: 2000
  342. })
  343. },
  344. complete() {
  345. uni.hideLoading()
  346. }
  347. });
  348. },
  349. fail() {
  350. uni.showToast({
  351. title: self.$t(`登录失败`),
  352. icon: 'none',
  353. duration: 2000
  354. })
  355. }
  356. });
  357. },
  358. wxLoginApi() {
  359. let self = this
  360. wechatAppAuth({
  361. userInfo: self.appUserInfo,
  362. phone: this.account,
  363. code: this.captcha
  364. }).then(({
  365. data
  366. }) => {
  367. if (data.isbind) {
  368. uni.showModal({
  369. title: self.$t(`提示`),
  370. content: self.$t(`请绑定手机号后,继续操作`),
  371. showCancel: false,
  372. success: function(res) {
  373. if (res.confirm) {
  374. self.current = 1
  375. self.appLoginStatus = true
  376. }
  377. }
  378. });
  379. } else {
  380. self.$store.commit("LOGIN", {
  381. 'token': data.token,
  382. 'time': data.expires_time - self.$Cache.time()
  383. });
  384. let backUrl = self.$Cache.get(BACK_URL) || "/pages/index/index";
  385. self.$Cache.clear(BACK_URL);
  386. self.$store.commit("SETUID", data.userInfo.uid);
  387. uni.reLaunch({
  388. url: backUrl
  389. });
  390. }
  391. }).catch(error => {
  392. uni.showModal({
  393. title: self.$t(`提示`),
  394. content: self.$t(`错误信息`) + `${error}`,
  395. success: function(res) {
  396. if (res.confirm) {
  397. console.log(self.$t(`用户点击确定`));
  398. } else if (res.cancel) {
  399. console.log(self.$t(`用户点击取消`));
  400. }
  401. }
  402. });
  403. })
  404. },
  405. again() {
  406. this.codeUrl =
  407. VUE_APP_API_URL +
  408. "/sms_captcha?" +
  409. "key=" +
  410. this.keyCode +
  411. Date.parse(new Date());
  412. },
  413. success(data) {
  414. this.$refs.verify.hide()
  415. getCodeApi()
  416. .then(res => {
  417. this.keyCode = res.data.key;
  418. this.getCode(data);
  419. })
  420. .catch(res => {
  421. this.$util.Tips({
  422. title: res
  423. });
  424. });
  425. },
  426. code() {
  427. let that = this
  428. if (!that.protocol) {
  429. this.inAnimation = true
  430. return that.$util.Tips({
  431. title: '请先阅读并同意协议'
  432. });
  433. }
  434. if (!that.account) return that.$util.Tips({
  435. title: that.$t(`请填写手机号码`)
  436. });
  437. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
  438. title: that.$t(`请输入正确的手机号码`)
  439. });
  440. this.$refs.verify.show()
  441. },
  442. async getLogoImage() {
  443. let that = this;
  444. getLogo(2).then(res => {
  445. that.logoUrl = res.data.logo_url;
  446. });
  447. },
  448. async loginMobile() {
  449. let that = this;
  450. if (!that.protocol) {
  451. this.inAnimation = true
  452. return that.$util.Tips({
  453. title: '请先阅读并同意协议'
  454. });
  455. }
  456. if (!that.account) return that.$util.Tips({
  457. title: that.$t(`请填写手机号码`)
  458. });
  459. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
  460. title: that.$t(`请输入正确的手机号码`)
  461. });
  462. if (!that.captcha) return that.$util.Tips({
  463. title: that.$t(`请填写验证码`)
  464. });
  465. if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
  466. title: that.$t(`请输入正确的验证码`)
  467. });
  468. if (that.appLoginStatus) {
  469. that.wxLoginApi()
  470. } else if (that.appleLoginStatus) {
  471. that.appleLoginApi()
  472. } else {
  473. if (this.keyLock) {
  474. this.keyLock = !this.keyLock
  475. } else {
  476. return that.$util.Tips({
  477. title: that.$t(`请勿重复点击`)
  478. });
  479. }
  480. loginMobile({
  481. phone: that.account,
  482. captcha: that.captcha,
  483. spread: that.$Cache.get("spread")
  484. })
  485. .then(res => {
  486. let data = res.data;
  487. that.$store.commit("LOGIN", {
  488. 'token': data.token,
  489. 'time': data.expires_time - this.$Cache.time()
  490. });
  491. let backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
  492. that.$Cache.clear(BACK_URL);
  493. getUserInfo().then(res => {
  494. this.keyLock = true
  495. that.$store.commit("SETUID", res.data.uid);
  496. if (backUrl.indexOf('/pages/users/login/index') !== -1) {
  497. backUrl = '/pages/index/index';
  498. }
  499. uni.reLaunch({
  500. url: backUrl
  501. });
  502. })
  503. })
  504. .catch(res => {
  505. this.keyLock = true
  506. that.$util.Tips({
  507. title: res
  508. });
  509. });
  510. }
  511. },
  512. async register() {
  513. let that = this;
  514. if (!that.protocol) {
  515. this.inAnimation = true
  516. return that.$util.Tips({
  517. title: '请先阅读并同意协议'
  518. });
  519. }
  520. if (!that.account) return that.$util.Tips({
  521. title: that.$t(`请填写手机号码`)
  522. });
  523. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
  524. title: that.$t(`请输入正确的手机号码`)
  525. });
  526. if (!that.captcha) return that.$util.Tips({
  527. title: that.$t(`请填写验证码`)
  528. });
  529. if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
  530. title: that.$t(`请输入正确的验证码`)
  531. });
  532. if (!that.password) return that.$util.Tips({
  533. title: that.$t(`请填写密码`)
  534. });
  535. if (/^([0-9]|[a-z]|[A-Z]){0,6}$/i.test(that.password)) return that.$util.Tips({
  536. title: that.$t(`您输入的密码过于简单`)
  537. });
  538. register({
  539. account: that.account,
  540. captcha: that.captcha,
  541. password: that.password,
  542. spread: that.$Cache.get("spread")
  543. })
  544. .then(res => {
  545. that.$util.Tips({
  546. title: res
  547. });
  548. that.formItem = 1;
  549. })
  550. .catch(res => {
  551. that.$util.Tips({
  552. title: res
  553. });
  554. });
  555. },
  556. async getCode(data) {
  557. let that = this;
  558. if (!that.protocol) {
  559. this.inAnimation = true
  560. return that.$util.Tips({
  561. title: '请先阅读并同意协议'
  562. });
  563. }
  564. if (!that.account) return that.$util.Tips({
  565. title: that.$t(`请填写手机号码`)
  566. });
  567. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
  568. title: that.$t(`请输入正确的手机号码`)
  569. });
  570. if (that.formItem == 2) that.type = "register";
  571. await registerVerify({
  572. phone: that.account,
  573. type: that.type,
  574. key: that.keyCode,
  575. captchaType: this.captchaType,
  576. captchaVerification: data.captchaVerification
  577. })
  578. .then(res => {
  579. this.sendCode()
  580. that.$util.Tips({
  581. title: res.msg
  582. });
  583. })
  584. .catch(res => {
  585. that.$util.Tips({
  586. title: res
  587. });
  588. });
  589. },
  590. navTap: function(index) {
  591. this.current = index;
  592. },
  593. async submit() {
  594. let that = this;
  595. if (!that.protocol) {
  596. this.inAnimation = true
  597. return that.$util.Tips({
  598. title: '请先阅读并同意协议'
  599. });
  600. }
  601. if (!that.account) return that.$util.Tips({
  602. title: that.$t(`请填写账号`)
  603. });
  604. if (!/^[\w\d]{5,16}$/i.test(that.account)) return that.$util.Tips({
  605. title: that.$t(`请输入正确的账号`)
  606. });
  607. if (!that.password) return that.$util.Tips({
  608. title: that.$t(`请填写密码`)
  609. });
  610. if (this.keyLock) {
  611. this.keyLock = !this.keyLock
  612. } else {
  613. return that.$util.Tips({
  614. title: that.$t(`请勿重复点击`)
  615. });
  616. }
  617. loginH5({
  618. account: that.account,
  619. password: that.password,
  620. spread: that.$Cache.get("spread")
  621. })
  622. .then(({
  623. data
  624. }) => {
  625. that.$store.commit("LOGIN", {
  626. 'token': data.token,
  627. 'time': data.expires_time - this.$Cache.time()
  628. });
  629. let backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
  630. that.$Cache.clear(BACK_URL);
  631. getUserInfo().then(res => {
  632. this.keyLock = true
  633. that.$store.commit("SETUID", res.data.uid);
  634. uni.reLaunch({
  635. url: backUrl
  636. });
  637. }).catch(error => {
  638. this.keyLock = true
  639. })
  640. })
  641. .catch(e => {
  642. this.keyLock = true
  643. that.$util.Tips({
  644. title: e
  645. });
  646. });
  647. }
  648. }
  649. };
  650. </script>
  651. <style>
  652. page {
  653. background: #fff;
  654. }
  655. </style>
  656. <style lang="scss">
  657. .appLogin {
  658. margin-top: 60rpx;
  659. .hds {
  660. display: flex;
  661. justify-content: center;
  662. align-items: center;
  663. font-size: 24rpx;
  664. color: #B4B4B4;
  665. .line {
  666. width: 68rpx;
  667. height: 1rpx;
  668. background: #CCCCCC;
  669. }
  670. p {
  671. margin: 0 20rpx;
  672. }
  673. }
  674. .btn-wrapper {
  675. display: flex;
  676. align-items: center;
  677. justify-content: center;
  678. margin-top: 30rpx;
  679. .btn {
  680. display: flex;
  681. align-items: center;
  682. justify-content: center;
  683. width: 68rpx;
  684. height: 68rpx;
  685. border-radius: 50%;
  686. }
  687. .apple-btn {
  688. display: flex;
  689. align-items: center;
  690. justify-content: center;
  691. width: 68rpx;
  692. height: 68rpx;
  693. border-radius: 50%;
  694. background: #000;
  695. .icon-s-pingguo {
  696. color: #fff;
  697. font-size: 44rpx;
  698. }
  699. }
  700. .iconfont {
  701. font-size: 40rpx;
  702. color: #fff;
  703. }
  704. .wx {
  705. margin-right: 30rpx;
  706. background-color: #61C64F;
  707. }
  708. .mima {
  709. margin-right: 30rpx;
  710. background-color: #28B3E9;
  711. }
  712. .yanzheng {
  713. margin-right: 30rpx;
  714. background-color: #F89C23;
  715. }
  716. }
  717. }
  718. .code img {
  719. width: 100%;
  720. height: 100%;
  721. }
  722. .acea-row.row-middle {
  723. input {
  724. margin-left: 20rpx;
  725. display: block;
  726. }
  727. }
  728. .login-wrapper {
  729. padding: 30rpx;
  730. .shading {
  731. display: flex;
  732. align-items: center;
  733. justify-content: center;
  734. width: 100%;
  735. /* #ifdef APP-VUE */
  736. margin-top: 50rpx;
  737. /* #endif */
  738. /* #ifndef APP-VUE */
  739. margin-top: 200rpx;
  740. /* #endif */
  741. image {
  742. width: 240rpx;
  743. height: 240rpx;
  744. }
  745. }
  746. .whiteBg {
  747. margin-top: 100rpx;
  748. .list {
  749. border-radius: 16rpx;
  750. overflow: hidden;
  751. .item {
  752. border-bottom: 1px solid #F0F0F0;
  753. background: #fff;
  754. .row-middle {
  755. position: relative;
  756. padding: 16rpx 45rpx;
  757. input {
  758. flex: 1;
  759. font-size: 28rpx;
  760. height: 80rpx;
  761. }
  762. .code {
  763. position: absolute;
  764. right: 30rpx;
  765. top: 50%;
  766. color: var(--view-theme);
  767. font-size: 26rpx;
  768. transform: translateY(-50%);
  769. }
  770. }
  771. }
  772. }
  773. .logon {
  774. display: flex;
  775. align-items: center;
  776. justify-content: center;
  777. width: 100%;
  778. height: 86rpx;
  779. margin-top: 80rpx;
  780. background-color: var(--view-theme);
  781. border-radius: 120rpx;
  782. color: #FFFFFF;
  783. font-size: 30rpx;
  784. }
  785. .tips {
  786. margin: 30rpx;
  787. text-align: center;
  788. color: #999;
  789. }
  790. }
  791. }
  792. .protocol {
  793. margin-top: 40rpx;
  794. color: #999999;
  795. font-size: 24rpx;
  796. text-align: center;
  797. bottom: 20rpx;
  798. }
  799. .bottom {
  800. position: fixed;
  801. bottom: 30rpx;
  802. left: 0;
  803. display: flex;
  804. width: 100%;
  805. justify-content: center;
  806. color: #999999;
  807. .ver {
  808. font-size: 20rpx;
  809. }
  810. .ver-msg {
  811. margin-left: 10rpx;
  812. }
  813. a {
  814. color: #999999;
  815. margin-left: 10rpx;
  816. text-decoration: none;
  817. }
  818. }
  819. .trembling {
  820. animation: shake 0.6s;
  821. }
  822. .main-color {
  823. color: var(--view-theme);
  824. }
  825. .choose {
  826. display: flex;
  827. justify-content: center;
  828. .reg {
  829. font-size: 28rpx;
  830. font-weight: 500;
  831. color: #ff8d3a;
  832. }
  833. .xian {
  834. color: #FF4C4C;
  835. padding-left: 10rpx;
  836. }
  837. .zhuce {
  838. font-size: 28rpx;
  839. font-weight: 500;
  840. color: #FF4C4C;
  841. padding-left: 10rpx;
  842. }
  843. }
  844. </style>