app.js 7.3 KB

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