焦怡璇 1 ano atrás
pai
commit
c5dc8fbf0e

+ 8 - 1
heartvoice-app/angular.json

@@ -1,4 +1,5 @@
 {
+  
   "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
   "version": 1,
   "newProjectRoot": "projects",
@@ -15,6 +16,7 @@
       "sourceRoot": "src",
       "prefix": "app",
       "architect": {
+        
         "build": {
           "builder": "@angular-devkit/build-angular:browser",
           "options": {
@@ -30,7 +32,9 @@
                 "input": "src/assets",
                 "output": "assets"
               }
+
             ],
+
             "styles": ["src/global.scss", "src/theme/variables.scss"],
             "scripts": []
           },
@@ -83,7 +87,10 @@
               "progress": false
             }
           },
-          "defaultConfiguration": "development"
+          "defaultConfiguration": "development",
+                        "options": {
+                "proxyConfig": "proxy.conf.json"
+              }
         },
         "extract-i18n": {
           "builder": "@angular-devkit/build-angular:extract-i18n",

+ 212 - 11
heartvoice-app/package-lock.json

@@ -17,10 +17,16 @@
         "@angular/platform-browser-dynamic": "^18.0.0",
         "@angular/router": "^18.0.0",
         "@ionic/angular": "^8.0.0",
+        "axios": "^1.7.9",
         "fmode-ng": "^0.0.63",
+        "i18next": "^24.2.0",
+        "i18next-http-backend": "^3.0.1",
         "ionicons": "^7.2.1",
+        "md5": "^2.3.0",
         "rxjs": "~7.8.0",
+        "sentiment": "^5.0.2",
         "tslib": "^2.3.0",
+        "vader-sentiment": "^1.1.3",
         "zone.js": "~0.14.2"
       },
       "devDependencies": {
@@ -6521,6 +6527,12 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+      "license": "MIT"
+    },
     "node_modules/autoprefixer": {
       "version": "10.4.20",
       "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.20.tgz",
@@ -6576,13 +6588,14 @@
       }
     },
     "node_modules/axios": {
-      "version": "0.26.1",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz",
-      "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+      "version": "1.7.9",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz",
+      "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
       "license": "MIT",
-      "peer": true,
       "dependencies": {
-        "follow-redirects": "^1.14.8"
+        "follow-redirects": "^1.15.6",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
       }
     },
     "node_modules/axobject-query": {
@@ -7114,6 +7127,15 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/chokidar": {
       "version": "3.6.0",
       "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
@@ -7376,6 +7398,18 @@
         "node": ">=0.1.90"
       }
     },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "license": "MIT",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
     "node_modules/commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
@@ -7741,6 +7775,15 @@
         "postcss-media-query-parser": "^0.2.3"
       }
     },
+    "node_modules/cross-fetch": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-4.0.0.tgz",
+      "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
+      "license": "MIT",
+      "dependencies": {
+        "node-fetch": "^2.6.12"
+      }
+    },
     "node_modules/cross-spawn": {
       "version": "7.0.6",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -7756,6 +7799,15 @@
         "node": ">= 8"
       }
     },
+    "node_modules/crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmmirror.com/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/crypto-js": {
       "version": "4.2.0",
       "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
@@ -8069,6 +8121,15 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/depd": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
@@ -8284,7 +8345,6 @@
       "version": "0.1.13",
       "resolved": "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz",
       "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-      "dev": true,
       "license": "MIT",
       "optional": true,
       "dependencies": {
@@ -8295,7 +8355,6 @@
       "version": "0.6.3",
       "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
       "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dev": true,
       "license": "MIT",
       "optional": true,
       "dependencies": {
@@ -8678,6 +8737,16 @@
         "node": ">=0.12.7"
       }
     },
+    "node_modules/esdk-obs-browserjs/node_modules/axios": {
+      "version": "0.26.1",
+      "resolved": "https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz",
+      "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "follow-redirects": "^1.14.8"
+      }
+    },
     "node_modules/eslint": {
       "version": "8.57.1",
       "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz",
@@ -9681,6 +9750,20 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/form-data": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz",
+      "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+      "license": "MIT",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/forwarded": {
       "version": "0.2.0",
       "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
@@ -10392,6 +10475,46 @@
         "node": ">=10.18"
       }
     },
+    "node_modules/i18next": {
+      "version": "24.2.0",
+      "resolved": "https://registry.npmmirror.com/i18next/-/i18next-24.2.0.tgz",
+      "integrity": "sha512-ArJJTS1lV6lgKH7yEf4EpgNZ7+THl7bsGxxougPYiXRTJ/Fe1j08/TBpV9QsXCIYVfdE/HWG/xLezJ5DOlfBOA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://locize.com"
+        },
+        {
+          "type": "individual",
+          "url": "https://locize.com/i18next.html"
+        },
+        {
+          "type": "individual",
+          "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.23.2"
+      },
+      "peerDependencies": {
+        "typescript": "^5"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/i18next-http-backend": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/i18next-http-backend/-/i18next-http-backend-3.0.1.tgz",
+      "integrity": "sha512-XT2lYSkbAtDE55c6m7CtKxxrsfuRQO3rUfHzj8ZyRtY9CkIX3aRGwXGTkUhpGWce+J8n7sfu3J0f2wTzo7Lw0A==",
+      "license": "MIT",
+      "dependencies": {
+        "cross-fetch": "4.0.0"
+      }
+    },
     "node_modules/iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -10687,6 +10810,12 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "license": "MIT"
+    },
     "node_modules/is-callable": {
       "version": "1.2.7",
       "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz",
@@ -12565,6 +12694,17 @@
         "speech-rule-engine": "^4.0.6"
       }
     },
+    "node_modules/md5": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/md5/-/md5-2.3.0.tgz",
+      "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "charenc": "0.0.2",
+        "crypt": "0.0.2",
+        "is-buffer": "~1.1.6"
+      }
+    },
     "node_modules/mdurl": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-2.0.0.tgz",
@@ -12778,7 +12918,6 @@
       "version": "1.52.0",
       "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "dev": true,
       "license": "MIT",
       "engines": {
         "node": ">= 0.6"
@@ -12788,7 +12927,6 @@
       "version": "2.1.35",
       "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "dev": true,
       "license": "MIT",
       "dependencies": {
         "mime-db": "1.52.0"
@@ -13293,6 +13431,26 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/node-fetch": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz",
+      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+      "license": "MIT",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/node-forge": {
       "version": "1.3.1",
       "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz",
@@ -14679,6 +14837,12 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+      "license": "MIT"
+    },
     "node_modules/prr": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
@@ -15488,7 +15652,7 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true,
+      "devOptional": true,
       "license": "MIT"
     },
     "node_modules/sass": {
@@ -15694,6 +15858,15 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/sentiment": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmmirror.com/sentiment/-/sentiment-5.0.2.tgz",
+      "integrity": "sha512-ZeC3y0JsOYTdwujt5uOd7ILJNilbgFzUtg/LEG4wUv43LayFNLZ28ec8+Su+h3saHlJmIwYxBzfDHHZuiMA15g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
     "node_modules/serialize-javascript": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
@@ -16836,6 +17009,12 @@
         "node": ">=0.6"
       }
     },
+    "node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+      "license": "MIT"
+    },
     "node_modules/tree-dump": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/tree-dump/-/tree-dump-1.0.2.tgz",
@@ -17052,7 +17231,7 @@
       "version": "5.4.5",
       "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.4.5.tgz",
       "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
-      "dev": true,
+      "devOptional": true,
       "license": "Apache-2.0",
       "bin": {
         "tsc": "bin/tsc",
@@ -17306,6 +17485,12 @@
         "uuid": "dist/bin/uuid"
       }
     },
+    "node_modules/vader-sentiment": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/vader-sentiment/-/vader-sentiment-1.1.3.tgz",
+      "integrity": "sha512-z9ys48I7pd3ngy/YzYDCTcOp6//z96wiXaJnQnuyxiPT3PTU0mWLWVCKvips11S5euvHfXsr0ahsmWT2oeXcUw==",
+      "license": "Apache-2.0"
+    },
     "node_modules/validate-npm-package-license": {
       "version": "3.0.4",
       "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
@@ -17918,6 +18103,12 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+      "license": "BSD-2-Clause"
+    },
     "node_modules/webpack": {
       "version": "5.94.0",
       "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.94.0.tgz",
@@ -18289,6 +18480,16 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "license": "MIT",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
     "node_modules/which": {
       "version": "2.0.2",
       "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",

+ 6 - 0
heartvoice-app/package.json

@@ -22,10 +22,16 @@
     "@angular/platform-browser-dynamic": "^18.0.0",
     "@angular/router": "^18.0.0",
     "@ionic/angular": "^8.0.0",
+    "axios": "^1.7.9",
     "fmode-ng": "^0.0.63",
+    "i18next": "^24.2.0",
+    "i18next-http-backend": "^3.0.1",
     "ionicons": "^7.2.1",
+    "md5": "^2.3.0",
     "rxjs": "~7.8.0",
+    "sentiment": "^5.0.2",
     "tslib": "^2.3.0",
+    "vader-sentiment": "^1.1.3",
     "zone.js": "~0.14.2"
   },
   "devDependencies": {

+ 8 - 0
heartvoice-app/proxy.conf.json

@@ -0,0 +1,8 @@
+{
+    "/api": {
+      "target": "http://api.fanyi.baidu.com",
+      "secure": false,
+      "changeOrigin": true,
+      "logLevel": "debug"
+    }
+  }

+ 166 - 3
heartvoice-app/src/app/report/report.component.ts

@@ -1,5 +1,10 @@
 import { Component, OnInit } from '@angular/core';
 import { ActivatedRoute } from '@angular/router';
+import { Cloudmy } from 'src/lib/ncloud';
+import { CloudUser } from 'src/lib/ncloud';
+import Sentiment from 'sentiment'; // 导入 Sentiment.js
+import axios from 'axios'; // 导入 axios 进行 HTTP 请求
+import md5 from 'md5'; // 导入 md5 库
 
 @Component({
   selector: 'app-report',
@@ -7,18 +12,47 @@ import { ActivatedRoute } from '@angular/router';
   styleUrls: ['./report.component.scss'],
   standalone: true,
 })
-export class ReportComponent  implements OnInit {
+export class ReportComponent implements OnInit {
   data: any; // 用于存储接收到的数据
+  extractedContents: string[] = []; // 用于存储提取的内容
+  translatedText: string = ''; // 用于存储翻译后的文本
+  data1: any; // 用于存储最终的数据
+  data2: any;
+  data3: any;
 
   constructor(private route: ActivatedRoute) {}
 
-  ngOnInit() {
+  async ngOnInit() {
     // 从路由参数中获取数据
-    this.route.params.subscribe(params => {
+    this.route.params.subscribe(async params => {
       if (params['data']) {
         try {
           this.data = JSON.parse(params['data']); // 尝试解析数据
           console.log('成功返回数据:', this.data); // 打印成功消息和接收到的数据
+
+          // 检查第一个数据是否为 'yes'
+          if (this.data.data.data1 === 'yes') {
+            // 如果是 'yes',查询 Userresponse 表获取 mbtiType
+            const currentUser = new CloudUser();
+            const userId = currentUser.toPointer(); // 获取当前用户 ID
+
+            const query = new Cloudmy('Userresponse');
+            query.equalTo('user', userId);
+            query.descending('createdAt'); // 按照 createdAt 降序排列
+            const latestResponse = await query.first(); // 获取最近一次的记录
+
+            // 如果找到记录,赋值给 data1
+            if (latestResponse && latestResponse.mbtiType) {
+              this.data1 = latestResponse.mbtiType;
+              console.log('MBTI 类型:', this.data1);
+            } else {
+              console.log('没有找到 MBTI 类型');
+            }
+          } else {
+            // 如果不是 'yes',将第一个数据赋值给 data1
+            this.data1 = this.data.data.data1;
+            console.log('赋值给 data1 的MBTI 类型:', this.data1);
+          }
         } catch (error) {
           console.error('解析数据时发生错误:', error); // 捕获解析错误
         }
@@ -27,6 +61,135 @@ export class ReportComponent  implements OnInit {
         console.log('没有接收到数据。'); // 打印没有接收到数据的消息
       }
     });
+
+    // 检查第二个数据是否为 'yes'
+    if ( this.data.data.data2 === 'yes') {
+      console.log('否');
+      let currentUser = new CloudUser();
+      let userId = currentUser.toPointer(); // 替换为实际的用户ID
+
+      const query = new Cloudmy('Chat');
+      query.equalTo('user', userId);
+      query.descending('chattime'); // 按照chattime降序排列
+      const latestChat = await query.first(); // 获取最新聊天记录
+
+      if (latestChat && latestChat.content) {
+        this.extractOddIndexedContents(latestChat.content);
+      }
+    } else {
+      // 如果不是 'yes'
+      this.data1 = ""; // 确保 data1 被赋予一个空字符串
+      console.log('否');
+    }
+  }
+
+    private extractOddIndexedContents(contentArray: any[]) {
+    this.extractedContents = contentArray
+      .filter((_, index) => index % 2 === 0) // 过滤出奇数索引的对象
+      .slice(1) // 去掉第一个对象
+      .map(item => item.content); // 提取content的值
+
+    // 明确指定 combinedContent 的类型为 string
+    const combinedContent: string = this.extractedContents.join(' ');
+
+    // 打印合并后的字符串
+    console.log('合并后的内容:', combinedContent);
+
+    // 调用翻译函数
+    this.translateContent(combinedContent);
+  }
+
+  private async translateContent(content: string) {
+    const appid = '20241224002237024'; // 替换为您的百度翻译API的appid
+    const key = 'sNvEvziEi9iu8QxbjjoV'; // 替换为您的百度翻译API的key
+    const salt = (new Date()).getTime();
+    const from = 'zh'; // 源语言
+    const to = 'en'; // 目标语言
+    const sign = md5(appid + content + salt + key); // 生成签名
+
+    try {
+      const response = await axios.get('/api/trans/vip/translate', {
+        params: {
+          q: content,
+          appid: appid,
+          salt: salt,
+          from: from,
+          to: to,
+          sign: sign,
+        },
+      });
+
+      if (response.data && response.data.trans_result) {
+        this.translatedText = response.data.trans_result[0].dst; // 获取翻译后的文本
+        console.log('翻译后的内容:', this.translatedText);
+
+        // 使用 Sentiment.js 进行情感分析
+        this.analyzeSentiment(this.translatedText);
+      }
+    } catch (error) {
+      console.error('翻译失败:', error);
+    }
+  }
+
+  private analyzeSentiment(text: string) {
+    console.log('进行情感分析的文本:', text); 
+    const sentiment = new Sentiment();
+    const result = sentiment.analyze(text);
+
+    // 打印情感得分和分析结果
+    console.log('情感得分:', result.score);
+    console.log('情感分析结果:', result);
+    this.data2 = result.score;
+    this.data3 = result;
   }
 
 }
+
+  //   this.translatedText = this.translateContent(combinedContent); // 翻译合并后的内容
+  //   console.log('翻译结果:', this.translatedText);
+
+  
+
+  // private translateContent(text: string): string {
+  //   // 使用 i18next 进行翻译
+  //   // 这里我们需要将中文内容翻译成英文
+  //   // 由于 i18next.t() 通常用于键值对翻译,我们可以直接返回翻译的内容
+  //   // 这需要在翻译文件中定义对应的键值对
+  //   return i18next.t(text); // 直接使用传入的文本
+  // }
+  
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 0 - 2
heartvoice-app/src/app/tab1/tab1.page.html

@@ -90,9 +90,7 @@
 
 <ion-footer>
   <ion-toolbar>
-
     <ion-title>© 2024 心理健康服务平台</ion-title>
-
   </ion-toolbar>
 </ion-footer>
 

+ 57 - 24
heartvoice-app/src/app/tab1/tab1.page.ts

@@ -7,16 +7,17 @@ import {  Router } from '@angular/router';
 import { PersonalityTestComponent } from '../personality-test/personality-test.component';
 import { ChatPanelOptions, FmodeChat, openChatPanelModal, FmodeChatMessage } from 'fmode-ng';
 import { CloudObject } from 'src/lib/ncloud';
-
-
-
+import { IconModule } from '@ant-design/icons-angular';
+import { CloudUser } from 'src/lib/ncloud';
 @Component({
   selector: 'app-tab1',
   templateUrl: 'tab1.page.html',
   styleUrls: ['tab1.page.scss'],
   standalone: true,
   imports: [IonHeader, IonToolbar, IonTitle, IonContent,IonButton,IonButtons,IonRow,IonCol,IonIcon,IonCard,IonCardHeader,IonCardContent,IonCardTitle,IonList,IonItem,IonLabel,IonGrid,
-    IonAvatar,IonFooter,EditTagComponent, ExploreContainerComponent,EditRatingStarComponent,PersonalityTestComponent],
+    IonAvatar,IonFooter,EditTagComponent, ExploreContainerComponent,EditRatingStarComponent,PersonalityTestComponent,
+    IconModule,
+    ],
 })
 export class Tab1Page {
 
@@ -36,9 +37,29 @@ export class Tab1Page {
    /**
    * 开始聊天
    */
+   private consult: any; // 这里定义你的 consult 对象
   openChat(){
+    // 弹窗形式聊天:开始聊天
+        localStorage.setItem("company", "E4KpGvTEto");
+     // 创建聊天记录对象
+          let consult = new CloudObject("Chat");
+             // 设置聊天记录的基本信息
+          let now = new Date();
+          let currentUser = new CloudUser();
+          let dateStr = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;
+         // 对象权限的精确制定
+          let ACL: any = {
+               "*": { read: true, write: true }
+        };
+        consult.set({
+            user: currentUser.toPointer(),
+            content: [], // 初始内容为空
+            chattime: now, // 可以加上创建时间
+            ACL: ACL
+            });
     let options:ChatPanelOptions = {
       roleId:"2DXJkRsjXK",
+
       onChatInit:(chat:FmodeChat)=>{
         console.log("onChatInit");
               console.log("预设角色",chat.role);
@@ -46,7 +67,7 @@ export class Tab1Page {
               chat.role.set("title","心理咨询师");
               chat.role.set("desc","一名亲切和蔼的心理咨询师,小雅,年龄32岁");
               chat.role.set("tags",["心理","青少年"]);
-              chat.role.set("avatar","https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/Q4Zif7fTbK-0.png")
+              //chat.role.set("avatar","https://nova-cloud.obs.cn-south-1.myhuaweicloud.com/storage/aigc/imagine/Q4Zif7fTbK-0.png")
               chat.role.set("prompt",`
 # 角色设定
 您是一名亲切和蔼的心理咨询师,小雅,年龄32岁,需要完成一次完整的心理陪聊服务。
@@ -60,33 +81,45 @@ export class Tab1Page {
 例如:根据上文用户表现出的心理倾向,进一步提问。
 - 当问询细节补充完成后进入下一个环节
 3.初步的心理报告,若健康则鼓励,若不健康则列出具体的心理问题
-- 完成心理咨询时,请在消息结尾附带: [完成]
 
 # 开始话语
 当您准备好了,向来访的用户打招呼。`);
       },
       onMessage:(chat:FmodeChat,message:FmodeChatMessage)=>{
-        console.log("onMessage",message)
-        let content:any = message?.content;
-        if(typeof content == "string"){
-          if(content?.indexOf("[完成]")>-1){
-            console.log("心理咨询完成");
-            let xinliChat = new CloudObject("XinliChat");
-            xinliChat.set({
-              content:content,
-              messageList:chat?.messageList
-            })
-            xinliChat.save();
+        // console.log("onMessage",message)
+        // let content:any = message?.content;
+        //   if(content?.indexOf("[完成]")>-1){
+        //     console.log("心理咨询完成");
+        //     let xinliChat = new CloudObject("Chat");
+        //     xinliChat.set({
+        //       content:content,
+        //       messageList:chat?.messageList
+        //     })
+        //     xinliChat.save();
+        //   }
+
+        // 更新 consult 对象的内容
+
+          consult.set({
+              content: chat.messageList, // 存储用户消息
+          });
+          
+          // 仅在内容发生变化时保存
+          if (currentUser?.id) { // 检查用户是否登录
+              consult.save();
+          } else {
+              console.log("未登录,无法保存聊天记录。");
           }
-        }
       },
-      onChatSaved:(chat:FmodeChat)=>{
-        // chat?.chatSession?.id 本次会话的 chatId
-        console.log("onChatSaved",chat,chat?.chatSession,chat?.chatSession?.id)
+      
+      onChatSaved: (chat: FmodeChat) => {
+          // chat?.chatSession?.id 本次会话的 chatId
+          console.log("onChatSaved", chat, chat?.chatSession, chat?.chatSession?.id);
       }
-    }
-    openChatPanelModal(this.modalCtrl,options)
-  }
+  };
+  
+  openChatPanelModal(this.modalCtrl, options);
+}
    personality(){
     this.router.navigate(['/tabs/personality-test'])
    }

+ 5 - 0
heartvoice-app/src/assets/locales/en.json

@@ -0,0 +1,5 @@
+{
+    "welcome": "Welcome to our application!",
+    "goodbye": "Goodbye!",
+    "合并后的内容": "Combined content"  
+  }

+ 5 - 0
heartvoice-app/src/assets/locales/zh.json

@@ -0,0 +1,5 @@
+{
+    "welcome": "欢迎来到我们的应用程序!",
+    "goodbye": "再见!",
+    "合并后的内容": "合并后的内容"  
+  }

+ 19 - 0
heartvoice-app/src/i18n.ts

@@ -0,0 +1,19 @@
+// src/i18n.ts
+import i18next from 'i18next';
+import Backend from 'i18next-http-backend';
+
+i18next
+  .use(Backend)
+  .init({
+    lng: 'zh', // 默认语言
+    fallbackLng: 'en', // 回退语言
+    debug: true, // 开启调试模式
+    backend: {
+      loadPath: '/assets/locales/{{lng}}/{{ns}}.json',
+    },
+    interpolation: {
+      escapeValue: false, // 不需要转义
+    },
+  });
+
+export default i18next;

+ 55 - 0
heartvoice-app/src/lib/ncloud.ts

@@ -405,4 +405,59 @@ export class CloudApi{
         let json = await response.json();
         return json
     }
+}
+
+
+
+export class Cloudmy {
+    className: string;
+    queryParams: Record<string, any> = {};
+
+    constructor(className: string) {
+        this.className = className;
+    }
+
+    include(...fields: string[]) {
+        this.queryParams["include"] = fields;
+    }
+
+    equalTo(key: string, value: any) {
+        if (!this.queryParams["where"]) this.queryParams["where"] = {};
+        this.queryParams["where"][key] = value;
+    }
+
+    descending(key: string) {
+        if (!this.queryParams["order"]) this.queryParams["order"] = [];
+        this.queryParams["order"].push(`-${key}`); // 使用负号表示降序
+    }
+
+    async first(): Promise<any> {
+        let url = `https://dev.fmode.cn/parse/classes/${this.className}?`;
+
+        // 添加 where 条件
+        if (Object.keys(this.queryParams["where"]).length) {
+            const whereStr = JSON.stringify(this.queryParams["where"]);
+            url += `where=${whereStr}`;
+        }
+
+        // 添加 order 条件
+        if (this.queryParams["order"] && this.queryParams["order"].length) {
+            const orderStr = this.queryParams["order"].join(',');
+            url += `&order=${orderStr}`;
+        }
+
+        const response = await fetch(url, {
+            headers: {
+                "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
+                "x-parse-application-id": "dev"
+            },
+            body: null,
+            method: "GET",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const json = await response?.json();
+        return json?.results?.[0] || null;
+    }
 }

+ 2 - 2
heartvoice-app/src/lib/user/modal-hint/modal-hint.component.html

@@ -10,7 +10,7 @@
 <ion-content>
   <ion-card>
     <ion-card-header>
-      <ion-card-title>是否使用上一次测试的mbti性格偏向</ion-card-title>
+      <ion-card-title>是否使用上一次测试的mbti性格偏向(不填默认为“是”)</ion-card-title>
     </ion-card-header>
     <ion-card-content>
       <ion-item>
@@ -28,7 +28,7 @@
 
   <ion-card>
     <ion-card-header>
-      <ion-card-title>是否使用上一次的聊天数据分析</ion-card-title>
+      <ion-card-title>是否使用上一次的聊天数据分析(不填默认为“是”)</ion-card-title>
     </ion-card-header>
     <ion-card-content>
       <ion-item>

+ 3 - 0
heartvoice-app/src/md5.d.ts

@@ -0,0 +1,3 @@
+declare module 'md5' {
+    export default function md5(input: string | Buffer): string;
+}

+ 22 - 0
heartvoice-app/src/typings.d.ts

@@ -0,0 +1,22 @@
+declare module 'sentiment' {
+    export default class Sentiment {
+        analyze(text: string): {
+            score: number;
+            comparative: number;
+            words: string[];
+            positive: string[];
+            negative: string[];
+        };
+    }
+}
+
+// declare module 'vader-sentiment' {
+//     export class SentimentIntensityAnalyzer {
+//         polarityScores(text: string): {
+//             pos: number;
+//             neg: number;
+//             neu: number;
+//             compound: number;
+//         };
+//     }
+// }

+ 6 - 1
heartvoice-app/tsconfig.json

@@ -1,6 +1,7 @@
 /* To learn more about this file see: https://angular.io/config/tsconfig. */
 {
   "compileOnSave": false,
+
   "compilerOptions": {
     "allowSyntheticDefaultImports":true,
     "baseUrl": "./",
@@ -20,7 +21,11 @@
     "target": "es2022",
     "module": "es2020",
     "lib": ["es2018", "dom"],
-    "useDefineForClassFields": false
+    "useDefineForClassFields": false,
+    "typeRoots": [
+      "./node_modules/@types",
+      "./@types" // 添加这一行以包含自定义类型声明
+    ]
   },
   "angularCompilerOptions": {
     "enableI18nLegacyMessageIdFormat": false,