index.vue 21 KB

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