177 Commits 056c37171b ... 6c1422d93a

Autore SHA1 Messaggio Data
  hid_msrpuwgj56ccf29 6c1422d93a Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 f5a73958b5 a 4 mesi fa
  flowaaa db85ad71c3 c 4 mesi fa
  flowaaa f6c9d85ab9 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa 5a36f8d1b0 c 4 mesi fa
  hid_msrpuwgj56ccf29 87e854ebd0 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 1ca7e82dd0 a 4 mesi fa
  flowaaa 0de637390d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa 5a4f816a79 c 4 mesi fa
  hid_msrpuwgj56ccf29 94a7855954 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 65f2f875ac a 4 mesi fa
  flowaaa e7bab25fa8 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa bcbfedc064 con 4 mesi fa
  hid_msrpuwgj56ccf29 ce1ab14df7 a 4 mesi fa
  hid_msrpuwgj56ccf29 4e9d74f219 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 a241e70128 a 4 mesi fa
  flowaaa 47b037c8fd Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa 696205ede2 c 4 mesi fa
  hid_msrpuwgj56ccf29 45902db574 a 4 mesi fa
  hid_msrpuwgj56ccf29 e65a95fc43 a 4 mesi fa
  hid_msrpuwgj56ccf29 0b1cc5deb2 1 4 mesi fa
  hid_msrpuwgj56ccf29 7096d47098 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 e47b91b366 1 4 mesi fa
  flowaaa 145184d8b5 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa 2051a3331a c 4 mesi fa
  hid_msrpuwgj56ccf29 334a6b44ab 1 4 mesi fa
  hid_msrpuwgj56ccf29 15dbe88452 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 328da53e66 aa 4 mesi fa
  flowaaa e884a45950 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa 947b41525b c 4 mesi fa
  hid_msrpuwgj56ccf29 a20467201d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 54a7c11926 a 4 mesi fa
  flowaaa 6dd7c40e7e Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa 9e80c2daac c 4 mesi fa
  hid_msrpuwgj56ccf29 ecb00c747d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 fe46c6b820 a 4 mesi fa
  flowaaa 55d05a401d c 4 mesi fa
  flowaaa 863f529e90 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa df4607e1d4 con 4 mesi fa
  hid_msrpuwgj56ccf29 fc67e174bf a 4 mesi fa
  hid_msrpuwgj56ccf29 5fd7c51aca a 4 mesi fa
  hid_msrpuwgj56ccf29 03602dd170 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 df91acec5a a 4 mesi fa
  flowaaa 143ed6c19b con 4 mesi fa
  flowaaa a10133b318 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa 0dff2857e9 c 4 mesi fa
  hid_msrpuwgj56ccf29 994450f449 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 858a1be5b2 a 4 mesi fa
  flowaaa 35d75cc753 con 4 mesi fa
  flowaaa d37d1a4108 con 4 mesi fa
  hid_msrpuwgj56ccf29 690765dbaa a 4 mesi fa
  flowaaa 3080ada1e9 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa 4ebe15853a con 4 mesi fa
  hid_msrpuwgj56ccf29 b045810322 a 4 mesi fa
  hid_msrpuwgj56ccf29 64a68c9dcb Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 5c351d653b a 4 mesi fa
  flowaaa 8be2c550d7 con 4 mesi fa
  flowaaa 276be6d7ac Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa f1123978c4 con 4 mesi fa
  hid_msrpuwgj56ccf29 0c7a4e85d2 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 988f23fe23 ycc 4 mesi fa
  flowaaa 750362087f Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa d7e17e573c con 4 mesi fa
  hid_msrpuwgj56ccf29 7e1b3e6d94 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 eb4b1bb5b2 a 4 mesi fa
  flowaaa 0208543433 feat 4 mesi fa
  flowaaa 225eeee08b Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  flowaaa f28e7b13d9 a 4 mesi fa
  hid_msrpuwgj56ccf29 c25bf0e825 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 4 mesi fa
  hid_msrpuwgj56ccf29 b848ba27d3 me 4 mesi fa
  flowaaa a118f4c86e show 4 mesi fa
  flowaaa e7cc63a600 con 4 mesi fa
  flowaaa 01a99a5461 feat 4 mesi fa
  flowaaa 056c37171b Contact 4 mesi fa
  flowaaa 2dc046657e Merge branch 'master' of http://git.fmode.cn:3000/ai/app-gift 4 mesi fa
  flowaaa 675da3df9d register 4 mesi fa
  flowaaa dda6eecea1 提交说明 4 mesi fa
  flowaaa 2d88f03908 feat 5 mesi fa
  flowaaa 76dca94ad0 feat 10 mesi fa
  flowaaa f83f97fb75 feat 10 mesi fa
  flowaaa 9eb33e3198 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa 02206678ae app 10 mesi fa
  hid_msrpuwgj56ccf29 a9383c1561 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 25e7332823 update 10 mesi fa
  flowaaa 682c0c8e9d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa dd44ab8f1a feat 10 mesi fa
  hid_msrpuwgj56ccf29 a0ba97c6a0 update 10 mesi fa
  hid_msrpuwgj56ccf29 2f153f7699 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 dff1317fe6 update 10 mesi fa
  flowaaa 7b5fd226c7 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa 901fd0a411 feat 10 mesi fa
  hid_msrpuwgj56ccf29 96a090ff58 update 10 mesi fa
  hid_msrpuwgj56ccf29 877004396f Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 abeb7a1a7e update 10 mesi fa
  flowaaa 449d07383f feat 10 mesi fa
  hid_msrpuwgj56ccf29 df741ebe90 update 10 mesi fa
  hid_msrpuwgj56ccf29 ff4512ed9c Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 0b742fecb7 update 10 mesi fa
  flowaaa fcdf5f5f99 feat 10 mesi fa
  flowaaa 7c20dddb8a feat 10 mesi fa
  flowaaa eeff1942f3 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa a09a96205c feat 10 mesi fa
  hid_msrpuwgj56ccf29 4382cf2416 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 aecdb9e93c update 10 mesi fa
  flowaaa d6c6ff577c feat 10 mesi fa
  flowaaa cd12680487 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa b8b4c597de feat 10 mesi fa
  hid_msrpuwgj56ccf29 fae480be64 update 10 mesi fa
  hid_msrpuwgj56ccf29 72cdf8b78f update 10 mesi fa
  hid_msrpuwgj56ccf29 a94edcfec3 update 10 mesi fa
  hid_msrpuwgj56ccf29 2331528520 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 9a571bdf64 update 10 mesi fa
  flowaaa 71ece09b74 feat 10 mesi fa
  flowaaa 3394bd9dd4 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa 60fc632304 feat 10 mesi fa
  hid_msrpuwgj56ccf29 b521d61113 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 3496c5d92d update 10 mesi fa
  flowaaa 82241d0d78 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa 5de6552f94 feat 10 mesi fa
  hid_msrpuwgj56ccf29 4d653a6a36 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 d143211250 update 10 mesi fa
  flowaaa af36a950f7 feat 10 mesi fa
  flowaaa cce375e49f Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa 7adcd7d61b feat 10 mesi fa
  hid_msrpuwgj56ccf29 6c30521c84 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 4fc6fd1484 update 10 mesi fa
  flowaaa 953b983aad Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa 84c802bae2 feat 10 mesi fa
  hid_msrpuwgj56ccf29 b1f4fc3f89 update 10 mesi fa
  flowaaa 9cc0af366f feat 10 mesi fa
  flowaaa f8be0582f3 feat 10 mesi fa
  flowaaa 8bba03f3ab feat 10 mesi fa
  flowaaa 488f908a4f feat 10 mesi fa
  flowaaa d11e1b6f8a feat 10 mesi fa
  flowaaa ac6c5c3dc1 feat 10 mesi fa
  flowaaa d270e79b9b feat 10 mesi fa
  flowaaa 642699dc17 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa 68f56e6602 feat 10 mesi fa
  hid_msrpuwgj56ccf29 be643299f5 update 10 mesi fa
  flowaaa a6706a6aa0 feat 10 mesi fa
  flowaaa 7362816694 feat 10 mesi fa
  flowaaa 06a0c86565 feat 10 mesi fa
  hid_msrpuwgj56ccf29 61390a1d2b Merge commit '2e376fb' 10 mesi fa
  hid_msrpuwgj56ccf29 2e376fb53a update 10 mesi fa
  hid_msrpuwgj56ccf29 011c52f660 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 3bbe120c96 update 10 mesi fa
  flowaaa 26930a24c9 feat 10 mesi fa
  flowaaa 837ffbf902 feat 10 mesi fa
  flowaaa 7044c486b7 feat 10 mesi fa
  hid_msrpuwgj56ccf29 75e7c25539 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 d5defe9cfe update 10 mesi fa
  flowaaa 9760ab457d Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  flowaaa fe03d2dde3 update 10 mesi fa
  hid_msrpuwgj56ccf29 8055be6d18 update 10 mesi fa
  hid_msrpuwgj56ccf29 1380a8d256 updata 10 mesi fa
  hid_msrpuwgj56ccf29 235db06ecd update 10 mesi fa
  hid_msrpuwgj56ccf29 8d34a1ec24 Merge branch 'master' of codehub-cn-south-1.devcloud.huaweicloud.com:web3000003/web-0210402 10 mesi fa
  hid_msrpuwgj56ccf29 8527c32b9a update 10 mesi fa
  flowaaa 2885f1a158 update 10 mesi fa
  flowaaa 6d1b999e6f update 10 mesi fa
  hid_msrpuwgj56ccf29 fbd3b90c40 update 10 mesi fa
  hid_msrpuwgj56ccf29 7914fafb9f update 1 anno fa
  hid_msrpuwgj56ccf29 69b107624e update 1 anno fa
  hid_msrpuwgj56ccf29 9a5d15e989 update 1 anno fa
  hid_msrpuwgj56ccf29 23bacad75b update 1 anno fa
  hid_msrpuwgj56ccf29 ddfe3fe9f6 update 1 anno fa
  hid_msrpuwgj56ccf29 8f5acf1152 update 1 anno fa
  hid_msrpuwgj56ccf29 d6589823a7 update 1 anno fa
  hid_msrpuwgj56ccf29 3b73d5aa9b update 1 anno fa
  hid_msrpuwgj56ccf29 b9178033f9 update 1 anno fa
  hid_msrpuwgj56ccf29 11f031d23a update 1 anno fa
  hid_msrpuwgj56ccf29 b27f54179e update 1 anno fa
  hid_msrpuwgj56ccf29 749a3e57da update 1 anno fa
  hid_msrpuwgj56ccf29 e1e80eaac7 update 1 anno fa
  hid_msrpuwgj56ccf29 9b7a2548c8 update 1 anno fa
  hid_msrpuwgj56ccf29 378ab80061 update 1 anno fa
  hid_msrpuwgj56ccf29 5c703d3484 web3-0210402 1 anno fa
100 ha cambiato i file con 1237 aggiunte e 1476 eliminazioni
  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
-  });
-};

File diff suppressed because it is too large
+ 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


Some files were not shown because too many files changed in this diff