app.js 7.1 KB

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