index.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. // 小程序首页逻辑
  2. const { museumApi } = require('../../utils/api.js');
  3. const { navigateToWebview, urlImg } = require('../../utils/util.js');
  4. const app = getApp();
  5. Page({
  6. /**
  7. * 页面的初始数据
  8. */
  9. data: {
  10. showLoading: false, // 控制是否显示loading组件
  11. isFirstOpen: false, // 是否首次打开
  12. bannerData: [], // 轮播图数据
  13. newsList: [], // 资讯列表
  14. exhibitionList: [], // 展览列表
  15. activeList: [], // 活动列表
  16. loading: false, // 加载状态
  17. isLoggedIn: false, // 登录状态
  18. urlImg: urlImg
  19. },
  20. /**
  21. * 生命周期函数--监听页面加载
  22. */
  23. onLoad(options) {
  24. // 检查登录状态
  25. this.checkLoginStatus();
  26. // 检查是否首次访问
  27. const hasVisited = wx.getStorageSync('hasVisited');
  28. if (!hasVisited) {
  29. if(typeof this.getTabBar === 'function' && this.getTabBar()){
  30. console.log(this.getTabBar());
  31. this.getTabBar().setData({
  32. isShowTabar: false
  33. })
  34. }
  35. wx.hideTabBar();
  36. this.setData({
  37. showLoading: true,
  38. isFirstOpen: true
  39. });
  40. this.initAllData();
  41. } else {
  42. // 非首次访问,立即显示页面内容
  43. this.setData({
  44. showLoading: false,
  45. isFirstOpen: false
  46. });
  47. // 设置已访问标记
  48. wx.setStorageSync('hasVisited', true);
  49. // 立即加载数据,但不显示loading状态
  50. this.initAllData();
  51. }
  52. },
  53. // loading组件"开始探索"事件处理
  54. onStartExplore() {
  55. // 设置已访问标记
  56. wx.setStorageSync('hasVisited', true);
  57. if(typeof this.getTabBar === 'function' && this.getTabBar()){
  58. this.getTabBar().setData({
  59. isShowTabar: true,
  60. selected: 0
  61. })
  62. }
  63. // 显示系统TabBar以呈现自定义导航,避免加载过程闪烁
  64. // wx.showTabBar();
  65. this.setData({
  66. showLoading: false,
  67. isFirstOpen: false
  68. });
  69. },
  70. // 轮播图点击事件
  71. onBannerClick(e) {
  72. const url = e.currentTarget.dataset.url;
  73. if (url) {
  74. console.log('轮播图点击,跳转URL:', url);
  75. navigateToWebview(url);
  76. } else {
  77. console.log('轮播图URL为空,无法跳转');
  78. }
  79. },
  80. // 查看更多
  81. viewMore(e) {
  82. const section = e.currentTarget.dataset.section;
  83. console.log(`查看更多${section}`);
  84. switch (section) {
  85. case 'exhibition':
  86. wx.switchTab({
  87. url: '/pages/exhibition/index'
  88. });
  89. break;
  90. case 'recommended':
  91. wx.navigateTo({
  92. url: '/pages/index/news/news'
  93. });
  94. break;
  95. case 'activity':
  96. wx.navigateTo({
  97. url: '/pages/index/activity/activity'
  98. });
  99. break;
  100. }
  101. },
  102. /**
  103. * 初始化所有数据
  104. */
  105. async initAllData() {
  106. try {
  107. // 只有首次访问时才显示loading状态
  108. if (this.data.isFirstOpen) {
  109. this.setData({ loading: true });
  110. }
  111. // 并行请求所有数据
  112. const [bannerRes, newsRes, exhibitionRes, activeRes] = await Promise.all([
  113. this.getBannerData({ pageNum: 1, pageSize: 5, status: 1 }),
  114. this.getNewsList({ pageNum: 1, pageSize: 3, status: 1 }),
  115. this.getExhibitionList({ pageNum: 1, pageSize: 5, status: 1 , recommend: 1 }),
  116. this.getActiveList({ pageNum: 1, pageSize: 5, status: 1 })
  117. ]);
  118. // console.log('所有数据加载完成');
  119. } catch (error) {
  120. console.error('数据加载失败:', error);
  121. wx.showToast({
  122. title: '数据加载失败',
  123. icon: 'none'
  124. });
  125. } finally {
  126. // 只有首次访问时才需要关闭loading状态
  127. if (this.data.isFirstOpen) {
  128. this.setData({ loading: false });
  129. }
  130. }
  131. },
  132. /**
  133. * 获取轮播图数据
  134. */
  135. async getBannerData(params = {}) {
  136. try {
  137. const response = await museumApi.getCarouselList(params);
  138. console.log('轮播图数据:', response);
  139. const bannerData = response.records || response.list || response.data || response || [];
  140. this.setData({ bannerData });
  141. return response;
  142. } catch (error) {
  143. console.error('获取轮播图数据失败:', error);
  144. // 使用默认数据
  145. this.setData({
  146. bannerData: [{ carouselId: 1, title: '轮播图1', img: '' }]
  147. });
  148. throw error;
  149. }
  150. },
  151. /**
  152. * 获取资讯列表
  153. */
  154. async getNewsList(params = {}) {
  155. try {
  156. const response = await museumApi.getNewsList(params);
  157. console.log('资讯数据:', response);
  158. const newsList = response.records || response.list || response.data || response || [];
  159. this.setData({ newsList });
  160. return response;
  161. } catch (error) {
  162. console.error('获取资讯数据失败:', error);
  163. this.setData({ newsList: [] });
  164. throw error;
  165. }
  166. },
  167. /**
  168. * 获取展览列表
  169. */
  170. async getExhibitionList(params = {}) {
  171. try {
  172. const response = await museumApi.getExhibitionList(params);
  173. console.log('展览数据:', response);
  174. const exhibitionList = response.records || response.list || response.data || response || [];
  175. this.setData({ exhibitionList });
  176. return response;
  177. } catch (error) {
  178. console.error('获取展览数据失败:', error);
  179. this.setData({ exhibitionList: [] });
  180. throw error;
  181. }
  182. },
  183. /**
  184. * 获取活动列表
  185. */
  186. async getActiveList(params = {}) {
  187. try {
  188. const response = await museumApi.getSocialActivityList(params);
  189. console.log('活动数据:', response);
  190. const activeList = response.records || response.list || response.data || response || [];
  191. this.setData({ activeList });
  192. return response;
  193. } catch (error) {
  194. console.error('获取活动数据失败:', error);
  195. this.setData({ activeList: [] });
  196. throw error;
  197. }
  198. },
  199. /**
  200. * 功能点击处理
  201. */
  202. handleFunctionClick(e) {
  203. const { type } = e.currentTarget.dataset;
  204. console.log(`点击了${type}功能`);
  205. // 检查是否需要登录的功能
  206. if ((type === 'visit' || type === 'activity') && !this.data.isLoggedIn) {
  207. // 未登录,显示登录提示
  208. this.showLoginPrompt();
  209. return;
  210. }
  211. // 根据不同功能跳转到webview页面
  212. switch (type) {
  213. case 'visit':
  214. wx.navigateTo({
  215. url: '/pages/index/visit-preview/visit-preview'
  216. });
  217. break;
  218. case 'activity':
  219. wx.navigateTo({
  220. url: '/pages/index/active-preview/active-preview'
  221. });
  222. break;
  223. case 'map':
  224. this.handleMapClick();
  225. break;
  226. case 'introduce':
  227. this.navigateToWebview('/allDetailsShow?id=1&type=museum');
  228. break;
  229. case 'online':
  230. wx.navigateTo({
  231. url: '/pages/index/online/index',
  232. })
  233. break;
  234. }
  235. },
  236. /**
  237. * 查看展览详情
  238. */
  239. viewExhibition(e) {
  240. const { item } = e.currentTarget.dataset;
  241. console.log(`查看展览${item.exhibitId}详情`);
  242. this.navigateToWebview(`/allDetailsShow?isFrom=weixin&id=${item.exhibitId}&type=exhibition`);
  243. },
  244. /**
  245. * 查看活动详情
  246. */
  247. viewActivity(e) {
  248. const { item } = e.currentTarget.dataset;
  249. console.log(`查看活动${item.activityId}详情`);
  250. // this.navigateToWebview(`/allDetailsShow?isFrom=weixin&id=${item.activityId}&type=activity`);
  251. wx.navigateTo({
  252. url: `/pages/exhibition/activeDetails/index?isFrom=weixin&id=${item.activityId}&type=activity`
  253. });
  254. },
  255. /**
  256. * 查看资讯详情
  257. */
  258. viewNews(e) {
  259. const { item } = e.currentTarget.dataset;
  260. console.log(`查看资讯${item.informationId}详情`);
  261. this.navigateToWebview(`/allDetailsShow?isFrom=weixin&id=${item.informationId}&type=information`);
  262. },
  263. /**
  264. * 处理地图点击事件
  265. */
  266. async handleMapClick() {
  267. // this.navigateToWebview('/indexPage/map?isFrom=weixin');
  268. wx.navigateTo({
  269. url: '/pages/user/map/index'
  270. });
  271. },
  272. /**
  273. * 导航到webview页面
  274. */
  275. navigateToWebview(path) {
  276. navigateToWebview(path);
  277. },
  278. /**
  279. * 生命周期函数--监听页面初次渲染完成
  280. */
  281. onReady() {
  282. },
  283. /**
  284. * 生命周期函数--监听页面显示
  285. */
  286. onShow() {
  287. // 同步高亮与显示状态(非首次打开时显示)
  288. const hasVisited = wx.getStorageSync('hasVisited');
  289. if (typeof this.getTabBar === 'function' && this.getTabBar()) {
  290. this.getTabBar().setData({
  291. selected: 0,
  292. isShowTabar: !!hasVisited
  293. })
  294. }
  295. // 每次显示页面时检查登录状态
  296. this.checkLoginStatus();
  297. },
  298. /**
  299. * 检查登录状态
  300. */
  301. checkLoginStatus() {
  302. const app = getApp();
  303. const token = wx.getStorageSync('token');
  304. const isLoggedIn = !!(token && !app.globalData.isGuest);
  305. this.setData({
  306. isLoggedIn: isLoggedIn
  307. });
  308. },
  309. /**
  310. * 显示登录提示
  311. */
  312. showLoginPrompt() {
  313. const app = getApp();
  314. wx.showModal({
  315. title: '登录提示',
  316. content: '为了给您提供更好的服务,需要获取您的微信登录信息,是否同意?',
  317. confirmText: '立即登录',
  318. cancelText: '取消',
  319. success: (res) => {
  320. if (res.confirm) {
  321. // 用户确认登录,调用app的登录方法
  322. app.wxLogin();
  323. // 登录弹窗关闭后,页面会重新显示,onShow会被触发,从而更新登录状态
  324. }
  325. }
  326. });
  327. },
  328. /**
  329. * 生命周期函数--监听页面隐藏
  330. */
  331. onHide() {
  332. },
  333. /**
  334. * 生命周期函数--监听页面卸载
  335. */
  336. onUnload() {
  337. },
  338. /**
  339. * 页面相关事件处理函数--监听用户下拉刷新
  340. */
  341. onPullDownRefresh() {
  342. this.initAllData().finally(() => {
  343. wx.stopPullDownRefresh();
  344. });
  345. },
  346. /**
  347. * 页面上拉触底事件的处理函数
  348. */
  349. onReachBottom() {
  350. },
  351. /**
  352. * 用户点击右上角分享
  353. */
  354. onShareAppMessage() {
  355. return {
  356. title: '克拉玛依博物馆',
  357. path: '/pages/index/index?isFrom=weixin'
  358. };
  359. },
  360. /**
  361. * 用户点击右上角分享到朋友圈
  362. */
  363. onShareTimeline() {
  364. return {
  365. title: '克拉玛依博物馆 - 探索历史文化之美',
  366. query: 'isFrom=weixin',
  367. imageUrl: '' // 可以设置自定义分享图片
  368. };
  369. }
  370. })