浏览代码

init:web3-0210427

林财明 1 年之前
父节点
当前提交
40e0aa978a
共有 62 个文件被更改,包括 677 次插入283 次删除
  1. 0 0
      app-angular/.editorconfig
  2. 0 0
      app-angular/.gitignore
  3. 0 0
      app-angular/.vscode/extensions.json
  4. 0 0
      app-angular/.vscode/launch.json
  5. 0 0
      app-angular/.vscode/tasks.json
  6. 1 1
      app-angular/README.md
  7. 7 7
      app-angular/angular.json
  8. 128 128
      app-angular/package-lock.json
  9. 1 1
      app-angular/package.json
  10. 2 1
      app-angular/src/app/app-routing.module.ts
  11. 12 0
      app-angular/src/app/app.component.html
  12. 42 0
      app-angular/src/app/app.component.scss
  13. 3 3
      app-angular/src/app/app.component.spec.ts
  14. 0 0
      app-angular/src/app/app.component.ts
  15. 0 0
      app-angular/src/app/app.module.ts
  16. 0 0
      app-angular/src/assets/.gitkeep
  17. 0 0
      app-angular/src/favicon.ico
  18. 1 1
      app-angular/src/index.html
  19. 0 0
      app-angular/src/main.ts
  20. 6 0
      app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.html
  21. 9 0
      app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.scss
  22. 21 0
      app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.spec.ts
  23. 12 0
      app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.ts
  24. 4 0
      app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.html
  25. 10 0
      app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.scss
  26. 21 0
      app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.spec.ts
  27. 13 0
      app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.ts
  28. 5 0
      app-angular/src/modules/lesson/detail/detail.component.html
  29. 0 0
      app-angular/src/modules/lesson/detail/detail.component.scss
  30. 0 0
      app-angular/src/modules/lesson/detail/detail.component.spec.ts
  31. 19 0
      app-angular/src/modules/lesson/detail/detail.component.ts
  32. 51 0
      app-angular/src/modules/lesson/home/home.component.html
  33. 75 0
      app-angular/src/modules/lesson/home/home.component.scss
  34. 0 0
      app-angular/src/modules/lesson/home/home.component.spec.ts
  35. 30 0
      app-angular/src/modules/lesson/home/home.component.ts
  36. 13 2
      app-angular/src/modules/lesson/lesson-routing.module.ts
  37. 32 0
      app-angular/src/modules/lesson/lesson.module.ts
  38. 5 0
      app-angular/src/modules/lesson/page-mine/page-mine.component.html
  39. 0 0
      app-angular/src/modules/lesson/page-mine/page-mine.component.scss
  40. 21 0
      app-angular/src/modules/lesson/page-mine/page-mine.component.spec.ts
  41. 10 0
      app-angular/src/modules/lesson/page-mine/page-mine.component.ts
  42. 1 0
      app-angular/src/modules/lesson/page-student-detail/page-student-detail.component.html
  43. 0 0
      app-angular/src/modules/lesson/page-student-detail/page-student-detail.component.scss
  44. 21 0
      app-angular/src/modules/lesson/page-student-detail/page-student-detail.component.spec.ts
  45. 10 0
      app-angular/src/modules/lesson/page-student-detail/page-student-detail.component.ts
  46. 7 0
      app-angular/src/modules/lesson/page-student/page-student.component.html
  47. 0 0
      app-angular/src/modules/lesson/page-student/page-student.component.scss
  48. 21 0
      app-angular/src/modules/lesson/page-student/page-student.component.spec.ts
  49. 63 0
      app-angular/src/modules/lesson/page-student/page-student.component.ts
  50. 0 0
      app-angular/src/modules/user/user-routing.module.ts
  51. 0 0
      app-angular/src/modules/user/user.module.ts
  52. 0 0
      app-angular/src/styles.scss
  53. 0 0
      app-angular/tsconfig.app.json
  54. 0 0
      app-angular/tsconfig.json
  55. 0 0
      app-angular/tsconfig.spec.json
  56. 0 63
      nova-angular/src/app/app.component.html
  57. 0 32
      nova-angular/src/app/app.component.scss
  58. 0 1
      nova-angular/src/modules/lesson/detail/detail.component.html
  59. 0 10
      nova-angular/src/modules/lesson/detail/detail.component.ts
  60. 0 1
      nova-angular/src/modules/lesson/home/home.component.html
  61. 0 10
      nova-angular/src/modules/lesson/home/home.component.ts
  62. 0 22
      nova-angular/src/modules/lesson/lesson.module.ts

+ 0 - 0
nova-angular/.editorconfig → app-angular/.editorconfig


+ 0 - 0
nova-angular/.gitignore → app-angular/.gitignore


+ 0 - 0
nova-angular/.vscode/extensions.json → app-angular/.vscode/extensions.json


+ 0 - 0
nova-angular/.vscode/launch.json → app-angular/.vscode/launch.json


+ 0 - 0
nova-angular/.vscode/tasks.json → app-angular/.vscode/tasks.json


+ 1 - 1
nova-angular/README.md → app-angular/README.md

@@ -1,4 +1,4 @@
-# NovaAngular
+# AppAngular
 
 This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 16.2.2.
 

+ 7 - 7
nova-angular/angular.json → app-angular/angular.json

@@ -3,7 +3,7 @@
   "version": 1,
   "newProjectRoot": "projects",
   "projects": {
-    "nova-angular": {
+    "app-angular": {
       "projectType": "application",
       "schematics": {
         "@schematics/angular:component": {
@@ -17,7 +17,7 @@
         "build": {
           "builder": "@angular-devkit/build-angular:browser",
           "options": {
-            "outputPath": "dist/nova-angular",
+            "outputPath": "dist/app-angular",
             "index": "src/index.html",
             "main": "src/main.ts",
             "polyfills": [
@@ -31,7 +31,7 @@
             ],
             "styles": [
               "src/styles.scss"
-            ],
+         ],
             "scripts": []
           },
           "configurations": {
@@ -65,10 +65,10 @@
           "builder": "@angular-devkit/build-angular:dev-server",
           "configurations": {
             "production": {
-              "browserTarget": "nova-angular:build:production"
+              "browserTarget": "app-angular:build:production"
             },
             "development": {
-              "browserTarget": "nova-angular:build:development"
+              "browserTarget": "app-angular:build:development"
             }
           },
           "defaultConfiguration": "development"
@@ -76,7 +76,7 @@
         "extract-i18n": {
           "builder": "@angular-devkit/build-angular:extract-i18n",
           "options": {
-            "browserTarget": "nova-angular:build"
+            "browserTarget": "app-angular:build"
           }
         },
         "test": {
@@ -102,6 +102,6 @@
     }
   },
   "cli": {
-    "analytics": "be7830c7-3a59-4a80-a264-4f091dbe1010"
+    "analytics": "bb6bc101-16ac-4c9b-b6d5-21ccaef3df93"
   }
 }

+ 128 - 128
nova-angular/package-lock.json → app-angular/package-lock.json

@@ -1,11 +1,11 @@
 {
-  "name": "nova-angular",
+  "name": "app-angular",
   "version": "0.0.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
-      "name": "nova-angular",
+      "name": "app-angular",
       "version": "0.0.0",
       "dependencies": {
         "@angular/animations": "^16.2.0",
@@ -48,12 +48,12 @@
       }
     },
     "node_modules/@angular-devkit/architect": {
-      "version": "0.1602.2",
-      "resolved": "https://registry.npmmirror.com/@angular-devkit/architect/-/architect-0.1602.2.tgz",
-      "integrity": "sha512-JFIeKKW7V2+/C8+pTReM6gfQkVU9l1IR1OCb9vvHWTRvuTr7E5h2L1rUInnmLiRWkEvkYfG29B+UPpYlkVl9oQ==",
+      "version": "0.1602.3",
+      "resolved": "https://registry.npmmirror.com/@angular-devkit/architect/-/architect-0.1602.3.tgz",
+      "integrity": "sha512-7f4U5LzAYRcQcOvRJwunSwLd5/nwbNxY/E4jTgwFxCNvCBSMysNJBi3g9v0t8zm2XYOv4ok5eYqIwriXVypRBg==",
       "dev": true,
       "dependencies": {
-        "@angular-devkit/core": "16.2.2",
+        "@angular-devkit/core": "16.2.3",
         "rxjs": "7.8.1"
       },
       "engines": {
@@ -63,15 +63,15 @@
       }
     },
     "node_modules/@angular-devkit/build-angular": {
-      "version": "16.2.2",
-      "resolved": "https://registry.npmmirror.com/@angular-devkit/build-angular/-/build-angular-16.2.2.tgz",
-      "integrity": "sha512-j2lni4mN6NaMLT85sJUPSz/pNuaTCAYG3EYUeuMRNkC5keH/f4W0Tiuq6DxY4OLEF1JnEnfkp+k0Z84mEti/xA==",
+      "version": "16.2.3",
+      "resolved": "https://registry.npmmirror.com/@angular-devkit/build-angular/-/build-angular-16.2.3.tgz",
+      "integrity": "sha512-GQo14ui3jGBa3ORslO9AcNLCmLuV6EohFk7KbHMTpTY1267z3kdkJfUXhwPKTYQX4ZvQZK2lHLMrSjpFQ5vtOQ==",
       "dev": true,
       "dependencies": {
         "@ampproject/remapping": "2.2.1",
-        "@angular-devkit/architect": "0.1602.2",
-        "@angular-devkit/build-webpack": "0.1602.2",
-        "@angular-devkit/core": "16.2.2",
+        "@angular-devkit/architect": "0.1602.3",
+        "@angular-devkit/build-webpack": "0.1602.3",
+        "@angular-devkit/core": "16.2.3",
         "@babel/core": "7.22.9",
         "@babel/generator": "7.22.9",
         "@babel/helper-annotate-as-pure": "7.22.5",
@@ -83,7 +83,7 @@
         "@babel/runtime": "7.22.6",
         "@babel/template": "7.22.5",
         "@discoveryjs/json-ext": "0.5.7",
-        "@ngtools/webpack": "16.2.2",
+        "@ngtools/webpack": "16.2.3",
         "@vitejs/plugin-basic-ssl": "1.0.1",
         "ansi-colors": "4.1.3",
         "autoprefixer": "10.4.14",
@@ -191,12 +191,12 @@
       "dev": true
     },
     "node_modules/@angular-devkit/build-webpack": {
-      "version": "0.1602.2",
-      "resolved": "https://registry.npmmirror.com/@angular-devkit/build-webpack/-/build-webpack-0.1602.2.tgz",
-      "integrity": "sha512-V9+tsBgNrXJPeabq9vJzN3Cfz9joaNOxs6l6M4XItcMGmAtzvxxGZ7qS5uRH1RE+SOMpYyh9uPY4QMHRNRD/gA==",
+      "version": "0.1602.3",
+      "resolved": "https://registry.npmmirror.com/@angular-devkit/build-webpack/-/build-webpack-0.1602.3.tgz",
+      "integrity": "sha512-ls2aC7UvM748f/UqCDNsz9apWb4ArAKHtJ1Jwxx1DUQo+qT4c9/8WpiqxgTNkZTjCZbZZG1Ojub/rviw9Y88lA==",
       "dev": true,
       "dependencies": {
-        "@angular-devkit/architect": "0.1602.2",
+        "@angular-devkit/architect": "0.1602.3",
         "rxjs": "7.8.1"
       },
       "engines": {
@@ -210,9 +210,9 @@
       }
     },
     "node_modules/@angular-devkit/core": {
-      "version": "16.2.2",
-      "resolved": "https://registry.npmmirror.com/@angular-devkit/core/-/core-16.2.2.tgz",
-      "integrity": "sha512-6H4FsvP3rLJaGiWpIhCFPS7ZeNoM4sSrnFtRhhecu6s7MidzE4aqzuGdzJpzLammw1KL+DuTlN0gpLtM1Bvcwg==",
+      "version": "16.2.3",
+      "resolved": "https://registry.npmmirror.com/@angular-devkit/core/-/core-16.2.3.tgz",
+      "integrity": "sha512-oZLdg2XTx7likYAXRj1CU0XmrsCfe5f2grj3iwuI3OB1LXwwpdbHBztruj03y3yHES+TnO+dIbkvRnvMXs7uAA==",
       "dev": true,
       "dependencies": {
         "ajv": "8.12.0",
@@ -237,12 +237,12 @@
       }
     },
     "node_modules/@angular-devkit/schematics": {
-      "version": "16.2.2",
-      "resolved": "https://registry.npmmirror.com/@angular-devkit/schematics/-/schematics-16.2.2.tgz",
-      "integrity": "sha512-KeXIlibVrQEwIKbR9GViLKc3m1SXi/xuSXgIvSv+22FNu5i91ScsAhYLe65sDUL6m6MM1XQQMS46XN1Z9bRqQw==",
+      "version": "16.2.3",
+      "resolved": "https://registry.npmmirror.com/@angular-devkit/schematics/-/schematics-16.2.3.tgz",
+      "integrity": "sha512-+lBiHxi/C9HCfiCbtW25DldwvJDXXXv5oWw+Tg4s18BO/lYZLveGUEaZWu9ZJ5VIJ8GliUi2LohxhDxBkh4Oxg==",
       "dev": true,
       "dependencies": {
-        "@angular-devkit/core": "16.2.2",
+        "@angular-devkit/core": "16.2.3",
         "jsonc-parser": "3.2.0",
         "magic-string": "0.30.1",
         "ora": "5.4.1",
@@ -255,9 +255,9 @@
       }
     },
     "node_modules/@angular/animations": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/animations/-/animations-16.2.5.tgz",
-      "integrity": "sha512-2reD50S9zWvhewRvwl320iuRICN9s0fI+3nKULlwcyJ0praLRhJ1SnaAK3NEEu7MWo3n9sb3iVTzA6S9qZRJ4g==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/animations/-/animations-16.2.6.tgz",
+      "integrity": "sha512-NHnHdZFKLr1PB8RhscjsE/DMSVHhtjCqc3bhtOiOMYfAgm4nYrSFvp6nAaT5OoMTeAWuM0n8/HvAiFweEQgVQA==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -265,19 +265,19 @@
         "node": "^16.14.0 || >=18.10.0"
       },
       "peerDependencies": {
-        "@angular/core": "16.2.5"
+        "@angular/core": "16.2.6"
       }
     },
     "node_modules/@angular/cli": {
-      "version": "16.2.2",
-      "resolved": "https://registry.npmmirror.com/@angular/cli/-/cli-16.2.2.tgz",
-      "integrity": "sha512-PmhR/NMVVCiATXxHLkVCV781Q5aa5DaYye9+plZGX3rdKTilEunRNIfT13w7IuRfa0K/pKZj6PJU1S6yb7sqZg==",
+      "version": "16.2.3",
+      "resolved": "https://registry.npmmirror.com/@angular/cli/-/cli-16.2.3.tgz",
+      "integrity": "sha512-XYewIme6CPxgyK9A4aBDUOwv88h8RHwCeLxuBQcOYY2kVhWIiQjFwdkODQPG0WZkRZxtwXk6wErIO80Nz1K8BA==",
       "dev": true,
       "dependencies": {
-        "@angular-devkit/architect": "0.1602.2",
-        "@angular-devkit/core": "16.2.2",
-        "@angular-devkit/schematics": "16.2.2",
-        "@schematics/angular": "16.2.2",
+        "@angular-devkit/architect": "0.1602.3",
+        "@angular-devkit/core": "16.2.3",
+        "@angular-devkit/schematics": "16.2.3",
+        "@schematics/angular": "16.2.3",
         "@yarnpkg/lockfile": "1.1.0",
         "ansi-colors": "4.1.3",
         "ini": "4.1.1",
@@ -303,9 +303,9 @@
       }
     },
     "node_modules/@angular/common": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/common/-/common-16.2.5.tgz",
-      "integrity": "sha512-MCPSZfPXTEqdkswPczivwjqV117YeVjObtyxZsDAwrTZHzYBtfQreQG1XJ1IRRgDncznP6ke0mdH9LyD2LgZKQ==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/common/-/common-16.2.6.tgz",
+      "integrity": "sha512-BjnahvtJHh2zXfCZjpWit+zMkggl/PrgUtPd02egzLmEKyXIMmQLYNpDZ+Pqgpb7eefU8yBPhL7WA2oKFjHjSg==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -313,14 +313,14 @@
         "node": "^16.14.0 || >=18.10.0"
       },
       "peerDependencies": {
-        "@angular/core": "16.2.5",
+        "@angular/core": "16.2.6",
         "rxjs": "^6.5.3 || ^7.4.0"
       }
     },
     "node_modules/@angular/compiler": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/compiler/-/compiler-16.2.5.tgz",
-      "integrity": "sha512-DpLfWWZFk4lbr81W7sLRt15+/nbyyqTvz+UmGcrSfKBTSbV0VSoUjC3XZeIdPWoIgQXiKUCpaC0YXw0BjaOl0g==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/compiler/-/compiler-16.2.6.tgz",
+      "integrity": "sha512-FKv9isn8BdM9TydyhdqcFhFD8nn11+fGqg3qbIQnOlnLb0ryYign93zBmlx/qFu46PvPtTmhsa4saE2NwvrSbg==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -328,7 +328,7 @@
         "node": "^16.14.0 || >=18.10.0"
       },
       "peerDependencies": {
-        "@angular/core": "16.2.5"
+        "@angular/core": "16.2.6"
       },
       "peerDependenciesMeta": {
         "@angular/core": {
@@ -337,9 +337,9 @@
       }
     },
     "node_modules/@angular/compiler-cli": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/compiler-cli/-/compiler-cli-16.2.5.tgz",
-      "integrity": "sha512-6TtyFxro4iukVXhLlzxz7sVCMfAlNQhSYnizIJRSW31uQ0Uku8rjlUmX1tCAmhW6CacLumiz2tcy04Xn/QFWyw==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/compiler-cli/-/compiler-cli-16.2.6.tgz",
+      "integrity": "sha512-rzyI4dKVj8T9dCnZCIffoxZ2PplYLmC9yd65VoaKxOQFxf/95/hgIRdt5kafjnZvzFN1qUbQuEfyviY+KFdQKg==",
       "dev": true,
       "dependencies": {
         "@babel/core": "7.22.5",
@@ -360,7 +360,7 @@
         "node": "^16.14.0 || >=18.10.0"
       },
       "peerDependencies": {
-        "@angular/compiler": "16.2.5",
+        "@angular/compiler": "16.2.6",
         "typescript": ">=4.9.3 <5.2"
       }
     },
@@ -400,9 +400,9 @@
       }
     },
     "node_modules/@angular/core": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/core/-/core-16.2.5.tgz",
-      "integrity": "sha512-Po2LMUnPg23D2qI7EYaoA4x3lRswx9nxfpwROzfFPbMNJ3JVbTK0HkTD2dFPGxRua2UjfJTb1um23tEGO4OGMQ==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/core/-/core-16.2.6.tgz",
+      "integrity": "sha512-F7kJbkVHLupdVQbwjjEuWp5rtxmfnL571VtqRN/8OJZAI2OjZjnSbL+FRZGEZHDmOZ2cNgPKpYt/d3nbK8hpSw==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -415,9 +415,9 @@
       }
     },
     "node_modules/@angular/forms": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/forms/-/forms-16.2.5.tgz",
-      "integrity": "sha512-iYJImRji1OiYIcC2mDBcXhtvPfAoEGT+HqZpivu+/ZPLuf+QegC9+ktJw90SQXR+xccmpkUb9MsJ52SN2MgkPA==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/forms/-/forms-16.2.6.tgz",
+      "integrity": "sha512-TsSpV6Oh0Z5WlCmRB6jEsChLA8ChBn8CY1uOkTh4YQEzdMCwvBvc1Q2DugER5iGvZU/hRNgjyHX7VR3ysB3JlQ==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -425,16 +425,16 @@
         "node": "^16.14.0 || >=18.10.0"
       },
       "peerDependencies": {
-        "@angular/common": "16.2.5",
-        "@angular/core": "16.2.5",
-        "@angular/platform-browser": "16.2.5",
+        "@angular/common": "16.2.6",
+        "@angular/core": "16.2.6",
+        "@angular/platform-browser": "16.2.6",
         "rxjs": "^6.5.3 || ^7.4.0"
       }
     },
     "node_modules/@angular/platform-browser": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/platform-browser/-/platform-browser-16.2.5.tgz",
-      "integrity": "sha512-p+1GH/M4Vwoyp7brKkNBcMTxscoZxA1zehetFlNr8kArXWiISgPolyqOVzvT6cycYKu5uSRLnvHOTDss6xrAuA==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/platform-browser/-/platform-browser-16.2.6.tgz",
+      "integrity": "sha512-jXtarSZ/n6ytZQ9+Y0aDuazz5POz4UmLN3GxIWtc4kqPOQp4o3DCM16Ig4ioSm53Z/WSDASVaMwtRWN5SXCKfw==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -442,9 +442,9 @@
         "node": "^16.14.0 || >=18.10.0"
       },
       "peerDependencies": {
-        "@angular/animations": "16.2.5",
-        "@angular/common": "16.2.5",
-        "@angular/core": "16.2.5"
+        "@angular/animations": "16.2.6",
+        "@angular/common": "16.2.6",
+        "@angular/core": "16.2.6"
       },
       "peerDependenciesMeta": {
         "@angular/animations": {
@@ -453,9 +453,9 @@
       }
     },
     "node_modules/@angular/platform-browser-dynamic": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.5.tgz",
-      "integrity": "sha512-kzC4z/KmLss8Du9uM1Q16r+3EqDExKKHnrb3G3tuEQ1jTvYCysdWoooVSBmtIlQUw13znpBm1B7XLoyviFvnwA==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.6.tgz",
+      "integrity": "sha512-i3prfdjnOMMemQMLk7vywGueDsjRIcug+jNf4ZdSb4AEaAhv86mzt5z3iNNSSA3bec7oJfrxOayMz3o6zq3QXA==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -463,16 +463,16 @@
         "node": "^16.14.0 || >=18.10.0"
       },
       "peerDependencies": {
-        "@angular/common": "16.2.5",
-        "@angular/compiler": "16.2.5",
-        "@angular/core": "16.2.5",
-        "@angular/platform-browser": "16.2.5"
+        "@angular/common": "16.2.6",
+        "@angular/compiler": "16.2.6",
+        "@angular/core": "16.2.6",
+        "@angular/platform-browser": "16.2.6"
       }
     },
     "node_modules/@angular/router": {
-      "version": "16.2.5",
-      "resolved": "https://registry.npmmirror.com/@angular/router/-/router-16.2.5.tgz",
-      "integrity": "sha512-5IXhe6G7zYFUwHSfUgPw+I/q6M1AcfSyaOVcjMFQ94bVSWEMq5KrGCDc8HQtkdw7GqJ4txwbyQKSKp7khpqShQ==",
+      "version": "16.2.6",
+      "resolved": "https://registry.npmmirror.com/@angular/router/-/router-16.2.6.tgz",
+      "integrity": "sha512-huORA6D1UriaswbvVgfxpYQJofZ3hSDdJYRMI4lDcu1n6CaCoYnj8E3rqaU5U1Va0OeFmxzOuXG+3WyL+YfZgg==",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -480,9 +480,9 @@
         "node": "^16.14.0 || >=18.10.0"
       },
       "peerDependencies": {
-        "@angular/common": "16.2.5",
-        "@angular/core": "16.2.5",
-        "@angular/platform-browser": "16.2.5",
+        "@angular/common": "16.2.6",
+        "@angular/core": "16.2.6",
+        "@angular/platform-browser": "16.2.6",
         "rxjs": "^6.5.3 || ^7.4.0"
       }
     },
@@ -2822,9 +2822,9 @@
       "dev": true
     },
     "node_modules/@ngtools/webpack": {
-      "version": "16.2.2",
-      "resolved": "https://registry.npmmirror.com/@ngtools/webpack/-/webpack-16.2.2.tgz",
-      "integrity": "sha512-BDZ2yyXdzVE8kILOM0lhRpmKlvfLMluuZvqVa1r5dHkjCLbyOo1jXoYTCXvrQ2JU5GXc/MBBLXwmIHgtPWk8/A==",
+      "version": "16.2.3",
+      "resolved": "https://registry.npmmirror.com/@ngtools/webpack/-/webpack-16.2.3.tgz",
+      "integrity": "sha512-GkMGYMXL2tyxjjh7plKOFptJJPU2arzxLsYZs706InOJKmM9pE9prz//LohSdcXiPAw+S3Qfsc27k/VqNdKJxA==",
       "dev": true,
       "engines": {
         "node": "^16.14.0 || >=18.10.0",
@@ -3021,13 +3021,13 @@
       }
     },
     "node_modules/@schematics/angular": {
-      "version": "16.2.2",
-      "resolved": "https://registry.npmmirror.com/@schematics/angular/-/angular-16.2.2.tgz",
-      "integrity": "sha512-OqPhpodkQx9pzSz7H2AGeEbf3ut6WOkJFP2YlX2JIGholfG/0FQMJmfTEyRoFXCBeVIDGt3sOmlfK7An0PS8uA==",
+      "version": "16.2.3",
+      "resolved": "https://registry.npmmirror.com/@schematics/angular/-/angular-16.2.3.tgz",
+      "integrity": "sha512-QZOh6iH3BQo4azmqGIoydW95KuxTGezTXl+cfekr4ru5IJ7FqCwrg4wQKWD8/3FkxakXjAFdqsWhlxn1kGtyqw==",
       "dev": true,
       "dependencies": {
-        "@angular-devkit/core": "16.2.2",
-        "@angular-devkit/schematics": "16.2.2",
+        "@angular-devkit/core": "16.2.3",
+        "@angular-devkit/schematics": "16.2.3",
         "jsonc-parser": "3.2.0"
       },
       "engines": {
@@ -3196,9 +3196,9 @@
       }
     },
     "node_modules/@types/eslint": {
-      "version": "8.44.2",
-      "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.44.2.tgz",
-      "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==",
+      "version": "8.44.3",
+      "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.44.3.tgz",
+      "integrity": "sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==",
       "dev": true,
       "dependencies": {
         "@types/estree": "*",
@@ -3206,9 +3206,9 @@
       }
     },
     "node_modules/@types/eslint-scope": {
-      "version": "3.7.4",
-      "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz",
-      "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==",
+      "version": "3.7.5",
+      "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.5.tgz",
+      "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==",
       "dev": true,
       "dependencies": {
         "@types/eslint": "*",
@@ -3216,15 +3216,15 @@
       }
     },
     "node_modules/@types/estree": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz",
-      "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.2.tgz",
+      "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==",
       "dev": true
     },
     "node_modules/@types/express": {
-      "version": "4.17.17",
-      "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.17.tgz",
-      "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
+      "version": "4.17.18",
+      "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.18.tgz",
+      "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==",
       "dev": true,
       "dependencies": {
         "@types/body-parser": "*",
@@ -3234,9 +3234,9 @@
       }
     },
     "node_modules/@types/express-serve-static-core": {
-      "version": "4.17.36",
-      "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz",
-      "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==",
+      "version": "4.17.37",
+      "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz",
+      "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==",
       "dev": true,
       "dependencies": {
         "@types/node": "*",
@@ -3279,9 +3279,9 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "20.6.3",
-      "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.6.3.tgz",
-      "integrity": "sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA==",
+      "version": "20.6.5",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.6.5.tgz",
+      "integrity": "sha512-2qGq5LAOTh9izcc0+F+dToFigBWiK1phKPt7rNhOqJSr35y8rlIBjDwGtFSgAI6MGIhjwOVNSQZVdJsZJ2uR1w==",
       "dev": true
     },
     "node_modules/@types/qs": {
@@ -3978,13 +3978,13 @@
       }
     },
     "node_modules/babel-plugin-polyfill-corejs3": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz",
-      "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==",
+      "version": "0.8.4",
+      "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz",
+      "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==",
       "dev": true,
       "dependencies": {
         "@babel/helper-define-polyfill-provider": "^0.4.2",
-        "core-js-compat": "^3.31.0"
+        "core-js-compat": "^3.32.2"
       },
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -4144,15 +4144,15 @@
       "dev": true
     },
     "node_modules/browserslist": {
-      "version": "4.21.10",
-      "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.10.tgz",
-      "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
+      "version": "4.21.11",
+      "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.11.tgz",
+      "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==",
       "dev": true,
       "dependencies": {
-        "caniuse-lite": "^1.0.30001517",
-        "electron-to-chromium": "^1.4.477",
+        "caniuse-lite": "^1.0.30001538",
+        "electron-to-chromium": "^1.4.526",
         "node-releases": "^2.0.13",
-        "update-browserslist-db": "^1.0.11"
+        "update-browserslist-db": "^1.0.13"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -4228,9 +4228,9 @@
       }
     },
     "node_modules/cacache/node_modules/glob": {
-      "version": "10.3.4",
-      "resolved": "https://registry.npmmirror.com/glob/-/glob-10.3.4.tgz",
-      "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==",
+      "version": "10.3.7",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-10.3.7.tgz",
+      "integrity": "sha512-wCMbE1m9Nx5yD9LYtgsVWq5VhHlk5WzJirw594qZR6AIvQYuHrdDtIktUVjQItalD53y7dqoedu9xP0u0WaxIQ==",
       "dev": true,
       "dependencies": {
         "foreground-child": "^3.1.0",
@@ -4240,7 +4240,7 @@
         "path-scurry": "^1.10.1"
       },
       "bin": {
-        "glob": "dist/cjs/src/bin.js"
+        "glob": "dist/esm/bin.mjs"
       },
       "engines": {
         "node": ">=16 || 14 >=14.17"
@@ -5194,9 +5194,9 @@
       "dev": true
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.525",
-      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz",
-      "integrity": "sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA==",
+      "version": "1.4.528",
+      "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz",
+      "integrity": "sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA==",
       "dev": true
     },
     "node_modules/emoji-regex": {
@@ -9356,9 +9356,9 @@
       }
     },
     "node_modules/read-package-json/node_modules/glob": {
-      "version": "10.3.4",
-      "resolved": "https://registry.npmmirror.com/glob/-/glob-10.3.4.tgz",
-      "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==",
+      "version": "10.3.7",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-10.3.7.tgz",
+      "integrity": "sha512-wCMbE1m9Nx5yD9LYtgsVWq5VhHlk5WzJirw594qZR6AIvQYuHrdDtIktUVjQItalD53y7dqoedu9xP0u0WaxIQ==",
       "dev": true,
       "dependencies": {
         "foreground-child": "^3.1.0",
@@ -9368,7 +9368,7 @@
         "path-scurry": "^1.10.1"
       },
       "bin": {
-        "glob": "dist/cjs/src/bin.js"
+        "glob": "dist/esm/bin.mjs"
       },
       "engines": {
         "node": ">=16 || 14 >=14.17"
@@ -9641,9 +9641,9 @@
       }
     },
     "node_modules/rollup": {
-      "version": "3.29.2",
-      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.2.tgz",
-      "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==",
+      "version": "3.29.3",
+      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.3.tgz",
+      "integrity": "sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg==",
       "dev": true,
       "bin": {
         "rollup": "dist/bin/rollup"
@@ -10908,9 +10908,9 @@
       }
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
-      "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
+      "version": "1.0.13",
+      "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
       "dev": true,
       "dependencies": {
         "escalade": "^3.1.1",

+ 1 - 1
nova-angular/package.json → app-angular/package.json

@@ -1,5 +1,5 @@
 {
-  "name": "nova-angular",
+  "name": "app-angular",
   "version": "0.0.0",
   "scripts": {
     "ng": "ng",

+ 2 - 1
nova-angular/src/app/app-routing.module.ts → app-angular/src/app/app-routing.module.ts

@@ -1,11 +1,12 @@
 import { NgModule } from '@angular/core';
 import { RouterModule, Routes } from '@angular/router';
 
+
 const routes: Routes = [
   {
     path:'lesson',
     loadChildren:()=>import('../modules/lesson/lesson.module').then(m => m.LessonModule)
-  }
+  },
 ];
 
 @NgModule({

文件差异内容过多而无法显示
+ 12 - 0
app-angular/src/app/app.component.html


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

@@ -0,0 +1,42 @@
+
+.bottom-navigation {
+  display: flex;
+  justify-content: space-between;
+  padding: 10px;
+  background-color: #f5f5f5;
+  position: fixed;
+  bottom: 0px;
+  left:0px;
+  width: 90%;
+
+  .tab-button {
+    button {
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      color: #888;
+
+      svg {
+        width: 2em;height: 2em;
+        // width: 24px;
+        // height: 24px;
+        margin-bottom: 5px;
+      }
+      img {
+        width: 24px;
+        height: 24px;
+        margin-bottom: 5px;
+      }
+
+      span {
+        font-size: 12px;
+      }
+    }
+
+    .active {
+      color: #000;
+      font-weight: bold;
+    }
+  }
+}

+ 3 - 3
nova-angular/src/app/app.component.spec.ts → app-angular/src/app/app.component.spec.ts

@@ -14,16 +14,16 @@ describe('AppComponent', () => {
     expect(app).toBeTruthy();
   });
 
-  it(`should have as title 'nova-angular'`, () => {
+  it(`should have as title 'app-angular'`, () => {
     const fixture = TestBed.createComponent(AppComponent);
     const app = fixture.componentInstance;
-    expect(app.title).toEqual('nova-angular');
+    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('nova-angular app is running!');
+    expect(compiled.querySelector('.content span')?.textContent).toContain('app-angular app is running!');
   });
 });

+ 0 - 0
nova-angular/src/app/app.component.ts → app-angular/src/app/app.component.ts


+ 0 - 0
nova-angular/src/app/app.module.ts → app-angular/src/app/app.module.ts


+ 0 - 0
nova-angular/src/assets/.gitkeep → app-angular/src/assets/.gitkeep


+ 0 - 0
nova-angular/src/favicon.ico → app-angular/src/favicon.ico


+ 1 - 1
nova-angular/src/index.html → app-angular/src/index.html

@@ -2,7 +2,7 @@
 <html lang="en">
 <head>
   <meta charset="utf-8">
-  <title>NovaAngular</title>
+  <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">

+ 0 - 0
nova-angular/src/main.ts → app-angular/src/main.ts


+ 6 - 0
app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.html

@@ -0,0 +1,6 @@
+<div class="lesson-card">
+    <h1>{{name}}</h1>
+    <h2>{{author}}</h2>
+    <h1>{{lesson?.name}}</h1>
+    <h2>{{lesson?.author}}</h2>
+</div>

+ 9 - 0
app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.scss

@@ -0,0 +1,9 @@
+.lesson-card{
+    min-height: 80px;
+    width: 80%;
+    border: solid 1px;
+    border-color: black;
+    margin-bottom: 10px;
+    padding: 15px;
+    text-align: center;
+}

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

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

+ 12 - 0
app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.ts

@@ -0,0 +1,12 @@
+import { Component, Input } from '@angular/core';
+
+@Component({
+  selector: 'app-comp-lesson-card',
+  templateUrl: './comp-lesson-card.component.html',
+  styleUrls: ['./comp-lesson-card.component.scss']
+})
+export class CompLessonCardComponent {
+  @Input() name:string = "未命名"
+  @Input() author:string = "未命名"
+  @Input() lesson:any = {}
+}

+ 4 - 0
app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.html

@@ -0,0 +1,4 @@
+<div class="line-button" (click)="showName()"> 
+    {{btName}}
+    <span>></span>
+</div>

+ 10 - 0
app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.scss

@@ -0,0 +1,10 @@
+.line-button{
+    width: 90%;
+    margin-bottom: 5px;
+    border: solid 0.5px;
+    padding:5px;
+    span{
+        float: right;
+        right: 5px;
+    }
+}

+ 21 - 0
app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.spec.ts

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

+ 13 - 0
app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.ts

@@ -0,0 +1,13 @@
+import { Component, Input } from '@angular/core';
+
+@Component({
+  selector: 'app-comp-nav-button',
+  templateUrl: './comp-nav-button.component.html',
+  styleUrls: ['./comp-nav-button.component.scss']
+})
+export class CompNavButtonComponent {
+  @Input("name") btName:string = ""
+  showName(){
+    alert(this.btName);
+  }
+}

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

@@ -0,0 +1,5 @@
+<h1>{{lesson.name}}</h1>
+<h2>作者:{{lesson.author}}</h2>
+<p>
+    描述:{{lesson.desc}}
+</p>

+ 0 - 0
nova-angular/src/modules/lesson/detail/detail.component.scss → app-angular/src/modules/lesson/detail/detail.component.scss


+ 0 - 0
nova-angular/src/modules/lesson/detail/detail.component.spec.ts → app-angular/src/modules/lesson/detail/detail.component.spec.ts


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

@@ -0,0 +1,19 @@
+import { Component } from '@angular/core';
+import { ActivatedRoute } from '@angular/router';
+
+@Component({
+  selector: 'app-detail',
+  templateUrl: './detail.component.html',
+  styleUrls: ['./detail.component.scss']
+})
+export class DetailComponent {
+
+  lesson:any = {}
+  constructor(private route:ActivatedRoute){
+    // 参数接收:通过ActivatedRoute服务,实现查询参数的接收
+    this.route.queryParams.subscribe(params=>{
+      console.log(params)
+      this.lesson = params
+    })
+  }
+}

+ 51 - 0
app-angular/src/modules/lesson/home/home.component.html

@@ -0,0 +1,51 @@
+<div class="page-content">
+    <div class="search-area">
+      <div class="left-component">
+        <select [(ngModel)]="selectedOption">
+          <option value="frontend">大前端</option>
+          <option value="backend">后端开发</option>
+          <option value="mobile">移动开发</option>
+        </select>
+      </div>
+      <div class="right-component">
+        <input type="text" placeholder="搜索课程/技术">
+      </div>
+    </div>
+    <div class="quick-links">
+      <h1>{{lessonName}}</h1>
+
+      <!-- 指令:*ngFor循环指令 *ngIf条件指令 ng-container虚拟DOM容器 -->
+      <ul style="font-size: 36px;">
+        <ng-container *ngFor="let lesson of lessonList;let i = index">
+          <li *ngIf="lesson.isEnabled" (click)="goDetail(lesson)">
+              课程{{i+1}}:{{lesson.name}}
+          </li>
+        </ng-container>
+      </ul>
+
+      <!-- 组件:通过selector标签引用组件,并通过@Input传参,用[]传递变量 -->
+      <ng-container *ngFor="let lesson of lessonList;let i = index">
+        <app-comp-lesson-card [name]="lesson.name" [author]="lesson.author" [lesson]="lesson"
+        *ngIf="lesson.isEnabled" (click)="goDetail(lesson)"></app-comp-lesson-card>
+      </ng-container>
+
+      <!-- 组件:通过selector标签引用组件,并通过@Input传参 -->
+      <app-comp-lesson-card [name]="title"></app-comp-lesson-card>
+      <app-comp-lesson-card [name]="'title123'"></app-comp-lesson-card>
+      <app-comp-lesson-card name="666"></app-comp-lesson-card>
+      <app-comp-lesson-card name="{{title}}"></app-comp-lesson-card>
+      <app-comp-lesson-card></app-comp-lesson-card>
+      <app-comp-lesson-card></app-comp-lesson-card>
+      <app-comp-lesson-card></app-comp-lesson-card>
+      <!-- 添加更多的行 -->
+    </div>
+    <div class="course-area">
+      <div class="filter-tags">
+        <!-- 添加筛选标签 -->
+      </div>
+      <div class="course-list">
+        <!-- 添加课程列表 -->
+      </div>
+    </div>
+  </div>
+  

+ 75 - 0
app-angular/src/modules/lesson/home/home.component.scss

@@ -0,0 +1,75 @@
+.page-content {
+    padding: 20px;
+  }
+  
+  .search-area {
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+  
+    .left-component {
+      select {
+        width: 150px;
+        height: 30px;
+        padding: 5px;
+        border: 1px solid #ccc;
+        border-radius: 4px;
+      }
+    }
+  
+    .right-component {
+      input[type="text"] {
+        width: 200px;
+        height: 30px;
+        padding: 5px;
+        border: 1px solid #ccc;
+        border-radius: 4px;
+      }
+    }
+  }
+  
+  .quick-links {
+    .row {
+      display: flex;
+      flex-wrap: wrap;
+      margin-bottom: 20px;
+  
+      .col {
+        flex: 1 0 20%;
+        max-width: 20%;
+  
+        .quick-link-item {
+          display: flex;
+          flex-direction: column;
+          align-items: center;
+          justify-content: center;
+          text-align: center;
+          margin-bottom: 10px;
+  
+          img {
+            width: 50px;
+            height: 50px;
+          }
+  
+          span {
+            margin-top: 5px;
+          }
+        }
+      }
+    }
+  }
+  
+  .course-area {
+    .filter-tags {
+      display: flex;
+      align-items: center;
+      margin-bottom: 20px;
+  
+      // 添加筛选标签的样式
+    }
+  
+    .course-list {
+      // 添加课程列表的样式
+    }
+  }
+  

+ 0 - 0
nova-angular/src/modules/lesson/home/home.component.spec.ts → app-angular/src/modules/lesson/home/home.component.spec.ts


+ 30 - 0
app-angular/src/modules/lesson/home/home.component.ts

@@ -0,0 +1,30 @@
+import { Component } from '@angular/core';
+import { Router } from '@angular/router';
+
+@Component({
+  selector: 'app-home',
+  templateUrl: './home.component.html',
+  styleUrls: ['./home.component.scss']
+})
+export class HomeComponent {
+  selectedOption: string = 'frontend';
+  title = "临时tittle"
+  constructor(private router:Router){}
+  // 添加其他需要的逻辑和属性
+  lessonName = "Web3.0未来全栈工程师"
+  lessonList = [
+    {name:"大前端",author:"未来全栈", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
+    {name:"微服务",author:"未来全栈", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
+    {name:"数据库",author:"未来全栈", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:false},
+    {name:"人工智能",author:"未来全栈", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
+    {name:"区块链",author:"未来全栈", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:false},
+    {name:"DevOps",author:"未来全栈", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:false},
+  ]
+
+  // 路由传参:通过Router服务,携带查询参数,跳转至课程详情页
+  goDetail(lesson:any){
+    this.router.navigate(["/lesson/detail"],{
+      queryParams:lesson
+    })
+  }
+}

+ 13 - 2
nova-angular/src/modules/lesson/lesson-routing.module.ts → app-angular/src/modules/lesson/lesson-routing.module.ts

@@ -1,8 +1,10 @@
 import { NgModule } from '@angular/core';
 import { RouterModule, Routes } from '@angular/router';
-import { DetailComponent } from './detail/detail.component';
 import { HomeComponent } from './home/home.component';
-
+import { DetailComponent } from './detail/detail.component';
+import { PageMineComponent } from './page-mine/page-mine.component';
+import { PageStudentComponent } from './page-student/page-student.component';
+import { PageStudentDetailComponent } from './page-student-detail/page-student-detail.component';
 
 const routes: Routes = [
   {
@@ -11,6 +13,15 @@ const routes: Routes = [
   {
     path:"detail",component:DetailComponent
   },
+  {
+    path:"mine",component:PageMineComponent
+  },
+  {
+    path:"student",component:PageStudentComponent
+  },
+  {
+    path:"student/detail",component:PageStudentDetailComponent
+  }
 ];
 
 @NgModule({

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

@@ -0,0 +1,32 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+import { LessonRoutingModule } from './lesson-routing.module';
+import { HomeComponent } from './home/home.component';
+import { DetailComponent } from './detail/detail.component';
+import { FormsModule } from '@angular/forms';
+import { PageMineComponent } from './page-mine/page-mine.component';
+import { CompNavButtonComponent } from './comp-nav-button/comp-nav-button.component';
+import { CompLessonCardComponent } from './comp-lesson-card/comp-lesson-card.component';
+import { PageStudentComponent } from './page-student/page-student.component';
+import { PageStudentDetailComponent } from './page-student-detail/page-student-detail.component';
+
+
+
+@NgModule({
+  declarations: [
+    HomeComponent,
+    DetailComponent,
+    PageMineComponent,
+    CompNavButtonComponent,
+    CompLessonCardComponent,
+    PageStudentComponent,
+    PageStudentDetailComponent
+  ],
+  imports: [
+    CommonModule,
+    FormsModule,
+    LessonRoutingModule
+  ]
+})
+export class LessonModule { }

+ 5 - 0
app-angular/src/modules/lesson/page-mine/page-mine.component.html

@@ -0,0 +1,5 @@
+<h1>我的页面</h1>
+
+<app-comp-nav-button name="我的课堂"></app-comp-nav-button>
+<app-comp-nav-button name="我的收藏"></app-comp-nav-button>
+<app-comp-nav-button name="我的浏览"></app-comp-nav-button>

+ 0 - 0
nova-angular/src/modules/lesson/home/home.component.scss → app-angular/src/modules/lesson/page-mine/page-mine.component.scss


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

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

+ 10 - 0
app-angular/src/modules/lesson/page-mine/page-mine.component.ts

@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-page-mine',
+  templateUrl: './page-mine.component.html',
+  styleUrls: ['./page-mine.component.scss']
+})
+export class PageMineComponent {
+
+}

+ 1 - 0
app-angular/src/modules/lesson/page-student-detail/page-student-detail.component.html

@@ -0,0 +1 @@
+<p>page-student-detail works!</p>

+ 0 - 0
app-angular/src/modules/lesson/page-student-detail/page-student-detail.component.scss


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

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

+ 10 - 0
app-angular/src/modules/lesson/page-student-detail/page-student-detail.component.ts

@@ -0,0 +1,10 @@
+import { Component } from '@angular/core';
+
+@Component({
+  selector: 'app-page-student-detail',
+  templateUrl: './page-student-detail.component.html',
+  styleUrls: ['./page-student-detail.component.scss']
+})
+export class PageStudentDetailComponent {
+
+}

+ 7 - 0
app-angular/src/modules/lesson/page-student/page-student.component.html

@@ -0,0 +1,7 @@
+<ul>
+    <ng-container *ngFor="let student of studentList">
+        <li>
+            {{student.name}} / {{student.stuno}}
+        </li>
+    </ng-container>
+</ul>

+ 0 - 0
app-angular/src/modules/lesson/page-student/page-student.component.scss


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

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

+ 63 - 0
app-angular/src/modules/lesson/page-student/page-student.component.ts

@@ -0,0 +1,63 @@
+import { Component } from '@angular/core';
+
+
+interface Student{
+  name:string // 名称
+  stuno:string // 学号
+  gender?:string // 性别
+  age?:number // 年龄
+  signDate?:Date, // 注册时间
+  skills?:Array<string> // 擅长技术
+}
+
+@Component({
+  selector: 'app-page-student',
+  templateUrl: './page-student.component.html',
+  styleUrls: ['./page-student.component.scss']
+})
+export class PageStudentComponent {
+
+
+  studentList:Array<Student> = [
+    {
+      name:"刘聪明", 
+      stuno:"021666001", 
+      gender:"男",
+      age:18,
+      signDate:new Date(), 
+      skills:[
+        "HTML","JS"
+      ]
+    },
+    {
+      name:"王智慧", 
+      stuno:"021666002", 
+      gender:"男",
+      age:19,
+      signDate:new Date(), 
+      skills:[
+        "HTML","JS"
+      ]
+    },
+    {
+      name:"李漂亮", 
+      stuno:"021666003", 
+      gender:"女",
+      age:18,
+      signDate:new Date(), 
+      skills:[
+        "CSS"
+      ]
+    },
+    {
+      name:"钱多多", 
+      stuno:"021666004", 
+      gender:"男",
+      age:21,
+      signDate:new Date(), 
+      skills:[
+        "AIGC"
+      ]
+    },
+  ]
+}

+ 0 - 0
nova-angular/src/modules/user/user-routing.module.ts → app-angular/src/modules/user/user-routing.module.ts


+ 0 - 0
nova-angular/src/modules/user/user.module.ts → app-angular/src/modules/user/user.module.ts


+ 0 - 0
nova-angular/src/styles.scss → app-angular/src/styles.scss


+ 0 - 0
nova-angular/tsconfig.app.json → app-angular/tsconfig.app.json


+ 0 - 0
nova-angular/tsconfig.json → app-angular/tsconfig.json


+ 0 - 0
nova-angular/tsconfig.spec.json → app-angular/tsconfig.spec.json


+ 0 - 63
nova-angular/src/app/app.component.html

@@ -1,63 +0,0 @@
-<router-outlet></router-outlet>
-
-<footer class="bottom-navigation">
-  <div class="page-content">
-    <!-- 搜索区域 -->
-    <div class="search-area">
-      <!-- 左侧技术点选择组件 -->
-      <div class="left-component">
-        <select>
-          <option selected>手艺之窗</option>
-          <!-- 其他技术点选项 -->
-        </select>
-      </div>
-      <!-- 右侧搜索输入框 -->
-      <div class="right-component">
-        <input type="text" placeholder="搜索商品/店铺">
-      </div>
-    </div>
-  
-    <!-- 金刚区 -->
-    <div class="jinguang-area">
-      <div class="row">
-        <div class="jinguang-item">
-          <img src="icon1.png" alt="Icon 1">
-          <span>金刚区元素1</span>
-        </div>
-        <!-- 其他金刚区元素 -->
-      </div>
-      <div class="row">
-        <div class="jinguang-item">
-          <img src="icon6.png" alt="Icon 6">
-          <span>金刚区元素6</span>
-        </div>
-        <!-- 其他金刚区元素 -->
-      </div>
-    </div>
-  
-    <!-- 购物区域 -->
-    <div class="shopping-area">
-      <!-- 筛选标签 -->
-      <div class="filter-tags">
-        <!-- 筛选标签内容 -->
-      </div>
-      <!-- 商品列表 -->
-      <div class="product-list">
-        <!-- 商品列表内容 -->
-      </div>
-    </div>
-  </div>
-  
-  <!-- 底部导航区域 -->
-  <div class="bottom-navigation">
-    <div class="tab-button">
-      <img src="home-icon.png" alt="首页">
-      <span>首页</span>
-    </div>
-    <!-- 其他 Tab 按钮 -->
-    <div class="tab-button">
-      <img src="profile-icon.png" alt="我的">
-      <span>我的</span>
-    </div>
-  </div>
-</footer>

+ 0 - 32
nova-angular/src/app/app.component.scss

@@ -1,32 +0,0 @@
-
-.bottom-navigation {
-    display: flex;
-    justify-content: space-between;
-    padding: 10px;
-    background-color: #f5f5f5;
-  
-    .tab-button {
-      button {
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        justify-content: center;
-        color: #888;
-  
-        img {
-          width: 24px;
-          height: 24px;
-          margin-bottom: 5px;
-        }
-  
-        span {
-          font-size: 12px;
-        }
-      }
-  
-      .active {
-        color: #000;
-        font-weight: bold;
-      }
-    }
-  }

+ 0 - 1
nova-angular/src/modules/lesson/detail/detail.component.html

@@ -1 +0,0 @@
-<p>detail works!</p>

+ 0 - 10
nova-angular/src/modules/lesson/detail/detail.component.ts

@@ -1,10 +0,0 @@
-import { Component } from '@angular/core';
-
-@Component({
-  selector: 'app-detail',
-  templateUrl: './detail.component.html',
-  styleUrls: ['./detail.component.scss']
-})
-export class DetailComponent {
-
-}

+ 0 - 1
nova-angular/src/modules/lesson/home/home.component.html

@@ -1 +0,0 @@
-<p>home works!</p>

+ 0 - 10
nova-angular/src/modules/lesson/home/home.component.ts

@@ -1,10 +0,0 @@
-import { Component } from '@angular/core';
-
-@Component({
-  selector: 'app-home',
-  templateUrl: './home.component.html',
-  styleUrls: ['./home.component.scss']
-})
-export class HomeComponent {
-
-}

+ 0 - 22
nova-angular/src/modules/lesson/lesson.module.ts

@@ -1,22 +0,0 @@
-import { NgModule } from '@angular/core';
-import { CommonModule } from '@angular/common';
-
-import { LessonRoutingModule } from './lesson-routing.module';
-import { HomeComponent } from './home/home.component';
-import { DetailComponent } from './detail/detail.component';
-import { FormsModule } from '@angular/forms';
-
-
-
-@NgModule({
-  declarations: [
-    HomeComponent,
-    DetailComponent
-  ],
-  imports: [
-    CommonModule,
-    FormsModule,
-    LessonRoutingModule
-  ]
-})
-export class LessonModule { }

部分文件因为文件数量过多而无法显示