buttonLogin.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <template>
  2. <!-- 外层样式添加 position:relative 样式 -->
  3. <div class="btnLogin" @click="login"></div>
  4. </template>
  5. <script>
  6. import { getStorage, setStorage, removeStorage, storageKey, getOauthUrl, jumpUrl, OSDetect } from '../utils/help';
  7. import { postRequest } from '../http';
  8. export default {
  9. name: 'buttonLogin',
  10. computed: {
  11. userInfo() {
  12. return getStorage(storageKey.userInfo);
  13. }
  14. },
  15. data() {
  16. return {
  17. timer: null,
  18. }
  19. },
  20. unmounted() {
  21. clearInterval(this.timer);
  22. },
  23. methods: {
  24. login() {
  25. if (!!this.userInfo) {
  26. // 已登录
  27. this.$emit('success', this.userInfo)
  28. } else {
  29. // 未登录
  30. this.twitterAuth()
  31. }
  32. },
  33. async twitterAuth() {
  34. let win
  35. if (OSDetect() === 'ios') {
  36. win = window.open();
  37. win.opener = null;
  38. }
  39. postRequest(`/denet/user/twitterRequestToken`, {
  40. params: {
  41. oauthCallback: `${jumpUrl}authlogin`,
  42. },
  43. }).then(({ code, data }) => {
  44. if (code == 0) {
  45. if (OSDetect() === 'ios') {
  46. win.location.href = getOauthUrl(data.authToken);
  47. } else {
  48. win = window.open(getOauthUrl(data.authToken));
  49. }
  50. // timer
  51. this.timer = setInterval(() => {
  52. if (win && win.closed) {
  53. clearInterval(this.timer);
  54. this.twitterLogin(data);
  55. }
  56. }, 500);
  57. } else {
  58. this.$emit('error')
  59. }
  60. })
  61. },
  62. twitterLogin(authData) {
  63. let verifier = getStorage(storageKey.verifier);
  64. if (verifier) {
  65. postRequest(`/denet/user/twitterLogin`, {
  66. params: {
  67. consumerKey: authData.consumerKey,
  68. oauthToken: authData.authToken,
  69. oauthVerifier: verifier,
  70. },
  71. }).then(({ code, data }) => {
  72. if (code == 0) {
  73. setStorage(storageKey.userInfo, data);
  74. removeStorage(storageKey.verifier);
  75. this.$emit('success', data)
  76. } else {
  77. this.$emit('error')
  78. }
  79. });
  80. } else {
  81. this.$emit('error')
  82. }
  83. }
  84. }
  85. }
  86. </script>
  87. <style lang="scss" scoped>
  88. .btnLogin {
  89. position: absolute;
  90. z-index: 10;
  91. top: 0;
  92. left: 0;
  93. width: 100%;
  94. height: 100%;
  95. }
  96. </style>