2
0

177 コミット 056c37171b ... 6c1422d93a

作者 SHA1 メッセージ 日付
  hid_msrpuwgj56ccf29 6c1422d93a Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 f5a73958b5 a 5 ヶ月 前
  flowaaa db85ad71c3 c 5 ヶ月 前
  flowaaa f6c9d85ab9 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa 5a36f8d1b0 c 5 ヶ月 前
  hid_msrpuwgj56ccf29 87e854ebd0 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 1ca7e82dd0 a 5 ヶ月 前
  flowaaa 0de637390d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa 5a4f816a79 c 5 ヶ月 前
  hid_msrpuwgj56ccf29 94a7855954 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 65f2f875ac a 5 ヶ月 前
  flowaaa e7bab25fa8 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa bcbfedc064 con 5 ヶ月 前
  hid_msrpuwgj56ccf29 ce1ab14df7 a 5 ヶ月 前
  hid_msrpuwgj56ccf29 4e9d74f219 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 a241e70128 a 5 ヶ月 前
  flowaaa 47b037c8fd Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa 696205ede2 c 5 ヶ月 前
  hid_msrpuwgj56ccf29 45902db574 a 5 ヶ月 前
  hid_msrpuwgj56ccf29 e65a95fc43 a 5 ヶ月 前
  hid_msrpuwgj56ccf29 0b1cc5deb2 1 5 ヶ月 前
  hid_msrpuwgj56ccf29 7096d47098 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 e47b91b366 1 5 ヶ月 前
  flowaaa 145184d8b5 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa 2051a3331a c 5 ヶ月 前
  hid_msrpuwgj56ccf29 334a6b44ab 1 5 ヶ月 前
  hid_msrpuwgj56ccf29 15dbe88452 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 328da53e66 aa 5 ヶ月 前
  flowaaa e884a45950 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa 947b41525b c 5 ヶ月 前
  hid_msrpuwgj56ccf29 a20467201d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 54a7c11926 a 5 ヶ月 前
  flowaaa 6dd7c40e7e Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa 9e80c2daac c 5 ヶ月 前
  hid_msrpuwgj56ccf29 ecb00c747d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 fe46c6b820 a 5 ヶ月 前
  flowaaa 55d05a401d c 5 ヶ月 前
  flowaaa 863f529e90 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa df4607e1d4 con 5 ヶ月 前
  hid_msrpuwgj56ccf29 fc67e174bf a 5 ヶ月 前
  hid_msrpuwgj56ccf29 5fd7c51aca a 5 ヶ月 前
  hid_msrpuwgj56ccf29 03602dd170 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 df91acec5a a 5 ヶ月 前
  flowaaa 143ed6c19b con 5 ヶ月 前
  flowaaa a10133b318 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa 0dff2857e9 c 5 ヶ月 前
  hid_msrpuwgj56ccf29 994450f449 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 858a1be5b2 a 5 ヶ月 前
  flowaaa 35d75cc753 con 5 ヶ月 前
  flowaaa d37d1a4108 con 5 ヶ月 前
  hid_msrpuwgj56ccf29 690765dbaa a 5 ヶ月 前
  flowaaa 3080ada1e9 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa 4ebe15853a con 5 ヶ月 前
  hid_msrpuwgj56ccf29 b045810322 a 5 ヶ月 前
  hid_msrpuwgj56ccf29 64a68c9dcb Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 5c351d653b a 5 ヶ月 前
  flowaaa 8be2c550d7 con 5 ヶ月 前
  flowaaa 276be6d7ac Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa f1123978c4 con 5 ヶ月 前
  hid_msrpuwgj56ccf29 0c7a4e85d2 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 988f23fe23 ycc 5 ヶ月 前
  flowaaa 750362087f Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa d7e17e573c con 5 ヶ月 前
  hid_msrpuwgj56ccf29 7e1b3e6d94 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 eb4b1bb5b2 a 5 ヶ月 前
  flowaaa 0208543433 feat 5 ヶ月 前
  flowaaa 225eeee08b Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  flowaaa f28e7b13d9 a 5 ヶ月 前
  hid_msrpuwgj56ccf29 c25bf0e825 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 5 ヶ月 前
  hid_msrpuwgj56ccf29 b848ba27d3 me 5 ヶ月 前
  flowaaa a118f4c86e show 5 ヶ月 前
  flowaaa e7cc63a600 con 5 ヶ月 前
  flowaaa 01a99a5461 feat 5 ヶ月 前
  flowaaa 056c37171b Contact 5 ヶ月 前
  flowaaa 2dc046657e Merge branch 'master' of http://git.fmode.cn:3000/ai/app-gift 5 ヶ月 前
  flowaaa 675da3df9d register 5 ヶ月 前
  flowaaa dda6eecea1 提交说明 5 ヶ月 前
  flowaaa 2d88f03908 feat 6 ヶ月 前
  flowaaa 76dca94ad0 feat 11 ヶ月 前
  flowaaa f83f97fb75 feat 11 ヶ月 前
  flowaaa 9eb33e3198 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa 02206678ae app 11 ヶ月 前
  hid_msrpuwgj56ccf29 a9383c1561 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 25e7332823 update 11 ヶ月 前
  flowaaa 682c0c8e9d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa dd44ab8f1a feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 a0ba97c6a0 update 11 ヶ月 前
  hid_msrpuwgj56ccf29 2f153f7699 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 dff1317fe6 update 11 ヶ月 前
  flowaaa 7b5fd226c7 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa 901fd0a411 feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 96a090ff58 update 11 ヶ月 前
  hid_msrpuwgj56ccf29 877004396f Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 abeb7a1a7e update 11 ヶ月 前
  flowaaa 449d07383f feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 df741ebe90 update 11 ヶ月 前
  hid_msrpuwgj56ccf29 ff4512ed9c Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 0b742fecb7 update 11 ヶ月 前
  flowaaa fcdf5f5f99 feat 11 ヶ月 前
  flowaaa 7c20dddb8a feat 11 ヶ月 前
  flowaaa eeff1942f3 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa a09a96205c feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 4382cf2416 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 aecdb9e93c update 11 ヶ月 前
  flowaaa d6c6ff577c feat 11 ヶ月 前
  flowaaa cd12680487 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa b8b4c597de feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 fae480be64 update 11 ヶ月 前
  hid_msrpuwgj56ccf29 72cdf8b78f update 11 ヶ月 前
  hid_msrpuwgj56ccf29 a94edcfec3 update 11 ヶ月 前
  hid_msrpuwgj56ccf29 2331528520 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 9a571bdf64 update 11 ヶ月 前
  flowaaa 71ece09b74 feat 11 ヶ月 前
  flowaaa 3394bd9dd4 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa 60fc632304 feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 b521d61113 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 3496c5d92d update 11 ヶ月 前
  flowaaa 82241d0d78 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa 5de6552f94 feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 4d653a6a36 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 d143211250 update 11 ヶ月 前
  flowaaa af36a950f7 feat 11 ヶ月 前
  flowaaa cce375e49f Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa 7adcd7d61b feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 6c30521c84 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 4fc6fd1484 update 11 ヶ月 前
  flowaaa 953b983aad Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa 84c802bae2 feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 b1f4fc3f89 update 11 ヶ月 前
  flowaaa 9cc0af366f feat 11 ヶ月 前
  flowaaa f8be0582f3 feat 11 ヶ月 前
  flowaaa 8bba03f3ab feat 11 ヶ月 前
  flowaaa 488f908a4f feat 11 ヶ月 前
  flowaaa d11e1b6f8a feat 11 ヶ月 前
  flowaaa ac6c5c3dc1 feat 11 ヶ月 前
  flowaaa d270e79b9b feat 11 ヶ月 前
  flowaaa 642699dc17 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa 68f56e6602 feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 be643299f5 update 11 ヶ月 前
  flowaaa a6706a6aa0 feat 11 ヶ月 前
  flowaaa 7362816694 feat 11 ヶ月 前
  flowaaa 06a0c86565 feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 61390a1d2b Merge commit '2e376fb' 11 ヶ月 前
  hid_msrpuwgj56ccf29 2e376fb53a update 11 ヶ月 前
  hid_msrpuwgj56ccf29 011c52f660 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 3bbe120c96 update 11 ヶ月 前
  flowaaa 26930a24c9 feat 11 ヶ月 前
  flowaaa 837ffbf902 feat 11 ヶ月 前
  flowaaa 7044c486b7 feat 11 ヶ月 前
  hid_msrpuwgj56ccf29 75e7c25539 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 d5defe9cfe update 11 ヶ月 前
  flowaaa 9760ab457d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  flowaaa fe03d2dde3 update 11 ヶ月 前
  hid_msrpuwgj56ccf29 8055be6d18 update 11 ヶ月 前
  hid_msrpuwgj56ccf29 1380a8d256 updata 11 ヶ月 前
  hid_msrpuwgj56ccf29 235db06ecd update 11 ヶ月 前
  hid_msrpuwgj56ccf29 8d34a1ec24 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 11 ヶ月 前
  hid_msrpuwgj56ccf29 8527c32b9a update 11 ヶ月 前
  flowaaa 2885f1a158 update 11 ヶ月 前
  flowaaa 6d1b999e6f update 11 ヶ月 前
  hid_msrpuwgj56ccf29 fbd3b90c40 update 11 ヶ月 前
  hid_msrpuwgj56ccf29 7914fafb9f update 1 年間 前
  hid_msrpuwgj56ccf29 69b107624e update 1 年間 前
  hid_msrpuwgj56ccf29 9a5d15e989 update 1 年間 前
  hid_msrpuwgj56ccf29 23bacad75b update 1 年間 前
  hid_msrpuwgj56ccf29 ddfe3fe9f6 update 1 年間 前
  hid_msrpuwgj56ccf29 8f5acf1152 update 1 年間 前
  hid_msrpuwgj56ccf29 d6589823a7 update 1 年間 前
  hid_msrpuwgj56ccf29 3b73d5aa9b update 1 年間 前
  hid_msrpuwgj56ccf29 b9178033f9 update 1 年間 前
  hid_msrpuwgj56ccf29 11f031d23a update 1 年間 前
  hid_msrpuwgj56ccf29 b27f54179e update 1 年間 前
  hid_msrpuwgj56ccf29 749a3e57da update 1 年間 前
  hid_msrpuwgj56ccf29 e1e80eaac7 update 1 年間 前
  hid_msrpuwgj56ccf29 9b7a2548c8 update 1 年間 前
  hid_msrpuwgj56ccf29 378ab80061 update 1 年間 前
  hid_msrpuwgj56ccf29 5c703d3484 web3-0210402 1 年間 前
100 ファイル変更1237 行追加1476 行削除
  1. 0 1
      0210409
  2. 51 95
      README.md
  3. 0 16
      app-angular/.browserslistrc
  4. 0 46
      app-angular/.eslintrc.json
  5. 4 27
      app-angular/.gitignore
  6. 2 3
      app-angular/.vscode/extensions.json
  7. 20 0
      app-angular/.vscode/launch.json
  8. 0 3
      app-angular/.vscode/settings.json
  9. 42 0
      app-angular/.vscode/tasks.json
  10. 27 0
      app-angular/README.md
  11. 17 0
      app-angular/android/variables.gradle
  12. 120 52
      app-angular/angular.json
  13. 8 4
      app-angular/capacitor.config.ts
  14. 2 4
      app-angular/ionic.config.json
  15. 0 44
      app-angular/karma.conf.js
  16. 253 472
      app-angular/package-lock.json
  17. 30 47
      app-angular/package.json
  18. 14 0
      app-angular/resources/xml/network_security_config.xml
  19. 15 7
      app-angular/src/app/app-routing.module.ts
  20. 27 3
      app-angular/src/app/app.component.html
  21. 8 0
      app-angular/src/app/app.component.scss
  22. 17 9
      app-angular/src/app/app.component.spec.ts
  23. 3 9
      app-angular/src/app/app.component.ts
  24. 19 8
      app-angular/src/app/app.module.ts
  25. 0 27
      app-angular/src/app/explore-container/explore-container.component.scss
  26. 0 14
      app-angular/src/app/explore-container/explore-container.module.ts
  27. 0 16
      app-angular/src/app/tab1/tab1-routing.module.ts
  28. 0 20
      app-angular/src/app/tab1/tab1.module.ts
  29. 0 19
      app-angular/src/app/tab1/tab1.page.html
  30. 0 4
      app-angular/src/app/tab1/tab1.page.scss
  31. 0 26
      app-angular/src/app/tab1/tab1.page.spec.ts
  32. 0 19
      app-angular/src/app/tab1/tab1.page.ts
  33. 0 16
      app-angular/src/app/tab2/tab2-routing.module.ts
  34. 0 20
      app-angular/src/app/tab2/tab2.module.ts
  35. 0 17
      app-angular/src/app/tab2/tab2.page.html
  36. 0 26
      app-angular/src/app/tab2/tab2.page.spec.ts
  37. 0 12
      app-angular/src/app/tab2/tab2.page.ts
  38. 0 16
      app-angular/src/app/tab3/tab3-routing.module.ts
  39. 0 20
      app-angular/src/app/tab3/tab3.module.ts
  40. 0 17
      app-angular/src/app/tab3/tab3.page.html
  41. 0 0
      app-angular/src/app/tab3/tab3.page.scss
  42. 0 26
      app-angular/src/app/tab3/tab3.page.spec.ts
  43. 0 12
      app-angular/src/app/tab3/tab3.page.ts
  44. 0 39
      app-angular/src/app/tabs/tabs-routing.module.ts
  45. 0 19
      app-angular/src/app/tabs/tabs.module.ts
  46. 0 20
      app-angular/src/app/tabs/tabs.page.html
  47. 0 1
      app-angular/src/app/tabs/tabs.page.scss
  48. 0 26
      app-angular/src/app/tabs/tabs.page.spec.ts
  49. 0 12
      app-angular/src/app/tabs/tabs.page.ts
  50. 0 0
      app-angular/src/assets/.gitkeep
  51. BIN
      app-angular/src/assets/1.jpg
  52. BIN
      app-angular/src/assets/10.jpg
  53. BIN
      app-angular/src/assets/11.jpg
  54. BIN
      app-angular/src/assets/12.jpg
  55. BIN
      app-angular/src/assets/13.jpg
  56. BIN
      app-angular/src/assets/14.jpg
  57. BIN
      app-angular/src/assets/16.jpg
  58. BIN
      app-angular/src/assets/18.jpg
  59. BIN
      app-angular/src/assets/19.png
  60. BIN
      app-angular/src/assets/2.jpg
  61. BIN
      app-angular/src/assets/20.jpg
  62. BIN
      app-angular/src/assets/3.jpg
  63. BIN
      app-angular/src/assets/4.jpg
  64. BIN
      app-angular/src/assets/5.jpg
  65. BIN
      app-angular/src/assets/6.jpg
  66. BIN
      app-angular/src/assets/7.jpg
  67. BIN
      app-angular/src/assets/8.jpeg
  68. BIN
      app-angular/src/assets/9.jpg
  69. BIN
      app-angular/src/assets/e4656e49ad3321054e63d58809ad93dc.jpg
  70. BIN
      app-angular/src/assets/enfp.jpg
  71. BIN
      app-angular/src/assets/gxitu.png
  72. BIN
      app-angular/src/assets/icon/favicon.png
  73. BIN
      app-angular/src/assets/jl.png
  74. 0 1
      app-angular/src/assets/shapes.svg
  75. 0 3
      app-angular/src/environments/environment.prod.ts
  76. 0 16
      app-angular/src/environments/environment.ts
  77. BIN
      app-angular/src/favicon.ico
  78. 0 37
      app-angular/src/global.scss
  79. 6 19
      app-angular/src/index.html
  80. 1 6
      app-angular/src/main.ts
  81. 0 17
      app-angular/src/modules/contact/contact-detail/contact-detail-routing.module.ts
  82. 0 20
      app-angular/src/modules/contact/contact-detail/contact-detail.module.ts
  83. 0 0
      app-angular/src/modules/contact/contact-detail/contact-detail.page.scss
  84. 0 17
      app-angular/src/modules/contact/contact-list/contact-list-routing.module.ts
  85. 0 20
      app-angular/src/modules/contact/contact-list/contact-list.module.ts
  86. 0 0
      app-angular/src/modules/contact/contact-list/contact-list.page.scss
  87. 0 12
      app-angular/src/modules/contact/contact-routing.module.ts
  88. 0 14
      app-angular/src/modules/contact/contact.module.ts
  89. 78 0
      app-angular/src/modules/lesson/attention-detail/attention-detail.component.html
  90. 19 0
      app-angular/src/modules/lesson/attention-detail/attention-detail.component.scss
  91. 21 0
      app-angular/src/modules/lesson/attention-detail/attention-detail.component.spec.ts
  92. 42 0
      app-angular/src/modules/lesson/attention-detail/attention-detail.component.ts
  93. 100 0
      app-angular/src/modules/lesson/class-chat-completion.ts
  94. 21 0
      app-angular/src/modules/lesson/community/community-routing.module.ts
  95. 99 0
      app-angular/src/modules/lesson/community/community.component.html
  96. 43 0
      app-angular/src/modules/lesson/community/community.component.scss
  97. 21 0
      app-angular/src/modules/lesson/community/community.component.spec.ts
  98. 84 0
      app-angular/src/modules/lesson/community/community.component.ts
  99. 23 0
      app-angular/src/modules/lesson/community/community.module.ts
  100. 0 0
      app-angular/src/modules/lesson/contact-detail/contact-detail.component.html

+ 0 - 1
0210409

@@ -1 +0,0 @@
-Subproject commit 2d88f03908524af86d2c5d740fed96c38331fc30

+ 51 - 95
README.md

@@ -1,95 +1,51 @@
-0210409刘影影-人情智谋
-====
-> 想法:人情世故APP,帮助用户学习送礼知识;聚餐礼仪;职场技巧;提升社交能力。
-
-# 项目简介
-- 项目名称:AI智谋
-- 一句话:利用AGI助手帮助初入职场、性格内向的用户学习送礼知识、聚餐礼仪,提升社交能力和职场技巧。
-- 简介:人情智谋助手是一款通过AGI助手提供服务的APP,旨在帮助初入职场、性格内向的用户改善社交能力、提高沟通技巧,让他们更好地融入团队,学习送礼知识和聚餐礼仪。
-- 主要服务用户
-    - 关键画像:
-        - 初入职场
-        - 涉世未深
-        - 性格内向
-- 主要解决问题
-    - 改善社交能力
-    - 提高沟通技巧
-    - 帮助初入职场的新人熟悉团队写作
-
-# 背景分析
-## 政策背景
-
-
-心理健康政策:鼓励帮助有心理问题社交能力有限的青少年,提供社交基本交涉能力的提示与训练。
-- 江西省残联联合省发改委、省教育厅等10个厅局印发《关于加强孤独症儿童关爱服务工作的通知》
-- 《江苏省残疾预防行动计划(2021—2025年)》
-
-社会教育政策:政府鼓励和支持社会教育项目,提倡培养社会技能和人际交往能力,你的APP可以与这一政策相契合。
-
-职业培训政策:政府可能会推出一些职业培训补贴或支持计划,你的APP可以作为职业培训的一部分,帮助初入职场的新人提升必要的社交技能。
-
-创业支持政策:如果你打算将这款APP作为一个创业项目推出,可以关注政府是否有相关的创业支持政策,例如创业补贴、孵化器支持等。
-
-社交文化政策:政府可能会倡导积极的社交文化,鼓励人们提升社交技能,你的APP可以与这一政策相契合,并得到相关支持。
-
-科技创新政策:政府可能会支持科技创新项目,你可以关注是否有相关的科技创新补贴或支持政策,以推动你的APP的发展和推广。
-- 《江苏省“十四五”特殊教育发展提升行动计划》探索科学适宜教育方式
-
-
-## 市场背景
-涉及行业
-- 职业发展
-- 社交礼仪
-- 人际关系
-
-![](https://pics2.baidu.com/feed/94cad1c8a786c917e39d7a52efc9acc239c757c4.jpeg@f_auto?token=a43428f03bcfc904ec71df3dfd7b002f)
-
-[2024年中国礼仪培训行业发展现状](https://baijiahao.baidu.com/s?id=1796376620635830672)
-
-[人民数据研究院发布《新青年 新机遇——新职业发展趋势白皮书》](http://finance.people.com.cn/n1/2023/0629/c1004-40024119.html)
-
-## 痛点问题
-- [中青报调查:64.2%受访青年感觉自己存在“社交卡顿”](https://www.thepaper.cn/newsDetail_forward_22960577)
-
-![](https://imagecloud.thepaper.cn/thepaper/image/250/539/627.jpg)
-
-- [“搭子社交”流行背后:群体性孤独与社交恐惧](https://www.huxiu.com/article/1969815.html)
-
-
-# 用户分析
-- 用户需求
-    - 社交经验较少,难以正常社交
-    - 人际关系单薄,缺乏锻炼机会
-    - 缺乏勇气和自信,难以主动交流
-    - 恶性循环圈子变小,需要拓展圈层
-- 核心功能
-    - 社交技巧问答
-        - 用户描述具体社交场景
-        - 给出相关交流的建议、话术
-    - 模拟交流训练
-        - 用户性格测评
-        - 匹配挑战的社交对象
-        - 开展聊天交流
-        - 分析聊天效果
-        - 给出改进建议
-    - 好友推荐、圈层社交
-
-
-# 产品结构
-
-## 功能结构
-
-## 信息结构
-
-# 效果预览
-![](/uploads/upload_d2eaff9cb6f593d88a7e2063b577d6b7.png)
-
-# 竞品分析
-## 竞品选择
-- Soul,借鉴“灵魂鉴定”心理测评相关功能
-    - Soul是一款深受年轻人喜爱的社交APP这里的人真实、温暖、有趣
-    - 摆脱了时空和距离的约束,人们通过完成30秒的 “灵魂鉴定” 找到真正的自己,并在社群中自在表达,分享有趣好玩的内容和体验,与懂自己的人即时互动、发现精彩
-- 一码千言AI平台 小言心语栏目
-    - 一码千言AI平台是利用AIGC技术为用户精心打造的工作、学习、生活一体化集成平台。围绕文案、科研、英语、心理、法律、就业等领域设计了近百种种应用工具,总有一款适合您!
-- 抖音:豆包
-- 讯飞:语伴
+# Web3练习作业
+- 作者 俞葱葱
+- 学号 0210402
+
+# 项目结构
+- docs/ 学习笔记、产品文档
+    - day1.md 第一天练习作业
+- task/ 课堂代码练习作业
+    - day1.html
+- README.md 项目说明
+
+# FAQ:常见git备注信息
+``` sh
+# 初始化项目
+git commit -m "init: xxxxx"
+# 新增特性(目录、文件等)
+git commit -m "feat: xxxxx"
+# 修复功能
+git commit -m "fix: xxxxx"
+# 更新功能
+git commit -m "update: xxxxx"
+```
+
+# FAQ:提交到远程版本分支
+``` sh
+git remote add origin https://codehub-cn-south-1.devcloud.huaweicloud.com/web300001/web3-1234567.git
+git push -u origin master
+```
+
+# FAQ:HTML静态项目预览方法
+- VSCode 左侧打开扩展,搜索:Live Server,安装
+- 右键已经打开的 xxx.html ,选择Open with Live Server
+
+# FAQ:文档基本用法
+- 预览Markdown Ctrl+Shift+V
+
+<h1>标题1</h1>
+<h2>标题2</h2>
+
+# 标题1
+## 标题2
+
+
+# FAQ:HTML网页预览插件
+- 左侧,插件,Live Server
+- 右键 .html文件,预览
+
+# FAQ.初始化项目的参考过程
+- 根目录,创建README.md
+- 创建需要的笔记目录 /docs
+- 在README.md中编写项目介绍

+ 0 - 16
app-angular/.browserslistrc

@@ -1,16 +0,0 @@
-# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
-# For additional information regarding the format and rule options, please see:
-# https://github.com/browserslist/browserslist#queries
-
-# For the full list of supported browsers by the Angular framework, please see:
-# https://angular.io/guide/browser-support
-
-# You can see what browsers were selected by your queries by running:
-#   npx browserslist
-
-Chrome >=79
-ChromeAndroid >=79
-Firefox >=70
-Edge >=79
-Safari >=14
-iOS >=14

+ 0 - 46
app-angular/.eslintrc.json

@@ -1,46 +0,0 @@
-{
-  "root": true,
-  "ignorePatterns": ["projects/**/*"],
-  "overrides": [
-    {
-      "files": ["*.ts"],
-      "parserOptions": {
-        "project": ["tsconfig.json"],
-        "createDefaultProgram": true
-      },
-      "extends": [
-        "plugin:@angular-eslint/recommended",
-        "plugin:@angular-eslint/template/process-inline-templates"
-      ],
-      "rules": {
-        "@angular-eslint/component-class-suffix": [
-          "error",
-          {
-            "suffixes": ["Page", "Component"]
-          }
-        ],
-        "@angular-eslint/component-selector": [
-          "error",
-          {
-            "type": "element",
-            "prefix": "app",
-            "style": "kebab-case"
-          }
-        ],
-        "@angular-eslint/directive-selector": [
-          "error",
-          {
-            "type": "attribute",
-            "prefix": "app",
-            "style": "camelCase"
-          }
-        ]
-      }
-    },
-    {
-      "files": ["*.html"],
-      "extends": ["plugin:@angular-eslint/template/recommended"],
-      "rules": {}
-    }
-  ]
-}

+ 4 - 27
app-angular/.gitignore

@@ -1,27 +1,9 @@
-# Specifies intentionally untracked files to ignore when using Git
-# http://git-scm.com/docs/gitignore
+# See http://help.github.com/ignore-files/ for more about ignoring files.
 
-*~
-*.sw[mnpcod]
-.tmp
-*.tmp
-*.tmp.*
-UserInterfaceState.xcuserstate
-$RECYCLE.BIN/
-
-*.log
-log.txt
-
-
-/.sourcemaps
-/.versions
-/coverage
-
-# Ionic
-/.ionic
 /www
-/platforms
-/plugins
+/android
+/www
+/androidionic cap run android --project=app-angular
 
 # Compiled output
 /dist
@@ -41,7 +23,6 @@ yarn-error.log
 .c9/
 *.launch
 .settings/
-*.sublime-project
 *.sublime-workspace
 
 # Visual Studio Code
@@ -52,13 +33,9 @@ yarn-error.log
 !.vscode/extensions.json
 .history/*
 
-
 # Miscellaneous
-/.angular
 /.angular/cache
 .sass-cache/
-/.nx
-/.nx/cache
 /connect.lock
 /coverage
 /libpeerconnection.log

+ 2 - 3
app-angular/.vscode/extensions.json

@@ -1,5 +1,4 @@
 {
-    "recommendations": [
-      "ionic.ionic"
-    ]
+  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
+  "recommendations": ["angular.ng-template"]
 }

+ 20 - 0
app-angular/.vscode/launch.json

@@ -0,0 +1,20 @@
+{
+  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+  "version": "0.2.0",
+  "configurations": [
+    {
+      "name": "ng serve",
+      "type": "chrome",
+      "request": "launch",
+      "preLaunchTask": "npm: start",
+      "url": "http://localhost:4200/"
+    },
+    {
+      "name": "ng test",
+      "type": "chrome",
+      "request": "launch",
+      "preLaunchTask": "npm: test",
+      "url": "http://localhost:9876/debug.html"
+    }
+  ]
+}

+ 0 - 3
app-angular/.vscode/settings.json

@@ -1,3 +0,0 @@
-{
-  "typescript.preferences.autoImportFileExcludePatterns": ["@ionic/angular/common", "@ionic/angular/standalone"]
-}

+ 42 - 0
app-angular/.vscode/tasks.json

@@ -0,0 +1,42 @@
+{
+  // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
+  "version": "2.0.0",
+  "tasks": [
+    {
+      "type": "npm",
+      "script": "start",
+      "isBackground": true,
+      "problemMatcher": {
+        "owner": "typescript",
+        "pattern": "$tsc",
+        "background": {
+          "activeOnStart": true,
+          "beginsPattern": {
+            "regexp": "(.*?)"
+          },
+          "endsPattern": {
+            "regexp": "bundle generation complete"
+          }
+        }
+      }
+    },
+    {
+      "type": "npm",
+      "script": "test",
+      "isBackground": true,
+      "problemMatcher": {
+        "owner": "typescript",
+        "pattern": "$tsc",
+        "background": {
+          "activeOnStart": true,
+          "beginsPattern": {
+            "regexp": "(.*?)"
+          },
+          "endsPattern": {
+            "regexp": "bundle generation complete"
+          }
+        }
+      }
+    }
+  ]
+}

+ 27 - 0
app-angular/README.md

@@ -0,0 +1,27 @@
+# AppAngular
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.2.
+
+## Development server
+
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
+
+## Further help
+
+To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.

+ 17 - 0
app-angular/android/variables.gradle

@@ -0,0 +1,17 @@
+ext {
+    minSdkVersion = 22
+    compileSdkVersion = 33
+    targetSdkVersion = 33
+    androidxActivityVersion = '1.7.0'
+    androidxAppCompatVersion = '1.6.1'
+    androidxCoordinatorLayoutVersion = '1.2.0'
+    androidxCoreVersion = '1.10.0'
+    androidxFragmentVersion = '1.5.6'
+    coreSplashScreenVersion = '1.0.0'
+    androidxWebkitVersion = '1.6.1'
+    junitVersion = '4.13.2'
+    androidxJunitVersion = '1.1.5'
+    androidxEspressoCoreVersion = '3.5.1'
+    cordovaAndroidVersion = '10.1.1'
+    
+}

+ 120 - 52
app-angular/angular.json

@@ -3,9 +3,13 @@
   "version": 1,
   "newProjectRoot": "projects",
   "projects": {
-    "app": {
+    "app-angular": {
       "projectType": "application",
-      "schematics": {},
+      "schematics": {
+        "@schematics/angular:component": {
+          "style": "scss"
+        }
+      },
       "root": "",
       "sourceRoot": "src",
       "prefix": "app",
@@ -16,14 +20,18 @@
             "outputPath": "www",
             "index": "src/index.html",
             "main": "src/main.ts",
-            "polyfills": "src/polyfills.ts",
+            "polyfills": [
+              "zone.js"
+            ],
             "tsConfig": "tsconfig.app.json",
             "inlineStyleLanguage": "scss",
             "assets": [
+              "src/favicon.ico",
+              "src/assets",
               {
-                "glob": "**/*",
-                "input": "src/assets",
-                "output": "assets"
+                "glob": "**/*.svg",
+                "input": "node_modules/ionicons/dist/ionicons/svg",
+                "output": "./svg"
               },
               {
                 "glob": "**/*.svg",
@@ -31,7 +39,75 @@
                 "output": "./svg"
               }
             ],
-            "styles": ["src/global.scss", "src/theme/variables.scss"],
+            "styles": [
+              "src/styles.scss",
+              {
+                "input": "node_modules/@ionic/angular/css/core.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/normalize.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/structure.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/typography.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/display.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/padding.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/float-elements.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/text-alignment.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/text-transformation.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/flex-utils.css"
+              },
+              {
+                "input": "src/theme/variables.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/core.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/normalize.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/structure.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/typography.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/display.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/padding.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/float-elements.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/text-alignment.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/text-transformation.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/flex-utils.css"
+              },
+              {
+                "input": "src/theme/variables.css"
+              }
+            ],
             "scripts": []
           },
           "configurations": {
@@ -39,8 +115,8 @@
               "budgets": [
                 {
                   "type": "initial",
-                  "maximumWarning": "2mb",
-                  "maximumError": "5mb"
+                  "maximumWarning": "900kb",
+                  "maximumError": "1mb"
                 },
                 {
                   "type": "anyComponentStyle",
@@ -48,12 +124,6 @@
                   "maximumError": "4kb"
                 }
               ],
-              "fileReplacements": [
-                {
-                  "replace": "src/environments/environment.ts",
-                  "with": "src/environments/environment.prod.ts"
-                }
-              ],
               "outputHashing": "all"
             },
             "development": {
@@ -63,9 +133,6 @@
               "extractLicenses": false,
               "sourceMap": true,
               "namedChunks": true
-            },
-            "ci": {
-              "progress": false
             }
           },
           "defaultConfiguration": "production"
@@ -74,13 +141,10 @@
           "builder": "@angular-devkit/build-angular:dev-server",
           "configurations": {
             "production": {
-              "buildTarget": "app:build:production"
+              "browserTarget": "app-angular:build:production"
             },
             "development": {
-              "buildTarget": "app:build:development"
-            },
-            "ci": {
-              "progress": false
+              "browserTarget": "app-angular:build:development"
             }
           },
           "defaultConfiguration": "development"
@@ -88,22 +152,25 @@
         "extract-i18n": {
           "builder": "@angular-devkit/build-angular:extract-i18n",
           "options": {
-            "buildTarget": "app:build"
+            "browserTarget": "app-angular:build"
           }
         },
         "test": {
           "builder": "@angular-devkit/build-angular:karma",
           "options": {
-            "main": "src/test.ts",
-            "polyfills": "src/polyfills.ts",
+            "polyfills": [
+              "zone.js",
+              "zone.js/testing"
+            ],
             "tsConfig": "tsconfig.spec.json",
-            "karmaConfig": "karma.conf.js",
             "inlineStyleLanguage": "scss",
             "assets": [
+              "src/favicon.ico",
+              "src/assets",
               {
-                "glob": "**/*",
-                "input": "src/assets",
-                "output": "assets"
+                "glob": "**/*.svg",
+                "input": "node_modules/ionicons/dist/ionicons/svg",
+                "output": "./svg"
               },
               {
                 "glob": "**/*.svg",
@@ -111,39 +178,40 @@
                 "output": "./svg"
               }
             ],
-            "styles": ["src/global.scss", "src/theme/variables.scss"],
+            "styles": [
+              "src/styles.scss"
+            ],
             "scripts": []
+          }
+        },
+        "ionic-cordova-serve": {
+          "builder": "@ionic/angular-toolkit:cordova-serve",
+          "options": {
+            "cordovaBuildTarget": "app-angular:ionic-cordova-build",
+            "devServerTarget": "app-angular:serve"
           },
           "configurations": {
-            "ci": {
-              "progress": false,
-              "watch": false
+            "production": {
+              "cordovaBuildTarget": "app-angular:ionic-cordova-build:production",
+              "devServerTarget": "app-angular:serve:production"
             }
           }
         },
-        "lint": {
-          "builder": "@angular-eslint/builder:lint",
+        "ionic-cordova-build": {
+          "builder": "@ionic/angular-toolkit:cordova-build",
           "options": {
-            "lintFilePatterns": [
-              "src/**/*.ts",
-              "src/**/*.html"
-            ]
+            "browserTarget": "app-angular:build"
+          },
+          "configurations": {
+            "production": {
+              "browserTarget": "app-angular:build:production"
+            }
           }
         }
       }
     }
   },
   "cli": {
-    "schematicCollections": [
-      "@ionic/angular-toolkit"
-    ]
-  },
-  "schematics": {
-    "@ionic/angular-toolkit:component": {
-      "styleext": "scss"
-    },
-    "@ionic/angular-toolkit:page": {
-      "styleext": "scss"
-    }
+    "analytics": "bc2f0891-ea37-49cd-809c-9ae3fc6e37cf"
   }
-}
+}

+ 8 - 4
app-angular/capacitor.config.ts

@@ -1,9 +1,13 @@
-import type { CapacitorConfig } from '@capacitor/cli';
+import { CapacitorConfig } from '@capacitor/cli';
 
 const config: CapacitorConfig = {
-  appId: 'io.ionic.starter',
-  appName: 'app-angular',
-  webDir: 'www'
+  appId: 'com.example.app',
+  appName: 'PetFavor',
+  webDir: 'www',
+  server: {
+    androidScheme: 'https'
+  }
 };
 
+
 export default config;

+ 2 - 4
app-angular/ionic.config.json

@@ -1,7 +1,5 @@
 {
-  "name": "app-angular",
-  "integrations": {
-    "capacitor": {}
-  },
+  "name": "FavorPet",
+  "integrations": {},
   "type": "angular"
 }

+ 0 - 44
app-angular/karma.conf.js

@@ -1,44 +0,0 @@
-// Karma configuration file, see link for more information
-// https://karma-runner.github.io/1.0/config/configuration-file.html
-
-module.exports = function (config) {
-  config.set({
-    basePath: '',
-    frameworks: ['jasmine', '@angular-devkit/build-angular'],
-    plugins: [
-      require('karma-jasmine'),
-      require('karma-chrome-launcher'),
-      require('karma-jasmine-html-reporter'),
-      require('karma-coverage'),
-      require('@angular-devkit/build-angular/plugins/karma')
-    ],
-    client: {
-      jasmine: {
-        // you can add configuration options for Jasmine here
-        // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
-        // for example, you can disable the random execution with `random: false`
-        // or set a specific seed with `seed: 4321`
-      },
-      clearContext: false // leave Jasmine Spec Runner output visible in browser
-    },
-    jasmineHtmlReporter: {
-      suppressAll: true // removes the duplicated traces
-    },
-    coverageReporter: {
-      dir: require('path').join(__dirname, './coverage/app'),
-      subdir: '.',
-      reporters: [
-        { type: 'html' },
-        { type: 'text-summary' }
-      ]
-    },
-    reporters: ['progress', 'kjhtml'],
-    port: 9876,
-    colors: true,
-    logLevel: config.LOG_INFO,
-    autoWatch: true,
-    browsers: ['Chrome'],
-    singleRun: false,
-    restartOnFileChange: true
-  });
-};

ファイルの差分が大きいため隠しています
+ 253 - 472
app-angular/package-lock.json


+ 30 - 47
app-angular/package.json

@@ -1,67 +1,50 @@
 {
   "name": "app-angular",
-  "version": "0.0.1",
-  "author": "Ionic Framework",
-  "homepage": "https://ionicframework.com/",
+  "version": "0.0.0",
   "scripts": {
     "ng": "ng",
     "start": "ng serve",
     "build": "ng build",
     "watch": "ng build --watch --configuration development",
-    "test": "ng test",
-    "lint": "ng lint"
+    "test": "ng test"
   },
   "private": true,
   "dependencies": {
-    "@angular/animations": "^18.0.0",
-    "@angular/common": "^18.0.0",
-    "@angular/compiler": "^18.0.0",
-    "@angular/core": "^18.0.0",
-    "@angular/forms": "^18.0.0",
-    "@angular/platform-browser": "^18.0.0",
-    "@angular/platform-browser-dynamic": "^18.0.0",
-    "@angular/router": "^18.0.0",
-    "@capacitor/app": "6.0.0",
-    "@capacitor/core": "6.1.0",
-    "@capacitor/haptics": "6.0.0",
-    "@capacitor/keyboard": "6.0.1",
-    "@capacitor/status-bar": "6.0.0",
-    "@ionic/angular": "^8.0.0",
-    "@types/parse": "^3.0.9",
-    "ionicons": "^7.0.0",
-    "parse": "^5.1.0",
-    "pinyin": "^4.0.0-alpha.0",
+    "@angular/animations": "^16.2.0",
+    "@angular/common": "^16.2.0",
+    "@angular/compiler": "^16.2.0",
+    "@angular/core": "^16.2.0",
+    "@angular/forms": "^16.2.0",
+    "@angular/platform-browser": "^16.2.0",
+    "@angular/platform-browser-dynamic": "^16.2.0",
+    "@angular/router": "^16.2.0",
+    "@capacitor/android": "^5.6.0",
+    "@capacitor/app": "5.0.6",
+    "@capacitor/core": "^5.6.0",
+    "@capacitor/haptics": "5.0.6",
+    "@capacitor/keyboard": "5.0.6",
+    "@capacitor/status-bar": "5.0.6",
+    "@ionic/angular": "^7.5.0",
+    "parse": "^4.2.0",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
-    "zone.js": "~0.14.2"
+    "zone.js": "~0.13.0"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "^18.0.0",
-    "@angular-eslint/builder": "^18.0.0",
-    "@angular-eslint/eslint-plugin": "^18.0.0",
-    "@angular-eslint/eslint-plugin-template": "^18.0.0",
-    "@angular-eslint/schematics": "^18.0.0",
-    "@angular-eslint/template-parser": "^18.0.0",
-    "@angular/cli": "^18.0.0",
-    "@angular/compiler-cli": "^18.0.0",
-    "@angular/language-service": "^18.0.0",
-    "@capacitor/cli": "6.1.0",
-    "@ionic/angular-toolkit": "^11.0.1",
-    "@types/jasmine": "~5.1.0",
-    "@typescript-eslint/eslint-plugin": "^6.0.0",
-    "@typescript-eslint/parser": "^6.0.0",
-    "eslint": "^8.57.0",
-    "eslint-plugin-import": "^2.29.1",
-    "eslint-plugin-jsdoc": "^48.2.1",
-    "eslint-plugin-prefer-arrow": "1.2.2",
-    "jasmine-core": "~5.1.0",
-    "jasmine-spec-reporter": "~5.0.0",
+    "@angular-devkit/build-angular": "^16.2.2",
+    "@angular/cli": "~16.2.2",
+    "@angular/compiler-cli": "^16.2.0",
+    "@capacitor/cli": "^5.6.0",
+    "@compodoc/compodoc": "^1.1.23",
+    "@ionic/angular-toolkit": "latest",
+    "@types/jasmine": "~4.3.0",
+    "@types/parse": "^3.0.5",
+    "jasmine-core": "~4.6.0",
     "karma": "~6.4.0",
     "karma-chrome-launcher": "~3.2.0",
     "karma-coverage": "~2.2.0",
     "karma-jasmine": "~5.1.0",
     "karma-jasmine-html-reporter": "~2.1.0",
-    "typescript": "~5.4.0"
-  },
-  "description": "An Ionic project"
+    "typescript": "~5.1.3"
+  }
 }

+ 14 - 0
app-angular/resources/xml/network_security_config.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<network-security-config>
+    <domain-config cleartextTrafficPermitted="true">
+        <domain includeSubdomains="true">nova-cloud.obs.cn-south-1.myhuaweicloud.com</domain>
+        <domain includeSubdomains="true">localhost</domain>
+        <domain includeSubdomains="true">*.fmode.cn</domain>
+        <domain includeSubdomains="true">fmode.cn</domain>
+        <domain includeSubdomains="true">server.fmode.cn</domain>
+        <domain includeSubdomains="true">upload-z2.qiniup.com</domain>
+        <domain includeSubdomains="true">*.qiniup.com</domain>
+        <domain includeSubdomains="true">webapi.amap.com</domain>
+        <domain includeSubdomains="true">*.amap.com</domain>
+    </domain-config>
+</network-security-config>

+ 15 - 7
app-angular/src/app/app-routing.module.ts

@@ -1,20 +1,28 @@
 import { NgModule } from '@angular/core';
-import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
+import { RouterModule, Routes } from '@angular/router';
 
 const routes: Routes = [
+
   {
-    path: '',
-    loadChildren: () => import('./tabs/tabs.module').then(m => m.TabsPageModule)
+    path: "", redirectTo: "/lesson/community", pathMatch: "full"
   },
   {
     path: 'user',
     loadChildren: () => import('../modules/user/user.module').then(m => m.UserModule)
   }
 ];
+
 @NgModule({
-  imports: [
-    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
-  ],
+  imports: [RouterModule.forRoot(routes)],
   exports: [RouterModule]
 })
-export class AppRoutingModule {}
+export class AppRoutingModule { }
+
+let lessonRoute = {
+
+  path: 'lesson',
+  loadChildren: () => import('../modules/lesson/lesson.module').then(m => m.LessonModule)
+
+}
+
+routes.push(lessonRoute)

+ 27 - 3
app-angular/src/app/app.component.html

@@ -1,3 +1,27 @@
-<ion-app>
-  <ion-router-outlet></ion-router-outlet>
-</ion-app>
+<router-outlet></router-outlet>
+
+<ion-tabs>
+    <ion-tab-bar slot="bottom">
+        <ion-tab-button routerLink="/lesson/me">
+            <ion-icon name="home"></ion-icon>
+            首页
+        </ion-tab-button>
+        <ion-tab-button routerLink="/lesson/community">
+            <ion-icon name="people-circle-outline"></ion-icon>
+            社交广场
+        </ion-tab-button>
+        <ion-tab-button routerLink="/lesson/lesson">
+            <ion-icon name="gift"></ion-icon>
+                礼遇阁
+            </ion-tab-button>
+        <ion-tab-button routerLink="/lesson/page-chat">
+            <ion-icon name="logo-octocat"></ion-icon>
+            AI智答坊
+        </ion-tab-button>
+        <ion-tab-button routerLink="/lesson/page-test">
+            <ion-icon name="happy"></ion-icon>
+            性格秘境
+          </ion-tab-button>
+   
+    </ion-tab-bar>
+</ion-tabs>

+ 8 - 0
app-angular/src/app/app.component.scss

@@ -0,0 +1,8 @@
+ion-tabs {
+    pointer-events: none;
+
+}
+
+ion-tab-button {
+    pointer-events: all;
+}

+ 17 - 9
app-angular/src/app/app.component.spec.ts

@@ -1,16 +1,12 @@
-import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
 import { TestBed } from '@angular/core/testing';
-
+import { RouterTestingModule } from '@angular/router/testing';
 import { AppComponent } from './app.component';
 
 describe('AppComponent', () => {
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      declarations: [AppComponent],
-      schemas: [CUSTOM_ELEMENTS_SCHEMA],
-    }).compileComponents();
-  });
+  beforeEach(() => TestBed.configureTestingModule({
+    imports: [RouterTestingModule],
+    declarations: [AppComponent]
+  }));
 
   it('should create the app', () => {
     const fixture = TestBed.createComponent(AppComponent);
@@ -18,4 +14,16 @@ describe('AppComponent', () => {
     expect(app).toBeTruthy();
   });
 
+  it(`should have as title 'app-angular'`, () => {
+    const fixture = TestBed.createComponent(AppComponent);
+    const app = fixture.componentInstance;
+    expect(app.title).toEqual('app-angular');
+  });
+
+  it('should render title', () => {
+    const fixture = TestBed.createComponent(AppComponent);
+    fixture.detectChanges();
+    const compiled = fixture.nativeElement as HTMLElement;
+    expect(compiled.querySelector('.content span')?.textContent).toContain('app-angular app is running!');
+  });
 });

+ 3 - 9
app-angular/src/app/app.component.ts

@@ -1,16 +1,10 @@
 import { Component } from '@angular/core';
-import * as Parse from "parse";
-Parse.initialize("dev");
-(Parse as any).serverURL = 'http://web2023.fmode.cn:9999/parse'
 
 @Component({
   selector: 'app-root',
-  templateUrl: 'app.component.html',
-  styleUrls: ['app.component.scss'],
+  templateUrl: './app.component.html',
+  styleUrls: ['./app.component.scss']
 })
 export class AppComponent {
-  constructor() {
-
-
-  }
+  title = 'app-angular';
 }

+ 19 - 8
app-angular/src/app/app.module.ts

@@ -1,16 +1,27 @@
 import { NgModule } from '@angular/core';
+import { FormsModule } from '@angular/forms';
 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';
+import { IonicModule } from '@ionic/angular';
+
+import * as Parse from "parse"
+(Parse as any).serverURL = "http://web2023.fmode.cn:9999/parse"
+Parse.initialize("dev")
 
 @NgModule({
-  declarations: [AppComponent],
-  imports: [BrowserModule, IonicModule.forRoot(), AppRoutingModule],
-  providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
-  bootstrap: [AppComponent],
+  declarations: [
+    AppComponent,
+
+  ],
+  imports: [
+    BrowserModule,
+    AppRoutingModule,
+    FormsModule,
+    IonicModule.forRoot()
+  ],
+  providers: [],
+  bootstrap: [AppComponent]
 })
-export class AppModule {}
+export class AppModule { }

+ 0 - 27
app-angular/src/app/explore-container/explore-container.component.scss

@@ -1,27 +0,0 @@
-#container {
-  text-align: center;
-
-  position: absolute;
-  left: 0;
-  right: 0;
-  top: 50%;
-  transform: translateY(-50%);
-}
-
-#container strong {
-  font-size: 20px;
-  line-height: 26px;
-}
-
-#container p {
-  font-size: 16px;
-  line-height: 22px;
-
-  color: #8c8c8c;
-
-  margin: 0;
-}
-
-#container a {
-  text-decoration: none;
-}

+ 0 - 14
app-angular/src/app/explore-container/explore-container.module.ts

@@ -1,14 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FormsModule } from '@angular/forms';
-
-import { IonicModule } from '@ionic/angular';
-
-import { ExploreContainerComponent } from './explore-container.component';
-
-@NgModule({
-  imports: [ CommonModule, FormsModule, IonicModule],
-  declarations: [ExploreContainerComponent],
-  exports: [ExploreContainerComponent]
-})
-export class ExploreContainerComponentModule {}

+ 0 - 16
app-angular/src/app/tab1/tab1-routing.module.ts

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

+ 0 - 20
app-angular/src/app/tab1/tab1.module.ts

@@ -1,20 +0,0 @@
-import { IonicModule } from '@ionic/angular';
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FormsModule } from '@angular/forms';
-import { Tab1Page } from './tab1.page';
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
-
-import { Tab1PageRoutingModule } from './tab1-routing.module';
-
-@NgModule({
-  imports: [
-    IonicModule,
-    CommonModule,
-    FormsModule,
-    ExploreContainerComponentModule,
-    Tab1PageRoutingModule
-  ],
-  declarations: [Tab1Page]
-})
-export class Tab1PageModule {}

+ 0 - 19
app-angular/src/app/tab1/tab1.page.html

@@ -1,19 +0,0 @@
-<ion-header [translucent]="true">
-  <ion-toolbar>
-    <ion-title>
-      使用说明
-    </ion-title>
-  </ion-toolbar>
-</ion-header>
-
-<ion-content [fullscreen]="true">
-  <ion-header collapse="condense">
-    <ion-toolbar>
-      <ion-title size="large">使用说明</ion-title>
-    </ion-toolbar>
-  </ion-header>
-
-  <div *ngIf="safeHTML" [innerHTML]="safeHTML"></div>
-  <!-- <ion-button expand="block" routerLink="/tabs/tab2">示例:通讯录列表</ion-button>
-  <ion-button expand="block" (click)="openGit()">代码:study-ng-contact</ion-button> -->
-</ion-content>

+ 0 - 4
app-angular/src/app/tab1/tab1.page.scss

@@ -1,4 +0,0 @@
-iframe{
-    width:100%;
-    height:100%;
-}

+ 0 - 26
app-angular/src/app/tab1/tab1.page.spec.ts

@@ -1,26 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { IonicModule } from '@ionic/angular';
-
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
-
-import { Tab1Page } from './tab1.page';
-
-describe('Tab1Page', () => {
-  let component: Tab1Page;
-  let fixture: ComponentFixture<Tab1Page>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      declarations: [Tab1Page],
-      imports: [IonicModule.forRoot(), ExploreContainerComponentModule]
-    }).compileComponents();
-
-    fixture = TestBed.createComponent(Tab1Page);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});

+ 0 - 19
app-angular/src/app/tab1/tab1.page.ts

@@ -1,19 +0,0 @@
-import { Component } from '@angular/core';
-import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
-
-@Component({
-  selector: 'app-tab1',
-  templateUrl: 'tab1.page.html',
-  styleUrls: ['tab1.page.scss']
-})
-export class Tab1Page {
-
-  safeHTML: SafeResourceUrl|undefined
-  constructor(private domSan:DomSanitizer) {
-    this.safeHTML = domSan.bypassSecurityTrustHtml(``)
-  }
-  openGit(){
-    window.open(`http://git.fmode.cn:3000/nkkj/study-ng-contact`,"_blank")
-  }
-
-}

+ 0 - 16
app-angular/src/app/tab2/tab2-routing.module.ts

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

+ 0 - 20
app-angular/src/app/tab2/tab2.module.ts

@@ -1,20 +0,0 @@
-import { IonicModule } from '@ionic/angular';
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FormsModule } from '@angular/forms';
-import { Tab2Page } from './tab2.page';
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
-
-import { Tab2PageRoutingModule } from './tab2-routing.module';
-
-@NgModule({
-  imports: [
-    IonicModule,
-    CommonModule,
-    FormsModule,
-    ExploreContainerComponentModule,
-    Tab2PageRoutingModule
-  ],
-  declarations: [Tab2Page]
-})
-export class Tab2PageModule {}

+ 0 - 17
app-angular/src/app/tab2/tab2.page.html

@@ -1,17 +0,0 @@
-<ion-header [translucent]="true">
-  <ion-toolbar>
-    <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>
-
-  <app-explore-container name="Tab 2 page"></app-explore-container>
-</ion-content>

+ 0 - 26
app-angular/src/app/tab2/tab2.page.spec.ts

@@ -1,26 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { IonicModule } from '@ionic/angular';
-
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
-
-import { Tab2Page } from './tab2.page';
-
-describe('Tab2Page', () => {
-  let component: Tab2Page;
-  let fixture: ComponentFixture<Tab2Page>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      declarations: [Tab2Page],
-      imports: [IonicModule.forRoot(), ExploreContainerComponentModule]
-    }).compileComponents();
-
-    fixture = TestBed.createComponent(Tab2Page);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});

+ 0 - 12
app-angular/src/app/tab2/tab2.page.ts

@@ -1,12 +0,0 @@
-import { Component } from '@angular/core';
-
-@Component({
-  selector: 'app-tab2',
-  templateUrl: 'tab2.page.html',
-  styleUrls: ['tab2.page.scss']
-})
-export class Tab2Page {
-
-  constructor() {}
-
-}

+ 0 - 16
app-angular/src/app/tab3/tab3-routing.module.ts

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

+ 0 - 20
app-angular/src/app/tab3/tab3.module.ts

@@ -1,20 +0,0 @@
-import { IonicModule } from '@ionic/angular';
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { FormsModule } from '@angular/forms';
-import { Tab3Page } from './tab3.page';
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
-
-import { Tab3PageRoutingModule } from './tab3-routing.module';
-
-@NgModule({
-  imports: [
-    IonicModule,
-    CommonModule,
-    FormsModule,
-    ExploreContainerComponentModule,
-    Tab3PageRoutingModule
-  ],
-  declarations: [Tab3Page]
-})
-export class Tab3PageModule {}

+ 0 - 17
app-angular/src/app/tab3/tab3.page.html

@@ -1,17 +0,0 @@
-<ion-header [translucent]="true">
-  <ion-toolbar>
-    <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>
-
-  <app-explore-container name="Tab 3 page"></app-explore-container>
-</ion-content>

+ 0 - 0
app-angular/src/app/tab3/tab3.page.scss


+ 0 - 26
app-angular/src/app/tab3/tab3.page.spec.ts

@@ -1,26 +0,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-import { IonicModule } from '@ionic/angular';
-
-import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
-
-import { Tab3Page } from './tab3.page';
-
-describe('Tab3Page', () => {
-  let component: Tab3Page;
-  let fixture: ComponentFixture<Tab3Page>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      declarations: [Tab3Page],
-      imports: [IonicModule.forRoot(), ExploreContainerComponentModule]
-    }).compileComponents();
-
-    fixture = TestBed.createComponent(Tab3Page);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});

+ 0 - 12
app-angular/src/app/tab3/tab3.page.ts

@@ -1,12 +0,0 @@
-import { Component } from '@angular/core';
-
-@Component({
-  selector: 'app-tab3',
-  templateUrl: 'tab3.page.html',
-  styleUrls: ['tab3.page.scss']
-})
-export class Tab3Page {
-
-  constructor() {}
-
-}

+ 0 - 39
app-angular/src/app/tabs/tabs-routing.module.ts

@@ -1,39 +0,0 @@
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { TabsPage } from './tabs.page';
-
-const routes: Routes = [
-  {
-    path: 'tabs',
-    component: TabsPage,
-    children: [
-      {
-        path: 'tab1',
-        loadChildren: () => import('../tab1/tab1.module').then(m => m.Tab1PageModule)
-      },
-      {
-        path: 'tab2',
-        loadChildren: () => import('../../modules/contact/contact-list/contact-list.module').then(mod => mod.ContactListPageModule)
-      },
-      {
-        path: 'tab3',
-        loadChildren: () => import('../../modules/user/mine/mine.module').then(mod => mod.MinePageModule)
-      },
-      {
-        path: '',
-        redirectTo: '/tabs/tab1',
-        pathMatch: 'full'
-      }
-    ]
-  },
-  {
-    path: '',
-    redirectTo: '/tabs/tab1',
-    pathMatch: 'full'
-  }
-];
-
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-})
-export class TabsPageRoutingModule {}

+ 0 - 19
app-angular/src/app/tabs/tabs.module.ts

@@ -1,19 +0,0 @@
-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';
-
-@NgModule({
-  imports: [
-    IonicModule,
-    CommonModule,
-    FormsModule,
-    TabsPageRoutingModule
-  ],
-  declarations: [TabsPage]
-})
-export class TabsPageModule {}

+ 0 - 20
app-angular/src/app/tabs/tabs.page.html

@@ -1,20 +0,0 @@
-<ion-tabs>
-
-
-  <ion-tab-bar slot="bottom">
-    <ion-tab-button tab="tab2" href="/tabs/tab2">
-      <ion-icon aria-hidden="true" name="ellipse"></ion-icon>
-      <ion-label>人情圈</ion-label>
-    </ion-tab-button>
-
-    <ion-tab-button tab="tab3" href="/tabs/tab3">
-      <ion-icon aria-hidden="true" name="person"></ion-icon>
-      <ion-label>我的</ion-label>
-    </ion-tab-button>
-    <!-- <ion-tab-button tab="tab1" href="/tabs/tab1">
-      <ion-icon aria-hidden="true" name="document"></ion-icon>
-      <ion-label>礼物</ion-label>
-    </ion-tab-button> -->
-  </ion-tab-bar>
-
-</ion-tabs>

+ 0 - 1
app-angular/src/app/tabs/tabs.page.scss

@@ -1 +0,0 @@
-

+ 0 - 26
app-angular/src/app/tabs/tabs.page.spec.ts

@@ -1,26 +0,0 @@
-import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { TabsPage } from './tabs.page';
-
-describe('TabsPage', () => {
-  let component: TabsPage;
-  let fixture: ComponentFixture<TabsPage>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      declarations: [TabsPage],
-      schemas: [CUSTOM_ELEMENTS_SCHEMA],
-    }).compileComponents();
-  });
-
-  beforeEach(() => {
-    fixture = TestBed.createComponent(TabsPage);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});

+ 0 - 12
app-angular/src/app/tabs/tabs.page.ts

@@ -1,12 +0,0 @@
-import { Component } from '@angular/core';
-
-@Component({
-  selector: 'app-tabs',
-  templateUrl: 'tabs.page.html',
-  styleUrls: ['tabs.page.scss']
-})
-export class TabsPage {
-
-  constructor() {}
-
-}

+ 0 - 0
app-angular/src/app/tab2/tab2.page.scss → app-angular/src/assets/.gitkeep


BIN
app-angular/src/assets/1.jpg


BIN
app-angular/src/assets/10.jpg


BIN
app-angular/src/assets/11.jpg


BIN
app-angular/src/assets/12.jpg


BIN
app-angular/src/assets/13.jpg


BIN
app-angular/src/assets/14.jpg


BIN
app-angular/src/assets/16.jpg


BIN
app-angular/src/assets/18.jpg


BIN
app-angular/src/assets/19.png


BIN
app-angular/src/assets/2.jpg


BIN
app-angular/src/assets/20.jpg


BIN
app-angular/src/assets/3.jpg


BIN
app-angular/src/assets/4.jpg


BIN
app-angular/src/assets/5.jpg


BIN
app-angular/src/assets/6.jpg


BIN
app-angular/src/assets/7.jpg


BIN
app-angular/src/assets/8.jpeg


BIN
app-angular/src/assets/9.jpg


BIN
app-angular/src/assets/e4656e49ad3321054e63d58809ad93dc.jpg


BIN
app-angular/src/assets/enfp.jpg


BIN
app-angular/src/assets/gxitu.png


BIN
app-angular/src/assets/icon/favicon.png


BIN
app-angular/src/assets/jl.png


+ 0 - 1
app-angular/src/assets/shapes.svg

@@ -1 +0,0 @@
-<svg width="350" height="140" xmlns="http://www.w3.org/2000/svg" style="background:#f6f7f9"><g fill="none" fill-rule="evenodd"><path fill="#F04141" style="mix-blend-mode:multiply" d="M61.905-34.23l96.194 54.51-66.982 54.512L22 34.887z"/><circle fill="#10DC60" style="mix-blend-mode:multiply" cx="155.5" cy="135.5" r="57.5"/><path fill="#3880FF" style="mix-blend-mode:multiply" d="M208.538 9.513l84.417 15.392L223.93 93.93z"/><path fill="#FFCE00" style="mix-blend-mode:multiply" d="M268.625 106.557l46.332-26.75 46.332 26.75v53.5l-46.332 26.75-46.332-26.75z"/><circle fill="#7044FF" style="mix-blend-mode:multiply" cx="299.5" cy="9.5" r="38.5"/><rect fill="#11D3EA" style="mix-blend-mode:multiply" transform="rotate(-60 148.47 37.886)" x="143.372" y="-7.056" width="10.196" height="89.884" rx="5.098"/><path d="M-25.389 74.253l84.86 8.107c5.498.525 9.53 5.407 9.004 10.905a10 10 0 0 1-.057.477l-12.36 85.671a10.002 10.002 0 0 1-11.634 8.42l-86.351-15.226c-5.44-.959-9.07-6.145-8.112-11.584l13.851-78.551a10 10 0 0 1 10.799-8.219z" fill="#7044FF" style="mix-blend-mode:multiply"/><circle fill="#0CD1E8" style="mix-blend-mode:multiply" cx="273.5" cy="106.5" r="20.5"/></g></svg>

+ 0 - 3
app-angular/src/environments/environment.prod.ts

@@ -1,3 +0,0 @@
-export const environment = {
-  production: true
-};

+ 0 - 16
app-angular/src/environments/environment.ts

@@ -1,16 +0,0 @@
-// This file can be replaced during build by using the `fileReplacements` array.
-// `ng build` replaces `environment.ts` with `environment.prod.ts`.
-// The list of file replacements can be found in `angular.json`.
-
-export const environment = {
-  production: false
-};
-
-/*
- * For easier debugging in development mode, you can import the following file
- * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
- *
- * This import should be commented out in production mode because it will have a negative impact
- * on performance if an error is thrown.
- */
-// import 'zone.js/plugins/zone-error';  // Included with Angular CLI.

BIN
app-angular/src/favicon.ico


+ 0 - 37
app-angular/src/global.scss

@@ -1,37 +0,0 @@
-/*
- * App Global CSS
- * ----------------------------------------------------------------------------
- * Put style rules here that you want to apply globally. These styles are for
- * the entire app and not just one component. Additionally, this file can be
- * used as an entry point to import other CSS/Sass files to be included in the
- * output CSS.
- * For more information on global stylesheets, visit the documentation:
- * https://ionicframework.com/docs/layout/global-stylesheets
- */
-
-/* Core CSS required for Ionic components to work properly */
-@import "@ionic/angular/css/core.css";
-
-/* Basic CSS for apps built with Ionic */
-@import "@ionic/angular/css/normalize.css";
-@import "@ionic/angular/css/structure.css";
-@import "@ionic/angular/css/typography.css";
-@import "@ionic/angular/css/display.css";
-
-/* Optional CSS utils that can be commented out */
-@import "@ionic/angular/css/padding.css";
-@import "@ionic/angular/css/float-elements.css";
-@import "@ionic/angular/css/text-alignment.css";
-@import "@ionic/angular/css/text-transformation.css";
-@import "@ionic/angular/css/flex-utils.css";
-
-/**
- * Ionic Dark Mode
- * -----------------------------------------------------
- * For more info, please see:
- * https://ionicframework.com/docs/theming/dark-mode
- */
-
-/* @import "@ionic/angular/css/palettes/dark.always.css"; */
-/* @import "@ionic/angular/css/palettes/dark.class.css"; */
-// @import "@ionic/angular/css/palettes/dark.system.css";

+ 6 - 19
app-angular/src/index.html

@@ -1,26 +1,13 @@
-<!DOCTYPE html>
+<!doctype html>
 <html lang="en">
-
 <head>
-  <meta charset="utf-8" />
-  <title>Ionic App</title>
-
-  <base href="/" />
-
-  <meta name="color-scheme" content="light dark" />
-  <meta name="viewport" content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
-  <meta name="format-detection" content="telephone=no" />
-  <meta name="msapplication-tap-highlight" content="no" />
-
-  <link rel="icon" type="image/png" href="assets/icon/favicon.png" />
-
-  <!-- add to homescreen for ios -->
-  <meta name="apple-mobile-web-app-capable" content="yes" />
-  <meta name="apple-mobile-web-app-status-bar-style" content="black" />
+  <meta charset="utf-8">
+  <title>AppAngular</title>
+  <base href="/">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link rel="icon" type="image/x-icon" href="favicon.ico">
 </head>
-
 <body>
   <app-root></app-root>
 </body>
-
 </html>

+ 1 - 6
app-angular/src/main.ts

@@ -1,12 +1,7 @@
-import { enableProdMode } from '@angular/core';
 import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
 
 import { AppModule } from './app/app.module';
-import { environment } from './environments/environment';
 
-if (environment.production) {
-  enableProdMode();
-}
 
 platformBrowserDynamic().bootstrapModule(AppModule)
-  .catch(err => console.log(err));
+  .catch(err => console.error(err));

+ 0 - 17
app-angular/src/modules/contact/contact-detail/contact-detail-routing.module.ts

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

+ 0 - 20
app-angular/src/modules/contact/contact-detail/contact-detail.module.ts

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

+ 0 - 0
app-angular/src/modules/contact/contact-detail/contact-detail.page.scss


+ 0 - 17
app-angular/src/modules/contact/contact-list/contact-list-routing.module.ts

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

+ 0 - 20
app-angular/src/modules/contact/contact-list/contact-list.module.ts

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

+ 0 - 0
app-angular/src/modules/contact/contact-list/contact-list.page.scss


+ 0 - 12
app-angular/src/modules/contact/contact-routing.module.ts

@@ -1,12 +0,0 @@
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-
-const routes: Routes = [
-  {path: 'list', loadChildren: () => import('./contact-list/contact-list.module').then(mod => mod.ContactListPageModule)},
-  {path: 'detail/:id', loadChildren: () => import('./contact-detail/contact-detail.module').then(mod => mod.ContactDetailPageModule)},
-];
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule]
-})
-export class ContactRoutingModule { }

+ 0 - 14
app-angular/src/modules/contact/contact.module.ts

@@ -1,14 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-
-import { ContactRoutingModule } from './contact-routing.module';
-
-
-@NgModule({
-  declarations: [],
-  imports: [
-    CommonModule,
-    ContactRoutingModule
-  ]
-})
-export class ContactModule { }

+ 78 - 0
app-angular/src/modules/lesson/attention-detail/attention-detail.component.html

@@ -0,0 +1,78 @@
+<ion-header>
+    <ion-toolbar>
+        <ion-buttons slot="start">
+            <ion-button routerLink="/lesson/community" fill="clear" color="dark">
+                <ion-icon name="chevron-back-outline" size="small"></ion-icon>返回</ion-button>
+        </ion-buttons>
+        <ion-buttons slot="end">
+            <ion-button fill="clear" color="dark">
+                收藏</ion-button>
+        </ion-buttons>
+    </ion-toolbar>
+</ion-header>
+<ion-content color="light">
+    <ion-card>
+        <img alt="角色图" [src]="attention?.get('img')" />
+        <ion-card-header>
+            <ion-card-title>{{attention?.get('name')}}</ion-card-title>
+            <ion-card-subtitle>作者:{{attention?.get('user')?.get('name')||"某某某"}}</ion-card-subtitle>
+            <ion-card-subtitle>{{attention?.get('type')||""}}</ion-card-subtitle>
+            <ion-card-subtitle>{{attention?.get('createdAt')| date: 'YYYY/MM/dd/HH:mm'||"发布时间"}}</ion-card-subtitle>
+        </ion-card-header>
+        <ion-card-content>
+            {{attention?.get('cueword')||"#hrmai"}}
+        </ion-card-content>
+    </ion-card>
+    <ion-list [inset]="true">
+        <ion-item>
+            <ion-textarea label="留下你的想法吧" labelPlacement="floating" rows="5" [(ngModel)]="comment">
+            </ion-textarea>
+        </ion-item>
+        <ion-item>
+            <ion-buttons slot="end">
+                <ion-button color="medium" fill="outline" (click)="addComment()" shape="round">确定</ion-button>
+            </ion-buttons>
+        </ion-item>
+    </ion-list>
+    <ion-list [inset]="true">
+        <ng-container *ngFor="let comment of comments">
+            <ion-item class="comment-list">
+                <ion-label>
+                    <p class="commentator">用户昵称</p>
+                    <ion-note class="comment-content">{{comment}}</ion-note>
+                </ion-label>
+                <div class="comment-time">
+                    <ion-note color="medium">{{currentDate|date: 'HH:mm'}}</ion-note>
+                </div>
+            </ion-item>
+        </ng-container>
+        <ion-item class="comment-list">
+            <ion-label>
+                <p class="commentator">momo</p>
+                <ion-note class="comment-content">必须关注起来! ♥</ion-note>
+            </ion-label>
+            <div class="comment-time">
+                <ion-note color="medium">03:44</ion-note>
+            </div>
+        </ion-item>
+        <ion-item class="comment-list">
+            <ion-label>
+                <p class="commentator">苏格拉没有底</p>
+                <ion-note class="comment-content">古希腊掌管送礼的神出现啦</ion-note>
+            </ion-label>
+            <div class="comment-time">
+                <ion-note color="medium">Yesterday</ion-note>
+            </div>
+        </ion-item>
+        <ion-item class="comment-list">
+            <ion-label>
+                <p class="commentator">是CC呀</p>
+                <ion-note class="comment-content">礼物🎁仪式感满满</ion-note>
+            </ion-label>
+            <div class="comment-time">
+                <ion-note color="medium">Yesterday</ion-note>
+            </div>
+        </ion-item>
+    </ion-list>
+
+</ion-content>

+ 19 - 0
app-angular/src/modules/lesson/attention-detail/attention-detail.component.scss

@@ -0,0 +1,19 @@
+ion-content {
+    height: calc(100vh - 121px) !important;
+}
+
+.commentator {
+    font-size: 0.7rem;
+}
+
+.comment-time {
+    position: absolute;
+
+    bottom: 0px;
+    inset-inline-end: 10px;
+
+    font-size: 0.4rem;
+    z-index: 100;
+    display: flex;
+    align-items: center;
+}

+ 21 - 0
app-angular/src/modules/lesson/attention-detail/attention-detail.component.spec.ts

@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { AttentionDetailComponent } from './attention-detail.component';
+
+
+describe('AttentionDetailComponent', () => {
+  let component: AttentionDetailComponent;
+  let fixture: ComponentFixture<AttentionDetailComponent>;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      declarations: [AttentionDetailComponent]
+    });
+    fixture = TestBed.createComponent(AttentionDetailComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 42 - 0
app-angular/src/modules/lesson/attention-detail/attention-detail.component.ts

@@ -0,0 +1,42 @@
+import { Component } from '@angular/core';
+
+// 引入服务
+import { ActivatedRoute } from '@angular/router';
+
+// 引入Parse第三方库
+import * as Parse from "parse"
+(Parse as any).serverURL = "http://web2023.fmode.cn:9999/parse"
+Parse.initialize("dev")
+
+
+@Component({
+  selector: 'app-attention-detail',
+  templateUrl: './attention-detail.component.html',
+  styleUrls: ['./attention-detail.component.scss']
+})
+export class AttentionDetailComponent {
+
+  //添加评论
+  comments: string[] = [];
+  comment: string = '';
+  currentDate = new Date();
+  addComment() {
+    console.log(this.comment)
+    if (this.comment.trim() !== '') {
+      this.comments.push(this.comment);
+      this.comment = '';
+    }
+  }
+
+  attention: Parse.Object | undefined;
+  constructor(private router: ActivatedRoute) {
+    this.router.queryParams.subscribe(param => {
+      this.getRoleInfoById(param["id"])
+    })
+  }
+  async getRoleInfoById(id: string) {
+    let query = new Parse.Query("HrmAttention")
+    this.attention = await query.get(id)
+  }
+
+}

+ 100 - 0
app-angular/src/modules/lesson/class-chat-completion.ts

@@ -0,0 +1,100 @@
+export interface TestChatMessage {
+    role: string
+    content: string
+}
+export class TestChatCompletion {
+    messageList: Array<TestChatMessage>
+    constructor(messageList: Array<TestChatMessage>) {
+        this.messageList = messageList
+    }
+    async createCompletionByStream(call?: Function) {
+
+        let token = localStorage.getItem("token");
+        let bodyJson = {
+            "token": `Bearer ${token}`,
+            "messages": this.messageList,
+            "model": "gpt-3.5-turbo",
+            "temperature": 0.5,
+            "presence_penalty": 0,
+            "frequency_penalty": 0,
+            "top_p": 1,
+            "stream": true
+        };
+
+        let response = await fetch("https://test.fmode.cn/api/apig/aigc/gpt/v1/chat/completions", {
+            "headers": {
+                "accept": "text/event-stream",
+                "sec-fetch-dest": "empty",
+                "sec-fetch-mode": "cors",
+                "sec-fetch-site": "same-site"
+            },
+            "referrer": "https://ai.fmode.cn/",
+            "referrerPolicy": "strict-origin-when-cross-origin",
+            "body": JSON.stringify(bodyJson),
+            "method": "POST",
+            "mode": "cors",
+            "credentials": "omit"
+        });
+
+        let messageAiReply = ""
+        let messageIndex = this.messageList.length
+        let reader = response.body?.getReader();
+        if (!reader) {
+            throw new Error("Failed to get the response reader.");
+        }
+
+        let decoder = new TextDecoder();
+        let buffer = "";
+
+        while (true) {
+            let { done, value } = await reader.read();
+            if (done) {
+                break;
+            }
+
+            buffer += decoder.decode(value);
+
+            // Split the buffer by newlines to get individual messages
+            let messages = buffer.split("\n");
+
+            // Process each message
+            for (let i = 0; i < messages.length - 1; i++) {
+                let message = messages[i];
+
+                // Process the message as needed
+                /**
+                 * data: {"id":"chatcmpl-y2PLKqPDnwAFJIj2L5aqdH5TWK9Yv","object":"chat.completion.chunk","created":1696770162,"model":"gpt-3.5-turbo-0613","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
+                 * data: {"id":"chatcmpl-y2PLKqPDnwAFJIj2L5aqdH5TWK9Yv","object":"chat.completion.chunk","created":1696770162,"model":"gpt-3.5-turbo-0613","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
+                 * data: [DONE]
+                 */
+                let dataText = message.replace("data:\ ", "")
+                if (dataText.startsWith("{")) {
+                    try {
+                        let dataJson = JSON.parse(dataText)
+                        console.log(dataJson)
+                        messageAiReply += dataJson?.choices?.[0]?.delta?.content || ""
+                        this.messageList[messageIndex] = {
+                            role: "assistant",
+                            content: messageAiReply
+                        }
+                    } catch (err) { }
+                }
+                if (dataText.startsWith("[")) {
+                    console.log(message)
+                    console.log("完成")
+                    this.messageList[messageIndex] = {
+                        role: "assistant",
+                        content: messageAiReply
+                    }
+                    call && call(true)
+                    messageAiReply = ""
+                }
+                // Parse the message as JSON
+                // let data = JSON.parse(message);
+
+                // Clear the processed message from the buffer
+                buffer = buffer.slice(message.length + 1);
+            }
+        }
+    }
+}

+ 21 - 0
app-angular/src/modules/lesson/community/community-routing.module.ts

@@ -0,0 +1,21 @@
+import { NgModule } from '@angular/core';
+import { RouterModule, Routes } from '@angular/router';
+import { ShareComponent } from '../share/share.component';
+import { RecommendDetailComponent } from '../recommend-detail/recommend-detail.component';
+import { AttentionDetailComponent } from '../attention-detail/attention-detail.component';
+import { ScienceDetailComponent } from '../science-detail/science-detail.component';
+import { PageLessonDetailComponent } from '../page-lesson-detail/page-lesson-detail.component';
+
+const routes: Routes = [
+    { path: "share", component: ShareComponent }, // 当路径为 "share" 时,加载 ShareComponent 组件
+    { path: "recommend", component: RecommendDetailComponent }, // 当路径为 "recommend" 时,加载 RecommendDetailComponent 组件
+    { path: "attention", component: AttentionDetailComponent }, // 当路径为 "attention" 时,加载 AttentionDetailComponent 组件
+    { path: "science", component: ScienceDetailComponent }, // 当路径为 "science" 时,加载 ScienceDetailComponent 组件
+    { path: "lesson", component: PageLessonDetailComponent },
+]
+
+@NgModule({
+    imports: [RouterModule.forChild(routes)], // 导入路由配置
+    exports: [RouterModule] // 导出路由模块
+})
+export class CommunityRoutingModule { }

+ 99 - 0
app-angular/src/modules/lesson/community/community.component.html

@@ -0,0 +1,99 @@
+<ion-header>
+    <ion-toolbar>
+        <ion-icon name="compass-outline" size="large" color="dark"></ion-icon>
+        <ion-button slot="end" fill="clear" size="small" routerLink="share">
+            <ion-icon name="add-circle-outline" size="large" color="dark"></ion-icon>
+            <ion-note>发布</ion-note>
+        </ion-button>
+    </ion-toolbar>
+</ion-header>
+
+<ion-content color="light">
+    <!-- 导航 -->
+    <ion-card class="navbar">
+        <ion-toolbar>
+            <ion-segment value="推荐">
+                    <ion-segment-button value="推荐" (click)="cate='推荐'">
+                        <ion-label>推荐</ion-label>
+                    </ion-segment-button>
+                    <ion-segment-button value="关注" (click)="cate='关注'">
+                        <ion-label>关注</ion-label>
+                    </ion-segment-button>
+            </ion-segment>
+        </ion-toolbar>
+    </ion-card>
+    <ion-content>
+        <ng-container *ngIf="cate=='关注'">
+            <div class="carousel-container">
+                <div class="carousel">
+                    <ng-container *ngFor="let attention of attentionList; let i = index">
+                        <ion-col size="6" *ngIf="i % 2 === 0">
+                            <ion-card class="roleCard custom-card" (click)="goAttentionDetail(attention)">
+                                <img alt="关注图" [src]="attention?.get('img')" />
+                            </ion-card>
+                        </ion-col>
+                    </ng-container>
+                </div>
+            </div>
+            <div class="carousel-container">
+                <div class="carousel">
+                    <ng-container *ngFor="let attention of attentionList.slice().reverse(); let i = index">
+                        <ion-col size="6" *ngIf="i % 2 === 0">
+                            <ion-card class="roleCard custom-card" (click)="goAttentionDetail(attention)">
+                                <img alt="关注图" [src]="attention?.get('img')" />
+                            </ion-card>
+                        </ion-col>
+                    </ng-container>
+                </div>
+            </div>
+            <ng-container *ngFor="let science of scienceList">
+                <ion-card (click)="goScienceDetail(science)">
+                    <img alt="科普图" [src]="science?.get('img')" />
+                    <ion-card-header>
+                        <ion-card-title>{{science?.get('name')}}</ion-card-title>
+                        <ion-card-subtitle>{{science?.get('createdAt') | date: 'YYYY/MM/dd' || "发布时间"}}</ion-card-subtitle>
+                        <div class="metadata-end-wrapper">
+                            <ion-button fill="clear" color="dark" size="small" class="see">
+                                <ion-icon name="eye-outline" size="small"></ion-icon>
+                                <ion-note>{{science?.get('see')}}</ion-note>
+                            </ion-button>
+                            <ion-button fill="clear" color="dark" size="small" class="like">
+                                <ion-icon name="heart-outline" size="small"></ion-icon>
+                                <ion-note>{{science?.get('like')}}</ion-note>
+                            </ion-button>
+                        </div>
+                    </ion-card-header>
+                    <ion-card-content>
+                        <p class="foodContent">{{science?.get('content')}}</p>
+                    </ion-card-content>
+                </ion-card>
+            </ng-container>
+        </ng-container>
+
+         <!-- 推荐部分 -->
+         <ng-container *ngIf="cate=='推荐'">
+            <ion-grid>
+                <ion-row>
+                    <ng-container *ngFor="let attention of recommendList">
+                        <ion-col size="6">
+                            <ion-card class="roleCard" (click)="goRecommendDetail(attention)">
+                                <img alt="推荐图" [src]="attention?.get('img')" />
+                                <ion-card-header>
+                                    <ion-card-title>{{attention?.get('name')}}</ion-card-title>
+                                    <ion-card-subtitle style="font-size:0.7rem;">
+                                        作者:{{attention?.get('user')?.get('name') || "无名"}}
+                                    </ion-card-subtitle>
+                                </ion-card-header>
+                                <div class="metadata-end-wrapper">
+                                    <ion-button shape="round" size="small" color="danger">
+                                        <ion-icon name="heart-outline" size="small"></ion-icon>
+                                        {{attention?.get('like')}}
+                                    </ion-button>
+                                </div>
+                            </ion-card>
+                        </ion-col>
+                    </ng-container>
+                </ion-row>
+            </ion-grid>
+        </ng-container>
+    </ion-content>

+ 43 - 0
app-angular/src/modules/lesson/community/community.component.scss

@@ -0,0 +1,43 @@
+.carousel-container {
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel {
+  display: flex;
+  overflow-x: auto;
+  overflow-y: hidden; /* 禁止垂直滚动 */
+  scroll-snap-type: x mandatory; /* 必须的水平滚动 */
+  -webkit-overflow-scrolling: touch; /* 兼容iOS的滚动效果 */
+  scrollbar-width: none; /* 隐藏滚动条 Firefox */
+  -ms-overflow-style: none; /* 隐藏滚动条 IE/Edge */
+}
+
+.carousel::-webkit-scrollbar {
+  display: none; /* 隐藏滚动条 Chrome/Safari */
+}
+
+.card {
+  flex: 0 0 auto;
+  width: 40%; /* 缩短卡片长度 */
+  height: 150px; /* 调整卡片高度 */
+  margin-right: 10px;
+  background-color: #f9f9f9;
+  border-radius: 5px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+  scroll-snap-align: start; /* 开始对齐滚动 */
+}
+
+.carousel-content {
+  display: flex;
+  flex-wrap: nowrap; /* 防止换行 */
+  scroll-snap-type: x mandatory; /* 必须的水平滚动 */
+}
+
+.custom-card {
+  width: 100%; /* 设置每个 ion-card 的宽度为100% */
+  height: 100%; /* 设置每个 ion-card 的高度为100% */
+}
+.custom-header {
+  padding-bottom: 1px; /* 调整ion-card-header底部内边距 */
+}

+ 21 - 0
app-angular/src/modules/lesson/community/community.component.spec.ts

@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CommunityComponent } from './community.component';
+
+describe('CommunityComponent', () => {
+  let component: CommunityComponent;
+  let fixture: ComponentFixture<CommunityComponent>;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({
+      declarations: [CommunityComponent]
+    });
+    fixture = TestBed.createComponent(CommunityComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 84 - 0
app-angular/src/modules/lesson/community/community.component.ts

@@ -0,0 +1,84 @@
+import { Component, OnInit, ViewChild, ElementRef, Renderer2 } from '@angular/core';
+import { Router } from '@angular/router';
+import * as Parse from "parse";
+@Component({
+  selector: 'app-community',
+  templateUrl: './community.component.html',
+  styleUrls: ['./community.component.scss'],
+})
+export class CommunityComponent implements OnInit {
+  scienceList: Array<Parse.Object> = [];
+  recommendList: Array<Parse.Object> = [];
+  attentionList: Array<Parse.Object> = [];
+  startX: number = 0;
+  currentX: number = 0;
+  isDragging: boolean = false;
+  minTranslateX: number = 0; // 最小平移距离
+  maxTranslateX: number = 0;
+  @ViewChild('carousel', { static: true }) carousel!: ElementRef;
+  cate: string = 'all';
+  constructor(private router: Router, private renderer: Renderer2) {
+    this.initPage();
+  }
+  ngOnInit(): void {
+    this.renderer.listen(this.carousel.nativeElement, 'touchstart', this.onTouchStart.bind(this));
+    this.renderer.listen(this.carousel.nativeElement, 'touchmove', this.onTouchMove.bind(this));
+    this.renderer.listen(this.carousel.nativeElement, 'touchend', this.onTouchEnd.bind(this));
+  }
+  async initPage() {
+    this.scienceList = await this.getScienceData();
+    this.recommendList = await this.getRecommendData();
+    this.attentionList = await this.getAttentionData();
+    // 设置最大最小平移距离
+    this.maxTranslateX = this.carousel.nativeElement.offsetWidth - window.innerWidth;
+  }
+  async getScienceData() {
+    let query = new Parse.Query("HrmScience");
+    let list = await query.find();
+    return list;
+  }
+  async getRecommendData() {
+    let query = new Parse.Query("HrmRecommend");
+    let list = await query.find();
+    return list;
+  }
+  async getAttentionData() {
+    let query = new Parse.Query("HrmAttention");
+    let list = await query.find();
+    return list;
+  }
+  goScienceDetail(science: Parse.Object) {
+    this.router.navigate(["/lesson/community/scienceDetail"], {
+      queryParams: science
+    });
+  }
+  goRecommendDetail(recommend: Parse.Object) {
+    this.router.navigate(["/lesson/community/recommendDetail"], {
+      queryParams: recommend
+    });
+  }
+  goAttentionDetail(attention: Parse.Object) {
+    this.router.navigate(["/lesson/community/attentionDetail"], {
+      queryParams: attention
+    });
+  }
+  onTouchStart(event: TouchEvent): void {
+    this.startX = event.touches[0].clientX;
+    this.isDragging = true;
+  }
+  onTouchMove(event: TouchEvent): void {
+    if (this.carousel && this.isDragging) {
+        const touch = event.touches[0];
+        const deltaX = touch.clientX - this.startX;
+        this.currentX = this.currentX + deltaX;
+        // 限制平移范围在最大最小值之间
+        this.currentX = Math.max(this.minTranslateX, Math.min(this.maxTranslateX, this.currentX));
+
+        this.renderer.setStyle(this.carousel.nativeElement, 'transform', `translateX(${-this.currentX}px)`);
+        this.startX = touch.clientX;
+    }
+}
+  onTouchEnd(): void {
+    this.isDragging = false;
+  }
+}

+ 23 - 0
app-angular/src/modules/lesson/community/community.module.ts

@@ -0,0 +1,23 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { IonicModule } from '@ionic/angular';
+
+import { CommunityRoutingModule } from './community-routing.module';
+
+@NgModule({
+
+    declarations: [
+       
+    ],
+    imports: [
+        CommonModule,
+        CommunityRoutingModule,
+        FormsModule,
+        IonicModule
+    ]
+})
+
+export class community {
+
+}

+ 0 - 0
app-angular/src/modules/contact/contact-detail/contact-detail.page.html → app-angular/src/modules/lesson/contact-detail/contact-detail.component.html


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません