app.js 7.4 KB

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