login.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. <template>
  2. <view class="container">
  3. <!-- #ifdef MP-WEIXIN -->
  4. <image class="bg" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/images/bg_login.png" mode="widthFix"></image>
  5. <view class="force-login-wrap">
  6. <view :style="{height:menuButtonInfo.height,marginTop:menuButtonInfo.top}" class="backImg" >
  7. <image @tap="goBack()" src="@/static/image/back.png"></image>
  8. </view>
  9. <view class="top-title">
  10. <view class="title-text">登录</view>
  11. <view class="login-notice">登录后可体验更多功能</view>
  12. </view>
  13. <view class="force-login__content">
  14. <image class="bg-type" :src="current==0?'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/images/bg_tab_login.png':'https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/images/bg_tab_login2.png'" mode="widthFix"></image>
  15. <view class="logintype">
  16. <view :class="current==0 ? 'logintype-item active':'logintype-item'" @click="changeType(0)">验证码登录</view>
  17. <view :class="current==1 ? 'logintype-item active':'logintype-item'" @click="changeType(1)">密码登录</view>
  18. </view>
  19. <view class="input-form">
  20. <view class="input-item">
  21. <input
  22. class="input-field"
  23. type="number"
  24. v-model="phone"
  25. placeholder="请输入手机号"
  26. maxlength="11"
  27. />
  28. </view>
  29. <view class="input-item code-input-item">
  30. <input
  31. v-if="current == 0"
  32. class="input-field code-input"
  33. type="number"
  34. v-model="code"
  35. placeholder="请输入验证码"
  36. maxlength="6"
  37. />
  38. <view v-else class="mima">
  39. <input
  40. class="input-field code-input"
  41. type="text"
  42. :password="showPassword"
  43. v-model="password"
  44. placeholder="请输入密码"
  45. />
  46. <image @click="closePwd" :src="showPassword?'/static/image/icon_invisible.png':'/static/image/icon_visible.png'" mode="aspectFill"></image>
  47. </view>
  48. <view v-if="current == 0" class="get-code-btn" @click="getVerifyCode">
  49. {{ codeText }}
  50. </view>
  51. </view>
  52. </view>
  53. <view class="login-btn-wrap">
  54. <button class="login-btn" @click="handleLogin">{{ current == 0 ? '登录/注册用户' : '登录' }}</button>
  55. </view>
  56. <view class="tips">
  57. <checkbox :checked="isAgreement" @click="handleAgreement()" />
  58. <view class="tips-text" @click="handleAgreement()">已阅读并接受</view>
  59. <view class="btn" @click="openH5('/pages_user/userAgreement')">《用户注册协议》</view>
  60. <view class="btn" @click="openH5('/pages_user/privacyPolicy')">《隐私保护政策》</view>
  61. </view>
  62. </view>
  63. </view>
  64. <!-- #endif -->
  65. </view>
  66. </template>
  67. <script>
  68. import { loginByMiniApp, getUserInfo, loginByMp } from '@/api/user'
  69. import { loginByCode, loginByPassword, sendLoginVerifyCode } from '@/api/login'
  70. export default {
  71. data() {
  72. return {
  73. code:null, // 微信登录code
  74. isAgreement:false,
  75. current:0, // 0-验证码登录 1-密码登录
  76. menuButtonInfo:{},
  77. phone:'', // 手机号
  78. code:'', // 验证码
  79. password:'', // 密码
  80. codeText:'获取验证码', // 验证码按钮文字
  81. countdown:0, // 倒计时
  82. countdownTimer:null, // 倒计时定时器
  83. showPassword:true ,// 是否显示密码
  84. companyUserId:null,
  85. companyId:null
  86. }
  87. },
  88. computed: {
  89. },
  90. onLoad(option) {
  91. this.getMenuButtonInfo()
  92. if(option.scene){
  93. const decodedStr = decodeURIComponent(option.scene);
  94. const result = {};
  95. decodedStr.split(",").forEach(item => {
  96. const [key, value] = item.split("=");
  97. result[key] = value;
  98. });
  99. console.log(result)
  100. this.companyUserId=result.cuid
  101. this.companyId=result.cid
  102. //console.log('this.companyUserId',this.companyUserId)
  103. }
  104. // #ifdef MP-WEIXIN
  105. uni.$on('refreshLogin', () => {
  106. uni.navigateBack({
  107. delta:1
  108. })
  109. })
  110. //选获取CODE,防止后请求的时候腾讯服务端未同步报错
  111. //this.getCode();
  112. // #endif
  113. },
  114. onUnload() {
  115. // 清除倒计时
  116. if(this.countdownTimer) {
  117. clearInterval(this.countdownTimer);
  118. this.countdownTimer = null;
  119. }
  120. },
  121. mounted() {
  122. },
  123. methods: {
  124. closePwd(){
  125. this.showPassword=!this.showPassword
  126. },
  127. // 获取胶囊按钮布局参数
  128. getMenuButtonInfo() {
  129. // 微信小程序API(Uniapp可直接用uni.getMenuButtonBoundingClientRect)
  130. const menuBtn = uni.getMenuButtonBoundingClientRect();
  131. if (menuBtn) {
  132. this.menuButtonInfo = {
  133. top: menuBtn.top + 'px', // 胶囊顶部距离
  134. height: menuBtn.height + 'px', // 胶囊高度
  135. centerY: (menuBtn.top + menuBtn.height / 2) + 'px', // 胶囊垂直居中Y坐标
  136. right: menuBtn.right + 'px' // 胶囊右侧距离
  137. };
  138. }
  139. },
  140. changeType(index) {
  141. this.current = index;
  142. // 切换时清空输入
  143. if(index == 0) {
  144. this.password = '';
  145. } else {
  146. this.code = '';
  147. }
  148. },
  149. // 返回主页
  150. goBack() {
  151. uni.navigateBack({
  152. delta: 1
  153. });
  154. },
  155. // 获取验证码
  156. async getVerifyCode() {
  157. if(this.countdown > 0) {
  158. return;
  159. }
  160. if(!this.phone) {
  161. uni.showToast({
  162. icon:'none',
  163. title: "请输入手机号",
  164. });
  165. return;
  166. }
  167. if(!/^1[3-9]\d{9}$/.test(this.phone)) {
  168. uni.showToast({
  169. icon:'none',
  170. title: "请输入正确的手机号",
  171. });
  172. return;
  173. }
  174. try {
  175. uni.showLoading({
  176. title:"发送中..."
  177. });
  178. const res = await sendLoginVerifyCode({ phone: this.phone })
  179. uni.hideLoading();
  180. if(res.code === 200) {
  181. uni.showToast({
  182. icon:'success',
  183. title: "验证码已发送",
  184. });
  185. // 开始倒计时
  186. this.countdown = 60;
  187. this.codeText = this.countdown + '秒重新获取';
  188. this.countdownTimer = setInterval(() => {
  189. this.countdown--;
  190. this.codeText = this.countdown + '秒重新获取';
  191. if(this.countdown <= 0) {
  192. clearInterval(this.countdownTimer);
  193. this.countdownTimer = null;
  194. this.codeText = '获取验证码';
  195. }
  196. }, 1000);
  197. } else {
  198. uni.showToast({
  199. icon:'none',
  200. title: res.msg || "发送验证码失败",
  201. });
  202. }
  203. } catch (e) {
  204. uni.hideLoading();
  205. console.error('发送验证码失败', e);
  206. uni.showToast({
  207. icon:'none',
  208. title: "发送验证码失败",
  209. });
  210. }
  211. },
  212. // 登录
  213. handleLogin() {
  214. if(!this.isAgreement) {
  215. uni.showToast({
  216. icon:'none',
  217. title: "请先同意协议后再登录",
  218. });
  219. return;
  220. }
  221. if(!this.phone) {
  222. uni.showToast({
  223. icon:'none',
  224. title: "请输入手机号",
  225. });
  226. return;
  227. }
  228. if(!/^1[3-9]\d{9}$/.test(this.phone)) {
  229. uni.showToast({
  230. icon:'none',
  231. title: "请输入正确的手机号",
  232. });
  233. return;
  234. }
  235. if(this.current == 0) {
  236. // 验证码登录
  237. if(!this.code) {
  238. uni.showToast({
  239. icon:'none',
  240. title: "请输入验证码",
  241. });
  242. return;
  243. }
  244. this.loginByCode();
  245. } else {
  246. // 密码登录
  247. if(!this.password) {
  248. uni.showToast({
  249. icon:'none',
  250. title: "请输入密码",
  251. });
  252. return;
  253. }
  254. this.loginByPassword();
  255. }
  256. },
  257. // 验证码登录
  258. async loginByCode() {
  259. try {
  260. uni.showLoading({
  261. title:"登录中..."
  262. });
  263. const info={
  264. phone: this.phone,
  265. code: this.code,
  266. loginType:2,
  267. }
  268. //console.log('this.companyUserId',this.companyUserId,this.companyId)
  269. if(this.companyId!=null && this.companyUserId!=null){
  270. info.companyId=this.companyId,
  271. info.companyUserId=this.companyUserId
  272. }
  273. const res = await loginByCode(info);
  274. uni.hideLoading();
  275. if(res.code === 200) {
  276. // 保存token和用户信息
  277. if(res.data.token) {
  278. uni.setStorageSync('AppToken', res.data.token);
  279. }
  280. if(res.data.docker) {
  281. uni.setStorageSync('userInfo', JSON.stringify(res.data.docker));
  282. }
  283. uni.showToast({
  284. icon:'success',
  285. title: "登录成功",
  286. });
  287. uni.$emit('refreshLogin');
  288. var data= res.data.docker
  289. setTimeout(() => {
  290. if(data.status==4){
  291. uni.navigateTo({
  292. url: '/pages_user/certification'
  293. })
  294. }else{
  295. if(this.companyId!=null && this.companyUserId!=null){
  296. uni.switchTab({
  297. url: '/pages/home/index',
  298. })
  299. }else{
  300. uni.navigateBack({
  301. delta: 1
  302. });
  303. }
  304. }
  305. }, 500);
  306. } else {
  307. uni.showToast({
  308. icon:'none',
  309. title: res.msg || "登录失败",
  310. });
  311. }
  312. } catch (e) {
  313. uni.hideLoading();
  314. console.error('登录失败', e);
  315. uni.showToast({
  316. icon:'none',
  317. title: "登录失败",
  318. });
  319. }
  320. },
  321. // 密码登录
  322. async loginByPassword() {
  323. try {
  324. uni.showLoading({
  325. title:"登录中..."
  326. });
  327. console.log('---------------')
  328. const res = await loginByPassword({
  329. phone: this.phone,
  330. password: this.password,
  331. loginType:1
  332. });
  333. uni.hideLoading();
  334. if(res.code === 200) {
  335. // 保存token和用户信息
  336. if(res.data.token) {
  337. uni.setStorageSync('AppToken', res.data.token);
  338. }
  339. if(res.data.docker) {
  340. uni.setStorageSync('userInfo', JSON.stringify(res.data.docker));
  341. }
  342. uni.showToast({
  343. icon:'success',
  344. title: "登录成功",
  345. });
  346. uni.$emit('refreshLogin');
  347. var data= res.data.docker
  348. setTimeout(() => {
  349. if(data.status==4){
  350. uni.navigateTo({
  351. url: '/pages_user/certification'
  352. })
  353. }else{
  354. uni.navigateBack({
  355. delta: 1
  356. });
  357. }
  358. }, 500);
  359. } else {
  360. uni.showToast({
  361. icon:'none',
  362. title: res.msg || "登录失败",
  363. });
  364. }
  365. } catch (e) {
  366. uni.hideLoading();
  367. console.error('登录失败', e);
  368. uni.showToast({
  369. icon:'none',
  370. title: "登录失败",
  371. });
  372. }
  373. },
  374. checkWeixin(){
  375. var ua = window.navigator.userAgent.toLowerCase();
  376. if (ua.match(/micromessenger/i) == 'micromessenger') {
  377. return true;
  378. } else {
  379. return false;
  380. }
  381. },
  382. //URL地址是否存在CODE
  383. getUrlCode(name) {
  384. return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1]
  385. .replace(/\+/g, '%20')) || null
  386. },
  387. //获取微信CODE
  388. getWxCode() {
  389. //在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;
  390. //http://shequ.natapp1.cc/#/pages/index/index?deviceId=8
  391. var appId="wx40593595e62f61ad";
  392. var url="http://h5.yjf.runtzh.com";
  393. window.location.href ='https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent(url+"/#/pages/auth/wxLogin") +'&response_type=code&scope=snsapi_userinfo&state=JeffreySu-954&connect_redirect=1#wechat_redirect';
  394. //console.log('https://open.weixin.qq.com/connect/oauth2/authorize?appid='+appId+'&redirect_uri=' +encodeURIComponent("http://shequ.natapp1.cc/#/pages/index/index?deviceId="+this.deviceId) +'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect')
  395. // redirect_uri是授权成功后,跳转的url地址,微信会帮我们跳转到该链接,并且通过?的形式拼接code
  396. },
  397. handleAgreement(){
  398. this.isAgreement=!this.isAgreement;
  399. },
  400. openH5(url){
  401. // var requestPath = uni.getStorageSync('requestPath');
  402. // uni.setStorageSync('url',requestPath+url);
  403. uni.navigateTo({
  404. url: url
  405. })
  406. },
  407. getCode(){
  408. var that=this;
  409. this.utils.getProvider()
  410. .then(provider => {
  411. console.log('当前的环境商',provider)
  412. if (!provider) {
  413. reject()
  414. }
  415. // uni登录
  416. uni.login({
  417. provider: provider,
  418. success: async loginRes => {
  419. that.code = loginRes.code
  420. }
  421. })
  422. })
  423. .catch(err => {
  424. })
  425. },
  426. // 微信用户手机号登录
  427. phoneLogin(e) {
  428. var that=this;
  429. if(!this.isAgreement){
  430. uni.showToast({
  431. icon:'none',
  432. title: "请先同意协议后再登录",
  433. });
  434. return false;
  435. }
  436. uni.showLoading({
  437. title:"处理中..."
  438. })
  439. console.log(e,"e")
  440. if (e.mp.detail.errMsg == 'getPhoneNumber:ok') {
  441. this.utils.getProvider()
  442. .then(provider => {
  443. console.log('当前的环境商',provider)
  444. if (!provider) {
  445. reject()
  446. }
  447. // uni登录
  448. uni.login({
  449. provider: provider,
  450. success: async loginRes => {
  451. console.log(loginRes)
  452. let code = loginRes.code // 获取开发code
  453. var userCode=uni.getStorageSync('userCode');
  454. loginByMiniApp({
  455. encryptedData: e.mp.detail.encryptedData,
  456. iv: e.mp.detail.iv,
  457. code: code,
  458. userCode:userCode
  459. })
  460. .then( res => {
  461. if(res.code==200){
  462. uni.hideLoading();
  463. uni.showToast({
  464. icon:'none',
  465. title: "登录成功",
  466. });
  467. uni.setStorageSync('AppToken',res.token);
  468. uni.setStorageSync('userInfo',JSON.stringify(res.user));
  469. uni.hideLoading()
  470. //that.getUserInfo()
  471. uni.$emit('refreshLogin');
  472. uni.navigateBack({
  473. delta:1
  474. })
  475. }
  476. else{
  477. uni.hideLoading();
  478. uni.showToast({
  479. icon:'none',
  480. title: "授权登录失败,请重新登录",
  481. });
  482. }
  483. })
  484. .catch(error => {
  485. console.log(error)
  486. uni.hideLoading();
  487. uni.showToast({
  488. icon:'none',
  489. title: "登录接口调用失败",
  490. });
  491. })
  492. }
  493. })
  494. })
  495. .catch(err => {
  496. uni.showToast({
  497. icon:'none',
  498. title: err,
  499. });
  500. })
  501. } else {
  502. uni.showToast({
  503. title: '已拒绝授权',
  504. icon: 'none',
  505. duration: 2000,
  506. })
  507. }
  508. },
  509. back() {
  510. uni.switchTab({
  511. url: '/pages/home/index'
  512. });
  513. // uni.navigateBack()
  514. }
  515. }
  516. }
  517. </script>
  518. <style lang="scss">
  519. .container {
  520. flex: 1;
  521. padding:0 24rpx;
  522. display: flex;
  523. flex-direction: column;
  524. justify-content: flex-start;
  525. position: relative;
  526. .bg {
  527. width: 100%;
  528. position: absolute;
  529. top: 0;
  530. left: 0;
  531. }
  532. .backImg{
  533. display: flex;
  534. align-items: center;
  535. image{
  536. width: 40rpx;
  537. height: 40rpx;
  538. }
  539. margin-left: 32rpx;
  540. // position: absolute;
  541. // left: 30rpx;
  542. // z-index: 100;
  543. }
  544. }
  545. .force-login-wrap {
  546. width: 100%;
  547. height: 100vh;
  548. position: relative;
  549. .top-title {
  550. padding:0 32rpx;
  551. text-align: left;
  552. margin-top: 20rpx;
  553. .title-text {
  554. font-size: 56rpx;
  555. font-family: PingFang SC;
  556. font-weight: bold;
  557. color: #000000;
  558. margin-bottom: 20rpx;
  559. }
  560. .login-notice {
  561. font-size: 26rpx;
  562. font-family: PingFang SC;
  563. font-weight: 400;
  564. color: #999999;
  565. line-height: 36rpx;
  566. }
  567. }
  568. .force-login__content {
  569. margin-top: 54rpx;
  570. padding:0 32rpx;
  571. position: relative;
  572. .bg-type{
  573. width: 100%;
  574. position: absolute;
  575. top: 0;
  576. left: 0;
  577. }
  578. .logintype {
  579. display: flex;
  580. margin-bottom: 66rpx;
  581. border-bottom: 2rpx solid #f0f0f0;
  582. .logintype-item {
  583. flex: 1;
  584. text-align: center;
  585. padding-top:36rpx;
  586. padding-bottom: 48rpx;
  587. font-family: PingFang SC, PingFang SC;
  588. font-weight: 400;
  589. font-size: 32rpx;
  590. color: #666666;
  591. position: relative;
  592. &.active {
  593. font-size: 36rpx;
  594. color: #333333;
  595. font-weight: 600;
  596. &::after {
  597. content: '';
  598. position: absolute;
  599. bottom: 30rpx;
  600. left: 50%;
  601. transform: translateX(-50%);
  602. width: 52rpx;
  603. height: 6rpx;
  604. background: #388BFF;
  605. border-radius: 42rpx;
  606. }
  607. }
  608. }
  609. }
  610. .input-form {
  611. margin-bottom: 60rpx;
  612. .input-item {
  613. background: #FFFFFF;
  614. border-radius: 16rpx;
  615. padding: 30rpx 40rpx;
  616. margin-bottom: 48rpx;
  617. box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
  618. &::last-child{
  619. margin-bottom:0
  620. }
  621. .input-field {
  622. width: 100%;
  623. font-size: 30rpx;
  624. font-family: PingFang SC;
  625. color: #333333;
  626. &::placeholder {
  627. color: #CCCCCC;
  628. }
  629. }
  630. .mima{
  631. width: 100%;
  632. display: flex;
  633. align-items: center;
  634. justify-content: space-between;
  635. image{
  636. width: 32rpx;
  637. height: 32rpx;
  638. }
  639. }
  640. &.code-input-item {
  641. display: flex;
  642. align-items: center;
  643. .code-input {
  644. flex: 1;
  645. }
  646. .get-code-btn {
  647. font-size: 28rpx;
  648. font-family: PingFang SC;
  649. font-weight: 500;
  650. color: #388BFF;
  651. padding-left: 20rpx;
  652. border-left: 2rpx solid #f0f0f0;
  653. white-space: nowrap;
  654. }
  655. }
  656. }
  657. }
  658. .login-btn-wrap {
  659. margin-bottom: 40rpx;
  660. margin-top:140rpx;
  661. .login-btn {
  662. width: 100%;
  663. height: 88rpx;
  664. background: rgba(56, 139, 255, 1);
  665. border-radius: 44rpx;
  666. font-size: 32rpx;
  667. font-family: PingFang SC;
  668. font-weight: 500;
  669. color: #FFFFFF;
  670. border: none;
  671. display: flex;
  672. align-items: center;
  673. justify-content: center;
  674. &::after {
  675. border: none;
  676. }
  677. }
  678. }
  679. }
  680. }
  681. .tips{
  682. display: flex;
  683. justify-content: center;
  684. align-items: center;
  685. font-size: 24rpx;
  686. color: #666666;
  687. flex-wrap: nowrap;
  688. padding: 0 60rpx;
  689. checkbox{
  690. margin-right: 10rpx;
  691. flex-shrink: 0;
  692. }
  693. .tips-text{
  694. margin-right: 4rpx;
  695. white-space: nowrap;
  696. }
  697. .btn{
  698. color:#388BFF;
  699. margin: 0 2rpx;
  700. white-space: nowrap;
  701. }
  702. }
  703. .wx-login{
  704. background: rgba(0,0,0,0.7);
  705. z-index: 99999;
  706. position: fixed;
  707. top: 0;
  708. left: 0;
  709. height: 100%;
  710. width: 100%;
  711. display: flex;
  712. align-items: center;
  713. justify-content: center;
  714. .form{
  715. border-radius: 20rpx;
  716. padding: 60rpx 30rpx;
  717. width: 500upx;
  718. height: 300upx;
  719. background-color: #fff;
  720. .title{
  721. font-size: 32upx;
  722. font-family: PingFang SC;
  723. font-weight: bold;
  724. }
  725. .desc{
  726. font-size: 28upx;
  727. margin: 60upx 0upx 60upx 0upx;
  728. font-family: PingFang SC;
  729. font-weight: 500;
  730. }
  731. .btn-box{
  732. margin-top: 30rpx;
  733. width: 100%;
  734. display: flex;
  735. align-items: center;
  736. justify-content: center;
  737. .btn{
  738. display: flex;
  739. align-items: center;
  740. justify-content: center;
  741. margin-left: 10upx;
  742. width: 50%;
  743. height: 80rpx;
  744. border-radius: 5rpx;
  745. background-color: #0bb3f2;
  746. font-size: 30rpx;
  747. font-family: PingFang SC;
  748. font-weight: 500;
  749. color: #fff;
  750. position: relative;
  751. }
  752. .btn-close{
  753. margin-right: 10upx;
  754. width: 50%;
  755. height: 80rpx;
  756. border-radius: 5rpx;
  757. border: 2rpx solid #0bb3f2;
  758. background: none;
  759. font-size: 30rpx;
  760. font-family: PingFang SC;
  761. font-weight: 500;
  762. color: #0bb3f2;
  763. }
  764. }
  765. }
  766. }
  767. .auth_btn{
  768. width: 100%;
  769. height: 100%;
  770. top:0upx;
  771. position: absolute;
  772. opacity:0.0;
  773. }
  774. </style>