app.js 7.1 KB

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