index.vue 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078
  1. <template>
  2. <view class="login-wrapper" :style="colorStyle">
  3. <view class="login-top"></view>
  4. <view class="shading">
  5. <image :src="logoUrl" />
  6. <!-- <image src="../static/logo2.png" v-else /> -->
  7. </view>
  8. <view class="whiteBg" v-if="formItem === 1">
  9. <view class="tips">
  10. <view class="tips-btn" :class="current == 1 ? 'on' : ''" @click="current = 1">
  11. <view>快速登录</view>
  12. <view :class="current == 1 ? 'line' : 'none'"></view>
  13. </view>
  14. <view class="tips-btn" :class="current == 0 ? 'on' : ''" @click="current = 0">
  15. <view>账号登录</view>
  16. <view :class="current == 0 ? 'line' : 'none'"></view>
  17. </view>
  18. </view>
  19. <view class="list" v-if="current !== 1">
  20. <form @submit.prevent="submit">
  21. <view class="item">
  22. <view class="acea-row row-middle">
  23. <image src="../static/phone_1.png" class="itemImg-add"></image>
  24. <input type="text" placeholder="输入手机号码" v-model="account" maxlength="11" required />
  25. </view>
  26. </view>
  27. <view class="item">
  28. <view class="acea-row row-middle">
  29. <image src="../static/code_1.png" class="item-img"></image>
  30. <input type="password" placeholder="填写登录密码" v-model="password" required />
  31. </view>
  32. </view>
  33. </form>
  34. <navigator class="forgetPwd" hover-class="none" url="/pages/users/retrievePassword/index">
  35. 忘记密码?
  36. </navigator>
  37. </view>
  38. <view class="list" v-if="current !== 0 || appLoginStatus || appleLoginStatus">
  39. <view class="item">
  40. <view class="acea-row row-middle">
  41. <image src="../static/phone_1.png" class="itemImg-add"></image>
  42. <input type="text" placeholder="输入手机号码" v-model="account" maxlength="11" />
  43. </view>
  44. </view>
  45. <view class="item">
  46. <view class="acea-row row-middle">
  47. <image src="../static/code_2.png" class="item-img"></image>
  48. <input type="text" placeholder="填写验证码" maxlength="6" class="codeIput" v-model="captcha" />
  49. <button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="code">
  50. {{ text }}
  51. </button>
  52. </view>
  53. </view>
  54. <!-- -->
  55. <view class="item" v-if="sspread">
  56. <view class="acea-row row-middle">
  57. <image src="../static/code_1.png" class="item-img"></image>
  58. <input type="text" placeholder="" v-model="sspread" maxlength="11" disabled/>
  59. </view>
  60. </view>
  61. <!-- <view class="item" v-if="isShowCode">
  62. <view class="acea-row row-middle">
  63. <image src="../static/code_2.png" class="item-img"></image>
  64. <input type="text" placeholder="填写验证码" class="codeIput" v-model="codeVal" />
  65. <view class="code" @click="again"><img :src="codeUrl" /></view>
  66. </view>
  67. </view> -->
  68. </view>
  69. <view class="logon" @click="loginMobile" v-if="current !== 0">登录</view>
  70. <view class="logon" @click="submit" v-if="current === 0">登录</view>
  71. <!-- #ifdef APP-PLUS -->
  72. <!-- <view class="appLogin" v-if="!appLoginStatus && !appleLoginStatus">
  73. <view class="hds">
  74. <span class="line"></span>
  75. <p>其他方式登录</p>
  76. <span class="line"></span>
  77. </view>
  78. <view class="btn-wrapper">
  79. <view class="btn wx" @click="wxLogin">
  80. <span class="iconfont icon-s-weixindenglu1"></span>
  81. </view>
  82. <view class="btn pingguo" @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" />已阅读并同意 <text class="main-color"
  92. @click="privacy('user')">《用户协议》</text>
  93. 与<text class="main-color" @click="privacy('privacy ')">《隐私协议》</text>
  94. </checkbox-group>
  95. </view>
  96. </view>
  97. <view class="bottom"></view>
  98. <Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }"
  99. ref="verify"></Verify>
  100. <view class="copyright" v-if="copyrightContext">{{copyrightContext}}</view>
  101. <template v-else>
  102. <view class="copyright">Copyright ©2022 浙江易博网络科技有限公司 版权所有 <br /><text @click="domainTap('www.miit.gov.cn')">浙ICP备 2021013190号</text> </view>
  103. <!-- <view class="copyright" @click="domainTap('www.miit.gov.cn')"> </view> -->
  104. </template>
  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. validatorDefaultCatch
  126. } from "@/utils/dialog";
  127. import {
  128. getLogo
  129. } from "@/api/public";
  130. // import cookie from "@/utils/store/cookie";
  131. import {
  132. VUE_APP_API_URL
  133. } from "@/utils";
  134. // #ifdef APP-PLUS
  135. import {
  136. wechatAppAuth
  137. } from '@/api/api.js'
  138. // #endif
  139. const BACK_URL = "login_back_url";
  140. import colors from '@/mixins/color.js';
  141. import Verify from '@/components/verify/verify.vue';
  142. export default {
  143. name: "Login",
  144. components: {
  145. Verify
  146. },
  147. mixins: [sendVerifyCode, colors],
  148. data: function() {
  149. return {
  150. inAnimation: false,
  151. protocol: false,
  152. navList: ["快速登录", "账号登录"],
  153. current: 1,
  154. account: "",
  155. password: "",
  156. captcha: "",
  157. formItem: 1,
  158. type: "login",
  159. logoUrl: "",
  160. keyCode: "",
  161. codeUrl: "",
  162. codeVal: "",
  163. isShowCode: false,
  164. appLoginStatus: false, // 微信登录强制绑定手机号码状态
  165. appUserInfo: null, // 微信登录保存的用户信息
  166. appleLoginStatus: false, // 苹果登录强制绑定手机号码状态
  167. appleUserInfo: null,
  168. appleShow: false, // 苹果登录版本必须要求ios13以上的
  169. keyLock: true,
  170. copyrightContext:'',
  171. sspread: '',
  172. };
  173. },
  174. watch: {
  175. formItem: function(nval, oVal) {
  176. if (nval == 1) {
  177. this.type = 'login'
  178. } else {
  179. this.type = 'register'
  180. }
  181. }
  182. },
  183. onLoad() {
  184. let self = this
  185. uni.getSystemInfo({
  186. success: (res) => {
  187. if (res.platform.toLowerCase() == 'ios' && this.getSystem(res.system)) {
  188. self.appleShow = true
  189. }
  190. }
  191. });
  192. this.sspread = this.$Cache.get("spread")
  193. },
  194. mounted: function() {
  195. // this.getCode();
  196. this.getLogoImage();
  197. },
  198. methods: {
  199. domainTap(){
  200. let url = 'https://www.miit.gov.cn/'
  201. // #ifdef H5
  202. window.location.href = 'https://www.miit.gov.cn/'
  203. // #endif
  204. // #ifdef APP-PLUS || MP
  205. plus.runtime.openURL(
  206. url,
  207. function(err) {
  208. console.log(err);
  209. }
  210. );
  211. // #endif
  212. },
  213. changeMsg() {
  214. this.inAnimation = true;
  215. },
  216. ChangeIsDefault(e) {
  217. this.$set(this, 'protocol', !this.protocol);
  218. },
  219. // IOS 版本号判断
  220. getSystem(system) {
  221. let str
  222. system.toLowerCase().indexOf('ios') === -1 ? str = system : str = system.split(' ')[1]
  223. if (str.indexOf('.'))
  224. return str.split('.')[0] >= 13
  225. return str >= 13
  226. },
  227. // 苹果登录
  228. appleLogin() {
  229. let self = this
  230. this.account = ''
  231. this.captcha = ''
  232. if (!self.protocol) {
  233. this.inAnimation = true
  234. return self.$util.Tips({
  235. title: '请先阅读并同意协议'
  236. });
  237. }
  238. uni.showLoading({
  239. title: '登录中'
  240. })
  241. uni.login({
  242. provider: 'apple',
  243. timeout: 10000,
  244. success(loginRes) {
  245. uni.getUserInfo({
  246. provider: 'apple',
  247. success: function(infoRes) {
  248. self.appleUserInfo = infoRes.userInfo
  249. self.appleLoginApi()
  250. },
  251. fail() {
  252. uni.showToast({
  253. title: '获取用户信息失败',
  254. icon: 'none',
  255. duration: 2000
  256. })
  257. },
  258. complete() {
  259. uni.hideLoading()
  260. }
  261. });
  262. },
  263. fail(error) {
  264. console.log(error)
  265. }
  266. })
  267. },
  268. // 苹果登录Api
  269. appleLoginApi() {
  270. let self = this
  271. appleLogin({
  272. openId: self.appleUserInfo.openId,
  273. email: self.appleUserInfo.email || '',
  274. phone: this.account,
  275. captcha: this.captcha
  276. }).then(({
  277. data
  278. }) => {
  279. if (data.isbind) {
  280. uni.showModal({
  281. title: '提示',
  282. content: '请绑定手机号后,继续操作',
  283. showCancel: false,
  284. success: function(res) {
  285. if (res.confirm) {
  286. self.current = 1
  287. self.appleLoginStatus = true
  288. }
  289. }
  290. });
  291. } else {
  292. self.$store.commit("LOGIN", {
  293. 'token': data.token,
  294. 'time': data.expires_time - self.$Cache.time()
  295. });
  296. let backUrl = self.$Cache.get(BACK_URL) || "/pages/index/index";
  297. self.$Cache.clear(BACK_URL);
  298. self.$store.commit("SETUID", data.userInfo.uid);
  299. self.$store.commit("UPDATE_USERINFO", data.userInfo);
  300. uni.reLaunch({
  301. url: backUrl
  302. });
  303. }
  304. }).catch(error => {
  305. uni.showModal({
  306. title: '提示',
  307. content: `错误信息${error}`,
  308. success: function(res) {
  309. if (res.confirm) {
  310. console.log('用户点击确定');
  311. } else if (res.cancel) {
  312. console.log('用户点击取消');
  313. }
  314. }
  315. });
  316. })
  317. },
  318. // App微信登录
  319. wxLogin() {
  320. if (!this.protocol) {
  321. this.inAnimation = true
  322. return this.$util.Tips({
  323. title: '请先阅读并同意协议'
  324. });
  325. }
  326. let self = this
  327. this.account = ''
  328. this.captcha = ''
  329. uni.showLoading({
  330. title: '登录中'
  331. })
  332. uni.login({
  333. provider: 'weixin',
  334. success: function(loginRes) {
  335. // 获取用户信息
  336. uni.getUserInfo({
  337. provider: 'weixin',
  338. success: function(infoRes) {
  339. self.appUserInfo = infoRes.userInfo
  340. self.wxLoginApi()
  341. },
  342. fail() {
  343. uni.showToast({
  344. title: '获取用户信息失败',
  345. icon: 'none',
  346. duration: 2000
  347. })
  348. },
  349. complete() {
  350. uni.hideLoading()
  351. }
  352. });
  353. },
  354. fail() {
  355. uni.showToast({
  356. title: '登录失败',
  357. icon: 'none',
  358. duration: 2000
  359. })
  360. }
  361. });
  362. },
  363. wxLoginApi() {
  364. let self = this
  365. wechatAppAuth({
  366. userInfo: self.appUserInfo,
  367. phone: this.account,
  368. code: this.captcha
  369. }).then(({
  370. data
  371. }) => {
  372. if (data.isbind) {
  373. uni.showModal({
  374. title: '提示',
  375. content: '请绑定手机号后,继续操作',
  376. showCancel: false,
  377. success: function(res) {
  378. if (res.confirm) {
  379. self.current = 1
  380. self.appLoginStatus = true
  381. }
  382. }
  383. });
  384. } else {
  385. self.$store.commit("LOGIN", {
  386. 'token': data.token,
  387. 'time': data.expires_time - self.$Cache.time()
  388. });
  389. let backUrl = self.$Cache.get(BACK_URL) || "/pages/index/index";
  390. self.$Cache.clear(BACK_URL);
  391. self.$store.commit("SETUID", data.userInfo.uid);
  392. self.$store.commit("UPDATE_USERINFO", data.userInfo);
  393. uni.reLaunch({
  394. url: backUrl
  395. });
  396. }
  397. }).catch(error => {
  398. uni.showModal({
  399. title: '提示',
  400. content: `错误信息${error}`,
  401. success: function(res) {
  402. if (res.confirm) {
  403. console.log('用户点击确定');
  404. } else if (res.cancel) {
  405. console.log('用户点击取消');
  406. }
  407. }
  408. });
  409. })
  410. },
  411. again() {
  412. this.codeUrl =
  413. VUE_APP_API_URL +
  414. "/sms_captcha?" +
  415. "key=" +
  416. this.keyCode +
  417. Date.parse(new Date());
  418. },
  419. success(data) {
  420. this.$refs.verify.hide()
  421. getCodeApi()
  422. .then(res => {
  423. this.keyCode = res.data.key;
  424. this.getCode(data);
  425. })
  426. .catch(res => {
  427. this.$util.Tips({
  428. title: res
  429. });
  430. });
  431. },
  432. code() {
  433. let that = this
  434. if (!that.protocol) {
  435. this.inAnimation = true
  436. return that.$util.Tips({
  437. title: '请先阅读并同意协议'
  438. });
  439. }
  440. if (!that.account) return that.$util.Tips({
  441. title: '请填写手机号码'
  442. });
  443. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
  444. title: '请输入正确的手机号码'
  445. });
  446. // getCodeApi()
  447. // .then(res => {
  448. // that.keyCode = res.data.key;
  449. // that.getCode();
  450. // })
  451. // .catch(res => {
  452. // that.$util.Tips({
  453. // title: res
  454. // });
  455. // });
  456. this.$refs.verify.show()
  457. },
  458. async getLogoImage() {
  459. let that = this;
  460. getLogo(2).then(res => {
  461. that.logoUrl = res.data.logo_url;
  462. that.copyrightContext = res.data.copyrightContext;
  463. });
  464. },
  465. async loginMobile() {
  466. let that = this;
  467. if (!that.protocol) {
  468. this.inAnimation = true
  469. return that.$util.Tips({
  470. title: '请先阅读并同意协议'
  471. });
  472. }
  473. if (!that.account) return that.$util.Tips({
  474. title: '请填写手机号码'
  475. });
  476. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
  477. title: '请输入正确的手机号码'
  478. });
  479. if (!that.captcha) return that.$util.Tips({
  480. title: '请填写验证码'
  481. });
  482. if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
  483. title: '请输入正确的验证码'
  484. });
  485. if (that.appLoginStatus) {
  486. that.wxLoginApi()
  487. } else if (that.appleLoginStatus) {
  488. that.appleLoginApi()
  489. } else {
  490. if (this.keyLock) {
  491. this.keyLock = !this.keyLock
  492. } else {
  493. return that.$util.Tips({
  494. title: '请勿重复点击'
  495. });
  496. }
  497. loginMobile({
  498. phone: that.account,
  499. captcha: that.captcha,
  500. spread: that.$Cache.get("spread")
  501. })
  502. .then(res => {
  503. let data = res.data;
  504. that.$store.commit("LOGIN", {
  505. 'token': data.token,
  506. 'time': data.expires_time - this.$Cache.time()
  507. });
  508. let backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
  509. that.$Cache.clear(BACK_URL);
  510. getUserInfo().then(res => {
  511. this.keyLock = true
  512. that.$store.commit("SETUID", res.data.uid);
  513. that.$store.commit("UPDATE_USERINFO", res.data);
  514. if (backUrl.indexOf('/pages/users/login/index') !== -1) {
  515. backUrl = '/pages/index/index';
  516. }
  517. uni.reLaunch({
  518. url: backUrl
  519. });
  520. })
  521. })
  522. .catch(res => {
  523. this.keyLock = true
  524. that.$util.Tips({
  525. title: res
  526. });
  527. });
  528. }
  529. },
  530. async register() {
  531. let that = this;
  532. if (!that.account) return that.$util.Tips({
  533. title: '请填写手机号码'
  534. });
  535. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
  536. title: '请输入正确的手机号码'
  537. });
  538. if (!that.captcha) return that.$util.Tips({
  539. title: '请填写验证码'
  540. });
  541. if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
  542. title: '请输入正确的验证码'
  543. });
  544. if (!that.password) return that.$util.Tips({
  545. title: '请填写密码'
  546. });
  547. if (/^([0-9]|[a-z]|[A-Z]){0,6}$/i.test(that.password)) return that.$util.Tips({
  548. title: '您输入的密码过于简单'
  549. });
  550. register({
  551. account: that.account,
  552. captcha: that.captcha,
  553. password: that.password,
  554. spread: that.$Cache.get("spread")
  555. })
  556. .then(res => {
  557. that.$util.Tips({
  558. title: res
  559. });
  560. that.formItem = 1;
  561. })
  562. .catch(res => {
  563. that.$util.Tips({
  564. title: res
  565. });
  566. });
  567. },
  568. async getCode(data){
  569. console.log('data-------',data);
  570. let that = this;
  571. if (!that.account) return that.$util.Tips({
  572. title: '请填写手机号码'
  573. });
  574. if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
  575. title: '请输入正确的手机号码'
  576. });
  577. if (that.formItem == 2) that.type = "register";
  578. await registerVerify({
  579. phone: that.account,
  580. type: that.type,
  581. key: that.keyCode,
  582. captchaType: 'blockPuzzle',
  583. captchaVerification: data.captchaVerification
  584. })
  585. .then(res => {
  586. that.$util.Tips({
  587. title: res.msg
  588. });
  589. that.sendCode();
  590. })
  591. .catch(res => {
  592. that.$util.Tips({
  593. title: res
  594. });
  595. });
  596. },
  597. navTap: function(index) {
  598. this.current = index;
  599. },
  600. async submit() {
  601. let that = this;
  602. if (!that.protocol) {
  603. this.inAnimation = true
  604. return that.$util.Tips({
  605. title: '请先阅读并同意协议'
  606. });
  607. }
  608. if (!that.account) return that.$util.Tips({
  609. title: '请填写账号'
  610. });
  611. if (!/^[\w\d]{5,16}$/i.test(that.account)) return that.$util.Tips({
  612. title: '请输入正确的账号'
  613. });
  614. if (!that.password) return that.$util.Tips({
  615. title: '请填写密码'
  616. });
  617. if (this.keyLock) {
  618. this.keyLock = !this.keyLock
  619. } else {
  620. return that.$util.Tips({
  621. title: '请勿重复点击'
  622. });
  623. }
  624. loginH5({
  625. account: that.account,
  626. password: that.password,
  627. spread: that.$Cache.get("spread")
  628. })
  629. .then(({
  630. data
  631. }) => {
  632. that.$store.commit("LOGIN", {
  633. 'token': data.token,
  634. 'time': data.expires_time - this.$Cache.time()
  635. });
  636. let backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
  637. that.$Cache.clear(BACK_URL);
  638. getUserInfo().then(res => {
  639. this.keyLock = true
  640. that.$store.commit("SETUID", res.data.uid);
  641. that.$store.commit("UPDATE_USERINFO", res.data);
  642. uni.reLaunch({
  643. url: backUrl
  644. });
  645. // that.setMen({
  646. // avatar: res.data.avatar,
  647. // uid: res.data.uid,
  648. // nickname: res.data.nickname,
  649. // account: that.account,
  650. // password: that.password,
  651. // })
  652. }).catch(error => {
  653. this.keyLock = true
  654. })
  655. })
  656. .catch(e => {
  657. this.keyLock = true
  658. that.$util.Tips({
  659. title: e
  660. });
  661. });
  662. },
  663. privacy(type) {
  664. uni.navigateTo({
  665. url: "/pages/users/privacy/index?type=" + type
  666. })
  667. },
  668. // 保存用户基础信息
  669. setMen(data) {
  670. let that = this
  671. try{
  672. that.$io.read("MenList.json").then(res => {
  673. // res 读取的文件内容
  674. console.log('读取结果:',res)
  675. if(!res) {
  676. that.$io.storage("MenList.json", data)
  677. }
  678. }).catch(err => {
  679. // 找不到该文件就写入一个空白文件。
  680. that.$io.storage("MenList.json", date)
  681. console.log(err, "err")
  682. })
  683. }catch(e){
  684. //TODO handle the exception
  685. }
  686. }
  687. }
  688. };
  689. </script>
  690. <style lang="scss">
  691. .copyright{
  692. width: 650rpx;
  693. position: fixed;
  694. bottom: 30rpx;
  695. left:50%;
  696. margin-left: -325rpx;
  697. font-size: 20rpx;
  698. color: #999999;
  699. text-align: center;
  700. .domain{
  701. color: #478BF1;
  702. margin-left: 6rpx;
  703. }
  704. }
  705. .itemImg-add {
  706. width: 24rpx;
  707. height: 34rpx;
  708. }
  709. .item-img {
  710. width: 28rpx;
  711. height: 32rpx;
  712. }
  713. /deep/uni-checkbox .uni-checkbox-input{
  714. margin-top: -6rpx;
  715. }
  716. .appLogin {
  717. margin-top: 60rpx;
  718. .hds {
  719. display: flex;
  720. justify-content: center;
  721. align-items: center;
  722. font-size: 24rpx;
  723. color: #B4B4B4;
  724. .line {
  725. width: 68rpx;
  726. height: 1rpx;
  727. background: #CCCCCC;
  728. }
  729. p {
  730. margin: 0 20rpx;
  731. }
  732. }
  733. .btn-wrapper {
  734. display: flex;
  735. align-items: center;
  736. justify-content: center;
  737. margin-top: 30rpx;
  738. .btn {
  739. display: flex;
  740. align-items: center;
  741. justify-content: center;
  742. width: 68rpx;
  743. height: 68rpx;
  744. border-radius: 50%;
  745. }
  746. .apple-btn {
  747. display: flex;
  748. align-items: center;
  749. justify-content: center;
  750. width: 246rpx;
  751. height: 66rpx;
  752. margin-left: 30rpx;
  753. background: #EAEAEA;
  754. border-radius: 34rpx;
  755. font-size: 24rpx;
  756. .icon-s-pingguo {
  757. color: #333;
  758. margin-right: 10rpx;
  759. font-size: 34rpx;
  760. }
  761. }
  762. .iconfont {
  763. font-size: 40rpx;
  764. color: #fff;
  765. }
  766. .wx {
  767. background-color: #61C64F;
  768. }
  769. .mima {
  770. background-color: #28B3E9;
  771. }
  772. .yanzheng {
  773. background-color: #F89C23;
  774. }
  775. .pingguo {
  776. margin-left: 60rpx;
  777. background-color: #000;
  778. }
  779. }
  780. }
  781. .main-color {
  782. color: var(--view-theme);
  783. }
  784. .code img {
  785. width: 100%;
  786. height: 100%;
  787. }
  788. .acea-row.row-middle {
  789. input {
  790. margin-left: 20rpx;
  791. display: block;
  792. }
  793. }
  794. .login-wrapper {
  795. .login-top {
  796. height: 358rpx;
  797. background-color: var(--view-theme);
  798. background-image: url(../static/login.png);
  799. background-size: cover;
  800. background-repeat: no-repeat;
  801. image {
  802. width: 101%;
  803. height: 100%;
  804. }
  805. }
  806. .shading {
  807. display: flex;
  808. align-items: center;
  809. justify-content: center;
  810. width: 100%;
  811. margin-top: -230rpx;
  812. position: relative;
  813. image {
  814. width: 180rpx;
  815. height: 180rpx;
  816. top: 40rpx;
  817. }
  818. }
  819. .whiteBg {
  820. background-color: #fff;
  821. margin: -30rpx 56rpx 0rpx 56rpx;
  822. box-shadow: 0px 2px 14px 0px rgba(0, 0, 0, 0.08);
  823. border-radius: 8px;
  824. padding: 60rpx;
  825. .tips {
  826. display: flex;
  827. align-items: center;
  828. justify-content: center;
  829. height: 50rpx;
  830. margin: 40rpx;
  831. color: #999;
  832. .tips-btn {
  833. margin: 0 31rpx 0 48rpx;
  834. color: #999999;
  835. font-weight: bold;
  836. font-size: 32rpx;
  837. /* Safari 与 Chrome */
  838. .line {
  839. width: 80rpx;
  840. height: 6rpx;
  841. background: linear-gradient(135deg, var(--view-minorColor) 0%, var(--view-theme) 100%);
  842. border-radius: 2px;
  843. margin: 10rpx auto 0 auto;
  844. animation: myfirst .3s;
  845. -webkit-animation: myfirst .3s;
  846. }
  847. .none {
  848. width: 80rpx;
  849. background: #fff;
  850. height: 6rpx;
  851. }
  852. }
  853. @keyframes myfirst {
  854. 0% {
  855. width: 0rpx;
  856. }
  857. 100% {
  858. width: 80rpx;
  859. }
  860. }
  861. @-webkit-keyframes myfirst
  862. /* Safari 与 Chrome */
  863. {
  864. 0% {
  865. width: 0rpx;
  866. }
  867. 100% {
  868. width: 80rpx;
  869. }
  870. }
  871. .tips-btn.on {
  872. font-size: 36rpx;
  873. color: var(--view-theme);
  874. }
  875. }
  876. .list {
  877. border-radius: 16rpx;
  878. overflow: hidden;
  879. .forgetPwd {
  880. text-align: right;
  881. margin-top: 10rpx;
  882. color: #666666;
  883. font-size: 24rpx;
  884. }
  885. .item {
  886. border-bottom: 1px solid #F0F0F0;
  887. background: #fff;
  888. .row-middle {
  889. position: relative;
  890. padding: 16rpx 25rpx;
  891. input {
  892. flex: 1;
  893. font-size: 28rpx;
  894. height: 80rpx;
  895. }
  896. .spread {
  897. flex: 1;
  898. font-size: 28rpx;
  899. height: 80rpx;
  900. }
  901. .code {
  902. position: absolute;
  903. right: 30rpx;
  904. top: 50%;
  905. color: var(--view-theme);
  906. font-size: 26rpx;
  907. transform: translateY(-50%);
  908. }
  909. }
  910. }
  911. }
  912. .logon {
  913. display: flex;
  914. align-items: center;
  915. justify-content: center;
  916. width: 100%;
  917. height: 86rpx;
  918. margin-top: 48rpx;
  919. background: linear-gradient(135deg, var(--view-minorColor) 0%, var(--view-theme) 100%);
  920. border-radius: 120rpx;
  921. color: #FFFFFF;
  922. font-size: 30rpx;
  923. }
  924. }
  925. .protocol {
  926. margin-top: 40rpx;
  927. color: #999999;
  928. font-size: 24rpx;
  929. }
  930. .trembling {
  931. animation: shake 0.6s;
  932. }
  933. @keyframes shake {
  934. 0%,
  935. 100% {
  936. -webkit-transform: translateX(0);
  937. }
  938. 10%,
  939. 30%,
  940. 50%,
  941. 70%,
  942. 90% {
  943. -webkit-transform: translateX(-5rpx);
  944. }
  945. 20%,
  946. 40%,
  947. 60%,
  948. 80% {
  949. -webkit-transform: translateX(5rpx);
  950. }
  951. }
  952. @-o-keyframes shake {
  953. /* Opera */
  954. 0%,
  955. 100% {
  956. -webkit-transform: translateX(0);
  957. }
  958. 10%,
  959. 30%,
  960. 50%,
  961. 70%,
  962. 90% {
  963. -webkit-transform: translateX(-5rpx);
  964. }
  965. 20%,
  966. 40%,
  967. 60%,
  968. 80% {
  969. -webkit-transform: translateX(5rpx);
  970. }
  971. }
  972. @-webkit-keyframes shake {
  973. /* Safari 和 Chrome */
  974. 0%,
  975. 100% {
  976. -webkit-transform: translateX(0);
  977. }
  978. 10%,
  979. 30%,
  980. 50%,
  981. 70%,
  982. 90% {
  983. -webkit-transform: translateX(-5rpx);
  984. }
  985. 20%,
  986. 40%,
  987. 60%,
  988. 80% {
  989. -webkit-transform: translateX(5rpx);
  990. }
  991. }
  992. @-moz-keyframes shake {
  993. /* Firefox */
  994. 0%,
  995. 100% {
  996. -moz-transform: translateX(0);
  997. }
  998. 10%,
  999. 30%,
  1000. 50%,
  1001. 70%,
  1002. 90% {
  1003. -moz-transform: translateX(-5rpx);
  1004. }
  1005. 20%,
  1006. 40%,
  1007. 60%,
  1008. 80% {
  1009. -moz-transform: translateX(5rpx);
  1010. }
  1011. }
  1012. }
  1013. </style>