buttonLogin.vue 2.2 KB

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