openlogin.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782
  1. <template>
  2. <view class="login-container" :style="'height: '+phoneHeight+'px;'">
  3. <view class="skip" @click="gotoPage('/pages/index/index')">跳过→</view>
  4. <view class="p-30-75" v-if="is_login==2">
  5. <view class="login_topbpx">
  6. <view class="login_tit">注册</view>
  7. <view class="login_top">已有账户,<text class="red" @click="is_login=1">立即登录</text></view>
  8. </view>
  9. <view class="group-bd">
  10. <view class="form-level d-s-c">
  11. <view class="val flex-1 input_botom"><input type="text" v-model="register.mobile"
  12. placeholder="请填写手机号" :disabled="is_send" /></view>
  13. </view>
  14. <view class="form-level d-s-c">
  15. <view class="val flex-1 input_botom"><input type="text" password="true" v-model="register.password"
  16. placeholder="请输入密码" /></view>
  17. </view>
  18. <view class="form-level d-s-c">
  19. <view class="val flex-1 input_botom"><input type="text" password="true"
  20. v-model="register.repassword" placeholder="请确认密码" /></view>
  21. </view>
  22. <view class="form-level d-s-c">
  23. <view class="val flex-1 d-b-c input_botom">
  24. <input class="flex-1" type="number" v-model="register.code" placeholder="请填写验证码" />
  25. <button class="get-code-btn" type="default" @click="sendCode"
  26. :disabled="is_send">{{ send_btn_txt }}</button>
  27. </view>
  28. </view>
  29. </view>
  30. </view>
  31. <view class="p-30-75" v-if="is_login==1">
  32. <view class="login_topbpx">
  33. <view class="login_tit">登录</view>
  34. <view class="login_top">还没有账号,<text class="red" @click="is_login=2">立即注册</text></view>
  35. </view>
  36. <view class="group-bd">
  37. <view class="form-level d-s-c">
  38. <view class="val flex-1 input_botom"><input type="text" v-model="formData.mobile"
  39. placeholder="请填写手机号" /></view>
  40. </view>
  41. <view class="form-level d-s-c" v-if="!is_code">
  42. <view class="val flex-1 input_botom"><input type="text" password="true" v-model="loging_password"
  43. placeholder="请输入密码" /></view>
  44. </view>
  45. <view class="form-level d-s-c" v-if="is_code">
  46. <view class="val flex-1 d-b-c input_botom">
  47. <input class="flex-1" type="number" v-model="formData.code" placeholder="请填写验证码" />
  48. <button class="get-code-btn" type="default" @click="sendCode"
  49. :disabled="is_send">{{ send_btn_txt }}</button>
  50. </view>
  51. </view>
  52. </view>
  53. </view>
  54. <view class="p-30-75" v-if="is_login==0">
  55. <view class="login_topbpx">
  56. <view class="login_tit">重置密码</view>
  57. <view class="login_top"><text class="red" @click="is_login=1">立即登录</text></view>
  58. </view>
  59. <view class="group-bd">
  60. <view class="form-level d-s-c">
  61. <view class="val flex-1 input_botom"><input type="text" v-model="resetpassword.mobile"
  62. placeholder="请填写手机号" :disabled="is_send" /></view>
  63. </view>
  64. <view class="form-level d-s-c">
  65. <view class="val flex-1 input_botom"><input type="text" password="true"
  66. v-model="resetpassword.password" placeholder="请输入密码" /></view>
  67. </view>
  68. <view class="form-level d-s-c">
  69. <view class="val flex-1 input_botom"><input type="text" password="true"
  70. v-model="resetpassword.repassword" placeholder="请确认密码" /></view>
  71. </view>
  72. <view class="form-level d-s-c">
  73. <view class="val flex-1 d-b-c input_botom">
  74. <input class="flex-1" type="number" v-model="resetpassword.code" placeholder="请填写验证码" />
  75. <button class="get-code-btn" type="default" @click="sendCode"
  76. :disabled="is_send">{{ send_btn_txt }}</button>
  77. </view>
  78. </view>
  79. </view>
  80. </view>
  81. <view v-if="is_login==1" class=" gray6 p-0-75" :class="is_code?'d-e-c':'d-b-c'">
  82. <view v-if="!is_code" @click="is_login=0">忘记密码?</view>
  83. <view @click="isCode()">{{is_code?'使用密码登录':'使用验证码登录'}}</view>
  84. </view>
  85. <view @click="isRead=!isRead" class="d-s-c gray6 p-0-75 mt20">
  86. <view :class="isRead?'active agreement':'agreement'"></view>我已阅读并接受<text class="red" @click.stop="xieyi('service')">《用户协议》</text>和<text
  87. class="red" @click.stop="xieyi('privacy')">《隐私政策》</text>
  88. </view>
  89. <view style="padding-top: 80rpx;" class="btns p-30-75" v-if="is_login==2"><button
  90. @click="registerSub">注册</button></view>
  91. <view style="padding-top: 80rpx;" class="btns p-30-75" v-if="is_login==1"><button
  92. @click="formSubmit">登录</button></view>
  93. <view style="padding-top: 80rpx;" class="btns p-30-75" v-if="is_login==0"><button
  94. @click="resetpasswordSub">重置密码</button></view>
  95. <view class="bottom_nav" v-if="is_login==1">
  96. <view class="bottom-box">
  97. <view class="other_tit"><text class="bg-white p-0-20">其他方式登录</text></view>
  98. <view class="pt30 d-c-c" v-if="showWeixin">
  99. <view class="weixin_box" @tap="login"><text class="icon iconfont icon-weixin"></text></view>
  100. </view>
  101. <view v-if="showApple">
  102. <image @tap="appleLogin" class="ios-login" src="/static/ios.png" mode="aspectFill"></image>
  103. </view>
  104. </view>
  105. </view>
  106. </view>
  107. </template>
  108. <script>
  109. export default {
  110. data() {
  111. return {
  112. /*表单数据对象*/
  113. formData: {
  114. /*手机号*/
  115. mobile: '',
  116. /*验证码*/
  117. code: '',
  118. },
  119. loging_password: '',
  120. register: {
  121. mobile: '',
  122. password: '',
  123. repassword: '',
  124. code: ''
  125. },
  126. resetpassword: {
  127. mobile: '',
  128. password: '',
  129. repassword: '',
  130. code: ''
  131. },
  132. /*是否已发验证码*/
  133. is_send: false,
  134. /*发送按钮文本*/
  135. send_btn_txt: '获取验证码',
  136. /*当前秒数*/
  137. second: 60,
  138. ip: '',
  139. isShow: true,
  140. is_login: 1,
  141. is_code: false,
  142. phoneHeight: 0,
  143. isRead: true,
  144. showWeixin: false,
  145. showApple: false
  146. };
  147. },
  148. onShow() {
  149. this.init()
  150. },
  151. onLoad(){
  152. this.getData();
  153. console.log('111111')
  154. console.log(this.is_login,'测试')
  155. },
  156. methods: {
  157. /*初始化*/
  158. init() {
  159. let self = this;
  160. uni.getSystemInfo({
  161. success(res) {
  162. self.phoneHeight = res.windowHeight;
  163. }
  164. });
  165. // 是否安装了微信
  166. if (plus.runtime.isApplicationExist({ pname: 'com.tencent.mm', action: 'weixin://' })) {
  167. self.showWeixin = true;
  168. }
  169. // 是否ios13以上
  170. uni.getSystemInfo({
  171. success: (res)=> {
  172. let version = res.system.replace(/iOS /, "");
  173. if(res.platform == "ios" && version >= 13){
  174. self.showApple = true;
  175. }
  176. }
  177. });
  178. },
  179. getData(){
  180. let self = this;
  181. self._get('user.userapple/policy', {}, function(res) {
  182. console.log(res);
  183. self.service = res.data.service;
  184. self.privacy = res.data.privacy;
  185. });
  186. },
  187. /*提交*/
  188. formSubmit() {
  189. let self = this;
  190. let formdata = {
  191. mobile: self.formData.mobile,
  192. }
  193. let url = ''
  194. if (!self.isRead) {
  195. uni.showToast({
  196. title: '请同意并勾选协议内容',
  197. duration: 2000,
  198. icon: 'none'
  199. });
  200. return;
  201. }
  202. if (!/^1(3|4|5|6|7|8|9)\d{9}$/.test(self.formData.mobile)) {
  203. console.log(self.formData.mobile)
  204. uni.showToast({
  205. title: '手机有误,请重填!',
  206. duration: 2000,
  207. icon: 'none'
  208. });
  209. return;
  210. }
  211. if (self.is_code) {
  212. console.log(self.is_code)
  213. if (self.formData.code == '') {
  214. uni.showToast({
  215. title: '验证码不能为空!',
  216. duration: 2000,
  217. icon: 'none'
  218. });
  219. return;
  220. }
  221. formdata.code = self.formData.code;
  222. url = 'user.useropen/smslogin'
  223. } else {
  224. if (self.loging_password == '') {
  225. uni.showToast({
  226. title: '密码不能为空!',
  227. duration: 2000,
  228. icon: 'none'
  229. });
  230. return;
  231. }
  232. formdata.password = self.loging_password;
  233. url = 'user.useropen/phonelogin'
  234. }
  235. uni.showLoading({
  236. title: '正在提交'
  237. });
  238. self._post(
  239. url,
  240. formdata,
  241. result => {
  242. // 记录token user_id
  243. uni.setStorageSync('token', result.data.token);
  244. uni.setStorageSync('user_id', result.data.user_id);
  245. // 获取登录前页面
  246. let url = uni.getStorageSync('currentPage');
  247. let pageOptions = uni.getStorageSync('currentPageOptions');
  248. if (Object.keys(pageOptions).length > 0) {
  249. url += '?';
  250. for (let i in pageOptions) {
  251. url += i + '=' + pageOptions[i] + '&';
  252. }
  253. url = url.substring(0, url.length - 1);
  254. }
  255. self.gotoPage(url);
  256. },
  257. false,
  258. () => {
  259. uni.hideLoading();
  260. }
  261. );
  262. },
  263. /*注册*/
  264. registerSub() {
  265. let self = this;
  266. if (!/^1(3|4|5|6|7|8|9)\d{9}$/.test(self.register.mobile)) {
  267. console.log(self.register.mobile)
  268. uni.showToast({
  269. title: '手机有误,请重填!',
  270. duration: 2000,
  271. icon: 'none'
  272. });
  273. return;
  274. }
  275. if (self.register.code == '') {
  276. uni.showToast({
  277. title: '验证码不能为空!',
  278. duration: 2000,
  279. icon: 'none'
  280. });
  281. return;
  282. }
  283. if (self.register.password.length < 6) {
  284. uni.showToast({
  285. title: '密码至少6位数!',
  286. duration: 2000,
  287. icon: 'none'
  288. });
  289. return;
  290. }
  291. if (self.register.password !== self.register.repassword) {
  292. uni.showToast({
  293. title: '两次密码输入不一致!',
  294. duration: 2000,
  295. icon: 'none'
  296. });
  297. return;
  298. }
  299. if (!self.isRead) {
  300. uni.showToast({
  301. title: '请同意并勾选协议内容',
  302. duration: 2000,
  303. icon: 'none'
  304. });
  305. return;
  306. }
  307. self.register.invitation_id = uni.getStorageSync('invitation_id') ? uni.getStorageSync('invitation_id') :
  308. 0;
  309. self.register.reg_source = 'app';
  310. self.register.referee_id = uni.getStorageSync('referee_id');
  311. uni.showLoading({
  312. title: '正在提交'
  313. });
  314. self._post('user.useropen/register',
  315. self.register,
  316. result => {
  317. uni.showToast({
  318. title: '注册成功',
  319. duration: 3000
  320. })
  321. self.formData.mobile = self.register.mobile;
  322. self.register = {
  323. mobile: '',
  324. password: '',
  325. repassword: '',
  326. code: ''
  327. };
  328. self.second = 0;
  329. self.changeMsg();
  330. self.is_login = 1;
  331. },
  332. false,
  333. () => {
  334. uni.hideLoading();
  335. }
  336. );
  337. },
  338. resetpasswordSub() {
  339. let self = this;
  340. if (!/^1(3|4|5|6|7|8|9)\d{9}$/.test(self.resetpassword.mobile)) {
  341. uni.showToast({
  342. title: '手机有误,请重填!',
  343. duration: 2000,
  344. icon: 'none'
  345. });
  346. return;
  347. }
  348. if (self.resetpassword.code == '') {
  349. uni.showToast({
  350. title: '验证码不能为空!',
  351. duration: 2000,
  352. icon: 'none'
  353. });
  354. return;
  355. }
  356. if (self.resetpassword.password.length < 6) {
  357. uni.showToast({
  358. title: '密码至少6位数!',
  359. duration: 2000,
  360. icon: 'none'
  361. });
  362. return;
  363. }
  364. if (self.resetpassword.password !== self.resetpassword.repassword) {
  365. uni.showToast({
  366. title: '两次密码输入不一致!',
  367. duration: 2000,
  368. icon: 'none'
  369. });
  370. return;
  371. }
  372. uni.showLoading({
  373. title: '正在提交'
  374. });
  375. self._post(
  376. 'user.useropen/resetpassword',
  377. self.resetpassword,
  378. result => {
  379. uni.showToast({
  380. title: '重置成功',
  381. duration: 3000
  382. })
  383. self.formData.mobile = self.resetpassword.mobile;
  384. self.resetpassword = {
  385. mobile: '',
  386. password: '',
  387. repassword: '',
  388. code: ''
  389. };
  390. self.second = 0;
  391. self.changeMsg();
  392. self.is_login = 1;
  393. },
  394. false,
  395. () => {
  396. uni.hideLoading();
  397. }
  398. );
  399. },
  400. isCode() {
  401. if (this.is_code) {
  402. this.$set(this, 'is_code', false)
  403. } else {
  404. this.$set(this, 'is_code', true)
  405. }
  406. console.log(this.is_code)
  407. },
  408. /*发送短信*/
  409. sendCode() {
  410. let self = this;
  411. if (self.is_login == 1) {
  412. if (!/^1(3|4|5|6|7|8|9)\d{9}$/.test(self.formData.mobile)) {
  413. uni.showToast({
  414. title: '手机有误,请重填!',
  415. duration: 2000,
  416. icon: 'none'
  417. });
  418. return;
  419. }
  420. } else if (self.is_login == 2) {
  421. if (!/^1(3|4|5|6|7|8|9)\d{9}$/.test(self.register.mobile)) {
  422. uni.showToast({
  423. title: '手机有误,请重填!',
  424. duration: 2000,
  425. icon: 'none'
  426. });
  427. return;
  428. }
  429. } else if (self.is_login == 0) {
  430. if (!/^1(3|4|5|6|7|8|9)\d{9}$/.test(self.resetpassword.mobile)) {
  431. uni.showToast({
  432. title: '手机有误,请重填!',
  433. duration: 2000,
  434. icon: 'none'
  435. });
  436. return;
  437. }
  438. }
  439. let type = 'register'
  440. let mobile = self.register.mobile
  441. if (self.is_login == 1) {
  442. type = 'login';
  443. mobile = self.formData.mobile;
  444. } else if (self.is_login == 0) {
  445. type = 'login';
  446. mobile = self.resetpassword.mobile;
  447. }
  448. self._post(
  449. 'user.useropen/sendCode', {
  450. mobile: mobile,
  451. type: type
  452. },
  453. result => {
  454. if (result.code == 1) {
  455. uni.showToast({
  456. title: '发送成功'
  457. });
  458. self.is_send = true;
  459. self.changeMsg();
  460. }
  461. }
  462. );
  463. },
  464. login() {
  465. let self = this;
  466. plus.oauth.getServices(function(servies) {
  467. let s = servies[0]
  468. if (!s.authResult) {
  469. s.authorize(function(e) {
  470. uni.showLoading({
  471. title: '登录中',
  472. mask: true
  473. });
  474. self._post('user.useropen/login', {
  475. code: e.code,
  476. source: 'app'
  477. }, result => {
  478. // 记录token user_id
  479. uni.setStorageSync('token', result.data.token);
  480. uni.setStorageSync('user_id', result.data.user_id);
  481. // 获取登录前页面
  482. let url = uni.getStorageSync('currentPage');
  483. let pageOptions = uni.getStorageSync('currentPageOptions');
  484. if (Object.keys(pageOptions).length > 0) {
  485. url += '?';
  486. for (let i in pageOptions) {
  487. url += i + '=' + pageOptions[i] + '&';
  488. }
  489. url = url.substring(0, url.length - 1);
  490. }
  491. self.gotoPage(url);
  492. }, false, () => {
  493. uni.hideLoading();
  494. });
  495. }, function(e) {
  496. console.log('登陆认证失败!');
  497. uni.showModal({
  498. title: '认证失败1',
  499. content: JSON.stringify(e),
  500. });
  501. });
  502. } else {
  503. console.log('已经登陆认证');
  504. }
  505. }, function(e) {
  506. console.log("获取服务列表失败:" + JSON.stringify(e));
  507. })
  508. },
  509. /*改变发送验证码按钮文本*/
  510. changeMsg() {
  511. if (this.second > 0) {
  512. this.send_btn_txt = this.second + '秒';
  513. this.second--;
  514. setTimeout(this.changeMsg, 1000);
  515. } else {
  516. this.send_btn_txt = '获取验证码';
  517. this.second = 60;
  518. this.is_send = false;
  519. }
  520. },
  521. xieyi(type) {
  522. let url = '';
  523. if(type == 'service'){
  524. url = this.service;
  525. }else{
  526. url = this.privacy;
  527. }
  528. uni.navigateTo({
  529. url: '/pages/webview/webview?url=' + url
  530. });
  531. },
  532. appleLogin(){
  533. let self = this;
  534. uni.login({
  535. provider: 'apple',
  536. success: function (loginRes) {
  537. // 登录成功
  538. uni.getUserInfo({
  539. provider: 'apple',
  540. success(res) {
  541. if (res.errMsg !== 'getUserInfo:ok') {
  542. return false;
  543. }
  544. uni.showLoading({
  545. title: "正在登录",
  546. mask: true
  547. });
  548. self._post('user.userapple/login', {
  549. invitation_id: self.invitation_id,
  550. openId: res.userInfo.openId,
  551. nickName: res.userInfo.fullName.giveName?res.userInfo.fullName.giveName:'',
  552. referee_id: uni.getStorageSync('referee_id'),
  553. source: 'apple'
  554. }, result => {
  555. // 记录token user_id
  556. uni.setStorageSync('token', result.data.token);
  557. uni.setStorageSync('user_id', result.data.user_id);
  558. // 执行回调函数
  559. uni.navigateBack();
  560. }, false, () => {
  561. uni.hideLoading();
  562. });
  563. }
  564. })
  565. },
  566. fail: function (err) {
  567. // 登录失败
  568. console.log('登录失败');
  569. console.log(err);
  570. }
  571. });
  572. },
  573. }
  574. };
  575. </script>
  576. <style lang="scss" scoped>
  577. .p-30-75 {
  578. padding: 30rpx 75rpx;
  579. }
  580. .p-0-75 {
  581. padding: 0 75rpx;
  582. }
  583. .t-r {
  584. text-align: right;
  585. }
  586. .login-container {
  587. background: #ffffff;
  588. }
  589. .login-container input {
  590. height: 88rpx;
  591. line-height: 88rpx;
  592. }
  593. .wechatapp {
  594. padding: 80rpx 0 48rpx;
  595. border-bottom: 1rpx solid #e3e3e3;
  596. margin-bottom: 72rpx;
  597. text-align: center;
  598. }
  599. .wechatapp .header {
  600. width: 190rpx;
  601. height: 190rpx;
  602. border: 2px solid #fff;
  603. margin: 0rpx auto 0;
  604. border-radius: 50%;
  605. overflow: hidden;
  606. box-shadow: 1px 0px 5px rgba(50, 50, 50, 0.3);
  607. }
  608. .auth-title {
  609. color: #585858;
  610. font-size: 34rpx;
  611. margin-bottom: 40rpx;
  612. }
  613. .auth-subtitle {
  614. color: #888;
  615. margin-bottom: 88rpx;
  616. font-size: 28rpx;
  617. }
  618. .login-btn {
  619. padding: 0 20rpx;
  620. }
  621. .login-btn button {
  622. height: 88rpx;
  623. line-height: 88rpx;
  624. background: #04be01;
  625. color: #fff;
  626. font-size: 30rpx;
  627. border-radius: 999rpx;
  628. text-align: center;
  629. }
  630. .no-login-btn {
  631. margin-top: 20rpx;
  632. padding: 0 20rpx;
  633. }
  634. .no-login-btn button {
  635. height: 88rpx;
  636. line-height: 88rpx;
  637. background: #dfdfdf;
  638. color: #fff;
  639. font-size: 30rpx;
  640. border-radius: 999rpx;
  641. text-align: center;
  642. }
  643. .get-code-btn {
  644. width: 200rpx;
  645. height: 80rpx;
  646. line-height: 76rpx;
  647. padding: 0rpx 30rpx;
  648. border-radius: 40rpx;
  649. white-space: nowrap;
  650. // border: 1rpx solid $dominant-color;
  651. background-color: #FFFFFF;
  652. color: $dominant-color;
  653. font-size: 30rpx;
  654. }
  655. .get-code-btn[disabled='true'] {
  656. // border: 1rpx solid #cccccc;
  657. background-color: #FFFFFF;
  658. }
  659. .btns button {
  660. height: 90rpx;
  661. line-height: 90rpx;
  662. font-size: 34rpx;
  663. border-radius: 45rpx;
  664. background-color: $dominant-color;
  665. color: #ffffff;
  666. }
  667. .login_topbpx {
  668. padding: 90rpx 0;
  669. padding-bottom: 110rpx;
  670. }
  671. .login_tit {
  672. font-size: 52rpx;
  673. font-weight: 600;
  674. margin-bottom: 33rpx;
  675. }
  676. .login_top {
  677. font-size: 24rpx;
  678. color: #adafb3;
  679. }
  680. .input_botom {
  681. border-bottom: 1px solid #f4f4f4;
  682. }
  683. .bottom_nav {
  684. width: 100%;
  685. position: absolute;
  686. bottom: 30rpx;
  687. padding-bottom: env(safe-area-inset-bottom);
  688. }
  689. .bottom-box {
  690. width: 70%;
  691. margin: 0 auto;
  692. }
  693. .other_tit {
  694. height: 1rpx;
  695. background-color: #CACACA;
  696. width: 100%;
  697. line-height: 1rpx;
  698. text-align: center;
  699. }
  700. .weixin_box {
  701. background-color: #04BE01;
  702. border-radius: 50%;
  703. width: 80rpx;
  704. height: 80rpx;
  705. line-height: 80rpx;
  706. text-align: center;
  707. }
  708. .weixin_box .icon-weixin {
  709. font-size: 40rpx;
  710. color: #FFFFFF;
  711. }
  712. .agreement {
  713. border-radius: 50%;
  714. width: 28rpx;
  715. height: 28rpx;
  716. border: 2rpx solid #EE1413;
  717. background: #fff;
  718. position: relative;
  719. margin-right: 10rpx;
  720. box-sizing: border-box;
  721. }
  722. .agreement.active::after {
  723. content: '';
  724. width: 16rpx;
  725. height: 16rpx;
  726. background-color: #EE1413;
  727. border-radius: 50%;
  728. position: absolute;
  729. left: 0;
  730. top: 0;
  731. right: 0;
  732. bottom: 0;
  733. margin: auto;
  734. }
  735. .ios-login {
  736. width: 420rpx;
  737. height: 100rpx;
  738. margin: 20rpx auto;
  739. }
  740. .skip{
  741. position: absolute;
  742. top: 80rpx;
  743. right: 30rpx;
  744. font-size: 28rpx;
  745. color: #999999;
  746. }
  747. </style>