buttonLogin.vue 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <!-- 外层样式添加 position:relative 样式 -->
  3. <div class="btnLogin" @click="login"></div>
  4. </template>
  5. <script>
  6. import { getStorage, storageKey, getOauthUrl, jumpUrl } 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 = window.open();
  35. win.opener = null;
  36. postRequest(`/denet/user/twitterRequestToken`, {
  37. params: {
  38. oauthCallback: `${jumpUrl}authlogin`,
  39. },
  40. }).then(({ code, data }) => {
  41. if (code == 0) {
  42. win.location.href = getOauthUrl(data.authToken);
  43. // timer
  44. this.timer = setInterval(() => {
  45. if (win && win.closed) {
  46. clearInterval(this.timer);
  47. this.twitterLogin(data);
  48. }
  49. }, 500);
  50. } else {
  51. this.$emit('error')
  52. }
  53. })
  54. },
  55. twitterLogin(authData) {
  56. let verifier = getStorage(storageKey.verifier);
  57. if (verifier) {
  58. postRequest(`/denet/user/twitterLogin`, {
  59. params: {
  60. consumerKey: authData.consumerKey,
  61. oauthToken: authData.authToken,
  62. oauthVerifier: verifier,
  63. },
  64. }).then(({ code, data }) => {
  65. if (code == 0) {
  66. setStorage(storageKey.userInfo, data);
  67. removeStorage(storageKey.verifier);
  68. this.$emit('success', data)
  69. } else {
  70. this.$emit('error')
  71. }
  72. });
  73. } else {
  74. this.$emit('error')
  75. }
  76. }
  77. }
  78. }
  79. </script>
  80. <style lang="scss" scoped>
  81. .btnLogin {
  82. position: absolute;
  83. z-index: 10;
  84. top: 0;
  85. left: 0;
  86. width: 100%;
  87. height: 100%;
  88. }
  89. </style>