Selaa lähdekoodia

Merge branch 'master' of http://git.fmode.cn:3000/4u/workspace

cainiao-hue 3 kuukautta sitten
vanhempi
commit
7b135772bf
79 muutettua tiedostoa jossa 4827 lisäystä ja 322 poistoa
  1. 282 0
      .history/docs-prod/schema_20241223191830.md
  2. 148 0
      .history/soul-app/angular_20241221201127.json
  3. 148 0
      .history/soul-app/angular_20241223231307.json
  4. 148 0
      .history/soul-app/angular_20241223231643.json
  5. 69 0
      .history/soul-app/package_20241223220848.json
  6. 69 0
      .history/soul-app/package_20241223225228.json
  7. 69 0
      .history/soul-app/package_20241223225256.json
  8. 69 0
      .history/soul-app/package_20241223225311.json
  9. 69 0
      .history/soul-app/package_20241223225330.json
  10. 69 0
      .history/soul-app/package_20241223225505.json
  11. 69 0
      .history/soul-app/package_20241223225522.json
  12. 69 0
      .history/soul-app/package_20241223225535.json
  13. 69 0
      .history/soul-app/package_20241223225726.json
  14. 69 0
      .history/soul-app/package_20241223225943.json
  15. 69 0
      .history/soul-app/package_20241223230048.json
  16. 69 0
      .history/soul-app/package_20241223230317.json
  17. 41 0
      .history/soul-app/src/app/info-modal/info-modal.component_20241223140056.html
  18. 41 0
      .history/soul-app/src/app/info-modal/info-modal.component_20241223140434.html
  19. 35 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223214953.html
  20. 68 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223214958.ts
  21. 66 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223232115.ts
  22. 66 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223232614.ts
  23. 67 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223233228.ts
  24. 67 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223235522.ts
  25. 67 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223235734.ts
  26. 36 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241224003203.html
  27. 35 0
      .history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241224003220.html
  28. 63 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223150649.html
  29. 76 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223214959.ts
  30. 76 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223220203.ts
  31. 76 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223230330.ts
  32. 75 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223232332.ts
  33. 75 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223232613.ts
  34. 75 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223233904.ts
  35. 75 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223234415.ts
  36. 65 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223234722.html
  37. 65 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223234846.html
  38. 65 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223234902.html
  39. 75 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223235756.ts
  40. 65 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224000226.html
  41. 75 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224000227.ts
  42. 74 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224000825.ts
  43. 74 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224002925.ts
  44. 74 0
      .history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224002949.ts
  45. 82 0
      .history/soul-app/src/app/tab1/tab1.page_20241223141129.scss
  46. 82 0
      .history/soul-app/src/app/tab1/tab1.page_20241223141133.scss
  47. 82 0
      .history/soul-app/src/app/tab1/tab1.page_20241223141153.scss
  48. 9 0
      .history/soul-app/src/app/user.service_20241223213452.ts
  49. 17 0
      .history/soul-app/src/app/user.service_20241223213959.ts
  50. 82 0
      .history/soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component_20241223135555.ts
  51. 82 0
      .history/soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component_20241223141342.ts
  52. 82 0
      .history/soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component_20241223141403.ts
  53. 82 0
      .history/soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component_20241223142253.ts
  54. 38 0
      .history/soul-app/src/lib/user/modal-user-edit/modal-user-edit.component_20241221201127.html
  55. 38 0
      .history/soul-app/src/lib/user/modal-user-edit/modal-user-edit.component_20241223140521.html
  56. 38 0
      .history/soul-app/src/lib/user/modal-user-edit/modal-user-edit.component_20241223140831.html
  57. 34 0
      .history/soul-app/src/main_20241218212656.ts
  58. 35 0
      .history/soul-app/src/main_20241223235743.ts
  59. 3 0
      .idea/.gitignore
  60. 35 0
      .idea/gradle.xml
  61. 7 0
      .idea/misc.xml
  62. 8 0
      .idea/modules.xml
  63. 6 0
      .idea/vcs.xml
  64. 9 0
      .idea/workspace.iml
  65. 54 48
      docs-prod/schema.md
  66. 2 2
      soul-app/angular.json
  67. 419 227
      soul-app/package-lock.json
  68. 14 14
      soul-app/package.json
  69. 4 2
      soul-app/src/app/info-modal/info-modal.component.html
  70. 10 11
      soul-app/src/app/page-psysurvey/page-psysurvey.component.html
  71. 40 3
      soul-app/src/app/page-psysurvey/page-psysurvey.component.ts
  72. 3 1
      soul-app/src/app/page-publishsurvey/page-publishsurvey.component.html
  73. 24 9
      soul-app/src/app/page-publishsurvey/page-publishsurvey.component.ts
  74. 1 1
      soul-app/src/app/tab1/tab1.page.scss
  75. 16 0
      soul-app/src/app/user.service.spec.ts
  76. 17 0
      soul-app/src/app/user.service.ts
  77. 2 1
      soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component.ts
  78. 3 3
      soul-app/src/lib/user/modal-user-edit/modal-user-edit.component.html
  79. 1 0
      soul-app/src/main.ts

+ 282 - 0
.history/docs-prod/schema_20241223191830.md

@@ -0,0 +1,282 @@
+# //陪聊部分
+# 类图
+```plantuml
+' 聊天项目类图英文版
+@startuml
+
+class _User { 
+    + objectId: String //用户唯一标识符
+    + username: String //用户名
+    + realname: String //真实姓名
+    + password: String //用户密码
+    + gender: String //性别
+    + age: Number //年龄
+    + email: String //用户邮箱
+    + avatar: String //用户头像
+    + startChat(): void 
+    + chooseChatPartner(): String
+    + summarizeChatHistory(): void
+}
+
+class ChatPartner {
+    + objectId: String //陪聊师唯一标识符
+    + name: String //陪聊师姓名
+    + expertise: String //陪聊师专业领域
+    + avatar: String //陪聊师头像
+    + bio: String //陪聊师个人简介
+    + provideChat(): String 
+}
+
+class ChatCompanion {
+    + objectId: String //聊天伙伴唯一标识符
+    + name: String //聊天伙伴姓名
+    + avatar: String //聊天伙伴头像
+    + bio: String //聊天伙伴个人简介
+    + provideChat(): String
+}
+
+class ChatRecord {
+    + objectId: String //聊天记录唯一标识符
+    + title:String //聊天标题
+    + content:Array //聊天内容
+    + user: Pointer<User> //关联的用户对象
+    + chatpartner: Pointer<ChatPartner> //关联的聊天机器人对象
+    + getChatHistory(): List
+}
+
+class ChatReport {
+    + objectId: String //报告唯一标识符
+    - report: String //分析结果
+    + generateReport(): String //生成报告的方法
+}
+class ChatEvaluate{
+    + objectId:String//评论唯一标识符
+    + avater:String//用户头像
+    + content:String//评论内容
+    + rating:Number//评论星星数
+    + user: Pointer<User> //关联的用户对象
+}
+
+_User "*" --> "*" ChatEvaluate
+_User "1" --> "*" ChatRecord     
+ChatPartner "1" --> "*" ChatRecord 
+ChatCompanion "1" --> "*" ChatRecord 
+ChatRecord "1" --> "1" ChatReport      
+@enduml
+```
+# 时序图
+```plantuml
+@startuml
+actor 用户
+participant "专业陪聊师" as 专业陪聊师
+participant "普通陪聊师" as 普通陪聊师
+participant "聊天记录" as 聊天记录
+participant "报告" as 报告
+
+用户 -> 用户: 选择陪聊师()
+alt 选择专业陪聊师
+    用户 -> 专业陪聊师: 提供聊天()
+else 选择普通陪聊师
+    用户 -> 普通陪聊师: 提供聊天()
+end
+用户 -> 用户: 开始聊天()
+用户 -> 聊天记录: 总结聊天记录()
+聊天记录 -> 聊天记录: 获取聊天记录()
+
+聊天记录 -> 报告: 生成报告()
+报告 -> 用户: 返回分析报告
+
+@enduml
+```
+
+# 状态图
+```plantuml
+@startuml
+[*] --> 选择陪聊师
+
+选择陪聊师 -->  聊天中: 开始聊天
+聊天中 --> 继续聊天 : 选择继续聊天
+聊天中 --> 退出聊天 : 选择退出聊天
+退出聊天 --> 总结中 : 总结聊天记录
+
+总结中 --> 生成报告 : 生成分析报告
+生成报告 --> 生成失败 : 报告生成失败
+生成报告 --> 生成成功 : 报告生成成功
+
+生成成功 --> [*] : 聊天结束
+生成失败 --> 生成报告 : 重新生成
+@enduml
+```
+
+# 活动图
+```plantuml
+@startuml
+|用户|
+start
+:发送消息;
+|专业陪聊机器人|
+:回复消息;
+|用户|
+repeat
+if (继续聊天?) then (是)
+    |用户|
+    :发送消息;
+    |专业陪聊机器人|
+    :回复消息;
+else (否)
+    |管理员|
+    :记录消息;
+    stop
+endif
+repeat while (回复消息)
+@enduml
+
+```
+
+# //社区部分
+
+
+# 用例图
+```plantuml
+@startuml
+actor 学生用户
+actor 学校管理员
+
+rectangle "心理社区" {
+    学生用户 -- (填写心理普查问卷)
+    学生用户 -- (使用心理测试)
+    学校管理员 -- (发布心理普查问卷)
+    学校管理员 -- (发布心理活动通知)
+    学校管理员 -- (设置星标用户)
+}
+
+@enduml
+```
+# 类图
+
+```plantuml
+@startuml
+class User {
+    +objectId: String
+    +username: String
+    +realname: String
+    +password: String
+    +gender: String
+    +age: Number
+    +email: String
+    +avatar: String
+    +startChat():void
+    +chooseChatPartner():String
+    +summarizeCharHistory():void
+    +registerAccount():void
+    +login(): void
+    +fillPsychologicalTest(): void
+    +publishBottle(): void
+    +retrieveBottle(): Bottle
+}
+
+class PsychologicalCommunity {
+    +communityID: String
+    +topic: String
+    +joinCommunity(): void
+}
+
+class PsychologicalActivity {
+    +activityID: String
+    +title: String
+    +description: String
+    +date: Date
+    +location: String
+    +publishActivity(): void
+}
+
+class PsychologicalSurvey {
+    +surveyID: String
+    +content: String
+    +publisher: SchoolAdmin
+    +responses: List
+    +publishSurvey(): void
+    +analyzeResults(): void
+}
+
+class SchoolAdmin {
+    +adminID: String
+    +name: String
+    +email: String
+    +publishPsychologicalActivity(): void
+    +publishPsychologicalSurvey(): void
+    +analyzeSurveyResults(): void
+    +setFeaturedUser(): void
+}
+
+class Bottle {
+    +bottleID: String
+    +content: String
+    +author: User
+    +timestamp: Date
+}
+
+User "1" -- "0..*" PsychologicalCommunity
+PsychologicalActivity "1" -- "0..*" User
+SchoolAdmin "1" -- "0..*" PsychologicalActivity
+SchoolAdmin "1" -- "0..*" PsychologicalSurvey
+PsychologicalSurvey "1" -- "0..*" User
+User "1" -- "0..*" Bottle
+@enduml
+```
+
+# 时序图
+
+```mermaid
+sequenceDiagram
+    participant Admin as 学校管理员
+    participant Student as 学生用户
+    participant System as 系统
+
+    Admin->>System: 发布心理普查问卷
+    Student->>System: 填写心理普查问卷
+    System->>Admin: 收集问卷结果
+    Admin->>System: 分析问卷结果
+    alt 心理健康有问题的学生人数达到阈值
+        System->>Admin: 发布心理团辅
+        System->>Student: 升级为心理星标用户
+    end
+    Admin->>System: 制定后续心理活动
+    System->>Student: 通知学生参与活动
+    Student->>System: 使用心理测试
+```
+# 活动图
+
+```mermaid
+graph TD
+    A[开始] --> B[发布心理普查问卷]
+    B --> C[学生填写问卷]
+    C --> D[提交问卷]
+    D --> E[学校管理员分析结果]
+    E --> F{心理健康有问题的学生人数达到阈值?}
+    F -->|是| G[发布心理团辅]
+    F -->|否| H[继续监控]
+    G --> I[通知学生参与团辅]
+    E --> J[设置星标用户]
+    J --> K
+    H --> K
+    I --> K[结束]
+```
+
+# 状态图
+```mermaid
+stateDiagram-v2
+    [*] --> 发布问卷
+    发布问卷 --> 问卷收集中: 学生填写问卷
+    问卷收集中 --> 结果分析中: 提交问卷
+    结果分析中 --> 后续活动设计中: 学校管理员查看分析
+    结果分析中 --> 初期活动发布中: 心理状况有问题学生人数达到阈值
+    初期活动发布中 --> 团辅进行中: 发布心理团辅
+    初期活动发布中 --> 升级星标用户: 升级为心理星标用户
+    后续活动设计中 --> 后续活动开展中: 发布后续活动
+    后续活动开展中 --> [*]
+    团辅进行中 --> [*]
+    升级星标用户 --> [*]
+    
+```
+

+ 148 - 0
.history/soul-app/angular_20241221201127.json

@@ -0,0 +1,148 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "app": {
+      "projectType": "application",
+      "schematics": {
+        "@ionic/angular-toolkit:page": {
+          "styleext": "scss",
+          "standalone": true
+        }
+      },
+      "root": "",
+      "sourceRoot": "src",
+      "prefix": "app",
+      "architect": {
+        "build": {
+          "builder": "@angular-devkit/build-angular:browser",
+          "options": {
+            "outputPath": "www",
+            "index": "src/index.html",
+            "main": "src/main.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "tsconfig.app.json",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "src/assets",
+                "output": "assets",
+              }
+            ],
+            "styles": ["src/global.scss", "src/theme/variables.scss"],
+            "scripts": []
+          },
+          "configurations": {
+            "production": {
+              "budgets": [
+                {
+                  "type": "initial",
+                  "maximumWarning": "2mb",
+                  "maximumError": "5mb"
+                },
+                {
+                  "type": "anyComponentStyle",
+                  "maximumWarning": "2kb",
+                  "maximumError": "4kb"
+                }
+              ],
+              "fileReplacements": [
+                {
+                  "replace": "src/environments/environment.ts",
+                  "with": "src/environments/environment.prod.ts"
+                }
+              ],
+              "outputHashing": "all"
+            },
+            "development": {
+              "buildOptimizer": false,
+              "optimization": false,
+              "vendorChunk": true,
+              "extractLicenses": false,
+              "sourceMap": true,
+              "namedChunks": true
+            },
+            "ci": {
+              "progress": false
+            }
+          },
+          "defaultConfiguration": "production"
+        },
+        "serve": {
+          "builder": "@angular-devkit/build-angular:dev-server",
+          "configurations": {
+            "production": {
+              "buildTarget": "app:build:production"
+            },
+            "development": {
+              "buildTarget": "app:build:development"
+            },
+            "ci": {
+              "progress": false
+            }
+          },
+          "defaultConfiguration": "development"
+        },
+        "extract-i18n": {
+          "builder": "@angular-devkit/build-angular:extract-i18n",
+          "options": {
+            "buildTarget": "app:build"
+          }
+        },
+        "test": {
+          "builder": "@angular-devkit/build-angular:karma",
+          "options": {
+            "main": "src/test.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "tsconfig.spec.json",
+            "karmaConfig": "karma.conf.js",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "src/assets",
+                "output": "assets"
+              }
+            ],
+            "styles": ["src/global.scss", "src/theme/variables.scss"],
+            "scripts": []
+          },
+          "configurations": {
+            "ci": {
+              "progress": false,
+              "watch": false
+            }
+          }
+        },
+        "lint": {
+          "builder": "@angular-eslint/builder:lint",
+          "options": {
+            "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
+          }
+        }
+      }
+    }
+  },
+  "cli": {
+    "schematicCollections": [
+      "@ionic/angular-toolkit"
+    ],
+    "analytics": false
+  },
+  "schematics": {
+    "@ionic/angular-toolkit:component": {
+      "styleext": "scss"
+    },
+    "@ionic/angular-toolkit:page": {
+      "styleext": "scss"
+    },
+    "@angular-eslint/schematics:application": {
+      "setParserOptionsProject": true
+    },
+    "@angular-eslint/schematics:library": {
+      "setParserOptionsProject": true
+    }
+  }
+}

+ 148 - 0
.history/soul-app/angular_20241223231307.json

@@ -0,0 +1,148 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "app": {
+      "projectType": "application",
+      "schematics": {
+        "@ionic/angular-toolkit:page": {
+          "styleext": "scss",
+          "standalone": true
+        }
+      },
+      "root": "",
+      "sourceRoot": "src",
+      "prefix": "app",
+      "architect": {
+        "build": {
+          "builder": "@angular-devkit/build-angular:browser",
+          "options": {
+            "outputPath": "www",
+            "index": "src/index.html",
+            "main": "src/main.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "tsconfig.app.json",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "src/assets",
+                "output": "assets"
+              }
+            ],
+            "styles": ["src/global.scss", "src/theme/variables.scss"],
+            "scripts": []
+          },
+          "configurations": {
+            "production": {
+              "budgets": [
+                {
+                  "type": "initial",
+                  "maximumWarning": "2mb",
+                  "maximumError": "5mb"
+                },
+                {
+                  "type": "anyComponentStyle",
+                  "maximumWarning": "2kb",
+                  "maximumError": "4kb"
+                }
+              ],
+              "fileReplacements": [
+                {
+                  "replace": "src/environments/environment.ts",
+                  "with": "src/environments/environment.prod.ts"
+                }
+              ],
+              "outputHashing": "all"
+            },
+            "development": {
+              "buildOptimizer": false,
+              "optimization": false,
+              "vendorChunk": true,
+              "extractLicenses": false,
+              "sourceMap": true,
+              "namedChunks": true
+            },
+            "ci": {
+              "progress": false
+            }
+          },
+          "defaultConfiguration": "production"
+        },
+        "serve": {
+          "builder": "@angular-devkit/build-angular:dev-server",
+          "configurations": {
+            "production": {
+              "buildTarget": "app:build:production"
+            },
+            "development": {
+              "buildTarget": "app:build:development"
+            },
+            "ci": {
+              "progress": false
+            }
+          },
+          "defaultConfiguration": "development"
+        },
+        "extract-i18n": {
+          "builder": "@angular-devkit/build-angular:extract-i18n",
+          "options": {
+            "buildTarget": "app:build"
+          }
+        },
+        "test": {
+          "builder": "@angular-devkit/build-angular:karma",
+          "options": {
+            "main": "src/test.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "tsconfig.spec.json",
+            "karmaConfig": "karma.conf.js",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "src/assets",
+                "output": "assets"
+              }
+            ],
+            "styles": ["src/global.scss", "src/theme/variables.scss"],
+            "scripts": []
+          },
+          "configurations": {
+            "ci": {
+              "progress": false,
+              "watch": false
+            }
+          }
+        },
+        "lint": {
+          "builder": "@angular-eslint/builder:lint",
+          "options": {
+            "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
+          }
+        }
+      }
+    }
+  },
+  "cli": {
+    "schematicCollections": [
+      "@ionic/angular-toolkit"
+    ],
+    "analytics": false
+  },
+  "schematics": {
+    "@ionic/angular-toolkit:component": {
+      "styleext": "scss"
+    },
+    "@ionic/angular-toolkit:page": {
+      "styleext": "scss"
+    },
+    "@angular-eslint/schematics:application": {
+      "setParserOptionsProject": true
+    },
+    "@angular-eslint/schematics:library": {
+      "setParserOptionsProject": true
+    }
+  }
+}

+ 148 - 0
.history/soul-app/angular_20241223231643.json

@@ -0,0 +1,148 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "app": {
+      "projectType": "application",
+      "schematics": {
+        "@ionic/angular-toolkit:page": {
+          "styleext": "scss",
+          "standalone": true
+        }
+      },
+      "root": "",
+      "sourceRoot": "src",
+      "prefix": "app",
+      "architect": {
+        "build": {
+          "builder": "@angular-devkit/build-angular:browser",
+          "options": {
+            "outputPath": "www",
+            "index": "src/index.html",
+            "main": "src/main.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "tsconfig.app.json",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "src/assets",
+                "output": "assets"
+              }
+            ],
+            "styles": ["src/global.scss", "src/theme/variables.scss"],
+            "scripts": []
+          },
+          "configurations": {
+            "production": {
+              "budgets": [
+                {
+                  "type": "initial",
+                  "maximumWarning": "2mb",
+                  "maximumError": "5mb"
+                },
+                {
+                  "type": "anyComponentStyle",
+                  "maximumWarning": "2kb",
+                  "maximumError": "4kb"
+                }
+              ],
+              "fileReplacements": [
+                {
+                  "replace": "src/environments/environment.ts",
+                  "with": "src/environments/environment.prod.ts"
+                }
+              ],
+              "outputHashing": "all"
+            },
+            "development": {
+              "buildOptimizer": false,
+              "optimization": false,
+              "vendorChunk": true,
+              "extractLicenses": false,
+              "sourceMap": true,
+              "namedChunks": true
+            },
+            "ci": {
+              "progress": false
+            }
+          },
+          "defaultConfiguration": "production"
+        },
+        "serve": {
+          "builder": "@angular-devkit/build-angular:dev-server",
+          "configurations": {
+            "production": {
+              "buildTarget": "app:build:production"
+            },
+            "development": {
+              "buildTarget": "app:build:development"
+            },
+            "ci": {
+              
+            }
+          },
+          "defaultConfiguration": "development"
+        },
+        "extract-i18n": {
+          "builder": "@angular-devkit/build-angular:extract-i18n",
+          "options": {
+            "buildTarget": "app:build"
+          }
+        },
+        "test": {
+          "builder": "@angular-devkit/build-angular:karma",
+          "options": {
+            "main": "src/test.ts",
+            "polyfills": "src/polyfills.ts",
+            "tsConfig": "tsconfig.spec.json",
+            "karmaConfig": "karma.conf.js",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "src/assets",
+                "output": "assets"
+              }
+            ],
+            "styles": ["src/global.scss", "src/theme/variables.scss"],
+            "scripts": []
+          },
+          "configurations": {
+            "ci": {
+              "progress": false,
+              "watch": false
+            }
+          }
+        },
+        "lint": {
+          "builder": "@angular-eslint/builder:lint",
+          "options": {
+            "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
+          }
+        }
+      }
+    }
+  },
+  "cli": {
+    "schematicCollections": [
+      "@ionic/angular-toolkit"
+    ],
+    "analytics": false
+  },
+  "schematics": {
+    "@ionic/angular-toolkit:component": {
+      "styleext": "scss"
+    },
+    "@ionic/angular-toolkit:page": {
+      "styleext": "scss"
+    },
+    "@angular-eslint/schematics:application": {
+      "setParserOptionsProject": true
+    },
+    "@angular-eslint/schematics:library": {
+      "setParserOptionsProject": true
+    }
+  }
+}

+ 69 - 0
.history/soul-app/package_20241223220848.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^19.0.5",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225228.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^18.0.5",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225256.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^18.0.0",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225311.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^18.0.5",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225330.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^18.2.13",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225505.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^19.0.0",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225522.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^20.0.0",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225535.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^19.0.5",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225726.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^18.0.0",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223225943.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^19.0.5",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223230048.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^18.0.0",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 69 - 0
.history/soul-app/package_20241223230317.json

@@ -0,0 +1,69 @@
+{
+  "name": "soul-app",
+  "version": "0.0.1",
+  "author": "Ionic Framework",
+  "homepage": "https://ionicframework.com/",
+  "scripts": {
+    "ng": "ng",
+    "start": "ng serve",
+    "build": "ng build",
+    "watch": "ng build --watch --configuration development",
+    "test": "ng test",
+    "lint": "ng lint"
+  },
+  "private": true,
+  "dependencies": {
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^19.0.5",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
+    "@capacitor/app": "6.0.2",
+    "@capacitor/core": "6.2.0",
+    "@capacitor/haptics": "6.0.2",
+    "@capacitor/keyboard": "6.0.3",
+    "@capacitor/status-bar": "6.0.2",
+    "@ionic/angular": "^8.0.0",
+    "@tensorflow-models/universal-sentence-encoder": "^1.3.3",
+    "@tensorflow/tfjs-backend-cpu": "^4.22.0",
+    "@tensorflow/tfjs-converter": "^4.22.0",
+    "@tensorflow/tfjs-core": "^4.22.0",
+    "fmode-ng": "^0.0.63",
+    "ionicons": "^7.2.1",
+    "rxjs": "~7.8.0",
+    "tslib": "^2.3.0",
+    "zone.js": "~0.15.0"
+  },
+  "devDependencies": {
+    "@angular-devkit/build-angular": "^19.0.6",
+    "@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": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
+    "@capacitor/cli": "6.2.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",
+    "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.6.3"
+  },
+  "description": "An Ionic project"
+}

+ 41 - 0
.history/soul-app/src/app/info-modal/info-modal.component_20241223140056.html

@@ -0,0 +1,41 @@
+<!-- 用户登录状态 -->
+<ion-card>
+  <ion-card-header>
+    <ion-card-title>
+      用户名:{{currentUser?.get("username")}}
+    </ion-card-title>
+   </ion-card-header>
+<ion-card-content>
+  <ion-item>
+    <ion-label>姓名: {{ userData['realname'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>昵称: {{ userData['username'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>年龄: {{ userData['age'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>性别: {{ userData['gender'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>学校: {{ userData['school'] || '--' }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>身份: {{ userData['identity'] || '--' }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>
+      {{ userData['identity'] === 'student' 
+        ? '学号:' + (userData['studentID'] || '--') 
+        : '工号:' + (userData['teacherID'] || '--') }}
+    </ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>邮箱: {{ userData['email'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>手机号: {{ userData['account'] }}</ion-label>
+  </ion-item>
+</ion-card-content>
+</ion-card>

+ 41 - 0
.history/soul-app/src/app/info-modal/info-modal.component_20241223140434.html

@@ -0,0 +1,41 @@
+<!-- 用户登录状态 -->
+<ion-card style="max-height: 400px; overflow-y: auto;">
+  <ion-card-header>
+    <ion-card-title>
+      用户名:{{currentUser?.get("username")}}
+    </ion-card-title>
+   </ion-card-header>
+<ion-card-content>
+  <ion-item>
+    <ion-label>姓名: {{ userData['realname'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>昵称: {{ userData['username'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>年龄: {{ userData['age'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>性别: {{ userData['gender'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>学校: {{ userData['school'] || '--' }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>身份: {{ userData['identity'] || '--' }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>
+      {{ userData['identity'] === 'student' 
+        ? '学号:' + (userData['studentID'] || '--') 
+        : '工号:' + (userData['teacherID'] || '--') }}
+    </ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>邮箱: {{ userData['email'] }}</ion-label>
+  </ion-item>
+  <ion-item>
+    <ion-label>手机号: {{ userData['account'] }}</ion-label>
+  </ion-item>
+</ion-card-content>
+</ion-card>

+ 35 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223214953.html

@@ -0,0 +1,35 @@
+<ion-header>
+  <ion-toolbar>
+    <div class="toolbar-content">
+      <div class="button-container">
+        <ion-button (click)="goTab1()" fill="clear">
+          <ion-icon name="chevron-back" slot="start"></ion-icon>返回
+        </ion-button>
+      </div>
+      <ion-title class="title-text">
+        心理普查
+      </ion-title>
+    </div>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+<section *ngIf="filteredSurveys.length > 0">
+  <ion-card *ngFor="let survey of filteredSurveys">
+    <ion-card-header>
+      <ion-card-title>{{ survey.title }}</ion-card-title>
+    </ion-card-header>
+    <ion-card-content>
+      <p>链接: <a [href]="survey.link" target="_blank">{{ survey.link }}</a></p>
+    </ion-card-content>
+  </ion-card>
+</section>
+
+  <div  style="display: flex; justify-content: center; margin-top: auto;">
+    <ion-button (click)="goPublishSurvey()" expand="full">
+      发布问卷
+    </ion-button>
+  </div>
+
+
+</ion-content>

+ 68 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223214958.ts

@@ -0,0 +1,68 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit, Injectable } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar } from '@ionic/angular/standalone';
+  import { HttpClient } from '@angular/common/http';
+  import { UserService } from '../user.service'; // 确保路径正确
+
+
+  @Injectable({
+    providedIn: 'root'
+  })
+
+@Component({
+  selector: 'app-page-psysurvey',
+  templateUrl: './page-psysurvey.component.html',
+  styleUrls: ['./page-psysurvey.component.scss'],
+  standalone: true,
+  imports: [IonHeader,IonToolbar,IonTitle,IonContent,
+      IonList,IonListHeader,IonItem,IonCardTitle,
+      IonLabel,IonIcon,IonButton,IonCardContent,
+      IonInput,IonSearchbar,IonCard,IonCardHeader,
+      CommonModule,HttpClient,Injectable
+    ]
+})
+export class PagePsysurveyComponent  implements OnInit {
+  surveys: any[] = []; // 存储问卷通知
+  filteredSurveys: any[] = []; // 存储过滤后的问卷
+  userApartment: string = '' ; // 当前用户的学院
+
+  constructor(private router: Router,private http: HttpClient,private userService: UserService) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+   goPublishSurvey(){
+    this.router.navigate(['tabs/page-publishsurvey'])
+   }
+
+   ngOnInit() {
+    // 动态获取当前用户的学院信息
+    this.userService.getCurrentUser().subscribe(user => {
+      this.userApartment = user.apartment; // 从用户数据中获取学院
+      this.getSurveys(); // 在获取到用户信息后获取问卷
+    }, error => {
+      console.error('获取用户信息时出错:', error);
+      // 可以设置一个默认值或处理错误
+    });
+  }
+
+  getSurveys() {
+    this.http.get('http://127.0.0.1:4040/apps/DevServer/browser/survey').subscribe(
+      (response: any) => {
+        this.surveys = response; // 假设响应是问卷数组
+        this.filterSurveys(); // 过滤问卷
+      },
+      error => {
+        console.error('获取问卷时出错:', error);
+      }
+    );
+  }
+  filterSurveys() {
+    this.filteredSurveys = this.surveys.filter(survey => {
+      return survey.audience === this.userApartment || survey.audience === 'all';
+    });
+  }
+  
+  
+}

+ 66 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223232115.ts

@@ -0,0 +1,66 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar } from '@ionic/angular/standalone';
+  import { HttpClient } from '@angular/common/http';
+  import { UserService } from '../user.service'; // 确保路径正确
+
+
+  
+
+@Component({
+  selector: 'app-page-psysurvey',
+  templateUrl: './page-psysurvey.component.html',
+  styleUrls: ['./page-psysurvey.component.scss'],
+  standalone: true,
+  imports: [IonHeader,IonToolbar,IonTitle,IonContent,
+      IonList,IonListHeader,IonItem,IonCardTitle,
+      IonLabel,IonIcon,IonButton,IonCardContent,
+      IonInput,IonSearchbar,IonCard,IonCardHeader,
+      CommonModule,HttpClient
+    ]
+})
+export class PagePsysurveyComponent  implements OnInit {
+  surveys: any[] = []; // 存储问卷通知
+  filteredSurveys: any[] = []; // 存储过滤后的问卷
+  userApartment: string = '' ; // 当前用户的学院
+
+  constructor(private router: Router,private http: HttpClient,private userService: UserService) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+   goPublishSurvey(){
+    this.router.navigate(['tabs/page-publishsurvey'])
+   }
+
+   ngOnInit() {
+    // 动态获取当前用户的学院信息
+    this.userService.getCurrentUser().subscribe(user => {
+      this.userApartment = user.apartment; // 从用户数据中获取学院
+      this.getSurveys(); // 在获取到用户信息后获取问卷
+    }, error => {
+      console.error('获取用户信息时出错:', error);
+      // 可以设置一个默认值或处理错误
+    });
+  }
+
+  getSurveys() {
+    this.http.get('http://127.0.0.1:4040/apps/DevServer/browser/survey').subscribe(
+      (response: any) => {
+        this.surveys = response; // 假设响应是问卷数组
+        this.filterSurveys(); // 过滤问卷
+      },
+      error => {
+        console.error('获取问卷时出错:', error);
+      }
+    );
+  }
+  filterSurveys() {
+    this.filteredSurveys = this.surveys.filter(survey => {
+      return survey.audience === this.userApartment || survey.audience === 'all';
+    });
+  }
+  
+  
+}

+ 66 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223232614.ts

@@ -0,0 +1,66 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar } from '@ionic/angular/standalone';
+  import { HttpClient } from '@angular/common/http';
+  import { UserService } from '../user.service'; // 确保路径正确
+
+
+  
+
+@Component({
+  selector: 'app-page-psysurvey',
+  templateUrl: './page-psysurvey.component.html',
+  styleUrls: ['./page-psysurvey.component.scss'],
+  standalone: true,
+  imports: [IonHeader,IonToolbar,IonTitle,IonContent,
+      IonList,IonListHeader,IonItem,IonCardTitle,
+      IonLabel,IonIcon,IonButton,IonCardContent,
+      IonInput,IonSearchbar,IonCard,IonCardHeader,
+      CommonModule
+    ]
+})
+export class PagePsysurveyComponent  implements OnInit {
+  surveys: any[] = []; // 存储问卷通知
+  filteredSurveys: any[] = []; // 存储过滤后的问卷
+  userApartment: string = '' ; // 当前用户的学院
+
+  constructor(private router: Router,private http: HttpClient,private userService: UserService) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+   goPublishSurvey(){
+    this.router.navigate(['tabs/page-publishsurvey'])
+   }
+
+   ngOnInit() {
+    // 动态获取当前用户的学院信息
+    this.userService.getCurrentUser().subscribe(user => {
+      this.userApartment = user.apartment; // 从用户数据中获取学院
+      this.getSurveys(); // 在获取到用户信息后获取问卷
+    }, error => {
+      console.error('获取用户信息时出错:', error);
+      // 可以设置一个默认值或处理错误
+    });
+  }
+
+  getSurveys() {
+    this.http.get('http://127.0.0.1:4040/apps/DevServer/browser/survey').subscribe(
+      (response: any) => {
+        this.surveys = response; // 假设响应是问卷数组
+        this.filterSurveys(); // 过滤问卷
+      },
+      error => {
+        console.error('获取问卷时出错:', error);
+      }
+    );
+  }
+  filterSurveys() {
+    this.filteredSurveys = this.surveys.filter(survey => {
+      return survey.audience === this.userApartment || survey.audience === 'all';
+    });
+  }
+  
+  
+}

+ 67 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223233228.ts

@@ -0,0 +1,67 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar } from '@ionic/angular/standalone';
+  import { HttpClient } from '@angular/common/http';
+  import { UserService } from '../user.service'; // 确保路径正确
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+
+
+  
+
+@Component({
+  selector: 'app-page-psysurvey',
+  templateUrl: './page-psysurvey.component.html',
+  styleUrls: ['./page-psysurvey.component.scss'],
+  standalone: true,
+  imports: [IonHeader,IonToolbar,IonTitle,IonContent,
+      IonList,IonListHeader,IonItem,IonCardTitle,FormsModule,
+      IonLabel,IonIcon,IonButton,IonCardContent,
+      IonInput,IonSearchbar,IonCard,IonCardHeader,
+      CommonModule
+    ]
+})
+export class PagePsysurveyComponent  implements OnInit {
+  surveys: any[] = []; // 存储问卷通知
+  filteredSurveys: any[] = []; // 存储过滤后的问卷
+  userApartment: string = '' ; // 当前用户的学院
+
+  constructor(private router: Router,private http: HttpClient,private userService: UserService) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+   goPublishSurvey(){
+    this.router.navigate(['tabs/page-publishsurvey'])
+   }
+
+   ngOnInit() {
+    // 动态获取当前用户的学院信息
+    this.userService.getCurrentUser().subscribe(user => {
+      this.userApartment = user.apartment; // 从用户数据中获取学院
+      this.getSurveys(); // 在获取到用户信息后获取问卷
+    }, error => {
+      console.error('获取用户信息时出错:', error);
+      // 可以设置一个默认值或处理错误
+    });
+  }
+
+  getSurveys() {
+    this.http.get('http://127.0.0.1:4040/apps/DevServer/browser/survey').subscribe(
+      (response: any) => {
+        this.surveys = response; // 假设响应是问卷数组
+        this.filterSurveys(); // 过滤问卷
+      },
+      error => {
+        console.error('获取问卷时出错:', error);
+      }
+    );
+  }
+  filterSurveys() {
+    this.filteredSurveys = this.surveys.filter(survey => {
+      return survey.audience === this.userApartment || survey.audience === 'all';
+    });
+  }
+  
+  
+}

+ 67 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223235522.ts

@@ -0,0 +1,67 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar } from '@ionic/angular/standalone';
+  import { HttpClient } from '@angular/common/http';
+  import { UserService } from '../user.service'; // 确保路径正确
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+
+
+  
+
+@Component({
+  selector: 'app-page-psysurvey',
+  templateUrl: './page-psysurvey.component.html',
+  styleUrls: ['./page-psysurvey.component.scss'],
+  standalone: true,
+  imports: [IonHeader,IonToolbar,IonTitle,IonContent,
+      IonList,IonListHeader,IonItem,IonCardTitle,FormsModule,
+      IonLabel,IonIcon,IonButton,IonCardContent,
+      IonInput,IonSearchbar,IonCard,IonCardHeader,
+      CommonModule
+    ]
+})
+export class PagePsysurveyComponent  implements OnInit {
+  surveys: any[] = []; // 存储问卷通知
+  filteredSurveys: any[] = []; // 存储过滤后的问卷
+  userApartment: string = '' ; // 当前用户的学院
+
+  constructor(private router: Router,private http: HttpClient,private userService: UserService) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+   goPublishSurvey(){
+    this.router.navigate(['tabs/page-publishsurvey'])
+   }
+
+   ngOnInit() {
+    // 动态获取当前用户的学院信息
+    this.userService.getCurrentUser().subscribe(user => {
+      this.userApartment = user.apartment; // 从用户数据中获取学院
+      this.getSurveys(); // 在获取到用户信息后获取问卷
+    }, error => {
+      console.error('获取用户信息时出错:', error);
+      // 可以设置一个默认值或处理错误
+    });
+  }
+
+  getSurveys() {
+    this.http.get('http://127.0.0.1:4040/apps/DevServer/browser/survey').subscribe(
+      (response: any) => {
+        this.surveys = response; // 假设响应是问卷数组
+        this.filterSurveys(); // 过滤问卷
+      },
+      error => {
+        console.error('获取问卷时出错:', error);
+      }
+    );
+  }
+  filterSurveys() {
+    this.filteredSurveys = this.surveys.filter(survey => {
+      return survey.audience === this.userApartment || survey.audience === 'all';
+    });
+  }
+  
+  
+}

+ 67 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241223235734.ts

@@ -0,0 +1,67 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar } from '@ionic/angular/standalone';
+  import { HttpClient } from '@angular/common/http';
+  import { UserService } from '../user.service'; // 确保路径正确
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+
+
+  
+
+@Component({
+  selector: 'app-page-psysurvey',
+  templateUrl: './page-psysurvey.component.html',
+  styleUrls: ['./page-psysurvey.component.scss'],
+  standalone: true,
+  imports: [IonHeader,IonToolbar,IonTitle,IonContent,
+      IonList,IonListHeader,IonItem,IonCardTitle,FormsModule,
+      IonLabel,IonIcon,IonButton,IonCardContent,
+      IonInput,IonSearchbar,IonCard,IonCardHeader,
+      CommonModule
+    ]
+})
+export class PagePsysurveyComponent  implements OnInit {
+  surveys: any[] = []; // 存储问卷通知
+  filteredSurveys: any[] = []; // 存储过滤后的问卷
+  userApartment: string = '' ; // 当前用户的学院
+
+  constructor(private router: Router,private http: HttpClient,private userService: UserService) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+   goPublishSurvey(){
+    this.router.navigate(['tabs/page-publishsurvey'])
+   }
+
+   ngOnInit() {
+    // 动态获取当前用户的学院信息
+    this.userService.getCurrentUser().subscribe(user => {
+      this.userApartment = user.apartment; // 从用户数据中获取学院
+      this.getSurveys(); // 在获取到用户信息后获取问卷
+    }, error => {
+      console.error('获取用户信息时出错:', error);
+      // 可以设置一个默认值或处理错误
+    });
+  }
+
+  getSurveys() {
+    this.http.get('http://127.0.0.1:4040/').subscribe(
+      (response: any) => {
+        this.surveys = response; // 假设响应是问卷数组
+        this.filterSurveys(); // 过滤问卷
+      },
+      error => {
+        console.error('获取问卷时出错:', error);
+      }
+    );
+  }
+  filterSurveys() {
+    this.filteredSurveys = this.surveys.filter(survey => {
+      return survey.audience === this.userApartment || survey.audience === 'all';
+    });
+  }
+  
+  
+}

+ 36 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241224003203.html

@@ -0,0 +1,36 @@
+<ion-header>
+  <ion-toolbar>
+    <div class="toolbar-content">
+      <div class="button-container">
+        <ion-button (click)="goTab1()" fill="clear">
+          <ion-icon name="chevron-back" slot="start"></ion-icon>返回
+        </ion-button>
+      </div>
+      <ion-title class="title-text">
+        心理普查
+      </ion-title>
+    </div>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+<section *ngIf="filteredSurveys.length > 0">
+  <ion-card *ngFor="let survey of filteredSurveys">
+    <ion-card-header>
+      <ion-card-title>问卷通知</ion-card-title>
+      <ion-card-title>{{ survey.title }}</ion-card-title>
+    </ion-card-header>
+    <ion-card-content>
+      <p>链接: <a [href]="survey.link" target="_blank">{{ survey.link }}</a></p>
+    </ion-card-content>
+  </ion-card>
+</section>
+
+  <div  style="display: flex; justify-content: center; margin-top: auto;">
+    <ion-button (click)="goPublishSurvey()" expand="full">
+      发布问卷
+    </ion-button>
+  </div>
+
+
+</ion-content>

+ 35 - 0
.history/soul-app/src/app/page-psysurvey/page-psysurvey.component_20241224003220.html

@@ -0,0 +1,35 @@
+<ion-header>
+  <ion-toolbar>
+    <div class="toolbar-content">
+      <div class="button-container">
+        <ion-button (click)="goTab1()" fill="clear">
+          <ion-icon name="chevron-back" slot="start"></ion-icon>返回
+        </ion-button>
+      </div>
+      <ion-title class="title-text">
+        心理普查
+      </ion-title>
+    </div>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+<section *ngIf="filteredSurveys.length > 0">
+  <ion-card *ngFor="let survey of filteredSurveys">
+    <ion-card-header>
+      <ion-card-title>{{ survey.title }}</ion-card-title>
+    </ion-card-header>
+    <ion-card-content>
+      <p>链接: <a [href]="survey.link" target="_blank">{{ survey.link }}</a></p>
+    </ion-card-content>
+  </ion-card>
+</section>
+
+  <div  style="display: flex; justify-content: center; margin-top: auto;">
+    <ion-button (click)="goPublishSurvey()" expand="full">
+      发布问卷
+    </ion-button>
+  </div>
+
+
+</ion-content>

+ 63 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223150649.html

@@ -0,0 +1,63 @@
+<ion-header>
+  <ion-toolbar>
+    <div class="toolbar-content">
+      <div class="button-container">
+        <ion-button (click)="goTab1()" fill="clear">
+          <ion-icon name="chevron-back" slot="start"></ion-icon>返回
+        </ion-button>
+      </div>
+      <ion-title class="title-text">
+        发布问卷
+      </ion-title>
+    </div>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+  <ion-segment [(ngModel)]="category" (ionChange)="onCategoryChange()">
+    <ion-segment-button value="school">
+      学校
+    </ion-segment-button>
+    <ion-segment-button value="society">
+      社会
+    </ion-segment-button>
+  </ion-segment>
+
+  <div *ngIf="category === 'school'">
+    <ion-item>
+      <ion-label position="floating">问卷标题</ion-label>
+      <ion-input [(ngModel)]="surveyTitle"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">问卷链接</ion-label>
+      <ion-input [(ngModel)]="surveyLink"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label>面向对象</ion-label>
+      <ion-select [(ngModel)]="targetAudience">
+        <ion-select-option value="all">全校学生</ion-select-option>
+        <ion-select-option value="软件学院">软件学院</ion-select-option>
+        <ion-select-option value="music">音乐学院</ion-select-option>
+      </ion-select>
+    </ion-item>
+
+    <ion-button expand="full" (click)="publishSurvey()">发布问卷</ion-button>
+  </div>
+
+  <div *ngIf="category === 'society'">
+    <!-- 社会问卷设置格式 -->
+    <ion-item>
+      <ion-label position="floating">社会问卷标题</ion-label>
+      <ion-input [(ngModel)]="societySurveyTitle"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">社会问卷链接</ion-label>
+      <ion-input [(ngModel)]="societySurveyLink"></ion-input>
+    </ion-item>
+
+    <ion-button expand="full" (click)="publishSocietySurvey()">发布社会问卷</ion-button>
+  </div>
+</ion-content>

+ 76 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223214959.ts

@@ -0,0 +1,76 @@
+import { Component, OnInit,NgModule } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms';
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    IonList,IonListHeader,IonItem,IonCardTitle,HttpClient,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,FormsModule
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  // societySurveyTitle: string = '';
+  // societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/apps/DevServer/browser/survey', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  // publishSocietySurvey() {
+  //   console.log('发布社会问卷:');
+  //   console.log(`标题: ${this.societySurveyTitle}`);
+  //   console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  // }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 76 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223220203.ts

@@ -0,0 +1,76 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms';
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    IonList,IonListHeader,IonItem,IonCardTitle,HttpClient,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,FormsModule
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  // societySurveyTitle: string = '';
+  // societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/apps/DevServer/browser/survey', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  // publishSocietySurvey() {
+  //   console.log('发布社会问卷:');
+  //   console.log(`标题: ${this.societySurveyTitle}`);
+  //   console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  // }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 76 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223230330.ts

@@ -0,0 +1,76 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
+  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    IonList,IonListHeader,IonItem,IonCardTitle,HttpClient,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  // societySurveyTitle: string = '';
+  // societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/apps/DevServer/browser/survey', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  // publishSocietySurvey() {
+  //   console.log('发布社会问卷:');
+  //   console.log(`标题: ${this.societySurveyTitle}`);
+  //   console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  // }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 75 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223232332.ts

@@ -0,0 +1,75 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    HttpClient,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  // societySurveyTitle: string = '';
+  // societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/apps/DevServer/browser/survey', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  // publishSocietySurvey() {
+  //   console.log('发布社会问卷:');
+  //   console.log(`标题: ${this.societySurveyTitle}`);
+  //   console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  // }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 75 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223232613.ts

@@ -0,0 +1,75 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  // societySurveyTitle: string = '';
+  // societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/apps/DevServer/browser/survey', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  // publishSocietySurvey() {
+  //   console.log('发布社会问卷:');
+  //   console.log(`标题: ${this.societySurveyTitle}`);
+  //   console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  // }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 75 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223233904.ts

@@ -0,0 +1,75 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    FormsModule,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  // societySurveyTitle: string = '';
+  // societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/apps/DevServer/browser/survey', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  // publishSocietySurvey() {
+  //   console.log('发布社会问卷:');
+  //   console.log(`标题: ${this.societySurveyTitle}`);
+  //   console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  // }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 75 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223234415.ts

@@ -0,0 +1,75 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonList, IonListHeader, IonItem,IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    FormsModule,IonList, IonListHeader, IonItem,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  // societySurveyTitle: string = '';
+  // societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/apps/DevServer/browser/survey', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  // publishSocietySurvey() {
+  //   console.log('发布社会问卷:');
+  //   console.log(`标题: ${this.societySurveyTitle}`);
+  //   console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  // }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 65 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223234722.html

@@ -0,0 +1,65 @@
+<ion-header>
+  <ion-toolbar>
+    <div class="toolbar-content">
+      <div class="button-container">
+        <ion-button (click)="goTab1()" fill="clear">
+          <ion-icon name="chevron-back" slot="start"></ion-icon>返回
+        </ion-button>
+      </div>
+      <ion-title class="title-text">
+        发布问卷
+      </ion-title>
+    </div>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+  <ion-segment [(ngModel)]="category" (ionChange)="onCategoryChange()">
+    <ion-segment-button value="school">
+      学校
+    </ion-segment-button>
+    <ion-segment-button value="society">
+      社会
+    </ion-segment-button>
+  </ion-segment>
+
+  <div *ngIf="category === 'school'">
+    <ion-list>
+    <ion-item>
+      <ion-label position="floating">问卷标题</ion-label>
+      <ion-input [(ngModel)]="surveyTitle"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">问卷链接</ion-label>
+      <ion-input [(ngModel)]="surveyLink"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label>面向对象</ion-label>
+      <ion-select [(ngModel)]="targetAudience">
+        <ion-select-option value="all">全校学生</ion-select-option>
+        <ion-select-option value="软件学院">软件学院</ion-select-option>
+        <ion-select-option value="music">音乐学院</ion-select-option>
+      </ion-select>
+    </ion-item>
+  </ion-list>
+
+    <ion-button expand="full" (click)="publishSurvey()">发布问卷</ion-button>
+  </div>
+
+  <div *ngIf="category === 'society'">
+    <!-- 社会问卷设置格式 -->
+    <ion-item>
+      <ion-label position="floating">社会问卷标题</ion-label>
+      <ion-input [(ngModel)]="societySurveyTitle"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">社会问卷链接</ion-label>
+      <ion-input [(ngModel)]="societySurveyLink"></ion-input>
+    </ion-item>
+
+    <ion-button expand="full" (click)="publishSocietySurvey()">发布社会问卷</ion-button>
+  </div>
+</ion-content>

+ 65 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223234846.html

@@ -0,0 +1,65 @@
+<ion-header>
+  <ion-toolbar>
+    <div class="toolbar-content">
+      <div class="button-container">
+        <ion-button (click)="goTab1()" fill="clear">
+          <ion-icon name="chevron-back" slot="start"></ion-icon>返回
+        </ion-button>
+      </div>
+      <ion-title class="title-text">
+        发布问卷
+      </ion-title>
+    </div>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+  <ion-segment [(ngModel)]="category" (ionChange)="onCategoryChange()">
+    <ion-segment-button value="school">
+      学校
+    </ion-segment-button>
+    <ion-segment-button value="society">
+      社会
+    </ion-segment-button>
+  </ion-segment>
+
+  <div *ngIf="category === 'school'">
+    <ion-list>
+    <ion-item>
+      <ion-label position="floating">问卷标题</ion-label>
+      <ion-input [(ngModel)]="surveyTitle"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">问卷链接</ion-label>
+      <ion-input [(ngModel)]="surveyLink"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label>面向对象</ion-label>
+      <ion-select [(ngModel)]="targetAudience">
+        <ion-select-option value="all">全校学生</ion-select-option>
+        <ion-select-option value="软件学院">软件学院</ion-select-option>
+        <ion-select-option value="music">音乐学院</ion-select-option>
+      </ion-select>
+    </ion-item>
+  </ion-list>
+
+    <ion-button expand="full" (click)="publishSurvey()">发布问卷</ion-button>
+  </div>
+
+  <div *ngIf="category === 'society'">
+    <!-- 社会问卷设置格式 -->
+    <ion-item>
+      <ion-label position="floating">社会问卷标题</ion-label>
+      
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">社会问卷链接</ion-label>
+      
+    </ion-item>
+
+    <ion-button expand="full" (click)="publishSocietySurvey()">发布社会问卷</ion-button>
+  </div>
+</ion-content>

+ 65 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223234902.html

@@ -0,0 +1,65 @@
+<ion-header>
+  <ion-toolbar>
+    <div class="toolbar-content">
+      <div class="button-container">
+        <ion-button (click)="goTab1()" fill="clear">
+          <ion-icon name="chevron-back" slot="start"></ion-icon>返回
+        </ion-button>
+      </div>
+      <ion-title class="title-text">
+        发布问卷
+      </ion-title>
+    </div>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+  <ion-segment [(ngModel)]="category" (ionChange)="onCategoryChange()">
+    <ion-segment-button value="school">
+      学校
+    </ion-segment-button>
+    <ion-segment-button value="society">
+      社会
+    </ion-segment-button>
+  </ion-segment>
+
+  <div *ngIf="category === 'school'">
+    <ion-list>
+    <ion-item>
+      <ion-label position="floating">问卷标题</ion-label>
+      <ion-input [(ngModel)]="surveyTitle"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">问卷链接</ion-label>
+      <ion-input [(ngModel)]="surveyLink"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label>面向对象</ion-label>
+      <ion-select [(ngModel)]="targetAudience">
+        <ion-select-option value="all">全校学生</ion-select-option>
+        <ion-select-option value="软件学院">软件学院</ion-select-option>
+        <ion-select-option value="music">音乐学院</ion-select-option>
+      </ion-select>
+    </ion-item>
+  </ion-list>
+
+    <ion-button expand="full" (click)="publishSurvey()">发布问卷</ion-button>
+  </div>
+
+  <div *ngIf="category === 'society'">
+    <!-- 社会问卷设置格式 -->
+    <ion-item>
+      <ion-label position="floating">社会问卷标题</ion-label>
+      
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">社会问卷链接</ion-label>
+      
+    </ion-item>
+
+    <ion-button expand="full" >发布社会问卷</ion-button>
+  </div>
+</ion-content>

+ 75 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241223235756.ts

@@ -0,0 +1,75 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonList, IonListHeader, IonItem,IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    FormsModule,IonList, IonListHeader, IonItem,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  // societySurveyTitle: string = '';
+  // societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  // publishSocietySurvey() {
+  //   console.log('发布社会问卷:');
+  //   console.log(`标题: ${this.societySurveyTitle}`);
+  //   console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  // }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 65 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224000226.html

@@ -0,0 +1,65 @@
+<ion-header>
+  <ion-toolbar>
+    <div class="toolbar-content">
+      <div class="button-container">
+        <ion-button (click)="goTab1()" fill="clear">
+          <ion-icon name="chevron-back" slot="start"></ion-icon>返回
+        </ion-button>
+      </div>
+      <ion-title class="title-text">
+        发布问卷
+      </ion-title>
+    </div>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+  <ion-segment [(ngModel)]="category" (ionChange)="onCategoryChange()">
+    <ion-segment-button value="school">
+      学校
+    </ion-segment-button>
+    <ion-segment-button value="society">
+      社会
+    </ion-segment-button>
+  </ion-segment>
+
+  <div *ngIf="category === 'school'">
+    <ion-list>
+    <ion-item>
+      <ion-label position="floating">问卷标题</ion-label>
+      <ion-input [(ngModel)]="surveyTitle"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">问卷链接</ion-label>
+      <ion-input [(ngModel)]="surveyLink"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label>面向对象</ion-label>
+      <ion-select [(ngModel)]="targetAudience">
+        <ion-select-option value="all">全校学生</ion-select-option>
+        <ion-select-option value="软件学院">软件学院</ion-select-option>
+        <ion-select-option value="music">音乐学院</ion-select-option>
+      </ion-select>
+    </ion-item>
+  </ion-list>
+
+    <ion-button expand="full" (click)="publishSurvey()">发布问卷</ion-button>
+  </div>
+
+  <div *ngIf="category === 'society'">
+    <!-- 社会问卷设置格式 -->
+    <ion-item>
+      <ion-label position="floating">社会问卷标题</ion-label>
+      <ion-input [(ngModel)]="societySurveyTitle"></ion-input>
+    </ion-item>
+
+    <ion-item>
+      <ion-label position="floating">社会问卷链接</ion-label>
+      <ion-input [(ngModel)]="societySurveyLink"></ion-input>
+    </ion-item>
+
+    <ion-button expand="full" (click)="publishSocietySurvey()">发布社会问卷</ion-button>
+  </div>
+</ion-content>

+ 75 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224000227.ts

@@ -0,0 +1,75 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonList, IonListHeader, IonItem,IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    FormsModule,IonList, IonListHeader, IonItem,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  societySurveyTitle: string = '';
+  societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        // 发布成功后可以导航到心理普查页面
+        this.router.navigate(['tabs/psysurvey']);
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  publishSocietySurvey() {
+    console.log('发布社会问卷:');
+    console.log(`标题: ${this.societySurveyTitle}`);
+    console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 74 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224000825.ts

@@ -0,0 +1,74 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonList, IonListHeader, IonItem,IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    FormsModule,IonList, IonListHeader, IonItem,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  societySurveyTitle: string = '';
+  societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  publishSocietySurvey() {
+    console.log('发布社会问卷:');
+    console.log(`标题: ${this.societySurveyTitle}`);
+    console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/tab1']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 74 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224002925.ts

@@ -0,0 +1,74 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonList, IonListHeader, IonItem,IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    FormsModule,IonList, IonListHeader, IonItem,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  societySurveyTitle: string = '';
+  societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  publishSocietySurvey() {
+    console.log('发布社会问卷:');
+    console.log(`标题: ${this.societySurveyTitle}`);
+    console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/page-publishsurvey']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 74 - 0
.history/soul-app/src/app/page-publishsurvey/page-publishsurvey.component_20241224002949.ts

@@ -0,0 +1,74 @@
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonHeader,IonButton, IonList, IonListHeader, IonItem,IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+  import { CommonModule } from '@angular/common';
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+  import { HttpClient } from '@angular/common/http';
+
+
+@Component({
+  selector: 'app-page-publishsurvey',
+  templateUrl: './page-publishsurvey.component.html',
+  styleUrls: ['./page-publishsurvey.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
+    FormsModule,IonList, IonListHeader, IonItem,
+    IonLabel,IonIcon,IonButton,IonCardContent,
+    IonInput,IonSearchbar,IonCard,IonCardHeader,
+    CommonModule,
+  ]
+})
+
+
+export class PagePublishsurveyComponent  implements OnInit {
+  category: string = 'school'; // 默认类别
+  surveyTitle: string = '';
+  surveyLink: string = '';
+  targetAudience: string = 'all'; // 默认面向对象
+  societySurveyTitle: string = '';
+  societySurveyLink: string = '';
+
+  onCategoryChange() {
+    console.log(`当前选择的类别: ${this.category}`);
+  }
+
+  publishSurvey() {
+    console.log('发布学校问卷:');
+    console.log(`标题: ${this.surveyTitle}`);
+    console.log(`链接: ${this.surveyLink}`);
+    console.log(`面向对象: ${this.targetAudience}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
+  }
+
+  publishSocietySurvey() {
+    console.log('发布社会问卷:');
+    console.log(`标题: ${this.societySurveyTitle}`);
+    console.log(`链接: ${this.societySurveyLink}`);
+    // 这里可以添加逻辑将问卷发布到后端或其他处理
+  }
+
+  constructor(private router: Router,private http: HttpClient) { }
+  goTab1(){
+    this.router.navigate(['tabs/page-psysurvey']);
+   }
+
+
+  ngOnInit() {}
+
+}

+ 82 - 0
.history/soul-app/src/app/tab1/tab1.page_20241223141129.scss

@@ -0,0 +1,82 @@
+/* 设置页面背景色 */
+ion-content {
+    --background: #f9f9f9; /* 设置内容背景色 */
+  }
+  
+  /* 设置卡片的样式 */
+  ion-card {
+    margin: 10px; /* 卡片之间的间距 */
+    border-radius: 10px; /* 圆角效果 */
+    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); /* 阴影效果 */
+  }
+  ion-card-title {
+    font-weight:bold;
+  }
+  
+  /* 设置列表项的样式 */
+  ion-item {
+    margin: 5px 0; /* 列表项之间的间距 */
+  }
+  ion-button {
+    font-size: 15px; /* 增大字体大小 */
+    margin-top: 8px; /* 上间距,仅在需要时添加 */
+    text-transform: none; /* 按钮文字不变形 */
+    height: 35px;
+    flex: 1,3; /* 每个按钮等分空间 */
+    margin: 0 5px; /* 按钮之间的间距 */
+    color: rgb(42, 50, 77);
+}
+  /* 设置搜索框的样式 */
+  ion-searchbar {
+    padding: 10px; /* 内边距 */
+    border-radius: 4px; /* 圆角 */
+    font-size: 16px; /* 字体大小 */
+  }
+  
+  /* 设置用户评价星星的样式 */
+  ion-icon[name="star"] {
+    color: gold; /* 星星颜色 */
+    font-size: 1.2rem; /* 星星大小 */
+  }
+  ion-card-header {
+    --background: #ffffff; /* 使用CSS变量设置背景颜色为白色 */
+    /* 或者,如果你不使用CSS变量,可以直接使用background-color属性 */
+    position: relative; /* 设置相对定位 */
+  }
+   
+  /* 实际上,ion-toolbar默认会继承ion-card-header的样式,但你可以显式地设置它以确保一致性 */
+  ion-toolbar {
+    --background: #ffffff; /* 同样使用CSS变量,但通常不是必需的 */
+  }
+   
+  /* 确保按钮的文本颜色是白色 */
+  .button-text {
+    color: #ffffff !important; /* 使用!important可以确保这个规则具有更高的优先级,但通常不推荐,除非确实需要 */
+    /* 然而,在这个例子中,由于按钮本身可能有自己的颜色设置,你可能不需要为.button-text设置颜色,
+       而是应该确保按钮的color属性正确,并在需要时覆盖按钮的默认颜色设置 */
+  }
+
+  ion-avatar {
+    width: 50px; /* 或者你需要的任何尺寸 */
+    height: 50px; /* 保持宽高一致,避免变形 */
+  }
+   
+  ion-avatar img {
+    width: 100%; /* 让图片填满avatar */
+    height: auto; /* 保持图片比例 */
+  }
+  .header-image {
+    width: 100%;
+    height: auto; /* 保持图片比例 */
+    border-radius: 50%; /* 可选:将图片设置为圆形 */
+  }
+  .button-toolbar {
+    display: flex;
+    justify-content: space-between; /* 均匀分布按钮 */
+  }
+  
+  .button-container {
+    display: flex;
+    width: 100%; /* 使按钮容器占满整个宽度 */
+  }
+  

+ 82 - 0
.history/soul-app/src/app/tab1/tab1.page_20241223141133.scss

@@ -0,0 +1,82 @@
+/* 设置页面背景色 */
+ion-content {
+    --background: #f9f9f9; /* 设置内容背景色 */
+  }
+  
+  /* 设置卡片的样式 */
+  ion-card {
+    margin: 10px; /* 卡片之间的间距 */
+    border-radius: 10px; /* 圆角效果 */
+    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); /* 阴影效果 */
+  }
+  ion-card-title {
+    font-weight:bold;
+  }
+  
+  /* 设置列表项的样式 */
+  ion-item {
+    margin: 5px 0; /* 列表项之间的间距 */
+  }
+  ion-button {
+    font-size: 15px; /* 增大字体大小 */
+    margin-top: 8px; /* 上间距,仅在需要时添加 */
+    text-transform: none; /* 按钮文字不变形 */
+    height: 35px;
+    flex: 1.3; /* 每个按钮等分空间 */
+    margin: 0 5px; /* 按钮之间的间距 */
+    color: rgb(42, 50, 77);
+}
+  /* 设置搜索框的样式 */
+  ion-searchbar {
+    padding: 10px; /* 内边距 */
+    border-radius: 4px; /* 圆角 */
+    font-size: 16px; /* 字体大小 */
+  }
+  
+  /* 设置用户评价星星的样式 */
+  ion-icon[name="star"] {
+    color: gold; /* 星星颜色 */
+    font-size: 1.2rem; /* 星星大小 */
+  }
+  ion-card-header {
+    --background: #ffffff; /* 使用CSS变量设置背景颜色为白色 */
+    /* 或者,如果你不使用CSS变量,可以直接使用background-color属性 */
+    position: relative; /* 设置相对定位 */
+  }
+   
+  /* 实际上,ion-toolbar默认会继承ion-card-header的样式,但你可以显式地设置它以确保一致性 */
+  ion-toolbar {
+    --background: #ffffff; /* 同样使用CSS变量,但通常不是必需的 */
+  }
+   
+  /* 确保按钮的文本颜色是白色 */
+  .button-text {
+    color: #ffffff !important; /* 使用!important可以确保这个规则具有更高的优先级,但通常不推荐,除非确实需要 */
+    /* 然而,在这个例子中,由于按钮本身可能有自己的颜色设置,你可能不需要为.button-text设置颜色,
+       而是应该确保按钮的color属性正确,并在需要时覆盖按钮的默认颜色设置 */
+  }
+
+  ion-avatar {
+    width: 50px; /* 或者你需要的任何尺寸 */
+    height: 50px; /* 保持宽高一致,避免变形 */
+  }
+   
+  ion-avatar img {
+    width: 100%; /* 让图片填满avatar */
+    height: auto; /* 保持图片比例 */
+  }
+  .header-image {
+    width: 100%;
+    height: auto; /* 保持图片比例 */
+    border-radius: 50%; /* 可选:将图片设置为圆形 */
+  }
+  .button-toolbar {
+    display: flex;
+    justify-content: space-between; /* 均匀分布按钮 */
+  }
+  
+  .button-container {
+    display: flex;
+    width: 100%; /* 使按钮容器占满整个宽度 */
+  }
+  

+ 82 - 0
.history/soul-app/src/app/tab1/tab1.page_20241223141153.scss

@@ -0,0 +1,82 @@
+/* 设置页面背景色 */
+ion-content {
+    --background: #f9f9f9; /* 设置内容背景色 */
+  }
+  
+  /* 设置卡片的样式 */
+  ion-card {
+    margin: 10px; /* 卡片之间的间距 */
+    border-radius: 10px; /* 圆角效果 */
+    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); /* 阴影效果 */
+  }
+  ion-card-title {
+    font-weight:bold;
+  }
+  
+  /* 设置列表项的样式 */
+  ion-item {
+    margin: 5px 0; /* 列表项之间的间距 */
+  }
+  ion-button {
+    font-size: 15px; /* 增大字体大小 */
+    margin-top: 8px; /* 上间距,仅在需要时添加 */
+    text-transform: none; /* 按钮文字不变形 */
+    height: 35px;
+    flex: 1; /* 每个按钮等分空间 */
+    margin: 1 7px; /* 按钮之间的间距 */
+    color: rgb(42, 50, 77);
+}
+  /* 设置搜索框的样式 */
+  ion-searchbar {
+    padding: 10px; /* 内边距 */
+    border-radius: 4px; /* 圆角 */
+    font-size: 16px; /* 字体大小 */
+  }
+  
+  /* 设置用户评价星星的样式 */
+  ion-icon[name="star"] {
+    color: gold; /* 星星颜色 */
+    font-size: 1.2rem; /* 星星大小 */
+  }
+  ion-card-header {
+    --background: #ffffff; /* 使用CSS变量设置背景颜色为白色 */
+    /* 或者,如果你不使用CSS变量,可以直接使用background-color属性 */
+    position: relative; /* 设置相对定位 */
+  }
+   
+  /* 实际上,ion-toolbar默认会继承ion-card-header的样式,但你可以显式地设置它以确保一致性 */
+  ion-toolbar {
+    --background: #ffffff; /* 同样使用CSS变量,但通常不是必需的 */
+  }
+   
+  /* 确保按钮的文本颜色是白色 */
+  .button-text {
+    color: #ffffff !important; /* 使用!important可以确保这个规则具有更高的优先级,但通常不推荐,除非确实需要 */
+    /* 然而,在这个例子中,由于按钮本身可能有自己的颜色设置,你可能不需要为.button-text设置颜色,
+       而是应该确保按钮的color属性正确,并在需要时覆盖按钮的默认颜色设置 */
+  }
+
+  ion-avatar {
+    width: 50px; /* 或者你需要的任何尺寸 */
+    height: 50px; /* 保持宽高一致,避免变形 */
+  }
+   
+  ion-avatar img {
+    width: 100%; /* 让图片填满avatar */
+    height: auto; /* 保持图片比例 */
+  }
+  .header-image {
+    width: 100%;
+    height: auto; /* 保持图片比例 */
+    border-radius: 50%; /* 可选:将图片设置为圆形 */
+  }
+  .button-toolbar {
+    display: flex;
+    justify-content: space-between; /* 均匀分布按钮 */
+  }
+  
+  .button-container {
+    display: flex;
+    width: 100%; /* 使按钮容器占满整个宽度 */
+  }
+  

+ 9 - 0
.history/soul-app/src/app/user.service_20241223213452.ts

@@ -0,0 +1,9 @@
+import { Injectable } from '@angular/core';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class UserService {
+
+  constructor() { }
+}

+ 17 - 0
.history/soul-app/src/app/user.service_20241223213959.ts

@@ -0,0 +1,17 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class UserService {
+  private apiUrl = 'http://127.0.0.1:4040/apps/DevServer/browser/survey'; // 替换为你的 API URL
+
+  constructor(private http: HttpClient) {}
+
+  // 获取当前用户信息
+  getCurrentUser(): Observable<any> {
+    return this.http.get(`${this.apiUrl}/current-user`); // 假设这个 API 返回当前用户的信息
+  }
+}

+ 82 - 0
.history/soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component_20241223135555.ts

@@ -0,0 +1,82 @@
+import { OnInit } from '@angular/core';
+import { Component } from '@angular/core';
+import { ModalController, IonInput, IonItem, IonLabel, IonSegment,  IonButton, IonCard, IonSegmentButton,IonCardHeader, IonCardTitle, IonCardSubtitle, IonCardContent, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+import { CloudUser } from 'src/lib/ncloud';
+import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+import { CommonModule } from '@angular/common';
+
+@Component({
+  selector: 'app-modal-identity-verification',
+  templateUrl: './modal-identity-verification.component.html',
+  styleUrls: ['./modal-identity-verification.component.scss'],
+  standalone: true,
+  imports: [
+    IonCard,
+    IonCardHeader,
+    IonCardTitle,
+    IonCardSubtitle,
+    IonCardContent,
+    IonSegment,  
+    IonSegmentButton,
+    IonButton,
+    IonInput,
+    IonItem,
+    IonLabel,
+    IonSelect,
+    IonSelectOption,
+    FormsModule,
+    CommonModule
+  ],
+})
+export class ModalIdentityVerificationComponent implements OnInit {
+  currentUser: CloudUser | undefined;
+  userData: any = {
+    school: '',
+    identity: '',
+    studentID: '',
+    department: '',
+    teacherID: ''
+  };
+
+  constructor(private modalCtrl: ModalController) {
+    this.currentUser = new CloudUser();
+  }
+
+  ngOnInit() {}
+
+  onIdentityChange() {
+    // 根据身份选择进行处理
+    if (this.userData.identity === 'student') {
+      this.userData.teacherID = ''; // 清空教师ID字段
+    } else if (this.userData.identity === 'teacher') {
+      this.userData.studentID = ''; // 清空学号字段
+      this.userData.department = ''; // 清空学院字段
+    }
+  }
+
+  async save() {
+    this.currentUser?.set(this.userData);
+    await this.currentUser?.save();
+    this.modalCtrl.dismiss(this.currentUser, "confirm");
+  }
+
+  cancel() {
+    this.modalCtrl.dismiss(null, "cancel");
+  }
+}
+
+export async function openIdentityVerificationModal(modalCtrl: ModalController): Promise<CloudUser | null> {
+  const modal = await modalCtrl.create({
+    component: ModalIdentityVerificationComponent,
+    breakpoints: [0.7, 1.0],
+    initialBreakpoint: 0.7
+  });
+  modal.present();
+
+  const { data, role } = await modal.onWillDismiss();
+
+  if (role === 'confirm') {
+    return data;
+  }
+  return null;
+}

+ 82 - 0
.history/soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component_20241223141342.ts

@@ -0,0 +1,82 @@
+import { OnInit } from '@angular/core';
+import { Component } from '@angular/core';
+import { ModalController, IonInput, IonItem, IonLabel, IonSegment,  IonButton, IonCard, IonSegmentButton,IonCardHeader, IonCardTitle, IonCardSubtitle, IonCardContent, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+import { CloudUser } from 'src/lib/ncloud';
+import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+import { CommonModule } from '@angular/common';
+
+@Component({
+  selector: 'app-modal-identity-verification',
+  templateUrl: './modal-identity-verification.component.html',
+  styleUrls: ['./modal-identity-verification.component.scss'],
+  standalone: true,
+  imports: [
+    IonCard,
+    IonCardHeader,
+    IonCardTitle,
+    IonCardSubtitle,
+    IonCardContent,
+    IonSegment,  
+    IonSegmentButton,
+    IonButton,
+    IonInput,
+    IonItem,
+    IonLabel,
+    IonSelect,
+    IonSelectOption,
+    FormsModule,
+    CommonModule
+  ],
+})
+export class ModalIdentityVerificationComponent implements OnInit {
+  currentUser: CloudUser | undefined;
+  userData: any = {
+    school: '',
+    identity: '',
+    studentID: '',
+    department: '',
+    teacherID: ''
+  };
+
+  constructor(private modalCtrl: ModalController) {
+    this.currentUser = new CloudUser();
+  }
+
+  ngOnInit() {}
+
+  onIdentityChange() {
+    // 根据身份选择进行处理
+    if (this.userData.identity === 'student') {
+      this.userData.teacherID = ''; // 清空教师ID字段
+    } else if (this.userData.identity === 'teacher') {
+      this.userData.studentID = ''; // 清空学号字段
+      this.userData.department = ''; // 清空学院字段
+    }
+  }
+
+  async save() {
+    this.currentUser?.set(this.userData);
+    await this.currentUser?.save();
+    this.modalCtrl.dismiss(this.currentUser, "confirm");
+  }
+
+  cancel() {
+    this.modalCtrl.dismiss(null, "cancel");
+  }
+}
+
+export async function openIdentityVerificationModal(modalCtrl: ModalController): Promise<CloudUser | null> {
+  const modal = await modalCtrl.create({
+    component: ModalIdentityVerificationComponent,
+    breakpoints: [0.7, 1.0],
+    initialBreakpoint: 0.7
+  });
+  modal.present();
+
+  const { data, role } = await modal.onWillDismiss();
+
+  if (role === 'confirm') {
+    return data;
+  }
+  return null;
+}

+ 82 - 0
.history/soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component_20241223141403.ts

@@ -0,0 +1,82 @@
+import { OnInit } from '@angular/core';
+import { Component } from '@angular/core';
+import { ModalController, IonInput, IonItem, IonLabel, IonSegment,  IonButton, IonCard, IonSegmentButton,IonCardHeader, IonCardTitle, IonCardSubtitle, IonCardContent, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+import { CloudUser } from 'src/lib/ncloud';
+import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+import { CommonModule } from '@angular/common';
+
+@Component({
+  selector: 'app-modal-identity-verification',
+  templateUrl: './modal-identity-verification.component.html',
+  styleUrls: ['./modal-identity-verification.component.scss'],
+  standalone: true,
+  imports: [
+    IonCard,
+    IonCardHeader,
+    IonCardTitle,
+    IonCardSubtitle,
+    IonCardContent,
+    IonSegment,  
+    IonSegmentButton,
+    IonButton,
+    IonInput,
+    IonItem,
+    IonLabel,
+    IonSelect,
+    IonSelectOption,
+    FormsModule,
+    CommonModule
+  ],
+})
+export class ModalIdentityVerificationComponent implements OnInit {
+  currentUser: CloudUser | undefined;
+  userData: any = {
+    school: '',
+    identity: '',
+    studentID: '',
+    department: '',
+    teacherID: ''
+  };
+
+  constructor(private modalCtrl: ModalController) {
+    this.currentUser = new CloudUser();
+  }
+
+  ngOnInit() {}
+
+  onIdentityChange() {
+    // 根据身份选择进行处理
+    if (this.userData.identity === 'student') {
+      this.userData.teacherID = ''; // 清空教师ID字段
+    } else if (this.userData.identity === 'teacher') {
+      this.userData.studentID = ''; // 清空学号字段
+      this.userData.department = ''; // 清空学院字段
+    }
+  }
+
+  async save() {
+    this.currentUser?.set(this.userData);
+    await this.currentUser?.save();
+    this.modalCtrl.dismiss(this.currentUser, "confirm");
+  }
+
+  cancel() {
+    this.modalCtrl.dismiss(null, "cancel");
+  }
+}
+
+export async function openIdentityVerificationModal(modalCtrl: ModalController): Promise<CloudUser | null> {
+  const modal = await modalCtrl.create({
+    component: ModalIdentityVerificationComponent,
+    breakpoints: [0.7, 1.0],
+    initialBreakpoint: 0.7
+  });
+  modal.present();
+
+  const { data, role } = await modal.onWillDismiss();
+
+  if (role === 'confirm') {
+    return data;
+  }
+  return null;
+}

+ 82 - 0
.history/soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component_20241223142253.ts

@@ -0,0 +1,82 @@
+import { OnInit } from '@angular/core';
+import { Component } from '@angular/core';
+import { ModalController, IonInput, IonItem, IonLabel, IonSegment,  IonButton, IonCard, IonSegmentButton,IonCardHeader, IonCardTitle, IonCardSubtitle, IonCardContent, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+import { CloudUser } from 'src/lib/ncloud';
+import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+import { CommonModule } from '@angular/common';
+
+@Component({
+  selector: 'app-modal-identity-verification',
+  templateUrl: './modal-identity-verification.component.html',
+  styleUrls: ['./modal-identity-verification.component.scss'],
+  standalone: true,
+  imports: [
+    IonCard,
+    IonCardHeader,
+    IonCardTitle,
+    IonCardSubtitle,
+    IonCardContent,
+    IonSegment,  
+    IonSegmentButton,
+    IonButton,
+    IonInput,
+    IonItem,
+    IonLabel,
+    IonSelect,
+    IonSelectOption,
+    FormsModule,
+    CommonModule
+  ],
+})
+export class ModalIdentityVerificationComponent implements OnInit {
+  currentUser: CloudUser | undefined;
+  userData: any = {
+    school: '',
+    identity: '',
+    studentID: '',
+    department: '',
+    teacherID: ''
+  };
+
+  constructor(private modalCtrl: ModalController) {
+    this.currentUser = new CloudUser();
+  }
+
+  ngOnInit() {}
+
+  onIdentityChange() {
+    // 根据身份选择进行处理
+    if (this.userData.identity === 'student') {
+      this.userData.teacherID = ''; // 清空教师ID字段
+    } else if (this.userData.identity === 'teacher') {
+      this.userData.studentID = ''; // 清空学号字段
+      this.userData.department = ''; // 清空学院字段
+    }
+  }
+
+  async save() {
+    this.currentUser?.set(this.userData);
+    await this.currentUser?.save();
+    this.modalCtrl.dismiss(this.currentUser, "confirm");
+  }
+
+  cancel() {
+    this.modalCtrl.dismiss(null, "cancel");
+  }
+}
+
+export async function openIdentityVerificationModal(modalCtrl: ModalController): Promise<CloudUser | null> {
+  const modal = await modalCtrl.create({
+    component: ModalIdentityVerificationComponent,
+    breakpoints: [0.7, 1.0],
+    initialBreakpoint: 0.7
+  });
+  modal.present();
+
+  const { data, role } = await modal.onWillDismiss();
+
+  if (role === 'confirm') {
+    return data;
+  }
+  return null;
+}

+ 38 - 0
.history/soul-app/src/lib/user/modal-user-edit/modal-user-edit.component_20241221201127.html

@@ -0,0 +1,38 @@
+<!-- 用户登录状态 -->
+<ion-card>
+  <ion-card-header>
+    <ion-card-title>
+      用户名:{{currentUser?.get("username")}}
+    </ion-card-title>
+    <ion-card-subtitle >请输入您的详细资料</ion-card-subtitle>
+   </ion-card-header>
+ <ion-card-content>
+
+    <ion-item>
+      <ion-input [value]="userData['realname']" (ionChange)="userDataChange('realname',$event)" label="姓名" placeholder="请您输入真实姓名"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['username']" (ionChange)="userDataChange('username',$event)" label="昵称" placeholder="请您输入用户网名"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input type="number" [value]="userData['age']" (ionChange)="userDataChange('age',$event)" label="年龄" placeholder="请您输入年龄"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['gender']" (ionChange)="userDataChange('gender',$event)" label="性别" placeholder="请您输入男/女"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['avatar']" (ionChange)="userDataChange('avatar',$event)" label="头像" placeholder="请您输入头像地址"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['email']" (ionChange)="userDataChange('avatar',$event)" label="邮箱" placeholder="请您输入邮箱号"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['account']" (ionChange)="userDataChange('avatar',$event)" label="手机号" placeholder="请您输入手机号"></ion-input>
+    </ion-item>
+
+   <ion-button expand="block" color="danger" (click)="save()">保存</ion-button>
+   <ion-button expand="block" color="danger" (click)="cancel()">取消</ion-button>
+ 
+
+  </ion-card-content>
+</ion-card>

+ 38 - 0
.history/soul-app/src/lib/user/modal-user-edit/modal-user-edit.component_20241223140521.html

@@ -0,0 +1,38 @@
+<!-- 用户登录状态 -->
+<ion-card style="max-height: 400px; overflow-y: auto;">
+  <ion-card-header>
+    <ion-card-title>
+      用户名:{{currentUser?.get("username")}}
+    </ion-card-title>
+    <ion-card-subtitle >请输入您的详细资料</ion-card-subtitle>
+   </ion-card-header>
+ <ion-card-content>
+
+    <ion-item>
+      <ion-input [value]="userData['realname']" (ionChange)="userDataChange('realname',$event)" label="姓名" placeholder="请您输入真实姓名"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['username']" (ionChange)="userDataChange('username',$event)" label="昵称" placeholder="请您输入用户网名"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input type="number" [value]="userData['age']" (ionChange)="userDataChange('age',$event)" label="年龄" placeholder="请您输入年龄"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['gender']" (ionChange)="userDataChange('gender',$event)" label="性别" placeholder="请您输入男/女"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['avatar']" (ionChange)="userDataChange('avatar',$event)" label="头像" placeholder="请您输入头像地址"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['email']" (ionChange)="userDataChange('avatar',$event)" label="邮箱" placeholder="请您输入邮箱号"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['account']" (ionChange)="userDataChange('avatar',$event)" label="手机号" placeholder="请您输入手机号"></ion-input>
+    </ion-item>
+
+   <ion-button expand="block" color="danger" (click)="save()">保存</ion-button>
+   <ion-button expand="block" color="danger" (click)="cancel()">取消</ion-button>
+ 
+
+  </ion-card-content>
+</ion-card>

+ 38 - 0
.history/soul-app/src/lib/user/modal-user-edit/modal-user-edit.component_20241223140831.html

@@ -0,0 +1,38 @@
+<!-- 用户登录状态 -->
+<ion-card style="max-height: 400px; overflow-y: auto;">
+  <ion-card-header>
+    <ion-card-title>
+      用户名:{{currentUser?.get("username")}}
+    </ion-card-title>
+    <ion-card-subtitle >请输入您的详细资料</ion-card-subtitle>
+   </ion-card-header>
+ <ion-card-content>
+
+    <ion-item>
+      <ion-input [value]="userData['realname']" (ionChange)="userDataChange('realname',$event)" label="姓名" placeholder="请您输入真实姓名"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['username']" (ionChange)="userDataChange('username',$event)" label="昵称" placeholder="请您输入用户网名"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input type="number" [value]="userData['age']" (ionChange)="userDataChange('age',$event)" label="年龄" placeholder="请您输入年龄"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['gender']" (ionChange)="userDataChange('gender',$event)" label="性别" placeholder="请您输入男/女"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['avatar']" (ionChange)="userDataChange('avatar',$event)" label="头像" placeholder="请您输入头像地址"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['email']" (ionChange)="userDataChange('email',$event)" label="邮箱" placeholder="请您输入邮箱号"></ion-input>
+    </ion-item>
+    <ion-item>
+      <ion-input [value]="userData['account']" (ionChange)="userDataChange('account',$event)" label="手机号" placeholder="请您输入手机号"></ion-input>
+    </ion-item>
+
+   <ion-button expand="block" color="danger" (click)="save()">保存</ion-button>
+   <ion-button expand="block" color="danger" (click)="cancel()">取消</ion-button>
+ 
+
+  </ion-card-content>
+</ion-card>

+ 34 - 0
.history/soul-app/src/main_20241218212656.ts

@@ -0,0 +1,34 @@
+import { bootstrapApplication } from '@angular/platform-browser';
+import { RouteReuseStrategy, provideRouter, withPreloading, PreloadAllModules } from '@angular/router';
+import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalone';
+
+import { routes } from './app/app.routes';
+import { AppComponent } from './app/app.component';
+
+
+// 引用HttpClient方法
+import { provideHttpClient } from '@angular/common/http';
+// 引用移动端授权检测供应器
+import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
+// 设置Parse服务属性
+import Parse from "parse";
+Parse.initialize("ncloudmaster");
+Parse.serverURL = "https://server.fmode.cn/parse";
+localStorage.setItem("NOVA_APIG_SERVER", 'aHR0cHMlM0ElMkYlMkZzZXJ2ZXIuZm1vZGUuY24lMkZhcGklMkZhcGlnJTJG')
+
+// 注意:替换Token 根据Token设置Parse服务帐套权限
+Parse.User.become('r:86287c6e67fc4e6ea9c197cdd4f00c10')
+
+//'r:bf1dc433a0b48ca0937e559134e3e316'
+bootstrapApplication(AppComponent, {
+  providers: [
+    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
+    provideIonicAngular(),
+    provideRouter(routes, withPreloading(PreloadAllModules)),
+
+    // 添加HttpClient供应器
+    provideHttpClient(),
+    // 添加Diagnostic
+    Diagnostic,
+  ],
+});

+ 35 - 0
.history/soul-app/src/main_20241223235743.ts

@@ -0,0 +1,35 @@
+import { bootstrapApplication } from '@angular/platform-browser';
+import { RouteReuseStrategy, provideRouter, withPreloading, PreloadAllModules } from '@angular/router';
+import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalone';
+
+import { routes } from './app/app.routes';
+import { AppComponent } from './app/app.component';
+
+
+// 引用HttpClient方法
+import { provideHttpClient } from '@angular/common/http';
+// 引用移动端授权检测供应器
+import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
+// 设置Parse服务属性
+import Parse from "parse";
+Parse.initialize("ncloudmaster");
+Parse.serverURL = "https://server.fmode.cn/parse";
+localStorage.setItem("NOVA_APIG_SERVER", 'aHR0cHMlM0ElMkYlMkZzZXJ2ZXIuZm1vZGUuY24lMkZhcGklMkZhcGlnJTJG')
+
+// 注意:替换Token 根据Token设置Parse服务帐套权限
+Parse.User.become('r:86287c6e67fc4e6ea9c197cdd4f00c10')
+
+//'r:bf1dc433a0b48ca0937e559134e3e316'
+bootstrapApplication(AppComponent, {
+  providers: [
+    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
+    provideIonicAngular(),
+    
+    provideRouter(routes, withPreloading(PreloadAllModules)),
+
+    // 添加HttpClient供应器
+    provideHttpClient(),
+    // 添加Diagnostic
+    Diagnostic,
+  ],
+});

+ 3 - 0
.idea/.gitignore

@@ -0,0 +1,3 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml

+ 35 - 0
.idea/gradle.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GradleSettings">
+    <option name="linkedExternalProjectsSettings">
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$/soul-app/node_modules/@capacitor/app/android" />
+        <option name="gradleJvm" value="corretto-21" />
+      </GradleProjectSettings>
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$/soul-app/node_modules/@capacitor/camera/android" />
+        <option name="gradleJvm" value="corretto-21" />
+      </GradleProjectSettings>
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$/soul-app/node_modules/@capacitor/clipboard/android" />
+        <option name="gradleJvm" value="corretto-21" />
+      </GradleProjectSettings>
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$/soul-app/node_modules/@capacitor/filesystem/android" />
+        <option name="gradleJvm" value="corretto-21" />
+      </GradleProjectSettings>
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$/soul-app/node_modules/@capacitor/haptics/android" />
+        <option name="gradleJvm" value="corretto-21" />
+      </GradleProjectSettings>
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$/soul-app/node_modules/@capacitor/keyboard/android" />
+        <option name="gradleJvm" value="corretto-21" />
+      </GradleProjectSettings>
+      <GradleProjectSettings>
+        <option name="externalProjectPath" value="$PROJECT_DIR$/soul-app/node_modules/@capacitor/status-bar/android" />
+        <option name="gradleJvm" value="corretto-21" />
+      </GradleProjectSettings>
+    </option>
+  </component>
+</project>

+ 7 - 0
.idea/misc.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="ProjectRootManager">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/workspace.iml" filepath="$PROJECT_DIR$/.idea/workspace.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 9 - 0
.idea/workspace.iml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 54 - 48
docs-prod/schema.md

@@ -156,66 +156,72 @@ rectangle "心理社区" {
 
 ```plantuml
 @startuml
-class 用户 {
-    +用户ID: String
-    +用户名: String
-    +密码: String
-    +电子邮件: String
-    +角色: String
-    +注册账户(): void
-    +登录(): void
-    +填写心理测试(): void
+class User {
+    +objectId: String
+    +username: String
+    +realname: String
+    +password: String
+    +gender: String
+    +age: Number
+    +email: String
+    +avatar: String
+    +startChat():void
+    +chooseChatPartner():String
+    +summarizeCharHistory():void
+    +registerAccount():void
+    +login(): void
+    +fillPsychologicalTest(): void
+    +publishBottle(): void
+    +retrieveBottle(): Bottle
 }
 
-class 心理社区 {
-    +社区ID: String
-    +话题: String
-    +帖子: List<帖子>
-    +加入社区(): void
-    +发布消息(): void
+class PsychologicalCommunity {
+    +communityID: String
+    +topic: String
+    +joinCommunity(): void
 }
 
-class 帖子 {
-    +帖子ID: String
-    +内容: String
-    +作者: 用户
-    +时间戳: Date
+class PsychologicalActivity {
+    +activityID: String
+    +title: String
+    +description: String
+    +date: Date
+    +location: String
+    +publishActivity(): void
 }
 
-class 心理活动 {
-    +活动ID: String
-    +标题: String
-    +描述: String
-    +日期: Date
-    +地点: String
-    +发布活动(): void
+class PsychologicalSurvey {
+    +surveyID: String
+    +content: String
+    +publisher: SchoolAdmin
+    +responses: List
+    +publishSurvey(): void
+    +analyzeResults(): void
 }
 
-class 心理普查问卷 {
-    +问卷ID: String
-    +内容: String
-    +发布者: 学校管理员
-    +填写结果: List<用户>
-    +发布问卷(): void
-    +分析结果(): void
+class SchoolAdmin {
+    +adminID: String
+    +name: String
+    +email: String
+    +publishPsychologicalActivity(): void
+    +publishPsychologicalSurvey(): void
+    +analyzeSurveyResults(): void
+    +setFeaturedUser(): void
 }
 
-class 学校管理员 {
-    +管理员ID: String
-    +姓名: String
-    +邮箱: String
-    +发布心理活动(): void
-    +发布心理普查问卷(): void
-    +分析问卷结果(): void
-    +设置星标用户(): void
+class Bottle {
+    +bottleID: String
+    +content: String
+    +author: User
+    +timestamp: Date
 }
 
-用户 "1" -- "0..*" 心理社区
-心理社区 "1" -- "0..*" 帖子
-心理活动 "1" -- "0..*" 用户
-学校管理员 "1" -- "0..*" 心理活动
-学校管理员 "1" -- "0..*" 心理普查问卷
-心理普查问卷 "1" -- "0..*" 用户
+User "1" -- "0..*" PsychologicalCommunity
+PsychologicalActivity "1" -- "0..*" User
+SchoolAdmin "1" -- "0..*" PsychologicalActivity
+SchoolAdmin "1" -- "0..*" PsychologicalSurvey
+PsychologicalSurvey "1" -- "0..*" User
+User "1" -- "0..*" Bottle
 @enduml
 ```
 

+ 2 - 2
soul-app/angular.json

@@ -28,7 +28,7 @@
               {
                 "glob": "**/*",
                 "input": "src/assets",
-                "output": "assets",
+                "output": "assets"
               }
             ],
             "styles": ["src/global.scss", "src/theme/variables.scss"],
@@ -80,7 +80,7 @@
               "buildTarget": "app:build:development"
             },
             "ci": {
-              "progress": false
+              
             }
           },
           "defaultConfiguration": "development"

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 419 - 227
soul-app/package-lock.json


+ 14 - 14
soul-app/package.json

@@ -13,14 +13,14 @@
   },
   "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",
+    "@angular/animations": "^19.0.5",
+    "@angular/common": "^19.0.5",
+    "@angular/compiler": "^19.0.5",
+    "@angular/core": "^19.0.5",
+    "@angular/forms": "^19.0.5",
+    "@angular/platform-browser": "^19.0.5",
+    "@angular/platform-browser-dynamic": "^19.0.5",
+    "@angular/router": "^19.0.5",
     "@capacitor/app": "6.0.2",
     "@capacitor/core": "6.2.0",
     "@capacitor/haptics": "6.0.2",
@@ -35,18 +35,18 @@
     "ionicons": "^7.2.1",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
-    "zone.js": "~0.14.2"
+    "zone.js": "~0.15.0"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "^18.0.0",
+    "@angular-devkit/build-angular": "^19.0.6",
     "@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",
+    "@angular/cli": "^19.0.6",
+    "@angular/compiler-cli": "^19.0.5",
+    "@angular/language-service": "^19.0.5",
     "@capacitor/cli": "6.2.0",
     "@ionic/angular-toolkit": "^11.0.1",
     "@types/jasmine": "~5.1.0",
@@ -63,7 +63,7 @@
     "karma-coverage": "~2.2.0",
     "karma-jasmine": "~5.1.0",
     "karma-jasmine-html-reporter": "~2.1.0",
-    "typescript": "~5.4.0"
+    "typescript": "~5.6.3"
   },
   "description": "An Ionic project"
 }

+ 4 - 2
soul-app/src/app/info-modal/info-modal.component.html

@@ -1,5 +1,5 @@
 <!-- 用户登录状态 -->
-<ion-card>
+<ion-card style="max-height: 400px; overflow-y: auto;">
   <ion-card-header>
     <ion-card-title>
       用户名:{{currentUser?.get("username")}}
@@ -26,7 +26,9 @@
   </ion-item>
   <ion-item>
     <ion-label>
-      {{ userData['identity'] === 'student' ? (userData['studentID'] || '--') : (userData['teacherID'] || '--') }}
+      {{ userData['identity'] === 'student' 
+        ? '学号:' + (userData['studentID'] || '--') 
+        : '工号:' + (userData['teacherID'] || '--') }}
     </ion-label>
   </ion-item>
   <ion-item>

+ 10 - 11
soul-app/src/app/page-psysurvey/page-psysurvey.component.html

@@ -14,17 +14,16 @@
 </ion-header>
 
 <ion-content [fullscreen]="true">
-
-  <section>
-    <ion-card>
-      <ion-card-header>
-        <ion-card-title>心理问卷调查通知</ion-card-title>
-      </ion-card-header>
-      <ion-card-content>
-        
-      </ion-card-content>
-    </ion-card>
-  </section>
+<section *ngIf="filteredSurveys.length > 0">
+  <ion-card *ngFor="let survey of filteredSurveys">
+    <ion-card-header>
+      <ion-card-title>{{ survey.title }}</ion-card-title>
+    </ion-card-header>
+    <ion-card-content>
+      <p>链接: <a [href]="survey.link" target="_blank">{{ survey.link }}</a></p>
+    </ion-card-content>
+  </ion-card>
+</section>
 
   <div  style="display: flex; justify-content: center; margin-top: auto;">
     <ion-button (click)="goPublishSurvey()" expand="full">

+ 40 - 3
soul-app/src/app/page-psysurvey/page-psysurvey.component.ts

@@ -3,6 +3,12 @@ import { Component, OnInit } from '@angular/core';
 import { Router } from '@angular/router';
 import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
   IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar } from '@ionic/angular/standalone';
+  import { HttpClient } from '@angular/common/http';
+  import { UserService } from '../user.service'; // 确保路径正确
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+
+
+  
 
 @Component({
   selector: 'app-page-psysurvey',
@@ -10,21 +16,52 @@ import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList,
   styleUrls: ['./page-psysurvey.component.scss'],
   standalone: true,
   imports: [IonHeader,IonToolbar,IonTitle,IonContent,
-      IonList,IonListHeader,IonItem,IonCardTitle,
+      IonList,IonListHeader,IonItem,IonCardTitle,FormsModule,
       IonLabel,IonIcon,IonButton,IonCardContent,
       IonInput,IonSearchbar,IonCard,IonCardHeader,
       CommonModule
     ]
 })
 export class PagePsysurveyComponent  implements OnInit {
+  surveys: any[] = []; // 存储问卷通知
+  filteredSurveys: any[] = []; // 存储过滤后的问卷
+  userApartment: string = '' ; // 当前用户的学院
 
-  constructor(private router: Router) { }
+  constructor(private router: Router,private http: HttpClient,private userService: UserService) { }
   goTab1(){
     this.router.navigate(['tabs/tab1']);
    }
    goPublishSurvey(){
     this.router.navigate(['tabs/page-publishsurvey'])
    }
-  ngOnInit() {}
 
+   ngOnInit() {
+    // 动态获取当前用户的学院信息
+    this.userService.getCurrentUser().subscribe(user => {
+      this.userApartment = user.apartment; // 从用户数据中获取学院
+      this.getSurveys(); // 在获取到用户信息后获取问卷
+    }, error => {
+      console.error('获取用户信息时出错:', error);
+      // 可以设置一个默认值或处理错误
+    });
+  }
+
+  getSurveys() {
+    this.http.get('http://127.0.0.1:4040/').subscribe(
+      (response: any) => {
+        this.surveys = response; // 假设响应是问卷数组
+        this.filterSurveys(); // 过滤问卷
+      },
+      error => {
+        console.error('获取问卷时出错:', error);
+      }
+    );
+  }
+  filterSurveys() {
+    this.filteredSurveys = this.surveys.filter(survey => {
+      return survey.audience === this.userApartment || survey.audience === 'all';
+    });
+  }
+  
+  
 }

+ 3 - 1
soul-app/src/app/page-publishsurvey/page-publishsurvey.component.html

@@ -24,6 +24,7 @@
   </ion-segment>
 
   <div *ngIf="category === 'school'">
+    <ion-list>
     <ion-item>
       <ion-label position="floating">问卷标题</ion-label>
       <ion-input [(ngModel)]="surveyTitle"></ion-input>
@@ -38,10 +39,11 @@
       <ion-label>面向对象</ion-label>
       <ion-select [(ngModel)]="targetAudience">
         <ion-select-option value="all">全校学生</ion-select-option>
-        <ion-select-option value="software">软件学院</ion-select-option>
+        <ion-select-option value="软件学院">软件学院</ion-select-option>
         <ion-select-option value="music">音乐学院</ion-select-option>
       </ion-select>
     </ion-item>
+  </ion-list>
 
     <ion-button expand="full" (click)="publishSurvey()">发布问卷</ion-button>
   </div>

+ 24 - 9
soul-app/src/app/page-publishsurvey/page-publishsurvey.component.ts

@@ -1,9 +1,10 @@
-import { Component, OnInit,NgModule } from '@angular/core';
+import { Component, OnInit } from '@angular/core';
 import { Router } from '@angular/router';
-import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList, 
-  IonListHeader,IonCardHeader,IonCardTitle,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
+import { IonHeader,IonButton, IonList, IonListHeader, IonItem,IonContent, IonIcon, IonLabel, IonCardHeader,IonCardContent, IonTitle,IonCard, IonToolbar,IonInput,IonSearchbar, IonSegment, IonSegmentButton, IonSelect, IonSelectOption } from '@ionic/angular/standalone';
   import { CommonModule } from '@angular/common';
-  import { FormsModule } from '@angular/forms';
+  import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+  import { HttpClient } from '@angular/common/http';
+
 
 @Component({
   selector: 'app-page-publishsurvey',
@@ -11,12 +12,11 @@ import { IonHeader,IonButton, IonContent, IonIcon, IonItem, IonLabel, IonList,
   styleUrls: ['./page-publishsurvey.component.scss'],
   standalone: true,
   imports: [
-
     IonHeader,IonToolbar,IonTitle,IonContent,IonSegment,IonSegmentButton,IonSelect,IonSelectOption,
-    IonList,IonListHeader,IonItem,IonCardTitle,
+    FormsModule,IonList, IonListHeader, IonItem,
     IonLabel,IonIcon,IonButton,IonCardContent,
     IonInput,IonSearchbar,IonCard,IonCardHeader,
-    CommonModule,FormsModule
+    CommonModule,
   ]
 })
 
@@ -39,6 +39,21 @@ export class PagePublishsurveyComponent  implements OnInit {
     console.log(`链接: ${this.surveyLink}`);
     console.log(`面向对象: ${this.targetAudience}`);
     // 这里可以添加逻辑将问卷发布到后端或其他处理
+    const surveyData = {
+      title: this.surveyTitle,
+      link: this.surveyLink,
+      audience: this.targetAudience,
+    };
+
+    this.http.post('http://127.0.0.1:4040/', surveyData).subscribe(
+      response => {
+        console.log('问卷已成功发布:', response);
+        
+      },
+      error => {
+        console.error('发布问卷时出错:', error);
+      }
+    );
   }
 
   publishSocietySurvey() {
@@ -48,9 +63,9 @@ export class PagePublishsurveyComponent  implements OnInit {
     // 这里可以添加逻辑将问卷发布到后端或其他处理
   }
 
-  constructor(private router: Router) { }
+  constructor(private router: Router,private http: HttpClient) { }
   goTab1(){
-    this.router.navigate(['tabs/tab1']);
+    this.router.navigate(['tabs/page-psysurvey']);
    }
 
 

+ 1 - 1
soul-app/src/app/tab1/tab1.page.scss

@@ -23,7 +23,7 @@ ion-content {
     text-transform: none; /* 按钮文字不变形 */
     height: 35px;
     flex: 1; /* 每个按钮等分空间 */
-    margin: 0 5px; /* 按钮之间的间距 */
+    margin: 1 7px; /* 按钮之间的间距 */
     color: rgb(42, 50, 77);
 }
   /* 设置搜索框的样式 */

+ 16 - 0
soul-app/src/app/user.service.spec.ts

@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { UserService } from './user.service';
+
+describe('UserService', () => {
+  let service: UserService;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(UserService);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});

+ 17 - 0
soul-app/src/app/user.service.ts

@@ -0,0 +1,17 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class UserService {
+  private apiUrl = 'http://127.0.0.1:4040/apps/DevServer/browser/survey'; // 替换为你的 API URL
+
+  constructor(private http: HttpClient) {}
+
+  // 获取当前用户信息
+  getCurrentUser(): Observable<any> {
+    return this.http.get(`${this.apiUrl}/current-user`); // 假设这个 API 返回当前用户的信息
+  }
+}

+ 2 - 1
soul-app/src/lib/user/modal-identity-verification/modal-identity-verification.component.ts

@@ -24,7 +24,8 @@ import { CommonModule } from '@angular/common';
     IonLabel,
     IonSelect,
     IonSelectOption,
-    FormsModule,CommonModule,
+    FormsModule,
+    CommonModule
   ],
 })
 export class ModalIdentityVerificationComponent implements OnInit {

+ 3 - 3
soul-app/src/lib/user/modal-user-edit/modal-user-edit.component.html

@@ -1,5 +1,5 @@
 <!-- 用户登录状态 -->
-<ion-card>
+<ion-card style="max-height: 400px; overflow-y: auto;">
   <ion-card-header>
     <ion-card-title>
       用户名:{{currentUser?.get("username")}}
@@ -24,10 +24,10 @@
       <ion-input [value]="userData['avatar']" (ionChange)="userDataChange('avatar',$event)" label="头像" placeholder="请您输入头像地址"></ion-input>
     </ion-item>
     <ion-item>
-      <ion-input [value]="userData['email']" (ionChange)="userDataChange('avatar',$event)" label="邮箱" placeholder="请您输入邮箱号"></ion-input>
+      <ion-input [value]="userData['email']" (ionChange)="userDataChange('email',$event)" label="邮箱" placeholder="请您输入邮箱号"></ion-input>
     </ion-item>
     <ion-item>
-      <ion-input [value]="userData['account']" (ionChange)="userDataChange('avatar',$event)" label="手机号" placeholder="请您输入手机号"></ion-input>
+      <ion-input [value]="userData['account']" (ionChange)="userDataChange('account',$event)" label="手机号" placeholder="请您输入手机号"></ion-input>
     </ion-item>
 
    <ion-button expand="block" color="danger" (click)="save()">保存</ion-button>

+ 1 - 0
soul-app/src/main.ts

@@ -24,6 +24,7 @@ bootstrapApplication(AppComponent, {
   providers: [
     { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
     provideIonicAngular(),
+    
     provideRouter(routes, withPreloading(PreloadAllModules)),
 
     // 添加HttpClient供应器

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä