store.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import Vue from 'vue' //引入 Vue
  2. import Vuex from 'vuex' //引入 Vuex
  3. import ajax from './common/js/ajax.js' //引入封装好的 request 方法
  4. import { //引入 api
  5. api_onLaunch
  6. } from './api.js'
  7. Vue.use(Vuex) //套路
  8. const store = new Vuex.Store({
  9. state: { //状态
  10. N401: 0,
  11. gotLocation: false,
  12. id: uni.getStorageSync('id'),
  13. openid: uni.getStorageSync('openid'),
  14. networkType: '', //网络状态信息
  15. userWeixinInfo: {}, //用户微信信息,包括微信名,微信头像等
  16. userServerInfo: {}, //用户服务器信息,包括 token,用户名,等级等
  17. showVerify: false, //是否显示手机短信验证弹窗
  18. showWarn: false, //是否显示警告用户弹窗
  19. showGetUserInfoButton: false //是否显示获取用户信息button
  20. },
  21. mutations: {
  22. CHANGENETWORKSTATUS (state, payload) { //修改网络类型
  23. state.networkType = payload
  24. },
  25. GETUSERWEIXININFO (state, payload) { //获取到用户微信信息之后的操作
  26. console.log(payload)
  27. state.userWeixinInfo = payload
  28. },
  29. GETUSERSERVERINFO (state, payload) { //获取到用户服务器信息之后的操作
  30. if (!state.openid) {
  31. uni.setStorageSync('openid', payload.openid)
  32. state.openid = payload.openid
  33. }
  34. if (!state.id) {
  35. uni.setStorageSync('id', payload.id)
  36. state.openid = payload.openid
  37. }
  38. console.log(payload)
  39. // payload.cha_nickname = 'TEST1211313123'
  40. // payload.money = 1
  41. // 模拟用户 请打开下面注释
  42. // payload.signuped = true
  43. // payload.type = 2
  44. // payload.level_name = '代理公司'
  45. state.userServerInfo = payload //把获取到的用户服务器信息,保存到 vuex 中
  46. },
  47. HIDEVERIFY (state) { //关闭手机号码验证弹窗
  48. state.showVerify = false
  49. },
  50. SHOWVERIFY (state) { //打开手机号码验证弹窗
  51. state.showVerify = true
  52. },
  53. HIDEWARN (state) { //关闭警告用户弹窗
  54. state.showWarn = false
  55. },
  56. SHOWWARN (state) { //打开警告用户弹窗
  57. state.showWarn = true
  58. },
  59. SHOWGETUSERINFOBUTTON (state) { //显示获取用户信息按钮
  60. state.showGetUserInfoButton = true
  61. },
  62. HIDEGETUSERINFOBUTTON (state) { //隐藏获取用户信息按钮
  63. state.showGetUserInfoButton = false
  64. },
  65. SIGNUP (state) { // 用户报名成功改变状态
  66. state.userServerInfo.signuped = true
  67. },
  68. GETLOCALTION(state) { // 获取位置信息
  69. state.gotLocation = true
  70. },
  71. READCHALLENGE(state) { // 已读挑战消息
  72. state.userServerInfo.cha_nickname = ''
  73. }
  74. },
  75. actions: {
  76. onLaunch ({ commit, state }) { //初始化后进行的一些异步操作
  77. return new Promise(async (resolve, reject) => {
  78. uni.showLoading({ title: '加载中', mask: true }) //显示loading
  79. const [getUserWeixinInfoErr, userWeixinInfo] = await uni.getUserInfo() //首先获取用户微信信息
  80. if (getUserWeixinInfoErr) { //获取用户微信信息失败后,提示用户,同时展示透明按钮
  81. uni.$emit('MESSAGE', '获取微信授权信息失败,请点击屏幕允许 大卫博士争霸赛获取您的公开信息(昵称、头像、地区及性别)', 864000000)
  82. uni.hideLoading() //取消loading
  83. commit('SHOWGETUSERINFOBUTTON')
  84. } else { // 获取用户微信信息成功后,继续进行下一步
  85. uni.$emit('HIDEMESSAGE') // 隐藏信息提示框
  86. commit('GETUSERWEIXININFO', userWeixinInfo.userInfo) //将获取到的用户微信信息存在 store 里
  87. let CODE = '123'
  88. if (!state.openid) {
  89. const [ , { code }] = await uni.login() //获取 code,并将code 连同用户头像/昵称/openid一同发给后台
  90. CODE = code
  91. }
  92. let latitude = '' // 经度
  93. let longitude = '' // 维度
  94. const location = await uni.getLocation({ type: 'gcj02' }) // 获取地理位置信息
  95. uni.hideLoading() //取消loading
  96. const login = () => {
  97. uni.showLoading({ title: '加载中', mask: true }) //显示loading
  98. this.$ajax.get(`${api_onLaunch}?id=${state.id}&sex=${state.userWeixinInfo.gender}&latitude=${latitude}&longitude=${longitude}&code=${CODE}&avatar=${state.userWeixinInfo.avatarUrl}&openid=${state.openid ? state.openid : '123'}&nickname=${state.userWeixinInfo.nickName}`).then(([ , { data: res }]) => {
  99. if (res.code === 200) { //当前微信用户已经绑定手机号了
  100. state.N401 = 0
  101. commit('GETUSERSERVERINFO', res.data)
  102. uni.hideLoading() //异步操作结束,停止 loading
  103. resolve()
  104. } else if (res.code === 300) { //当前微信用户没有绑定手机号,弹出验证码框 // 401 表示 code 过期/失效 openid 获取不到等
  105. uni.hideLoading() //异步操作结束,停止 loadin
  106. commit('SHOWVERIFY')
  107. resolve()
  108. } else if (res.code === 401) {
  109. uni.hideLoading() // 异步操作结束,停止 loading
  110. reject(500)
  111. } else { //其他边界情况,提示用户下拉刷新
  112. uni.hideLoading() // 异步操作结束,停止 loading
  113. reject(500)
  114. }
  115. })
  116. }
  117. const checkLocation = async () => {
  118. if (!state.gotLocation) {
  119. const [, { cancel, confirm }] = await uni.showModal({
  120. title: '提示',
  121. content: '获取您的位置信息失败,会导致您无法上传图片',
  122. showCancel: false,
  123. confirmText: '重新获取'
  124. })
  125. if (confirm) {
  126. const settings = await new Promise(resolve => wx.openSetting({
  127. success (res) {
  128. resolve(res.authSetting)
  129. }
  130. }))
  131. if (settings['scope.userLocation']) {
  132. commit('GETLOCALTION')
  133. login()
  134. } else {
  135. checkLocation()
  136. }
  137. } else {
  138. checkLocation()
  139. }
  140. }
  141. }
  142. if (location.length == 2) {
  143. commit('GETLOCALTION')
  144. latitude = location[1].latitude
  145. longitude = location[1].longitude
  146. login()
  147. } else {
  148. checkLocation()
  149. }
  150. }
  151. })
  152. }
  153. }
  154. })
  155. Vuex.Store.prototype.$ajax = ajax(store)
  156. export default store