tab3.page.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import { Component, OnInit } from '@angular/core';
  2. import { IonHeader, IonToolbar, IonTitle, IonContent, IonSearchbar, IonIcon, IonTabButton, IonTabs, IonTabBar, IonLabel, IonMenu, IonList, IonItem, IonMenuButton } from '@ionic/angular/standalone';
  3. import { Router } from '@angular/router';
  4. import { CommonModule } from '@angular/common';
  5. import { CloudQuery, CloudObject, Pointer } from '../../lib/community_ncloud'; // 确保路径正确
  6. import { FormsModule } from '@angular/forms'; // 导入 FormsModule
  7. interface Work {
  8. WorkId: string; // 修改为 WorkId
  9. title: string;
  10. description: string;
  11. fileUrl: string;
  12. avatarUrl: string;
  13. userName: string;
  14. updatedAt: string;
  15. likesCount: number;
  16. category: string;
  17. comments: string[];
  18. }
  19. @Component({
  20. selector: 'app-tab3',
  21. templateUrl: 'tab3.page.html',
  22. styleUrls: ['tab3.page.scss'],
  23. standalone: true,
  24. imports: [
  25. CommonModule,
  26. IonHeader, IonToolbar, IonTitle, IonContent,
  27. IonSearchbar, IonIcon, IonTabButton, IonTabs, IonTabBar, IonLabel,
  28. IonMenu, IonList, IonItem, IonMenuButton, FormsModule, // 添加 FormsModule
  29. ],
  30. })
  31. export class Tab3Page implements OnInit {
  32. artworks: Work[] = []; // 存储所有的帖子信息
  33. displayedArtworks: Work[] = []; // 存储当前显示的帖子
  34. isSearchActive = false; // 控制搜索框是否显示
  35. searchQuery = ''; // 搜索框的输入内容
  36. constructor(private router: Router) { }
  37. ngOnInit() {
  38. this.loadWorks(); // 加载帖子数据
  39. this.red_underline('发现');
  40. }
  41. // 加载所有帖子数据
  42. async loadWorks() {
  43. try {
  44. const workQuery = new CloudQuery('Work');
  45. const workObjs = await workQuery.find();
  46. // 初始化 artworks 和 displayedArtworks
  47. this.artworks = workObjs.map((workObj: CloudObject) => {
  48. const workData = workObj.data as Work;
  49. return {
  50. ...workData,
  51. objectId: String(workObj.id),
  52. imageUrl: `${workData.fileUrl}`, // 图片路径
  53. };
  54. });
  55. // 初始显示所有帖子
  56. this.displayedArtworks = [...this.artworks];
  57. } catch (error) {
  58. console.error('加载帖子数据失败:', error);
  59. }
  60. }
  61. red_underline(text: string) {
  62. const prevUnderlined = document.querySelectorAll('span[underline="true"]') as NodeListOf<HTMLElement>;
  63. prevUnderlined.forEach((el: HTMLElement) => {
  64. el.style.textDecoration = 'none';
  65. el.removeAttribute('underline');
  66. });
  67. const target = document.querySelector(`span[data-id="${text}"]`) as HTMLElement;
  68. if (target) {
  69. target.setAttribute('underline', 'true');
  70. }
  71. }
  72. // 点击搜索图像时触发
  73. onSearchIconClick() {
  74. this.isSearchActive = !this.isSearchActive; // 显示或隐藏搜索框
  75. }
  76. // 关闭搜索框
  77. onCloseSearch() {
  78. this.isSearchActive = false;
  79. this.searchQuery = ''; // 清空搜索内容
  80. this.displayedArtworks = [...this.artworks]; // 恢复显示所有帖子
  81. }
  82. onSearchInput() {
  83. if (this.searchQuery.trim()) {
  84. this.filterPosts(this.searchQuery); // 过滤帖子
  85. } else {
  86. this.displayedArtworks = [...this.artworks]; // 搜索框为空时恢复所有帖子
  87. }
  88. }
  89. // 根据搜索关键字过滤帖子
  90. filterPosts(query: string) {
  91. // 筛选符合条件的帖子
  92. this.displayedArtworks = this.artworks.filter(artwork =>
  93. artwork.title.toLowerCase().includes(query.toLowerCase()) || // 标题包含关键字
  94. artwork.description.toLowerCase().includes(query.toLowerCase()) // 描述包含关键字
  95. );
  96. }
  97. // 根据传入的 Work[] 数组加载帖子数据
  98. async loadWorkByContent(workContents: Work[]) {
  99. try {
  100. // 初始化查询
  101. const workQuery = new CloudQuery('Work');
  102. // 查询数据库中的帖子
  103. const workObjs = await workQuery.find();
  104. // 处理查询到的帖子数据
  105. this.artworks = workObjs.map((workObj: CloudObject) => {
  106. const workData = workObj.data as Work;
  107. console.log(workObj.data);
  108. console.log(workData.updatedAt);
  109. console.log(workData.fileUrl);
  110. // 返回构造好的帖子数据
  111. return {
  112. ...workData,
  113. objectId: String(workObj.id),
  114. imageUrl: `${workData.fileUrl}`, // 这里确保你的路径正确
  115. };
  116. });
  117. } catch (error) {
  118. console.error('加载帖子数据失败:', error);
  119. }
  120. }
  121. // 点击跳转到具体的帖子详情页面
  122. goToDetail(artId: string) {
  123. console.log('Work ID:', artId);
  124. const artwork = this.artworks.find(art => art.WorkId === artId);
  125. if (artwork) {
  126. this.router.navigate(['/tabs/art-detail', artId], {
  127. state: { artwork }
  128. }).then(() => {
  129. console.log('Navigation successful');
  130. }).catch(err => {
  131. console.error('Navigation failed:', err);
  132. });
  133. } else {
  134. console.warn('Artwork not found for id:', artId);
  135. }
  136. }
  137. // 跳转到上传文件页面
  138. goToUploadFile() {
  139. console.log("跳转上传文件的页面")
  140. this.router.navigate(['/tabs/upload-file']); // 跳转到 upload-file 页面
  141. }
  142. // 使用 trackByFn 来提高性能
  143. trackByFn(index: number, item: any) {
  144. return item.WorkId; // 使用 WorkId 作为唯一标识符
  145. }
  146. }