娱乐之上 пре 4 месеци
родитељ
комит
7c40a81133
100 измењених фајлова са 1762 додато и 62 уклоњено
  1. 2 1
      angular.json
  2. 89 3
      package-lock.json
  3. 2 0
      package.json
  4. 1 0
      server/fiml.service.ts
  5. 59 0
      server/import/Book.js
  6. 53 0
      server/import/README.md
  7. 244 0
      server/import/game.js
  8. 60 0
      server/import/music.js
  9. 281 0
      server/import/outdoor.js
  10. 0 0
      server/promise.js
  11. 14 0
      server/rest.js
  12. 77 4
      src/app/app-routing.module.ts
  13. 1 0
      src/app/app.component.html
  14. 3 0
      src/app/app.component.ts
  15. 2 1
      src/app/app.module.ts
  16. 12 4
      src/app/tab1/tab1-routing.module.ts
  17. 86 12
      src/app/tab1/tab1.page.html
  18. 18 2
      src/app/tab1/tab1.page.ts
  19. 6 1
      src/app/tab2/tab2-routing.module.ts
  20. 95 10
      src/app/tab2/tab2.page.html
  21. 24 0
      src/app/tab2/tab2.page.ts
  22. 85 8
      src/app/tab3/tab3.page.html
  23. 17 2
      src/app/tab3/tab3.page.ts
  24. 6 5
      src/app/tabs/tabs-routing.module.ts
  25. 0 1
      src/app/tabs/tabs.module.ts
  26. 6 6
      src/app/tabs/tabs.page.html
  27. BIN
      src/assets/image/ATeMan.png
  28. BIN
      src/assets/image/BoFan.png
  29. BIN
      src/assets/image/DengShan.jpg
  30. BIN
      src/assets/image/DiWuRenGe.png
  31. BIN
      src/assets/image/DiaoYu.png
  32. BIN
      src/assets/image/Doraemon.png
  33. BIN
      src/assets/image/FeiChiRenShen.jpg
  34. BIN
      src/assets/image/FengKuangDongWuCheng.jpg
  35. BIN
      src/assets/image/GuangYu.webp
  36. BIN
      src/assets/image/HePinJinYing.webp
  37. BIN
      src/assets/image/HongLouMeng.webp
  38. BIN
      src/assets/image/HuaXue.png
  39. BIN
      src/assets/image/HuoYingRenZhe.jpg
  40. BIN
      src/assets/image/JiPinFeiChe.jpg
  41. BIN
      src/assets/image/JianAn.webp
  42. BIN
      src/assets/image/JinChuanChuan.jpg
  43. BIN
      src/assets/image/JueQuLing.png
  44. BIN
      src/assets/image/LanQu.png
  45. BIN
      src/assets/image/MiNiShiJie.png
  46. BIN
      src/assets/image/MingZhenTang.jpg
  47. BIN
      src/assets/image/MoReBengTa.png
  48. BIN
      src/assets/image/PangYan.png
  49. BIN
      src/assets/image/QiXin.jpg
  50. BIN
      src/assets/image/RuBinSui.webp
  51. BIN
      src/assets/image/SanShiLiuJi.webp
  52. BIN
      src/assets/image/ShenTouNaiBa.png
  53. BIN
      src/assets/image/ShiJin.webp
  54. BIN
      src/assets/image/ShuiHuZhuan.webp
  55. BIN
      src/assets/image/SuiZiBinFu.webp
  56. BIN
      src/assets/image/TanRenJieTanAn.jpg
  57. BIN
      src/assets/image/The Shawshank Redemption.jpg
  58. BIN
      src/assets/image/TuBuLuXin.jpg
  59. BIN
      src/assets/image/WangZhiRongYao.webp
  60. BIN
      src/assets/image/WoDeShiJie.webp
  61. BIN
      src/assets/image/WuDuGuEr.webp
  62. BIN
      src/assets/image/XiYouJi.webp
  63. BIN
      src/assets/image/XingQuTieDao.jpg
  64. BIN
      src/assets/image/YeCang.jpg
  65. BIN
      src/assets/image/YuMaoQu.png
  66. BIN
      src/assets/image/YuanShen.png
  67. BIN
      src/assets/image/YuanZu.png
  68. BIN
      src/assets/image/ZhaoHuaXiShi.webp
  69. BIN
      src/assets/image/ZhiWuDaZhanJiangShi.jpg
  70. BIN
      src/assets/image/ZhouChuChuSanHai.webp
  71. BIN
      src/assets/image/ZhouYi.webp
  72. BIN
      src/assets/image/ZhuLouJiShiJi.jpg
  73. BIN
      src/assets/image/ZuQu.jpg
  74. BIN
      src/assets/image/spiderman.png
  75. 3 1
      src/environments/environment.ts
  76. 10 1
      src/main.ts
  77. 17 0
      src/modules/album/album-routing.module.ts
  78. 20 0
      src/modules/album/album.module.ts
  79. 17 0
      src/modules/album/album.page.html
  80. 0 0
      src/modules/album/album.page.scss
  81. 17 0
      src/modules/album/album.page.spec.ts
  82. 22 0
      src/modules/album/album.page.ts
  83. 36 0
      src/modules/album/album.service.ts
  84. 32 0
      src/modules/coms/edit-ratio-star/README.md
  85. 3 0
      src/modules/coms/edit-ratio-star/edit-ratio-star.component.html
  86. 0 0
      src/modules/coms/edit-ratio-star/edit-ratio-star.component.scss
  87. 22 0
      src/modules/coms/edit-ratio-star/edit-ratio-star.component.spec.ts
  88. 61 0
      src/modules/coms/edit-ratio-star/edit-ratio-star.component.ts
  89. 17 0
      src/modules/dongt/dongt-routing.module.ts
  90. 20 0
      src/modules/dongt/dongt.module.ts
  91. 74 0
      src/modules/dongt/dongt.page.html
  92. 0 0
      src/modules/dongt/dongt.page.scss
  93. 17 0
      src/modules/dongt/dongt.page.spec.ts
  94. 26 0
      src/modules/dongt/dongt.page.ts
  95. 17 0
      src/modules/favorites/favorites-routing.module.ts
  96. 20 0
      src/modules/favorites/favorites.module.ts
  97. 23 0
      src/modules/favorites/favorites.page.html
  98. 0 0
      src/modules/favorites/favorites.page.scss
  99. 17 0
      src/modules/favorites/favorites.page.spec.ts
  100. 28 0
      src/modules/favorites/favorites.page.ts

+ 2 - 1
angular.json

@@ -136,7 +136,8 @@
   "cli": {
     "schematicCollections": [
       "@ionic/angular-toolkit"
-    ]
+    ],
+    "analytics": false
   },
   "schematics": {
     "@ionic/angular-toolkit:component": {

+ 89 - 3
package-lock.json

@@ -23,6 +23,7 @@
         "@capacitor/status-bar": "6.0.0",
         "@ionic/angular": "^8.0.0",
         "ionicons": "^7.0.0",
+        "parse": "^5.2.0",
         "rxjs": "~7.8.0",
         "tslib": "^2.3.0",
         "zone.js": "~0.14.2"
@@ -40,6 +41,7 @@
         "@capacitor/cli": "6.1.0",
         "@ionic/angular-toolkit": "^11.0.1",
         "@types/jasmine": "~5.1.0",
+        "@types/parse": "^3.0.9",
         "@typescript-eslint/eslint-plugin": "^6.0.0",
         "@typescript-eslint/parser": "^6.0.0",
         "eslint": "^8.57.0",
@@ -2522,6 +2524,18 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@babel/runtime-corejs3": {
+      "version": "7.24.6",
+      "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.24.6.tgz",
+      "integrity": "sha512-tbC3o8uHK9xMgMsvUm9qGqxVpbv6yborMBLbDteHIc7JDNHsTV0vDMQ5j1O1NXvO+BDELtL9KgoWYaUVIVGt8w==",
+      "dependencies": {
+        "core-js-pure": "^3.30.2",
+        "regenerator-runtime": "^0.14.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
     "node_modules/@babel/template": {
       "version": "7.24.7",
       "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.24.7.tgz",
@@ -5287,6 +5301,15 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/parse": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmmirror.com/@types/parse/-/parse-3.0.9.tgz",
+      "integrity": "sha512-DGTHygc7krgmNAK8h42giwmAofCd9uv2++RD+zw6OmWI7AEnlTYZwEuWsx22SA2CSMQrZW8P2INHLpQbnQFUng==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/qs": {
       "version": "6.9.15",
       "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.15.tgz",
@@ -7369,6 +7392,16 @@
         "url": "https://opencollective.com/core-js"
       }
     },
+    "node_modules/core-js-pure": {
+      "version": "3.37.1",
+      "resolved": "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.37.1.tgz",
+      "integrity": "sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==",
+      "hasInstallScript": true,
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/core-js"
+      }
+    },
     "node_modules/core-util-is": {
       "version": "1.0.3",
       "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -7513,6 +7546,12 @@
         "node": ">= 8"
       }
     },
+    "node_modules/crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
+      "optional": true
+    },
     "node_modules/css-loader": {
       "version": "7.1.1",
       "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-7.1.1.tgz",
@@ -10091,6 +10130,11 @@
         "postcss": "^8.1.0"
       }
     },
+    "node_modules/idb-keyval": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmmirror.com/idb-keyval/-/idb-keyval-6.2.1.tgz",
+      "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg=="
+    },
     "node_modules/ieee754": {
       "version": "1.2.1",
       "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
@@ -13382,6 +13426,25 @@
         "node": ">=6"
       }
     },
+    "node_modules/parse": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/parse/-/parse-5.2.0.tgz",
+      "integrity": "sha512-FoD3kcLAQCw/2J1984sl3GUBzbHE2tA9mUcyw/EBWZ46WVZTzV+kjnA5tttXyzN4uodt21wSluzjbGnyLqreKw==",
+      "dependencies": {
+        "@babel/runtime-corejs3": "7.24.6",
+        "idb-keyval": "6.2.1",
+        "react-native-crypto-js": "1.0.0",
+        "uuid": "10.0.0",
+        "ws": "8.17.1",
+        "xmlhttprequest": "1.8.0"
+      },
+      "engines": {
+        "node": ">=18 <21"
+      },
+      "optionalDependencies": {
+        "crypto-js": "4.2.0"
+      }
+    },
     "node_modules/parse-imports": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/parse-imports/-/parse-imports-2.1.1.tgz",
@@ -13434,6 +13497,18 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/parse/node_modules/uuid": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz",
+      "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
     "node_modules/parse5": {
       "version": "7.1.2",
       "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz",
@@ -14075,6 +14150,11 @@
       "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
       "dev": true
     },
+    "node_modules/react-native-crypto-js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/react-native-crypto-js/-/react-native-crypto-js-1.0.0.tgz",
+      "integrity": "sha512-FNbLuG/HAdapQoybeZSoes1PWdOj0w242gb+e1R0hicf3Gyj/Mf8M9NaED2AnXVOX01b2FXomwUiw1xP1K+8sA=="
+    },
     "node_modules/readable-stream": {
       "version": "3.6.2",
       "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -14140,8 +14220,7 @@
     "node_modules/regenerator-runtime": {
       "version": "0.14.1",
       "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
-      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
-      "dev": true
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
     },
     "node_modules/regenerator-transform": {
       "version": "0.15.2",
@@ -17326,7 +17405,6 @@
       "version": "8.17.1",
       "resolved": "https://registry.npmmirror.com/ws/-/ws-8.17.1.tgz",
       "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
-      "dev": true,
       "engines": {
         "node": ">=10.0.0"
       },
@@ -17374,6 +17452,14 @@
         "node": ">=8.0"
       }
     },
+    "node_modules/xmlhttprequest": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmmirror.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+      "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/y18n": {
       "version": "5.0.8",
       "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",

+ 2 - 0
package.json

@@ -28,6 +28,7 @@
     "@capacitor/status-bar": "6.0.0",
     "@ionic/angular": "^8.0.0",
     "ionicons": "^7.0.0",
+    "parse": "^5.2.0",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
     "zone.js": "~0.14.2"
@@ -45,6 +46,7 @@
     "@capacitor/cli": "6.1.0",
     "@ionic/angular-toolkit": "^11.0.1",
     "@types/jasmine": "~5.1.0",
+    "@types/parse": "^3.0.9",
     "@typescript-eslint/eslint-plugin": "^6.0.0",
     "@typescript-eslint/parser": "^6.0.0",
     "eslint": "^8.57.0",

+ 1 - 0
server/fiml.service.ts

@@ -0,0 +1 @@
+

+ 59 - 0
server/import/Book.js

@@ -0,0 +1,59 @@
+// 导入BoleMbti脚本
+
+// 引用Parse JS SDK
+const Parse = require("parse/node");
+Parse.initialize("dev"); // 设置applicationId
+Parse.serverURL = "http://web2023.fmode.cn:9999/parse"; // 设置serverURL
+
+let lqlBook = [
+    { name: '朝花夕拾', image: 'assets/image/ZhaoHuaXiShi.webp', author: '朝花夕拾的详情描述', rating: 8.5 },
+    { name: '西游记', image: 'assets/image/XiYouJi.webp', author: '西游记的详情描述', rating: 9.3 },
+    { name: '红楼梦', image: 'assets/image/HongLouMeng.webp', author: '红楼梦的详情描述', rating: 8.0 },
+    { name: '水浒传', image: 'assets/image/ShuiHuZhuan.webp', author: '水浒传的详情描述', rating: 8.7 },
+    { name: '简·爱', image: 'assets/image/JianAn.webp', author: '哆啦A梦的详情描述', rating: 9.4},
+    { name: '雾都孤儿', image: 'assets/image/WuDuGuEr.webp', author: '哆啦A梦的详情描述', rating: 9.2 },
+    { name: '鲁滨孙漂流记', image: 'assets/image/RuBinSui.webp', author: '哆啦A梦的详情描述', rating: 9.1 },
+    { name: '孙子兵法', image: 'assets/image/SuiZiBinFu.webp', author: '哆啦A梦的详情描述', rating: 9.5 },
+    { name: '周易', image: 'assets/image/ZhouYi.webp', author: '哆啦A梦的详情描述', rating: 9.6 },
+    { name: '三十六计', image: 'assets/image/SanShiLiuJi.webp', author: '哆啦A梦的详情描述', rating: 9.4 },
+    { name: '诗经', image: 'assets/image/ShiJin.webp', author: '哆啦A梦的详情描述', rating: 9.3 },
+
+  ];
+
+  
+
+function importAll(){
+    
+    let LQLBook= []
+    Object.keys(lqlBook).forEach(key=>{
+        LQLBook.push({
+            // result:key,
+            name:lqlBook[key]?.name,
+            author:lqlBook[key]?.author,
+            rating:lqlBook[key]?.rating,
+            image:lqlBook[key]?.image,
+        })
+    })
+
+    console.log(LQLBook)
+    LQLBook.forEach(async mbti => {
+        // 查重
+        let exists = await checkExists(mbti)
+        if(exists?.id) return;
+        // 新增
+        let LQLBook = Parse.Object.extend("LQLBook");
+        let bm = new LQLBook();
+        bm.set(mbti);
+        bm.save();
+    });
+}
+
+async function checkExists(mbti){
+    let query = new Parse.Query("LQLBook");
+    query.equalTo("result",mbti?.result);
+    query.equalTo("name",mbti?.name);
+    await query.first();
+    return await query.first();
+}
+
+importAll()

+ 53 - 0
server/import/README.md

@@ -0,0 +1,53 @@
+我正在编写一个音乐的页面,前端框架使用ionic7的angular版本,数据请求使用Parse JS SDK。 其中音乐的Schema名称为Music,字段name:String名称、author:String作者、rating:Number评分、image:string图片地址。现在我有一个Music的数组music= [
+    { name: '偏爱', image: 'assets/image/BoFan.png', author: '张芸京', rating: 8.5 },
+    { name: '雪之华', image: 'assets/image/BoFan.png', author: '中岛美嘉', rating: 9.3 },
+    { name: '是你', image: 'assets/image/BoFan.png', author: '梦然', rating: 9. },
+    { name: '悬溺', image: 'assets/image/BoFan.png', author: '葛东琪', rating: 8.7 },
+    { name: '雾里', image: 'assets/image/BoFan.png', author: '朵芊', rating: 9.3 },
+    { name: '祈愿~致那个时候的你~', image: 'assets/image/BoFan.png', author: '当山真玲', rating: 9.1 },
+    { name: 'SAKURA', image: 'assets/image/BoFan.png', author: 'Che·Nelle', rating: 9.2 },
+    { name: 'Letting Go', image: 'assets/image/BoFan.png', author: '蔡建雅', rating: 9.4 },
+    { name: '我们啊', image: 'assets/image/BoFan.png', author: '三块木头', rating: 9.5 },
+    { name: '星辰不坠落', image: 'assets/image/BoFan.png', author: '蓝心羽', rating: 9.6 },
+    { name: '溯', image: 'assets/image/BoFan.png', author: '马吟吟', rating: 9.1 },
+    { name: '你啊你啊', image: 'assets/image/BoFan.png', author: '魏如宣', rating: 9.0 },
+    { name: 'Tattoo', image: 'assets/image/BoFan.png', author: 'GJan', rating: 9.3 },
+  ];
+  请你将这个数组写入Music中
+
+
+
+
+
+  # Game页面
+  - 我正在编写一个游戏的页面,前端框架使用ionic7的angular版本,数据请求使用Parse JS SDK。 其中游戏的Schema名称为LQLGame,字段name:String 游戏名称、detail:String 对游戏介绍、rating:Number 评分(十分制)、image:string 游戏图标地址。现在我希望你可以给我50个的LQLGame对象的数据,要求:JSON格式的数组,实例化的游戏
+
+  我正在编写一个游戏的页面,前端框架使用ionic7的angular版本,数据请求使用Parse JS SDK。 其中游戏的Schema名称为LQLGame,字段name:String名称、detail:String 游戏介绍、rating:Number评分、image:string图片地址。现在我有一个LQLGame的数组LQLGame= [
+    { title: '王者荣耀', image: 'assets/image/WangZhiRongYao.webp', details: '一款由腾讯游戏开发的多人在线战术竞技游戏,玩家分为两支对抗的队伍,在地图上展开战斗,每个玩家控制一个英雄,通过策略和技能展开战斗。', rating: 8.5 },
+    { title: '和平精英', image: 'assets/image/HePinJinYing.webp', details: '一款由腾讯游戏开发的大逃杀游戏,玩家需要在庞大的地图上收集资源、武器和装备,与其他玩家展开生存竞争,最终成为最后生存的玩家。', rating: 9.3 },
+    { title: '我的世界', image: 'assets/image/WoDeShiJie.webp', details: '一款沙盒游戏,玩家可以在一个由方块构建的世界中自由创造和探索,可以建造各种建筑、挖掘资源、与怪物战斗等。', rating: 8.0 },
+    { title: '迷你世界', image: 'assets/image/MiNiShiJie.png', details: '一款类似于我的世界的沙盒游戏,玩家可以在游戏中创造自己的世界,进行建筑、探险和社交。', rating:9.0 },
+    { title: '绝区零', image: 'assets/image/JueQuLing.png', details: '一款射击游戏,玩家需要在大型地图上与其他玩家展开战斗,通过收集装备和展现枪法来获得胜利。', rating:9.1 },
+    { title: '星穹铁道', image: 'assets/image/XingQuTieDao.jpg', details: '一款太空题材的建造游戏,玩家可以建造自己的太空站和铁路系统,探索宇宙并经营资源', rating:9.2 },
+    { title: '原神', image: 'assets/image/YuanShen.png', details: '一款开放世界动作角色扮演游戏,玩家可以在广阔的世界中探索、战斗、解谜,并收集各种角色和装备。', rating:9.3 },
+    { title: '极品飞车', image: 'assets/image/JiPinFeiChe.jpg', details: '一款经典的赛车游戏系列,玩家可以驾驶各种豪车在城市街道或赛道上展开竞速。', rating:9.5 },
+    { title: '植物大战僵尸', image: 'assets/image/ZhiWuDaZhanJiangShi.jpg', details: '一款塔防游戏,玩家需要通过种植各种植物来抵御僵尸的进攻,保卫自己的花园。', rating:9.1 },
+    { title: '火影忍者', image: 'assets/image/HuoYingRenZhe.jpg', details: '以日本漫画《火影忍者》为题材的动作格斗游戏,玩家可以扮演各种火影忍者中的角色展开战斗。', rating:9.6 },
+    { title: '光遇', image: 'assets/image/GuangYu.webp', details: '一款探索冒险游戏,玩家扮演一只可爱的生物,在神秘的世界中探索、解谜和与其他玩家互动。', rating:9.7 },
+    { title: '第五人格', image: 'assets/image/DiWuRenGe.png', details: '一款对抗式对称竞技游戏,玩家分为求生者和猎人两个阵营,在特定地图上展开战斗。', rating:9.0 },
+    { title: '金铲铲', image: 'assets/image/JinChuanChuan.jpg', details: '一款模拟经营游戏,玩家扮演矿工,在地下挖掘宝藏、经营矿山并发展自己的挖矿帝国。', rating:9.0 },
+  ];
+  请你将这个数组写入LQLGame中
+
+
+
+
+  # 户外
+  - 我正在编写一个户外的页面,前端框架使用ionic7的angular版本,数据请求使用Parse JS SDK。 其中户外的Schema名称为LQLOutdoor,字段name:String 户外名称、detail:String 对该户外介绍、rating:Number 评分(十分制)、image:string 图标地址。现在我希望你可以给我50个的LQLGame对象的数据,要求:JSON格式的数组,使用中文
+
+
+
+
+
+  # 星星打分系统
+  - 我正在编写一个影视的页面,前端框架使用ionic7的angular版本,数据请求使用Parse JS SDK。 其中影视的Schema名称为Film,字段name:String 影视名称、detail:String 对该影视介绍、rating:Number 评分(十分制)、image:string 图标地址。现在我要制作一个可以给每个影视评分的评分系统,评价的分数还要与rating取平均值,再传回Film的rating中。

+ 244 - 0
server/import/game.js

@@ -0,0 +1,244 @@
+// 导入BoleMbti脚本
+
+// 引用Parse JS SDK
+const Parse = require("parse/node");
+Parse.initialize("dev"); // 设置applicationId
+Parse.serverURL = "http://web2023.fmode.cn:9999/parse"; // 设置serverURL
+
+let game= [
+    {
+        "name": "王者荣耀",
+        "image": "assets/image/WangZhiRongYao.webp",
+        "detail": "一款由腾讯游戏开发的多人在线战术竞技游戏,玩家分为两支对抗的队伍,在地图上展开战斗,每个玩家控制一个英雄,通过策略和技能展开战斗。",
+        "rating": 9.3
+    },
+    {
+        "name": "和平精英",
+        "image": "assets/image/HePinJinYing.webp",
+        "detail": "一款由腾讯游戏开发的大逃杀游戏,玩家需要在庞大的地图上收集资源、武器和装备,与其他玩家展开生存竞争,最终成为最后生存的玩家。",
+        "rating": 9.3
+    },
+    {
+        "name": "我的世界",
+        "image": "assets/image/WoDeShiJie.webp",
+        "detail": "一款沙盒游戏,玩家可以在一个由方块构建的世界中自由创造和探索,可以建造各种建筑、挖掘资源、与怪物战斗等。",
+        "rating": 9.6
+    },
+    {
+        "name": "迷你世界",
+        "image": "assets/image/MiNiShiJie.png",
+        "detail": "一款类似于我的世界的沙盒游戏,玩家可以在游戏中创造自己的世界,进行建筑、探险和社交。",
+        "rating": 9.4
+    },
+    {
+        "name": "绝区零",
+        "image": "assets/image/JueQuLing.png",
+        "detail": "一款射击游戏,玩家需要在大型地图上与其他玩家展开战斗,通过收集装备和展现枪法来获得胜利。",
+        "rating": 9.1
+    },
+    {
+        "name": "星穹铁道",
+        "image": "assets/image/XingQuTieDao.jpg",
+        "detail": "一款太空题材的建造游戏,玩家可以建造自己的太空站和铁路系统,探索宇宙并经营资源",
+        "rating": 9.2
+    },
+    {
+        "name": "原神",
+        "image": "assets/image/YuanShen.png",
+        "detail": "一款开放世界动作角色扮演游戏,玩家可以在广阔的世界中探索、战斗、解谜,并收集各种角色和装备。",
+        "rating": 9.3
+    },
+    {
+        "name": "极品飞车",
+        "image": "assets/image/JiPinFeiChe.jpg",
+        "detail": "一款经典的赛车游戏系列,玩家可以驾驶各种豪车在城市街道或赛道上展开竞速。",
+        "rating": 9.5
+    },
+    {
+        "name": "植物大战僵尸",
+        "image": "assets/image/ZhiWuDaZhanJiangShi.jpg",
+        "detail": "一款塔防游戏,玩家需要通过种植各种植物来抵御僵尸的进攻,保卫自己的花园。",
+        "rating": 9.6
+    },
+    {
+        "name": "火影忍者",
+        "image": "assets/image/HuoYingRenZhe.jpg",
+        "detail": "以日本漫画《火影忍者》为题材的动作格斗游戏,玩家可以扮演各种火影忍者中的角色展开战斗。",
+        "rating": 9.6
+    },
+    {
+        "name": "光遇",
+        "image": "assets/image/GuangYu.webp",
+        "detail": "一款探索冒险游戏,玩家扮演一只可爱的生物,在神秘的世界中探索、解谜和与其他玩家互动。",
+        "rating": 9.7
+    },
+    {
+        "name": "第五人格",
+        "image": "assets/image/DiWuRenGe.png",
+        "detail": "一款对抗式对称竞技游戏,玩家分为求生者和猎人两个阵营,在特定地图上展开战斗。",
+        "rating": 9.0
+    },
+    {
+        "name": "金铲铲",
+        "image": "assets/image/JinChuanChuan.jpg",
+        "detail": "一款模拟经营游戏,玩家扮演矿工,在地下挖掘宝藏、经营矿山并发展自己的挖矿帝国。",
+        "rating": 9.0
+    },
+    {
+        "name": "荣耀战魂",
+        "detail": "一款热血战斗类游戏,挑战无尽的敌人,成为最强战士!",
+        "rating": 8.5,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.GtA5Cqk96Z6vJQJ1GfmS3AHaEo?w=270&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "未来之战",
+        "detail": "探索未知的星际世界,解开宇宙的秘密,战胜外星入侵者!",
+        "rating": 9.0,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.xFMW3-PBF4PLh--FNbM_NgHaLH?rs=1&pid=ImgDetMain"
+    },
+    {
+        "name": "幻想之旅",
+        "detail": "踏上奇幻冒险之旅,与精灵、巨龙共同征服魔法世界!",
+        "rating": 8.0,
+        "image": "https://img.zcool.cn/community/031f6cf58edd65ba8012049ef8b0c09.jpg"
+    },
+    {
+        "name": "机械战争",
+        "detail": "操控强大的机甲,与机器人对抗,保卫人类的未来!",
+        "rating": 8.8,
+        "image": "https://img.zcool.cn/community/01ebca5544f20c0000019ae90d1897.jpg@1280w_1l_2o_100sh.jpg"
+    },
+    {
+        "name": "魔法学院",
+        "detail": "学习魔法,拯救魔法学院,成为最强大法师!",
+        "rating": 9.2,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.YPQO8Zw6Gm6PY5MH0ACqywHaEK?rs=1&pid=ImgDetMain"
+    },
+    {
+        "name": "未来之城",
+        "detail": "建设未来之城,发展科技,引领人类文明的新时代!",
+        "rating": 8.7,
+        "image": "https://x0.ifengimg.com/ucms/2023_42/95176231911BD26060B4A8880FF34A1B7B58D2DC_size302_w1920_h1080.jpg"
+    },
+    {
+        "name": "神秘遗迹",
+        "detail": "探索神秘遗迹,解开古老谜团,获得无尽宝藏!",
+        "rating": 9.5,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.Kwd17FuPInfoA8Lj8-_ibAFNC7?w=273&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7g"
+    },
+    {
+        "name": "魔幻冒险",
+        "detail": "穿越魔幻世界,与精灵、巫师展开冒险之旅!",
+        "rating": 8.3,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.g2_hsuoPD9tPa_hkaMJuzQHaEL?w=255&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "宇宙探险",
+        "detail": "乘坐飞船探索宇宙,发现新星球,迎接未知挑战!",
+        "rating": 8.9,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.xEOiLpMk1BoyDrA6vABo-QAAAA?w=234&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "魔法战争",
+        "detail": "魔法与科技的战争,选择你的阵营,改变世界的命运!",
+        "rating": 9.1,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.ExIXu-NcDFJZnc1mSoGBlQHaEK?w=331&h=186&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "神秘之门",
+        "detail": "穿越神秘之门,探索古老文明,解开宇宙之谜!",
+        "rating": 9.3,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.hnVlYEIVfosbC-Y6VVBmswHaEj?w=263&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "魔法学堂",
+        "detail": "进入魔法学堂,学习魔法技能,成为顶尖法师!",
+        "rating": 8.6,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.PoR7whHmHNI9oSK-820PBAHaEH?w=311&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "未来战争",
+        "detail": "投身未来战争,驾驶高科技战机,改变战局!",
+        "rating": 9.0,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.9JjRXloW6NgnRnuYElk12QHaD4?w=331&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "魔幻王国",
+        "detail": "建立属于你的魔幻王国,统治整个魔法世界!",
+        "rating": 8.8,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.Hc1WCGyGHFT3Zxo6KLGDsgHaHa?w=170&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "星际探索",
+        "detail": "探索星际宇宙,发现新星球,迎接星际冒险!",
+        "rating": 9.2,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.TRZd41t7CzD9kcdl2uXCswHaE3?w=282&h=186&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "未知之境",
+        "detail": "探索未知之境,挑战神秘力量,解锁隐藏的秘密!",
+        "rating": 9.4,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.RDsooGjNtcjThT3JwxPA3gHaEK?w=268&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "魔法传说",
+        "detail": "传说中的魔法世界,英雄与魔法共存,开启传奇之旅!",
+        "rating": 8.9,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.7VeAlbRM-KxeGwsS-YymOwAAAA?w=187&h=333&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "未来之旅",
+        "detail": "穿越时空,踏上未来之旅,改变历史的走向!",
+        "rating": 9.1,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.ScDPIUG5rZo7wffi3-B49QHaEK?w=288&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "神秘之夜",
+        "detail": "夜幕降临,揭开神秘之夜的面纱,迎接挑战与冒险!",
+        "rating": 8.7,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.mw6-eCoPb6KLjNi9XlCeuAHaEX?w=293&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "魔法之战",
+        "detail": "魔法与剑术的较量,决定魔法世界的未来命运!",
+        "rating": 9.3,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.BRj8r1RuaxC1gbwebXS21gAAAA?w=127&h=188&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    }
+]
+  
+
+function importAll(){
+    
+    let LQLGame= []
+    Object.keys(game).forEach(key=>{
+        LQLGame.push({
+            // result:key,
+            name:game[key]?.name,
+            detail:game[key]?.detail,
+            rating:game[key]?.rating,
+            image:game[key]?.image,
+        })
+    })
+
+    console.log(LQLGame)
+    LQLGame.forEach(async mbti => {
+        // 查重
+        let exists = await checkExists(mbti)
+        if(exists?.id) return;
+        // 新增
+        let LQLGame = Parse.Object.extend("LQLGame");
+        let bm = new LQLGame();
+        bm.set(mbti);
+        bm.save();
+    });
+}
+
+async function checkExists(mbti){
+    let query = new Parse.Query("LQLGame");
+    //query.equalTo("result",mbti?.result);
+    query.equalTo("name",mbti?.name);
+    await query.first();
+    return await query.first();
+}
+
+importAll()

+ 60 - 0
server/import/music.js

@@ -0,0 +1,60 @@
+// 导入BoleMbti脚本
+
+// 引用Parse JS SDK
+const Parse = require("parse/node");
+Parse.initialize("dev"); // 设置applicationId
+Parse.serverURL = "http://web2023.fmode.cn:9999/parse"; // 设置serverURL
+
+let music= [
+    { "name": "偏爱", "image": "assets/image/BoFan.png", "author": "张芸京", "rating": 8.5 },
+    { "name": "雪之华", "image": "assets/image/BoFan.png", "author": "中岛美嘉", "rating": 9.3 },
+    { "name": "是你", "image": "assets/image/BoFan.png", "author": "梦然", "rating": 9.0 },
+    { "name": "悬溺", "image": "assets/image/BoFan.png", "author": "葛东琪", "rating": 8.7 },
+    { "name": "雾里", "image": "assets/image/BoFan.png", "author": "朵芊", "rating": 9.3 },
+    { "name": "祈愿~致那个时候的你~", "image": "assets/image/BoFan.png", "author": "当山真玲", "rating": 9.1 },
+    { "name": "SAKURA", "image": "assets/image/BoFan.png", "author": "Che·Nelle", "rating": 9.2 },
+    { "name": "Letting Go", "image": "assets/image/BoFan.png", "author": "蔡建雅", "rating": 9.4 },
+    { "name": "我们啊", "image": "assets/image/BoFan.png", "author": "三块木头", "rating": 9.5 },
+    { "name": "星辰不坠落", "image": "assets/image/BoFan.png", "author": "蓝心羽", "rating": 9.6 },
+    { "name": "溯", "image": "assets/image/BoFan.png", "author": "马吟吟", "rating": 9.1 },
+    { "name": "你啊你啊", "image": "assets/image/BoFan.png", "author": "魏如宣", "rating": 9.0 },
+    { "name": "Tattoo", "image": "assets/image/BoFan.png", "author": "GJan", "rating": 9.3 }
+];
+
+  
+
+function importAll(){
+    
+    let LQLMusic= []
+    Object.keys(music).forEach(key=>{
+        LQLMusic.push({
+            // result:key,
+            name:music[key]?.name,
+            author:music[key]?.author,
+            rating:music[key]?.rating,
+            image:music[key]?.image,
+        })
+    })
+
+    console.log(LQLMusic)
+    LQLMusic.forEach(async mbti => {
+        // 查重
+        let exists = await checkExists(mbti)
+        if(exists?.id) return;
+        // 新增
+        let LQLMusic = Parse.Object.extend("LQLMusic");
+        let bm = new LQLMusic();
+        bm.set(mbti);
+        bm.save();
+    });
+}
+
+async function checkExists(mbti){
+    let query = new Parse.Query("LQLMusic");
+    query.equalTo("result",mbti?.result);
+    query.equalTo("name",mbti?.name);
+    await query.first();
+    return await query.first();
+}
+
+importAll()

+ 281 - 0
server/import/outdoor.js

@@ -0,0 +1,281 @@
+// 导入BoleMbti脚本
+
+// 引用Parse JS SDK
+const Parse = require("parse/node");
+Parse.initialize("dev"); // 设置applicationId
+Parse.serverURL = "http://web2023.fmode.cn:9999/parse"; // 设置serverURL
+
+let outdoor= [
+    {
+        "name": "山峰探险",
+        "detail": "踏上征服该地区最高峰的惊险之旅。",
+        "rating": 9.5,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.dGrXl6o9hr0kz0KlQz4jlQHaIn?w=148&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "森林小径探索",
+        "detail": "在导游的带领下,发现森林的奇迹。",
+        "rating": 8.7,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.NCWkXvoIc5oA32AwUKHqmgHaE8?w=282&h=188&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "湖泊皮划艇远征",
+        "detail": "划过宁静的湖水,探索隐藏的小海湾。",
+        "rating": 9.0,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.xkecIavHjYqmMQduou3KCgHaE7?w=277&h=185&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "峡谷徒步之旅",
+        "detail": "徒步穿越壮丽的峡谷,感受大自然的壮丽。",
+        "rating": 8.8,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.vB75xl4nuaBndyljx2HvvAHaE7?w=287&h=190&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "野外露营体验",
+        "detail": "在大自然中露营,享受星空下的宁静。",
+        "rating": 9.2,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.udqi-p0CBbBQ7TD5-wqONwHaE7?w=260&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "滑雪乐园",
+        "detail": "在雪白的坡道上尽情滑行,体验冬日的乐趣。",
+        "rating": 9.4,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.k8N5Ay-WvhYNU4UEcJCwXgHaEU?w=247&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "海滩瑜伽课程",
+        "detail": "在海滩上练习瑜伽,感受海风的清新。",
+        "rating": 8.6,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.V3IDawispNb-4s2PVIRcZwHaE7?w=269&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "悬崖跳水挑战",
+        "detail": "勇敢地跳下悬崖,体验极限挑战的刺激。",
+        "rating": 9.7,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.QrQEHhAX1fEBSsHLtFT5HgHaEK?w=282&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "草原骑行之旅",
+        "detail": "骑行穿越广阔的草原,感受自然的纯粹。",
+        "rating": 8.9,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.gi2axq_oLwjKo53dYGco8wHaE7?w=275&h=183&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "瀑布探险",
+        "detail": "探索壮丽的瀑布,感受水流的力量。",
+        "rating": 9.3,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.8qEdlyCsHVUcIOi4ezi9PAHaE7?w=258&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "星空露营之旅",
+        "detail": "在夜晚的星空下露营,感受宇宙的浩瀚。",
+        "rating": 9.1,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.sp2AKWdjpS7GnbaIBvB1rAHaE8?w=276&h=184&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "山谷骑行挑战",
+        "detail": "挑战陡峭的山谷,体验骑行的刺激。",
+        "rating": 8.8,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.PZgmNq6uIWbgPZ7Unr1GSQHaE7?w=273&h=182&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "湖边瑜伽修行",
+        "detail": "在湖畔练习瑜伽,感受大自然的宁静。",
+        "rating": 9.0,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.2MEM0U7fzvMRODVgR5oioQHaE7?w=269&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "沙漠骆驼旅行",
+        "detail": "乘坐骆驼穿越沙漠,体验异国风情。",
+        "rating": 9.4,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.rWyaPzvTo8DeC8ZeHA4YpAHaE7?w=279&h=186&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "滑翔伞飞行体验",
+        "detail": "在空中飞翔,俯瞰壮丽的风景。",
+        "rating": 9.6,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.wuCG9dbQ2tfdNzrDRS5XFQHaE7?w=237&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "雨林探险之旅",
+        "detail": "深入雨林,探寻热带植物与动物的奥秘。",
+        "rating": 9.2,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.kMLud3xbouK7VshD9bfJcgHaE6?w=280&h=186&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "冰川徒步探险",
+        "detail": "徒步穿越冰川,感受冰雪世界的壮美。",
+        "rating": 9.7,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.2c2164ElnNAUCsv1o3IEMwHaE7?w=269&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "荒野求生挑战",
+        "detail": "在荒野中挑战求生技能,体验生存的艰辛。",
+        "rating": 8.9,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.xtQKp2vGO-jlZ1pYwDGljQHaE8?w=245&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "极地探险之旅",
+        "detail": "前往极地,探索冰雪世界的神秘。",
+        "rating": 9.5,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.yzdTWlXaUJ_rs_ZhO9MfjAAAAA?w=258&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "火山探险之旅",
+        "detail": "探索活火山,感受火山的狂暴与美丽。",
+        "rating": 9.3,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.ZLkJRGwlit-TCqse0_jFFgHaEo?w=260&h=181&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "海岛探险之旅",
+        "detail": "前往孤岛,探寻海岛的奇迹与秘密。",
+        "rating": 9.1,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.GgTqWhlZXiJIM06ZZIteBAHaFj?w=182&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "瀑布跳水挑战",
+        "detail": "勇敢地跳入瀑布池中,体验挑战的乐趣。",
+        "rating": 8.8,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.iDPPIEGczta8cVbIuvr-OwHaEX?w=284&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "河流漂流探险",
+        "detail": "漂流在急流险滩间,感受河流的激情。",
+        "rating": 9.0,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.AxyxSeGemoM2v1qmWU0zVwHaFj?w=221&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "悬崖攀岩挑战",
+        "detail": "攀登陡峭悬崖,挑战自己的极限。",
+        "rating": 9.4,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.zwHWNJeHhwleh0hI9IytiwHaE5?w=248&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "湖泊钓鱼之旅",
+        "detail": "在宁静的湖泊垂钓,享受钓鱼的乐趣。",
+        "rating": 9.6,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.Weo_lcRTm1MaPcapiL39JgHaE8?w=258&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "草原露营之旅",
+        "detail": "在广袤的草原露营,感受大自然的宁静。",
+        "rating": 9.2,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.FXcTJuScH_KZ2BlxgF3npgHaEN?w=302&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "雪地滑雪探险",
+        "detail": "滑行在洁白的雪地,体验雪地探险的乐趣。",
+        "rating": 9.7,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.O5FvDNSHHx-X0t9T5d37oAHaEK?w=270&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "海岸徒步之旅",
+        "detail": "沿着海岸线徒步,感受海风的清新。",
+        "rating": 8.9,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.sUJ42tvc75-18SMSX2XoQQHaE7?w=298&h=199&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "热气球飞行体验",
+        "detail": "乘坐热气球飞翔,俯瞰大地的壮丽。",
+        "rating": 9.3,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.deBeVl9iqp5_Au2ePk_pewHaE7?w=249&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "林间露营之旅",
+        "detail": "在郁郁葱葱的森林中露营,感受大自然的怀抱。",
+        "rating": 9.5,
+        "image": "https://tse2-mm.cn.bing.net/th/id/OIP-C.PoVh9HV97rrQK3aZNa-0LwHaEp?w=282&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "湖畔野餐活动",
+        "detail": "在湖边享受美味的野餐,感受自然的宁静。",
+        "rating": 9.1,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.MffzoBs9glXk_C6dKaRZNAHaE7?w=225&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "森林生存挑战",
+        "detail": "在茂密森林中挑战生存技能,体验野外生活。",
+        "rating": 8.8,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.V3jtZawqZdPm7Mzp5b6YKAHaEK?w=312&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "山谷露营之旅",
+        "detail": "在幽静山谷中搭起帐篷,享受大自然的美好。",
+        "rating": 9.0,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C._5dhDFNUtUAHEJ9VL99SNQHaC7?w=336&h=138&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "冰川探险之旅",
+        "detail": "探索冰川脚下的壮丽景观,感受冰雪世界的奇迹。",
+        "rating": 9.4,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.2c2164ElnNAUCsv1o3IEMwHaE7?w=270&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "荒漠沙漠之旅",
+        "detail": "穿越广袤的沙漠,体验沙漠风情。",
+        "rating": 9.6,
+        "image": "https://tse4-mm.cn.bing.net/th/id/OIP-C.vuiKOX8lYil7yjrg0Gwm1gHaEK?w=289&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "湖泊皮划艇漂流",
+        "detail": "在湖泊上划船漂流,享受水上乐趣。",
+        "rating": 9.2,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.WN_Bm7Up75R11Y5oqeC6ogHaE7?w=270&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "山顶日出观赏",
+        "detail": "登上山顶,欣赏日出美景,感受大自然的魅力。",
+        "rating": 9.7,
+        "image": "https://tse1-mm.cn.bing.net/th/id/OIP-C.vh89hngzt0X6b48Y939XpQHaE7?w=261&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "滑雪跳台挑战",
+        "detail": "挑战滑雪跳台,体验滑雪的刺激与挑战。",
+        "rating": 9.3,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.WZfNkfIbFkSDbzGsVcYSjwHaE7?w=270&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    },
+    {
+        "name": "海底潜水探险",
+        "detail": "潜入海底,探索神秘海洋世界的奥秘。",
+        "rating": 9.5,
+        "image": "https://tse3-mm.cn.bing.net/th/id/OIP-C.1MvDrB6cqRcuEJ33KlZPYgHaG6?w=159&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7"
+    }
+];
+
+  
+
+function importAll(){
+    
+    let LQLOutdoor= []
+    Object.keys(outdoor).forEach(key=>{
+        LQLOutdoor.push({
+            // result:key,
+            name:outdoor[key]?.name,
+            detail:outdoor[key]?.detail,
+            rating:outdoor[key]?.rating,
+            image:outdoor[key]?.image,
+        })
+    })
+
+    console.log(LQLOutdoor)
+    LQLOutdoor.forEach(async mbti => {
+        // 查重
+        let exists = await checkExists(mbti)
+        if(exists?.id) return;
+        // 新增
+        let LQLOutdoor = Parse.Object.extend("LQLOutdoor");
+        let bm = new LQLOutdoor();
+        bm.set(mbti);
+        bm.save();
+    });
+}
+
+async function checkExists(mbti){
+    let query = new Parse.Query("LQLOutdoor");
+    query.equalTo("result",mbti?.result);
+    query.equalTo("name",mbti?.name);
+    await query.first();
+    return await query.first();
+}
+
+importAll()

+ 0 - 0
server/promise.js


+ 14 - 0
server/rest.js

@@ -0,0 +1,14 @@
+fetch("http://web2023.fmode.cn:9999/parse/classes/Film?", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
+      "if-none-match": "W/\"860-DTLs8b/ido7RBqXhWd2PF7hkMFQ\"",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": null,
+    "method": "GET",
+    "mode": "cors",
+    "credentials": "omit"
+  });

+ 77 - 4
src/app/app-routing.module.ts

@@ -1,15 +1,88 @@
 import { NgModule } from '@angular/core';
 import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
+import { IonicModule } from '@ionic/angular';
 
 const routes: Routes = [
   {
-    path: '',
-    loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule)
-  }
+    path:'',
+    // redirectTo:"tabs/tab1",
+    // pathMatch:'full',
+    loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule),
+  },
+  {
+
+    path: 'user',
+    loadChildren: () => import('../modules/user/user.module').then(m => m.UserModule)
+  },
+  {
+    path:"feiwu",
+    children:[
+      {
+        path: 'book',
+        loadChildren: () => import('../modules/feiwu/book/book.module').then( m => m.BookPageModule)
+      },
+       {
+        path: 'fiml',
+         loadChildren: () => import('../modules/feiwu/fiml/fiml.module').then( m => m.FimlPageModule)
+       },
+     
+      {
+        path: 'music',
+        loadChildren: () => import('../modules/feiwu/music/music.module').then( m => m.MusicPageModule)
+      },
+      {
+        path: 'game',
+        loadChildren: () => import('../modules/feiwu/game/game.module').then( m => m.GamePageModule)
+      },
+      {
+        path: 'outdoor',
+        loadChildren: () => import('../modules/feiwu/outdoor/outdoor.module').then( m => m.OutdoorPageModule)
+      },
+      {
+        path: 'film-detail/:id',
+        loadChildren: () => import('../modules/feiwu/film-detail/film-detail.module').then( m => m.FilmDetailPageModule)
+      },
+      {
+        path: 'book-detail/:id',
+        loadChildren: () => import('../modules/feiwu/book-detail/book-detail.module').then( m => m.BookDetailPageModule)
+      },
+
+      {
+        path: 'music-detail/:id',
+        loadChildren: () => import('../modules/feiwu/music-detail/music-detail.module').then( m => m.MusicDetailPageModule)
+      },
+      {
+        path: 'game-detail/:id',
+        loadChildren: () => import('../modules/feiwu/game-detail/game-detail.module').then( m => m.GameDetailPageModule)
+      },
+      {
+        path: 'outdoor-detail/:id',
+        loadChildren: () => import('../modules/feiwu/outdoor-detail/outdoor-detail.module').then( m => m.OutdoorDetailPageModule)
+      },
+    ]  
+
+  },
+  {
+    path: 'dongt',
+    loadChildren: () => import('../modules/dongt/dongt.module').then( m => m.DongtPageModule)
+  },
+  {
+    path: 'favorites',
+    loadChildren: () => import('../modules/favorites/favorites.module').then( m => m.FavoritesPageModule)
+  },
+  {
+    path: 'album',
+    loadChildren: () => import('../modules/album/album.module').then( m => m.AlbumPageModule)
+  },
+  
+  
+ 
 ];
 @NgModule({
   imports: [
-    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
+    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules }),
+    
+ 
   ],
   exports: [RouterModule]
 })

+ 1 - 0
src/app/app.component.html

@@ -1,3 +1,4 @@
 <ion-app>
   <ion-router-outlet></ion-router-outlet>
 </ion-app>
+

+ 3 - 0
src/app/app.component.ts

@@ -1,4 +1,7 @@
 import { Component } from '@angular/core';
+import Parse from "parse";
+Parse.initialize("dev"); // 设置applicationId
+Parse.serverURL = "http://web2023.fmode.cn:9999/parse";
 
 @Component({
   selector: 'app-root',

+ 2 - 1
src/app/app.module.ts

@@ -1,12 +1,13 @@
 import { NgModule } from '@angular/core';
 import { BrowserModule } from '@angular/platform-browser';
 import { RouteReuseStrategy } from '@angular/router';
-
 import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
 
 import { AppRoutingModule } from './app-routing.module';
 import { AppComponent } from './app.component';
 
+
+
 @NgModule({
   declarations: [AppComponent],
   imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],

+ 12 - 4
src/app/tab1/tab1-routing.module.ts

@@ -1,12 +1,20 @@
 import { NgModule } from '@angular/core';
 import { RouterModule, Routes } from '@angular/router';
 import { Tab1Page } from './tab1.page';
+// import { FimlPage } from '../../modules/feiwu/fiml/fiml.page';
+//  import { BookPage } from '../../modules/feiwu/book/book.page';
+//  import { MusicPage } from '../../modules/feiwu/music/music.page';
+//  import { GamePage } from '../../modules/feiwu/game/game.page';
+//  import { OutdoorPage } from '../../modules/feiwu/outdoor/outdoor.page';
 
 const routes: Routes = [
-  {
-    path: '',
-    component: Tab1Page,
-  }
+  { path: '', component: Tab1Page },
+  // { path: 'fiml', component: FimlPage },
+  // { path: 'book', component: BookPage },
+  // { path: 'music', component: MusicPage },
+  // { path: 'game', component: GamePage },
+  // { path: 'outdoor', component: OutdoorPage }
+
 ];
 
 @NgModule({

+ 86 - 12
src/app/tab1/tab1.page.html

@@ -1,17 +1,91 @@
-<ion-header [translucent]="true">
-  <ion-toolbar>
-    <ion-title>
-      Tab 1
-    </ion-title>
+<ion-header>
+  <ion-toolbar color="primary">
+    <ion-title>页面功能区域</ion-title>
   </ion-toolbar>
 </ion-header>
 
-<ion-content [fullscreen]="true">
-  <ion-header collapse="condense">
-    <ion-toolbar>
-      <ion-title size="large">Tab 1</ion-title>
-    </ion-toolbar>
-  </ion-header>
+<ion-content color="light">
+  <!-- 搜索栏 -->
+  <ion-searchbar></ion-searchbar>
 
-  <app-explore-container name="Tab 1 page"></app-explore-container>
+  <!-- 分类选项 -->
+  <ion-segment>
+    <ion-segment-button value="movies" expand="block" routerLink="/feiwu/fiml">
+      影视
+    </ion-segment-button>
+    <ion-segment-button value="books" expand="block" routerLink="/feiwu/book">
+      读书
+    </ion-segment-button>
+    <ion-segment-button value="music" expand="block" routerLink="/feiwu/music">
+      音乐
+    </ion-segment-button>
+    <ion-segment-button value="games" expand="block" routerLink="/feiwu/game">
+      游戏
+    </ion-segment-button>			
+    <ion-segment-button value="outdoor" expand="block" routerLink="/feiwu/outdoor">
+      户外
+    </ion-segment-button>
+  </ion-segment>
+
+  <!-- 内容推荐 -->
+  <ion-card>
+    <ion-card-header>
+      个性推荐
+    </ion-card-header>
+    <ion-card-content>
+      <!-- 这里放个性推荐的内容 -->
+    </ion-card-content>
+  </ion-card>
+
+  <ion-row>
+    <!-- 放大的四个框 -->
+    <ion-col size="6">
+      <ion-card>
+        <ion-card-header>
+          热门电影
+        </ion-card-header>
+        <ion-card-content>
+          <!-- 这里放热门电影的内容 -->
+          <ion-img src="assets/movie.jpg"></ion-img>
+        </ion-card-content>
+      </ion-card>
+    </ion-col>
+
+    <ion-col size="6">
+      <ion-card>
+        <ion-card-header>
+          国内即将上映
+        </ion-card-header>
+        <ion-card-content>
+          <!-- 这里放国内即将上映的内容 -->
+          <ion-img src="assets/upcoming.jpg"></ion-img>
+        </ion-card-content>
+      </ion-card>
+    </ion-col>
+
+    <ion-col size="6">
+      <ion-card>
+        <ion-card-header>
+          全球值得期待
+        </ion-card-header>
+        <ion-card-content>
+          <!-- 这里放全球值得期待的内容 -->
+          <ion-img src="assets/global.jpg"></ion-img>
+        </ion-card-content>
+      </ion-card>
+    </ion-col>
+
+    <ion-col size="6">
+      <ion-card>
+        <ion-card-header>
+          新游戏发布
+        </ion-card-header>
+        <ion-card-content>
+          <!-- 这里放新游戏发布的内容 -->
+          <ion-img src="assets/games.jpg"></ion-img>
+        </ion-card-content>
+      </ion-card>
+    </ion-col>
+  </ion-row>
 </ion-content>
+

+ 18 - 2
src/app/tab1/tab1.page.ts

@@ -1,12 +1,28 @@
 import { Component } from '@angular/core';
+import { Router } from '@angular/router';
 
 @Component({
   selector: 'app-tab1',
   templateUrl: 'tab1.page.html',
   styleUrls: ['tab1.page.scss']
 })
-export class Tab1Page {
 
-  constructor() {}
 
+export class Tab1Page  {
+  constructor(private router: Router) { }
+  // goToMoviesPage() {
+  //   this.router.navigate(['/fiml']);
+  // }
+  // goToBooksPage() {
+  //   this.router.navigate(['/book']);
+  // }
+  // goToMusicPage() {
+  //   this.router.navigate(['/music']);
+  // }goToGamePage() {
+  //   this.router.navigate(['/game']);
+  // }
+  // goToOutdoorPage() {
+  //   this.router.navigate(['/outdoor']);
+  // }
 }
+

+ 6 - 1
src/app/tab2/tab2-routing.module.ts

@@ -6,7 +6,8 @@ const routes: Routes = [
   {
     path: '',
     component: Tab2Page,
-  }
+  },
+  
 ];
 
 @NgModule({
@@ -14,3 +15,7 @@ const routes: Routes = [
   exports: [RouterModule]
 })
 export class Tab2PageRoutingModule {}
+
+
+
+

+ 95 - 10
src/app/tab2/tab2.page.html

@@ -1,17 +1,102 @@
 <ion-header [translucent]="true">
-  <ion-toolbar>
+  <ion-toolbar color="primary">
+    
     <ion-title>
-      Tab 2
+      社区
     </ion-title>
   </ion-toolbar>
 </ion-header>
 
-<ion-content [fullscreen]="true">
-  <ion-header collapse="condense">
-    <ion-toolbar>
-      <ion-title size="large">Tab 2</ion-title>
-    </ion-toolbar>
-  </ion-header>
+<ion-content color="light">
+  <!-- 用户分享内容区域 -->
+  <ion-card color="light">
+    <ion-card-header>
+      <ion-title class="ion-text-left ion-text-large" color="tertiary">用户分享内容 <ion-icon name="fish-outline"></ion-icon></ion-title>
+     
+    </ion-card-header>
+    <ion-card-content>
+      <!-- 示例数据:用户1分享的内容 -->
+      <ion-item>
+        <ion-avatar slot="start">
+          <ion-img src="assets/image/tx1.jpg"style="position: absolute; width: 50px; height: 50px; margin-top:-70px; margin-left:-3px;"></ion-img>
+        </ion-avatar>
+        <ion-label>
+          <h2>朱迪</h2>
+          <p>Try everything.I just won't give up</p>
+          <div style="display: flex;">
+            <ion-img src="assets/image/zd2.jpg" style="max-width: 50%;"></ion-img> <!-- 第一张图片 -->
+            <ion-img src="assets/image/zd1.jpg" style="max-width: 45%;"></ion-img> <!-- 第二张图片 -->
+          </div>
+        </ion-label>
+        <ion-icon name="heart" slot="end" color="primary" (click)="toggleIconColor($event)"></ion-icon>
+      </ion-item>
+      <!-- 其他用户分享的内容 -->
+    </ion-card-content>
+  </ion-card>
 
-  <app-explore-container name="Tab 2 page"></app-explore-container>
-</ion-content>
+  <!-- 用户评论与点赞区域 -->
+  <ion-card color="light">
+    <ion-card-header>
+      <ion-title class="ion-text-left ion-text-large" color="tertiary">用户评论与点赞<ion-icon name="thumbs-up-outline"></ion-icon></ion-title>
+    </ion-card-header>
+    <ion-card-content>
+      <!-- 示例数据:用户2的评论 -->
+      <ion-item>
+        <ion-label>
+          <h2>尼克</h2>
+          <p>No matter what type of animal you are ,change start with you </p>
+        </ion-label>
+      </ion-item>
+      <!-- 用户点赞信息 -->
+      <ion-item>
+        <ion-icon name="heart" slot="end" color="primary"style="position: absolute;  left: 8px;" (click)="toggleIconColor($event)"></ion-icon>
+        <ion-icon name="chatbox-ellipses-outline" slot="start" style="position: absolute; left: 160px;" (click)="showCommentBox()"></ion-icon>
+        <ion-icon name="open-outline"slot="start"style="position: absolute;  left: 290px;"></ion-icon>
+      </ion-item>
+      <ion-item *ngIf="showComment">
+        <ion-input placeholder="输入评论内容" [(ngModel)]="newComment"></ion-input>
+        <ion-button (click)="addComment()">添加评论</ion-button>
+      </ion-item>
+    </ion-card-content>
+    
+  </ion-card>
+  
+
+  <!-- 精彩活动推荐区域 -->
+  <ion-card color="light">
+    <ion-card-header>
+      <ion-title class="ion-text-left ion-text-large" color="tertiary">精彩活动推荐<ion-icon name="bonfire-outline"></ion-icon></ion-title>
+    </ion-card-header>
+    <ion-card-content>
+      <!-- 示例数据:精彩活动1 -->
+      <ion-item>
+        <ion-thumbnail slot="start">
+          <ion-img src="assets/image/mzt.jpg"></ion-img>
+        </ion-thumbnail>
+        <ion-label>
+          <h2>法语原版音乐剧《摇滚莫扎特》</h2>
+          <p>天才音乐家的人生传记,摇滚与古典的大胆碰撞</p>
+        </ion-label>
+      </ion-item>
+      <!-- 其他精彩活动推荐 -->
+    </ion-card-content>
+  </ion-card>
+
+  <!-- 热门话题讨论区域 -->
+  <ion-card color="light">
+    <ion-card-header>
+      <ion-title class="ion-text-left ion-text-large" color="tertiary">热门话题讨论<ion-icon name="ribbon-outline"></ion-icon></ion-title>
+    </ion-card-header>
+    <ion-card-content>
+      <!-- 示例数据:话题1 -->
+      <ion-item>
+        <ion-label>史密斯先生—请允许我这样介绍他一位隐士,一位孤僻的绅士
+          他把所有的记忆都压在那隐秘的城堡将之掩盖在房间腐的尘土下
+          却又从那渡鸦般的灰色瞳孔中流露出来
+          从硝烟中活下来的史密斯先生这位二十世纪初的怪人被嫉妒的天才他在隐藏些什么?</ion-label>
+      </ion-item>
+      
+      <!-- 其他热门话题讨论 -->
+    </ion-card-content>
+  </ion-card>
+</ion-content>

+ 24 - 0
src/app/tab2/tab2.page.ts

@@ -1,3 +1,5 @@
+
+
 import { Component } from '@angular/core';
 
 @Component({
@@ -7,6 +9,28 @@ import { Component } from '@angular/core';
 })
 export class Tab2Page {
 
+  showComment: boolean = false;
+  newComment: string = '';
+
   constructor() {}
+  
+  showCommentBox() {
+    this.showComment = !this.showComment;
+  }
+
+  addComment() {
+    // 添加评论的逻辑
+  }
 
+  toggleIconColor(event: { target: any; }) {
+    const icon = event.target;
+    if (icon.getAttribute('color') === 'danger') {
+      icon.setAttribute('color', 'primary');
+    } else {
+      icon.setAttribute('color', 'danger');
+    }
+  }
 }
+
+
+

+ 85 - 8
src/app/tab3/tab3.page.html

@@ -1,17 +1,94 @@
 <ion-header [translucent]="true">
-  <ion-toolbar>
+  <ion-toolbar color="primary">
     <ion-title>
-      Tab 3
+      我的
     </ion-title>
   </ion-toolbar>
 </ion-header>
 
 <ion-content [fullscreen]="true">
-  <ion-header collapse="condense">
-    <ion-toolbar>
-      <ion-title size="large">Tab 3</ion-title>
-    </ion-toolbar>
-  </ion-header>
+  <!-- 顶部照片部分 -->
+  <div style="position: relative;">
+    <img src="assets/image/bj1.jpg" style="width: 100%; height: 33vh;" />
+    <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">
+    <ion-avatar>
+        <ion-img [src]="user?.id ? 'assets/image/tx2.jpg' : 'assets/image/wdl.jpg'"></ion-img>
+      </ion-avatar>
+    </div>
+    <div style="position: absolute; top: 0; right: 0;">
+      <ion-button *ngIf="!user?.id" fill="clear" routerLink="/user/login"color="tertiary" style="font-size: 20px; font-weight: bold;">登录</ion-button>
+ </div>
+ <div style="position: absolute; bottom: 0; right: 0;">
+ <ion-button *ngIf="user?.id" fill="clear" routerLink="/user/edit/info"color="tertiary" style="font-size: 12px; font-weight: bold;">编辑资料</ion-button>
+</div>
+    <div style="position: absolute; bottom: 0; left: 10px;">
+      <p style="line-height: -5; font-weight: bold; color: rgb(255, 253, 253); display: flex; align-items: center;">
+        <ion-card-title style="color: #f8f2f2; font-weight: bold;">{{user?.get("username") || '未登录'}}</ion-card-title>
+        <ion-icon name="bonfire-outline" style="margin-left: 5px;"></ion-icon>
+      </p>
+      <p>
+        <ion-card-subtitle *ngIf="user?.id" style="color: rgb(243, 243, 248);">{{user?.get("name")}}-{{user?.get("gender")}}</ion-card-subtitle>
+      </p>
+      <p>
+        <ion-card-subtitle *ngIf="user?.id" style="color: rgb(243, 243, 248);">{{user?.get("gxqm")}}</ion-card-subtitle>
+      </p>
+    </div>
+  </div>
 
-  <app-explore-container name="Tab 3 page"></app-explore-container>
+  <!-- 下方三个组件:主页、动态、相册 -->
+  <ion-row>
+    <ion-col>
+      <ion-button expand="full" routerLink="/dongt" class="custom-button">动态</ion-button>
+    </ion-col>
+    <ion-col>
+      <ion-button expand="full" routerLink="/favorites" class="custom-button">收藏</ion-button>
+    </ion-col>
+    <ion-col>
+      <ion-button expand="full" routerLink="/album" class="custom-button">相册</ion-button>
+    </ion-col>
+  </ion-row>
+
+  <ion-card>
+    <ion-card-header style="display: flex; flex-direction: row; align-items: center;">
+      <ion-icon name="book-outline" style="margin-right: 5px;"></ion-icon> 
+      <span>创建我的书影音</span>
+    </ion-card-header>
+    <ion-card-content>
+      添加你最爱的影视,它将会在你的个人主页展示。
+    </ion-card-content>
+  </ion-card>
+
+  <ion-card>
+    <ion-card-header style="display: flex; flex-direction: row; align-items: center;">
+      <ion-icon name="film" style="margin-right: 5px;"></ion-icon> 
+      <span>快速记录我看过的影视</span>
+    </ion-card-header>
+    <ion-card-content>
+     让我们来看看你看过那些影片吧!
+    </ion-card-content>
+  </ion-card>
+
+  <ion-card>
+    <ion-card-header style="display: flex; flex-direction: row; align-items: center;">
+      <ion-icon name="earth-outline" style="margin-right: 5px;"></ion-icon> 
+      <span> 我的社区</span>
+    </ion-card-header>
+    <ion-card-content>
+      快去社区分享你有趣的故事吧!
+    </ion-card-content>
+  </ion-card>
+
+  <ion-card>
+    <ion-card-header style="display: flex; flex-direction: row; align-items: center;">
+      <ion-icon name="heart-circle-outline" style="margin-right: 5px;"></ion-icon> 
+      <span> 创作灵感</span>
+    </ion-card-header>
+    <ion-card-content>
+      拯救没灵感的你,让我们来探索创意的潜力吧!
+    </ion-card-content>
+    <ion-card>
+      <ion-button *ngIf="user?.id" fill="clear" (click)="logout()">登出</ion-button>
+    </ion-card>
+  </ion-card>
 </ion-content>
+

+ 17 - 2
src/app/tab3/tab3.page.ts

@@ -1,5 +1,6 @@
 import { Component } from '@angular/core';
-
+// 由于Parse本身是js库,在ts中加载需要通过 * as Parse转换一下
+import Parse from "parse"
 @Component({
   selector: 'app-tab3',
   templateUrl: 'tab3.page.html',
@@ -7,6 +8,20 @@ import { Component } from '@angular/core';
 })
 export class Tab3Page {
 
-  constructor() {}
+  constructor() {
+   
+  }
 
+  // 由于Parse.User.current()是随着localStorage变化的属性
+  // 为了避免首次复制后用户状态变化,页面不同步,通过get方法实现实时获取
+  user:Parse.User|undefined
+  async ngOnInit() {
+      this.user = await Parse.User.current()
+      setInterval(async ()=>{
+      this.user = await Parse.User.current()
+    },1000)
+  }
+  logout(){
+    Parse.User.logOut();
+  }
 }

+ 6 - 5
src/app/tabs/tabs-routing.module.ts

@@ -3,6 +3,11 @@ import { RouterModule, Routes } from '@angular/router';
 import { TabsPage } from './tabs.page';
 
 const routes: Routes = [
+  {
+    path: '',
+    redirectTo: '/tabs/tab1',
+    pathMatch: 'full'
+  },
   {
     path: 'tabs',
     component: TabsPage,
@@ -25,12 +30,8 @@ const routes: Routes = [
         pathMatch: 'full'
       }
     ]
-  },
-  {
-    path: '',
-    redirectTo: '/tabs/tab1',
-    pathMatch: 'full'
   }
+  
 ];
 
 @NgModule({

+ 0 - 1
src/app/tabs/tabs.module.ts

@@ -2,7 +2,6 @@ import { IonicModule } from '@ionic/angular';
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
 import { FormsModule } from '@angular/forms';
-
 import { TabsPageRoutingModule } from './tabs-routing.module';
 
 import { TabsPage } from './tabs.page';

+ 6 - 6
src/app/tabs/tabs.page.html

@@ -2,18 +2,18 @@
 
   <ion-tab-bar slot="bottom">
     <ion-tab-button tab="tab1" href="/tabs/tab1">
-      <ion-icon aria-hidden="true" name="triangle"></ion-icon>
-      <ion-label>Tab 1</ion-label>
+      <ion-icon aria-hidden="true" name="home-outline"></ion-icon>
+      <ion-label>首页</ion-label>
     </ion-tab-button>
 
     <ion-tab-button tab="tab2" href="/tabs/tab2">
-      <ion-icon aria-hidden="true" name="ellipse"></ion-icon>
-      <ion-label>Tab 2</ion-label>
+      <ion-icon aria-hidden="true" name="apps-outline"></ion-icon>
+      <ion-label>社区</ion-label>
     </ion-tab-button>
 
     <ion-tab-button tab="tab3" href="/tabs/tab3">
-      <ion-icon aria-hidden="true" name="square"></ion-icon>
-      <ion-label>Tab 3</ion-label>
+      <ion-icon aria-hidden="true" name="person-circle-outline"></ion-icon>
+      <ion-label>我的</ion-label>
     </ion-tab-button>
   </ion-tab-bar>
 

BIN
src/assets/image/ATeMan.png


BIN
src/assets/image/BoFan.png


BIN
src/assets/image/DengShan.jpg


BIN
src/assets/image/DiWuRenGe.png


BIN
src/assets/image/DiaoYu.png


BIN
src/assets/image/Doraemon.png


BIN
src/assets/image/FeiChiRenShen.jpg


BIN
src/assets/image/FengKuangDongWuCheng.jpg


BIN
src/assets/image/GuangYu.webp


BIN
src/assets/image/HePinJinYing.webp


BIN
src/assets/image/HongLouMeng.webp


BIN
src/assets/image/HuaXue.png


BIN
src/assets/image/HuoYingRenZhe.jpg


BIN
src/assets/image/JiPinFeiChe.jpg


BIN
src/assets/image/JianAn.webp


BIN
src/assets/image/JinChuanChuan.jpg


BIN
src/assets/image/JueQuLing.png


BIN
src/assets/image/LanQu.png


BIN
src/assets/image/MiNiShiJie.png


BIN
src/assets/image/MingZhenTang.jpg


BIN
src/assets/image/MoReBengTa.png


BIN
src/assets/image/PangYan.png


BIN
src/assets/image/QiXin.jpg


BIN
src/assets/image/RuBinSui.webp


BIN
src/assets/image/SanShiLiuJi.webp


BIN
src/assets/image/ShenTouNaiBa.png


BIN
src/assets/image/ShiJin.webp


BIN
src/assets/image/ShuiHuZhuan.webp


BIN
src/assets/image/SuiZiBinFu.webp


BIN
src/assets/image/TanRenJieTanAn.jpg


BIN
src/assets/image/The Shawshank Redemption.jpg


BIN
src/assets/image/TuBuLuXin.jpg


BIN
src/assets/image/WangZhiRongYao.webp


BIN
src/assets/image/WoDeShiJie.webp


BIN
src/assets/image/WuDuGuEr.webp


BIN
src/assets/image/XiYouJi.webp


BIN
src/assets/image/XingQuTieDao.jpg


BIN
src/assets/image/YeCang.jpg


BIN
src/assets/image/YuMaoQu.png


BIN
src/assets/image/YuanShen.png


BIN
src/assets/image/YuanZu.png


BIN
src/assets/image/ZhaoHuaXiShi.webp


BIN
src/assets/image/ZhiWuDaZhanJiangShi.jpg


BIN
src/assets/image/ZhouChuChuSanHai.webp


BIN
src/assets/image/ZhouYi.webp


BIN
src/assets/image/ZhuLouJiShiJi.jpg


BIN
src/assets/image/ZuQu.jpg


BIN
src/assets/image/spiderman.png


+ 3 - 1
src/environments/environment.ts

@@ -3,7 +3,9 @@
 // The list of file replacements can be found in `angular.json`.
 
 export const environment = {
-  production: false
+  production: false,
+  // parseAppId: "Film",
+  // parseServerUrl: 'http://web2023.fmode.cn:9999/parse'
 };
 
 /*

+ 10 - 1
src/main.ts

@@ -1,6 +1,15 @@
 import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
-
+import { environment } from './environments/environment';
+import Parse from "parse";
 import { AppModule } from './app/app.module';
+import { enableProdMode } from '@angular/core';
+
+if (environment.production) {
+  enableProdMode();
+}
 
 platformBrowserDynamic().bootstrapModule(AppModule)
   .catch(err => console.log(err));
+
+  // Parse.initialize(environment.parseAppId);
+  // Parse.serverURL = environment.parseServerUrl;  

+ 17 - 0
src/modules/album/album-routing.module.ts

@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { AlbumPage } from './album.page';
+
+const routes: Routes = [
+  {
+    path: '',
+    component: AlbumPage
+  }
+];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule],
+})
+export class AlbumPageRoutingModule {}

+ 20 - 0
src/modules/album/album.module.ts

@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { AlbumPageRoutingModule } from './album-routing.module';
+
+import { AlbumPage } from './album.page';
+
+@NgModule({
+  imports: [
+    CommonModule,
+    FormsModule,
+    IonicModule,
+    AlbumPageRoutingModule
+  ],
+  declarations: [AlbumPage]
+})
+export class AlbumPageModule {}

+ 17 - 0
src/modules/album/album.page.html

@@ -0,0 +1,17 @@
+<ion-header>
+  <ion-toolbar color="primary">
+    <ion-title>我的相册</ion-title>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content>
+  <ion-grid>
+    <ion-row>
+      <ion-col size="6" *ngFor="let photo of albumPhotos">
+        <ion-img [src]="photo.imageUrl"></ion-img>
+      </ion-col>
+    </ion-row>
+  </ion-grid>
+
+  <ion-button expand="block" (click)="addPhoto()">添加图片</ion-button>
+</ion-content>

+ 0 - 0
src/modules/album/album.page.scss


+ 17 - 0
src/modules/album/album.page.spec.ts

@@ -0,0 +1,17 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { AlbumPage } from './album.page';
+
+describe('AlbumPage', () => {
+  let component: AlbumPage;
+  let fixture: ComponentFixture<AlbumPage>;
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(AlbumPage);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 22 - 0
src/modules/album/album.page.ts

@@ -0,0 +1,22 @@
+import { Component } from '@angular/core';
+import { AlbumService } from '../album/album.service'; // 替换为实际的路径
+
+@Component({
+  selector: 'app-album',
+  templateUrl: 'album.page.html',
+  styleUrls: ['album.page.scss'],
+})
+export class AlbumPage {
+  constructor(private albumService: AlbumService) {}
+
+  get albumPhotos() {
+    return this.albumService.getAlbumPhotos();
+  }
+
+  addPhoto() {
+    const newPhoto = {
+      imageUrl: 'assets/image/tx1.jpg'
+    };
+    this.albumService.addPhoto(newPhoto);
+  }
+}

+ 36 - 0
src/modules/album/album.service.ts

@@ -0,0 +1,36 @@
+import { Injectable } from '@angular/core';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class AlbumService {
+  private albumPhotos = [
+    {
+      imageUrl: 'assets/image/dt1.jpg'
+    },
+    {
+      imageUrl: 'assets/image/dt5.jpg'
+    },
+    {
+      imageUrl: 'assets/image/dt3.jpg'
+    },
+    {
+        imageUrl: 'assets/image/dt4.jpg'
+      },
+      {
+        imageUrl: 'assets/image/dt2.jpg'
+      }
+  ];
+
+  constructor() {}
+
+  getAlbumPhotos() {
+    return this.albumPhotos;
+  }
+
+  addPhoto(newPhoto: { imageUrl: string; }) {
+    const randomIndex = Math.floor(Math.random() * this.albumPhotos.length); // 随机选择一个索引
+    const randomPhoto = this.albumPhotos[randomIndex];
+    this.albumPhotos.push(randomPhoto); // 将随机选择的图片添加到相册中
+  }
+}

+ 32 - 0
src/modules/coms/edit-ratio-star/README.md

@@ -0,0 +1,32 @@
+# 组件:星星打分组件
+
+# 组件结构描述
+- 基本功能:用户可以引入该组件,绑定在number类型的属性上,实现用户选择星星,就能返回对应星级的数字.
+- 页面模板
+    - 横向的多颗行星列表
+        - 根据starCheckList进行循环,显示满星和空星
+    - 星星用ion-icon字体图标表示
+- 常量属性
+    - starCheckList:Array<boolean> 星星选择的数组
+        - [true,true,false,false,falce] 表示两颗满星 三颗空星
+- 输入属性
+    - value:number 默认 0
+    - maxValue:number default 5 默认5颗星
+- 输出事件
+    - onValueChange 事件 返回number类型 组件内选择的星星分数
+- 逻辑函数
+    - 初始化函数
+        - 根据value和maxValue的值,分别计算空星星数量和满星星数量,生成starCheckList
+    - 星星选择函数
+        - 根据星星所在位置,给value分数赋值,并且重新生成星星数组.
+        - 将value的值通过onValueChange事件进行发送
+
+# 组件开发:人工实现
+``` bash
+ionic g component edit-ratio-star --standalone
+```
+
+# 思考题目
+- 问题1:如何实现当满星被再次点击时候,分值设置为0?
+- 问题2:如何实现不用星星做标识,换成笑脸?
+- 问题3:如何实现图标颜色的用户自定义?

+ 3 - 0
src/modules/coms/edit-ratio-star/edit-ratio-star.component.html

@@ -0,0 +1,3 @@
+<div class="list">
+  <ion-icon [style.color]="color" (click)="onStarClick(index)" [name]="checked?fillIcon:emptyIcon" *ngFor="let checked of starCheckList;let index=index;"></ion-icon>
+</div>

+ 0 - 0
src/modules/coms/edit-ratio-star/edit-ratio-star.component.scss


+ 22 - 0
src/modules/coms/edit-ratio-star/edit-ratio-star.component.spec.ts

@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+
+import { EditRatioStarComponent } from './edit-ratio-star.component';
+
+describe('EditRatioStarComponent', () => {
+  let component: EditRatioStarComponent;
+  let fixture: ComponentFixture<EditRatioStarComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      imports: [EditRatioStarComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(EditRatioStarComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  }));
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 61 - 0
src/modules/coms/edit-ratio-star/edit-ratio-star.component.ts

@@ -0,0 +1,61 @@
+import { NgForOf } from '@angular/common';
+import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
+import { IonIcon } from '@ionic/angular/standalone';
+
+@Component({
+  selector: 'app-edit-ratio-star',
+  templateUrl: './edit-ratio-star.component.html',
+  styleUrls: ['./edit-ratio-star.component.scss'],
+  standalone: true,
+  imports:[
+    IonIcon,NgForOf
+  ]
+})
+export class EditRatioStarComponent  implements OnInit {
+
+  @Input()
+  fillIcon:string = "star"
+  @Input()
+  emptyIcon:string = "star-outline"
+  @Input()
+  color:string = "#FFD700"
+
+  @Input()
+  value:number = 2;
+  @Output()
+  onValueChange:EventEmitter<number> = new EventEmitter<number>
+
+  maxValue:number = 10;
+  starCheckList:Array<boolean> = []
+  constructor() {
+   }
+
+  ngOnInit() {
+    this.makeStarList()
+  }
+
+  onStarClick(index:number){
+    let score = index + 1
+
+    if(score==this.value){ // 点原星星,设置0分
+      this.value = 0
+    }else{ // 根据星星位置,设置分数
+      this.value = score;
+    }
+
+    this.makeStarList();
+    this.onValueChange.emit(this.value)
+  }
+  makeStarList(){
+    let starList = []
+    for (let index = 0; index < this.value; index++) {
+      starList.push(true)
+    }
+    let leftCount = this.maxValue - this.value
+    for (let index = 0; index < leftCount; index++) {
+      starList.push(false)
+    }
+    this.starCheckList = starList
+  }
+
+}

+ 17 - 0
src/modules/dongt/dongt-routing.module.ts

@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { DongtPage } from './dongt.page';
+
+const routes: Routes = [
+  {
+    path: '',
+    component: DongtPage
+  }
+];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule],
+})
+export class DongtPageRoutingModule {}

+ 20 - 0
src/modules/dongt/dongt.module.ts

@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { DongtPageRoutingModule } from './dongt-routing.module';
+
+import { DongtPage } from './dongt.page';
+
+@NgModule({
+  imports: [
+    CommonModule,
+    FormsModule,
+    IonicModule,
+    DongtPageRoutingModule
+  ],
+  declarations: [DongtPage]
+})
+export class DongtPageModule {}

+ 74 - 0
src/modules/dongt/dongt.page.html

@@ -0,0 +1,74 @@
+
+<ion-header [translucent]="true">
+  <ion-toolbar color="primary">
+    <ion-buttons slot="start">
+      <ion-back-button defaultHref="/"></ion-back-button> <!-- 返回上一级按钮 -->
+    </ion-buttons>
+    <ion-title>动态</ion-title>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content>
+  <ion-card>
+    <ion-card-content>
+      <!-- 示例数据:用户1分享的内容 -->
+      <ion-item>
+        <ion-avatar slot="start">
+          <ion-img src="assets/image/tx2.jpg" style="position: absolute; width: 50px; height: 50px; margin-top: -145px; margin-left: -3px;"></ion-img>
+        </ion-avatar>
+        <ion-label>
+          <ion-input value="啦啦啦"></ion-input> <!-- 将标题文本设为可编辑 -->
+          <ion-input value="山海自有归期 风雨自有相逢 "></ion-input> <!-- 将描述文本设为可编辑 -->
+          <div style="display: flex;">
+            <ion-img src="assets/image/dt1.jpg" style="max-width: 50%;"></ion-img> <!-- 第一张图片 -->
+            <ion-img src="assets/image/dt6.jpg" style="max-width: 50%;"></ion-img> <!-- 第二张图片 -->
+          </div>
+          <ion-item>
+            <ion-icon name="heart" slot="start" color="danger" style="position: absolute; left: 10px;"></ion-icon> <!-- 将heart图标设为红色 -->
+            <ion-icon name="chatbox-ellipses-outline" slot="start" style="position: absolute; left: 125px;"></ion-icon>
+            <ion-icon name="open-outline" slot="start" style="position: absolute; left: 240px;"></ion-icon>
+          </ion-item>
+        </ion-label>
+      </ion-item>
+      <ion-item>
+        <ion-avatar slot="start">
+          <ion-img src="assets/image/tx2.jpg" style="position: absolute; width: 50px; height: 50px; margin-top: -145px; margin-left: -3px;"></ion-img>
+        </ion-avatar>
+        <ion-label>
+          <ion-input value="啦啦啦"></ion-input> <!-- 将标题文本设为可编辑 -->
+          <ion-input value="Try everything. I just won't give up"></ion-input> <!-- 将描述文本设为可编辑 -->
+          <div style="display: flex;">
+            <ion-img src="assets/image/dt4.jpg" style="max-width: 50%;"></ion-img> <!-- 第一张图片 -->
+            <ion-img src="assets/image/dt3.jpg" style="max-width: 50%;"></ion-img> <!-- 第二张图片 -->
+          </div>
+          <ion-item>
+            <ion-icon name="heart" slot="start" color="danger" style="position: absolute; left: 10px;"></ion-icon> <!-- 将heart图标设为红色 -->
+            <ion-icon name="chatbox-ellipses-outline" slot="start" style="position: absolute; left: 125px;"></ion-icon>
+            <ion-icon name="open-outline" slot="start" style="position: absolute; left: 240px;"></ion-icon>
+          </ion-item>
+        </ion-label>
+      </ion-item>
+      <ion-item>
+        <ion-avatar slot="start">
+          <ion-img src="assets/image/tx2.jpg" style="position: absolute; width: 50px; height: 50px; margin-top: -145px; margin-left: -3px;"></ion-img>
+        </ion-avatar>
+        <ion-label>
+          <ion-input value="啦啦啦"></ion-input> <!-- 将标题文本设为可编辑 -->
+          <ion-input value="Try everything. I just won't give up"></ion-input> <!-- 将描述文本设为可编辑 -->
+          <div style="display: flex;">
+            <ion-img src="assets/image/dt2.jpg" style="max-width: 50%;"></ion-img> <!-- 第一张图片 -->
+            <ion-img src="assets/image/dt5.jpg" style="max-width: 50%;"></ion-img> <!-- 第二张图片 -->
+          </div>
+          <ion-item>
+            <ion-icon name="heart" slot="start" color="danger" style="position: absolute; left: 10px;"></ion-icon> <!-- 将heart图标设为红色 -->
+            <ion-icon name="chatbox-ellipses-outline" slot="start" style="position: absolute; left: 125px;"></ion-icon>
+            <ion-icon name="open-outline" slot="start" style="position: absolute; left: 240px;"></ion-icon>
+          </ion-item>
+        </ion-label>
+      </ion-item>
+      <!-- 其他用户分享的内容 -->
+    </ion-card-content>
+  </ion-card>
+</ion-content>
+
+

+ 0 - 0
src/modules/dongt/dongt.page.scss


+ 17 - 0
src/modules/dongt/dongt.page.spec.ts

@@ -0,0 +1,17 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { DongtPage } from './dongt.page';
+
+describe('ZhuyePage', () => {
+  let component: DongtPage;
+  let fixture: ComponentFixture<DongtPage>;
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(DongtPage);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 26 - 0
src/modules/dongt/dongt.page.ts

@@ -0,0 +1,26 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-dongt',
+  templateUrl: './dongt.page.html',
+  styleUrls: ['./dongt.page.scss'],
+})
+export class DongtPage {
+
+  constructor() {
+   
+  }
+
+  // 由于Parse.User.current()是随着localStorage变化的属性
+  // 为了避免首次复制后用户状态变化,页面不同步,通过get方法实现实时获取
+  user:Parse.User|undefined
+  async ngOnInit() {
+      this.user = await Parse.User.current()
+      setInterval(async ()=>{
+      this.user = await Parse.User.current()
+    },1000)
+  }
+  logout(){
+    Parse.User.logOut();
+  }
+}

+ 17 - 0
src/modules/favorites/favorites-routing.module.ts

@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { FavoritesPage } from './favorites.page';
+
+const routes: Routes = [
+  {
+    path: '',
+    component: FavoritesPage
+  }
+];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule],
+})
+export class FavoritesPageRoutingModule {}

+ 20 - 0
src/modules/favorites/favorites.module.ts

@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { FavoritesPageRoutingModule } from './favorites-routing.module';
+
+import { FavoritesPage } from './favorites.page';
+
+@NgModule({
+  imports: [
+    CommonModule,
+    FormsModule,
+    IonicModule,
+    FavoritesPageRoutingModule
+  ],
+  declarations: [FavoritesPage]
+})
+export class FavoritesPageModule {}

+ 23 - 0
src/modules/favorites/favorites.page.html

@@ -0,0 +1,23 @@
+<ion-header>
+  <ion-toolbar color="primary">
+    <ion-buttons slot="start">
+      <ion-back-button defaultHref="/"></ion-back-button>
+    </ion-buttons>
+    <ion-title>我的收藏</ion-title>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content>
+  <ion-list>
+    <ion-item *ngFor="let item of favoriteItems">
+      <ion-thumbnail slot="start">
+        <ion-img [src]="item.imageUrl"></ion-img>
+      </ion-thumbnail>
+      <ion-label>
+        <h2>{{item.title}}</h2>
+        <p>{{item.description}}</p>
+      </ion-label>
+      <ion-button slot="end" (click)="removeFromFavorites(item)">移除</ion-button>
+    </ion-item>
+  </ion-list>
+</ion-content>

+ 0 - 0
src/modules/favorites/favorites.page.scss


+ 17 - 0
src/modules/favorites/favorites.page.spec.ts

@@ -0,0 +1,17 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { FavoritesPage } from './favorites.page';
+
+describe('FavoritesPage', () => {
+  let component: FavoritesPage;
+  let fixture: ComponentFixture<FavoritesPage>;
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(FavoritesPage);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 28 - 0
src/modules/favorites/favorites.page.ts

@@ -0,0 +1,28 @@
+import { Component } from '@angular/core';
+import { FavoritesService } from '../favorites/favorites.service'; // 替换为实际的路径
+
+@Component({
+  selector: 'app-favorites',
+  templateUrl: 'favorites.page.html',
+  styleUrls: ['favorites.page.scss'],
+})
+export class FavoritesPage {
+  constructor(private favoritesService: FavoritesService) {}
+
+  get favoriteItems() {
+    return this.favoritesService.getFavoriteItems();
+  }
+
+  removeFromFavorites(item: { title: string; description: string; imageUrl: string; }) {
+    this.favoritesService.removeFromFavorites(item);
+  }
+
+  addToFavorites() {
+    const newItem = {
+      title: '新商品',
+      description: '这是新商品的描述',
+      imageUrl: 'assets/images/new-product.jpg'
+    };
+    this.favoritesService.addToFavorites(newItem);
+  }
+}

Неке датотеке нису приказане због велике количине промена