useDingTalkLogin.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { ref } from 'vue'
  2. import { useI18n } from 'vue-i18n'
  3. export function useDingTalkLogin() {
  4. const { t } = useI18n({ useScope: 'global' })
  5. const loggingIn = ref(false)
  6. const loginError = ref(null)
  7. const loginByDingTalk = async () => {
  8. if (loggingIn.value) return
  9. loggingIn.value = true
  10. loginError.value = null
  11. try {
  12. // 检查钉钉是否安装
  13. const providerRes = await checkDingTalkInstalled()
  14. if (!providerRes.provider.includes('dingtalk')) {
  15. throw new Error(t('login.dingtalkNotInstalled'))
  16. }
  17. // 调用钉钉登录
  18. const loginRes = await uniLogin()
  19. console.log('钉钉登录成功获取code:', loginRes)
  20. // 获取用户信息
  21. const userInfo = await fetchUserInfo(loginRes.code)
  22. console.log('获取用户信息成功:', userInfo)
  23. // 保存用户信息
  24. saveUserInfo(userInfo)
  25. return userInfo
  26. } catch (error) {
  27. console.error('钉钉登录失败:', error)
  28. loginError.value = error.message || t('login.failed')
  29. showLoginError()
  30. return null
  31. } finally {
  32. loggingIn.value = false
  33. }
  34. }
  35. const checkDingTalkInstalled = () => {
  36. return new Promise((resolve, reject) => {
  37. uni.getProvider({
  38. service: 'oauth',
  39. success: resolve,
  40. fail: reject
  41. })
  42. })
  43. }
  44. const uniLogin = () => {
  45. return new Promise((resolve, reject) => {
  46. uni.login({
  47. provider: 'dingtalk',
  48. success: resolve,
  49. fail: reject
  50. })
  51. })
  52. }
  53. const fetchUserInfo = (code) => {
  54. return new Promise((resolve, reject) => {
  55. uni.request({
  56. url: 'https://your-api.com/api/dingtalk/login',
  57. method: 'POST',
  58. data: { code },
  59. success: (res) => {
  60. if (res.data.code === 200) {
  61. resolve(res.data.data)
  62. } else {
  63. reject(new Error(res.data.message || '获取用户信息失败'))
  64. }
  65. },
  66. fail: (err) => {
  67. reject(err)
  68. }
  69. })
  70. })
  71. }
  72. const saveUserInfo = (userInfo) => {
  73. uni.setStorageSync('userInfo', userInfo)
  74. uni.setStorageSync('isLoggedIn', true)
  75. }
  76. const showLoginError = () => {
  77. uni.showToast({
  78. title: loginError.value,
  79. icon: 'none',
  80. duration: 3000
  81. })
  82. }
  83. return {
  84. loggingIn,
  85. loginError,
  86. loginByDingTalk
  87. }
  88. }