app.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // app.js
  2. const { utils } = require('./utils/api.js');
  3. App({
  4. onload() {
  5. wx.hideTabBar();
  6. },
  7. onLaunch() {
  8. // 展示本地存储能力
  9. const logs = wx.getStorageSync('logs') || []
  10. // logs.unshift(Date.now())
  11. // wx.setStorageSync('logs', logs)
  12. // 检查是否已有登录状态
  13. const token = wx.getStorageSync('token')
  14. if (token) {
  15. // 已登录,直接设置全局数据
  16. this.globalData.token = token
  17. const userInfo = wx.getStorageSync('userInfo')
  18. if (userInfo) {
  19. this.globalData.userInfo = userInfo
  20. }
  21. // 获取访问token
  22. this.getAccessToken()
  23. // 启动定时刷新token
  24. this.startTokenRefreshTimer()
  25. } else {
  26. // 未登录,显示授权弹窗
  27. this.showLoginModal()
  28. }
  29. },
  30. // 显示登录授权弹窗
  31. showLoginModal() {
  32. wx.showModal({
  33. title: '登录授权',
  34. content: '为了给您提供更好的服务,需要获取您的微信登录信息,是否同意?',
  35. confirmText: '同意',
  36. cancelText: '暂不',
  37. success: (res) => {
  38. if (res.confirm) {
  39. // 用户同意,进行微信登录
  40. this.wxLogin()
  41. } else {
  42. // 用户拒绝,保持未登录状态
  43. console.log('用户拒绝登录授权,保持未登录状态')
  44. this.globalData.isGuest = true
  45. }
  46. }
  47. })
  48. },
  49. // 微信登录方法
  50. wxLogin() {
  51. wx.login({
  52. success: (res) => {
  53. if (res.code) {
  54. console.log('微信登录获取code成功:', res.code)
  55. // 调用登录接口
  56. this.callLoginApi(res.code)
  57. } else {
  58. console.error('微信登录失败:', res.errMsg)
  59. }
  60. },
  61. fail: (error) => {
  62. console.error('微信登录调用失败:', error)
  63. }
  64. })
  65. },
  66. // 调用登录接口
  67. callLoginApi(code) {
  68. wx.request({
  69. url: 'https://klmybwg.4dage.com/api/museum/wxMini/login',
  70. method: 'GET',
  71. data: {
  72. code: code
  73. },
  74. header: {
  75. 'content-type': 'application/x-www-form-urlencoded'
  76. },
  77. success: (response) => {
  78. console.log('登录接口调用成功:', response.data)
  79. if (response.data && response.data.code === 0) {
  80. // 存储基本用户信息(微信用户)
  81. const basicUserInfo = {
  82. nickName: '微信用户',
  83. avatarUrl: 'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0',
  84. isWxUser: true
  85. }
  86. const token = response.data.data.token
  87. this.globalData.userInfo = basicUserInfo
  88. wx.setStorageSync('userInfo', basicUserInfo)
  89. // 存储token到全局数据
  90. this.globalData.token = token
  91. // 也存储到本地存储
  92. wx.setStorageSync('token', token)
  93. // 登录成功,设置为非游客状态
  94. this.globalData.isGuest = false
  95. console.log('token获取成功:', token)
  96. // 登录成功后获取token
  97. this.getAccessToken()
  98. // 启动定时刷新token
  99. this.startTokenRefreshTimer()
  100. // 通知所有页面更新登录状态
  101. this.notifyLoginStatusChange()
  102. } else {
  103. console.error('登录失败:', response.data.message || '未知错误')
  104. }
  105. },
  106. fail: (error) => {
  107. console.error('登录接口调用失败:', error)
  108. }
  109. })
  110. },
  111. // 获取访问token
  112. getAccessToken() {
  113. wx.request({
  114. url: 'https://klmybwg.4dage.com/api/museum/wxMini/getAccessToken',
  115. method: 'GET',
  116. header: {
  117. 'content-type': 'application/x-www-form-urlencoded'
  118. },
  119. success: (response) => {
  120. console.log('获取accessToken接口调用成功:', response.data)
  121. if (response.data && response.data.code === 0) {
  122. const accessToken = response.data.data
  123. // 存储token到全局数据
  124. this.globalData.accessToken = accessToken
  125. // 也存储到本地存储
  126. wx.setStorageSync('accessToken', accessToken)
  127. console.log('accessToken获取成功:', accessToken)
  128. } else {
  129. console.error('获取token失败:', response.data.message || '未知错误')
  130. }
  131. },
  132. fail: (error) => {
  133. console.error('获取token接口调用失败:', error)
  134. }
  135. })
  136. },
  137. // 手动触发登录(供其他页面调用)
  138. triggerLogin() {
  139. this.showLoginModal()
  140. },
  141. // 启动定时刷新token
  142. startTokenRefreshTimer() {
  143. // 清除之前的定时器
  144. if (this.globalData.refreshTimer) {
  145. clearInterval(this.globalData.refreshTimer)
  146. }
  147. // 设置每10分钟刷新一次token(600000毫秒)
  148. this.globalData.refreshTimer = setInterval(() => {
  149. if (this.globalData.token) {
  150. console.log('定时刷新token开始')
  151. utils.refreshToken()
  152. .then(newToken => {
  153. console.log('定时刷新token成功:', newToken)
  154. })
  155. .catch(error => {
  156. console.error('定时刷新token失败:', error)
  157. // 如果刷新失败,可能需要重新登录
  158. if (error.includes('token') || error.includes('401')) {
  159. this.logout()
  160. this.showLoginModal()
  161. }
  162. })
  163. }
  164. }, 600000) // 10分钟 = 600000毫秒
  165. },
  166. // 停止定时刷新token
  167. stopTokenRefreshTimer() {
  168. if (this.globalData.refreshTimer) {
  169. clearInterval(this.globalData.refreshTimer)
  170. this.globalData.refreshTimer = null
  171. }
  172. },
  173. // 退出登录
  174. logout() {
  175. // 停止定时刷新token
  176. this.stopTokenRefreshTimer()
  177. // 清除本地存储
  178. wx.removeStorageSync('token')
  179. wx.removeStorageSync('userInfo')
  180. wx.removeStorageSync('accessToken')
  181. // 清除全局数据
  182. this.globalData.userInfo = null
  183. this.globalData.token = null
  184. this.globalData.accessToken = null
  185. this.globalData.isGuest = true
  186. console.log('用户已退出登录')
  187. // 通知所有页面更新登录状态
  188. this.notifyLoginStatusChange()
  189. },
  190. // 通知所有页面更新登录状态
  191. notifyLoginStatusChange() {
  192. // 获取当前页面栈
  193. const pages = getCurrentPages()
  194. if (pages.length > 0) {
  195. // 获取当前页面
  196. const currentPage = pages[pages.length - 1]
  197. // 如果当前页面有checkLoginStatus方法,则调用它
  198. if (currentPage && typeof currentPage.checkLoginStatus === 'function') {
  199. currentPage.checkLoginStatus()
  200. }
  201. }
  202. },
  203. globalData: {
  204. userInfo: null,
  205. token: null,
  206. accessToken: null,
  207. isGuest: false, // 是否为游客状态
  208. refreshTimer: null // 定时刷新token的定时器
  209. }
  210. })