hid_msrpuwgj56ccf29 1 gadu atpakaļ
vecāks
revīzija
8527c32b9a
100 mainītis faili ar 2696 papildinājumiem un 532 dzēšanām
  1. 4 0
      app-angular/.gitignore
  2. 1 1
      app-angular/README.md
  3. 101 0
      app-angular/android/.gitignore
  4. 2 0
      app-angular/android/app/.gitignore
  5. 54 0
      app-angular/android/app/build.gradle
  6. 22 0
      app-angular/android/app/capacitor.build.gradle
  7. 21 0
      app-angular/android/app/proguard-rules.pro
  8. 26 0
      app-angular/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
  9. 41 0
      app-angular/android/app/src/main/AndroidManifest.xml
  10. 5 0
      app-angular/android/app/src/main/java/com/jxufe/0210463/MainActivity.java
  11. BIN
      app-angular/android/app/src/main/res/drawable-land-hdpi/splash.png
  12. BIN
      app-angular/android/app/src/main/res/drawable-land-mdpi/splash.png
  13. BIN
      app-angular/android/app/src/main/res/drawable-land-xhdpi/splash.png
  14. BIN
      app-angular/android/app/src/main/res/drawable-land-xxhdpi/splash.png
  15. BIN
      app-angular/android/app/src/main/res/drawable-land-xxxhdpi/splash.png
  16. BIN
      app-angular/android/app/src/main/res/drawable-port-hdpi/splash.png
  17. BIN
      app-angular/android/app/src/main/res/drawable-port-mdpi/splash.png
  18. BIN
      app-angular/android/app/src/main/res/drawable-port-xhdpi/splash.png
  19. BIN
      app-angular/android/app/src/main/res/drawable-port-xxhdpi/splash.png
  20. BIN
      app-angular/android/app/src/main/res/drawable-port-xxxhdpi/splash.png
  21. 34 0
      app-angular/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
  22. 170 0
      app-angular/android/app/src/main/res/drawable/ic_launcher_background.xml
  23. BIN
      app-angular/android/app/src/main/res/drawable/splash.png
  24. 12 0
      app-angular/android/app/src/main/res/layout/activity_main.xml
  25. 5 0
      app-angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
  26. 5 0
      app-angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
  27. BIN
      app-angular/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  28. BIN
      app-angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
  29. BIN
      app-angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  30. BIN
      app-angular/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  31. BIN
      app-angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
  32. BIN
      app-angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  33. BIN
      app-angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  34. BIN
      app-angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
  35. BIN
      app-angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  36. BIN
      app-angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  37. BIN
      app-angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
  38. BIN
      app-angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  39. BIN
      app-angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  40. BIN
      app-angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
  41. BIN
      app-angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  42. 4 0
      app-angular/android/app/src/main/res/values/ic_launcher_background.xml
  43. 7 0
      app-angular/android/app/src/main/res/values/strings.xml
  44. 22 0
      app-angular/android/app/src/main/res/values/styles.xml
  45. 5 0
      app-angular/android/app/src/main/res/xml/file_paths.xml
  46. 18 0
      app-angular/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java
  47. 29 0
      app-angular/android/build.gradle
  48. 15 0
      app-angular/android/capacitor.settings.gradle
  49. 22 0
      app-angular/android/gradle.properties
  50. BIN
      app-angular/android/gradle/wrapper/gradle-wrapper.jar
  51. 6 0
      app-angular/android/gradle/wrapper/gradle-wrapper.properties
  52. 244 0
      app-angular/android/gradlew
  53. 92 0
      app-angular/android/gradlew.bat
  54. 5 0
      app-angular/android/settings.gradle
  55. 16 0
      app-angular/android/variables.gradle
  56. 48 2
      app-angular/angular.json
  57. 12 0
      app-angular/capacitor.config.ts
  58. 5 0
      app-angular/ionic.config.json
  59. 691 43
      app-angular/package-lock.json
  60. 14 5
      app-angular/package.json
  61. 14 0
      app-angular/resources/xml/network_security_config.xml
  62. 15 2
      app-angular/src/app/app-routing.module.ts
  63. 0 4
      app-angular/src/app/app.component.html
  64. 6 42
      app-angular/src/app/app.component.scss
  65. 1 15
      app-angular/src/app/app.component.ts
  66. 7 0
      app-angular/src/app/app.module.ts
  67. 80 0
      app-angular/src/modules/lesson/attention-detail/attention-detail.component.html
  68. 19 0
      app-angular/src/modules/lesson/attention-detail/attention-detail.component.scss
  69. 21 0
      app-angular/src/modules/lesson/attention-detail/attention-detail.component.spec.ts
  70. 42 0
      app-angular/src/modules/lesson/attention-detail/rattention-detail.component.ts
  71. 19 0
      app-angular/src/modules/lesson/community/community-routing.module.ts
  72. 116 0
      app-angular/src/modules/lesson/community/community.component.html
  73. 28 0
      app-angular/src/modules/lesson/community/community.component.scss
  74. 21 0
      app-angular/src/modules/lesson/community/community.component.spec.ts
  75. 75 0
      app-angular/src/modules/lesson/community/community.component.ts
  76. 28 0
      app-angular/src/modules/lesson/community/community.module.ts
  77. 0 23
      app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.html
  78. 0 11
      app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.scss
  79. 0 21
      app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.spec.ts
  80. 0 14
      app-angular/src/modules/lesson/comp-lesson-card/comp-lesson-card.component.ts
  81. 0 4
      app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.html
  82. 0 10
      app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.scss
  83. 0 21
      app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.spec.ts
  84. 0 13
      app-angular/src/modules/lesson/comp-nav-button/comp-nav-button.component.ts
  85. 0 6
      app-angular/src/modules/lesson/detail/detail.component.html
  86. 0 0
      app-angular/src/modules/lesson/detail/detail.component.scss
  87. 0 19
      app-angular/src/modules/lesson/detail/detail.component.ts
  88. 0 0
      app-angular/src/modules/lesson/find/find.component.html
  89. 0 23
      app-angular/src/modules/lesson/find/find.component.scss
  90. 0 13
      app-angular/src/modules/lesson/find/find.component.ts
  91. 0 62
      app-angular/src/modules/lesson/home/home.component.html
  92. 0 74
      app-angular/src/modules/lesson/home/home.component.scss
  93. 0 41
      app-angular/src/modules/lesson/home/home.component.ts
  94. 29 27
      app-angular/src/modules/lesson/lesson-routing.module.ts
  95. 35 30
      app-angular/src/modules/lesson/lesson.module.ts
  96. 187 0
      app-angular/src/modules/lesson/me/me.component.html
  97. 57 0
      app-angular/src/modules/lesson/me/me.component.scss
  98. 6 6
      app-angular/src/modules/lesson/me/me.component.spec.ts
  99. 72 0
      app-angular/src/modules/lesson/me/me.component.ts
  100. 60 0
      app-angular/src/modules/lesson/near/near.component.html

+ 4 - 0
app-angular/.gitignore

@@ -1,5 +1,9 @@
 # See http://help.github.com/ignore-files/ for more about ignoring files.
 
+
+/www
+/androidionic cap run android --project=app-angular
+
 # Compiled output
 /dist
 /tmp

+ 1 - 1
app-angular/README.md

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

+ 101 - 0
app-angular/android/.gitignore

@@ -0,0 +1,101 @@
+# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
+
+# Built application files
+*.apk
+*.aar
+*.ap_
+*.aab
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+#  Uncomment the following line in case you need and you don't have the release build type files in your app
+# release/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+*.iml
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+# Android Studio 3 in .gitignore file.
+.idea/caches
+.idea/modules.xml
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
+.idea/navEditor.xml
+
+# Keystore files
+# Uncomment the following lines if you do not want to check your keystore files in.
+#*.jks
+#*.keystore
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+.cxx/
+
+# Google Services (e.g. APIs or Firebase)
+# google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
+fastlane/test_output
+fastlane/readme.md
+
+# Version control
+vcs.xml
+
+# lint
+lint/intermediates/
+lint/generated/
+lint/outputs/
+lint/tmp/
+# lint/reports/
+
+# Android Profiling
+*.hprof
+
+# Cordova plugins for Capacitor
+capacitor-cordova-android-plugins
+
+# Copied web assets
+app/src/main/assets/public
+
+# Generated Config files
+app/src/main/assets/capacitor.config.json
+app/src/main/assets/capacitor.plugins.json
+app/src/main/res/xml/config.xml

+ 2 - 0
app-angular/android/app/.gitignore

@@ -0,0 +1,2 @@
+/build/*
+!/build/.npmkeep

+ 54 - 0
app-angular/android/app/build.gradle

@@ -0,0 +1,54 @@
+apply plugin: 'com.android.application'
+
+android {
+    namespace "com.jxufe.ycc"
+    compileSdkVersion rootProject.ext.compileSdkVersion
+    defaultConfig {
+        applicationId "com.jxufe.ycc"
+        minSdkVersion rootProject.ext.minSdkVersion
+        targetSdkVersion rootProject.ext.targetSdkVersion
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        aaptOptions {
+             // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
+             // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
+            ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
+        }
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+repositories {
+    flatDir{
+        dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
+    }
+}
+
+dependencies {
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
+    implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
+    implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
+    implementation project(':capacitor-android')
+    testImplementation "junit:junit:$junitVersion"
+    androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
+    androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
+    implementation project(':capacitor-cordova-android-plugins')
+}
+
+apply from: 'capacitor.build.gradle'
+
+try {
+    def servicesJSON = file('google-services.json')
+    if (servicesJSON.text) {
+        apply plugin: 'com.google.gms.google-services'
+    }
+} catch(Exception e) {
+    logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
+}

+ 22 - 0
app-angular/android/app/capacitor.build.gradle

@@ -0,0 +1,22 @@
+// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
+
+android {
+  compileOptions {
+      sourceCompatibility JavaVersion.VERSION_17
+      targetCompatibility JavaVersion.VERSION_17
+  }
+}
+
+apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
+dependencies {
+    implementation project(':capacitor-app')
+    implementation project(':capacitor-haptics')
+    implementation project(':capacitor-keyboard')
+    implementation project(':capacitor-status-bar')
+
+}
+
+
+if (hasProperty('postBuildExtras')) {
+  postBuildExtras()
+}

+ 21 - 0
app-angular/android/app/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 26 - 0
app-angular/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java

@@ -0,0 +1,26 @@
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import android.content.Context;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+
+    @Test
+    public void useAppContext() throws Exception {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        assertEquals("com.getcapacitor.app", appContext.getPackageName());
+    }
+}

+ 41 - 0
app-angular/android/app/src/main/AndroidManifest.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+
+        <activity
+            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
+            android:name=".MainActivity"
+            android:label="@string/title_activity_main"
+            android:theme="@style/AppTheme.NoActionBarLaunch"
+            android:launchMode="singleTask"
+            android:exported="true">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+
+        </activity>
+
+        <provider
+            android:name="androidx.core.content.FileProvider"
+            android:authorities="${applicationId}.fileprovider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/file_paths"></meta-data>
+        </provider>
+    </application>
+
+    <!-- Permissions -->
+
+    <uses-permission android:name="android.permission.INTERNET" />
+</manifest>

+ 5 - 0
app-angular/android/app/src/main/java/com/jxufe/0210463/MainActivity.java

@@ -0,0 +1,5 @@
+package com.jxufe.ycc;
+
+import com.getcapacitor.BridgeActivity;
+
+public class MainActivity extends BridgeActivity {}

BIN
app-angular/android/app/src/main/res/drawable-land-hdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-land-mdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-land-xhdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-land-xxhdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-land-xxxhdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-port-hdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-port-mdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-port-xhdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-port-xxhdpi/splash.png


BIN
app-angular/android/app/src/main/res/drawable-port-xxxhdpi/splash.png


+ 34 - 0
app-angular/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml

@@ -0,0 +1,34 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path
+        android:fillType="evenOdd"
+        android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
+        android:strokeColor="#00000000"
+        android:strokeWidth="1">
+        <aapt:attr name="android:fillColor">
+            <gradient
+                android:endX="78.5885"
+                android:endY="90.9159"
+                android:startX="48.7653"
+                android:startY="61.0927"
+                android:type="linear">
+                <item
+                    android:color="#44000000"
+                    android:offset="0.0" />
+                <item
+                    android:color="#00000000"
+                    android:offset="1.0" />
+            </gradient>
+        </aapt:attr>
+    </path>
+    <path
+        android:fillColor="#FFFFFF"
+        android:fillType="nonZero"
+        android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
+        android:strokeColor="#00000000"
+        android:strokeWidth="1" />
+</vector>

+ 170 - 0
app-angular/android/app/src/main/res/drawable/ic_launcher_background.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108">
+    <path
+        android:fillColor="#26A69A"
+        android:pathData="M0,0h108v108h-108z" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M9,0L9,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,0L19,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,0L29,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,0L39,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,0L49,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,0L59,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,0L69,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,0L79,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M89,0L89,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M99,0L99,108"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,9L108,9"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,19L108,19"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,29L108,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,39L108,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,49L108,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,59L108,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,69L108,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,79L108,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,89L108,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M0,99L108,99"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,29L89,29"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,39L89,39"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,49L89,49"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,59L89,59"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,69L89,69"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M19,79L89,79"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M29,19L29,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M39,19L39,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M49,19L49,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M59,19L59,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M69,19L69,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+    <path
+        android:fillColor="#00000000"
+        android:pathData="M79,19L79,89"
+        android:strokeColor="#33FFFFFF"
+        android:strokeWidth="0.8" />
+</vector>

BIN
app-angular/android/app/src/main/res/drawable/splash.png


+ 12 - 0
app-angular/android/app/src/main/res/layout/activity_main.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity">
+
+    <WebView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+</androidx.coordinatorlayout.widget.CoordinatorLayout>

+ 5 - 0
app-angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/ic_launcher_background"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>

+ 5 - 0
app-angular/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/ic_launcher_background"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>

BIN
app-angular/android/app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
app-angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png


BIN
app-angular/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png


BIN
app-angular/android/app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
app-angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png


BIN
app-angular/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png


BIN
app-angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
app-angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png


BIN
app-angular/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png


BIN
app-angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
app-angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png


BIN
app-angular/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png


BIN
app-angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


BIN
app-angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png


BIN
app-angular/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png


+ 4 - 0
app-angular/android/app/src/main/res/values/ic_launcher_background.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="ic_launcher_background">#FFFFFF</color>
+</resources>

+ 7 - 0
app-angular/android/app/src/main/res/values/strings.xml

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<resources>
+    <string name="app_name">FavorPet</string>
+    <string name="title_activity_main">FavorPet</string>
+    <string name="package_name">com.jxufe.0210463</string>
+    <string name="custom_url_scheme">com.jxufe.0210463</string>
+</resources>

+ 22 - 0
app-angular/android/app/src/main/res/values/styles.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+
+    <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
+        <item name="windowActionBar">false</item>
+        <item name="windowNoTitle">true</item>
+        <item name="android:background">@null</item>
+    </style>
+
+
+    <style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
+        <item name="android:background">@drawable/splash</item>
+    </style>
+</resources>

+ 5 - 0
app-angular/android/app/src/main/res/xml/file_paths.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths xmlns:android="http://schemas.android.com/apk/res/android">
+    <external-path name="my_images" path="." />
+    <cache-path name="my_cache_images" path="." />
+</paths>

+ 18 - 0
app-angular/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java

@@ -0,0 +1,18 @@
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+
+    @Test
+    public void addition_isCorrect() throws Exception {
+        assertEquals(4, 2 + 2);
+    }
+}

+ 29 - 0
app-angular/android/build.gradle

@@ -0,0 +1,29 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    
+    repositories {
+        google()
+        mavenCentral()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:8.0.0'
+        classpath 'com.google.gms:google-services:4.3.15'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+apply from: "variables.gradle"
+
+allprojects {
+    repositories {
+        google()
+        mavenCentral()
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}

+ 15 - 0
app-angular/android/capacitor.settings.gradle

@@ -0,0 +1,15 @@
+// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
+include ':capacitor-android'
+project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
+
+include ':capacitor-app'
+project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
+
+include ':capacitor-haptics'
+project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/haptics/android')
+
+include ':capacitor-keyboard'
+project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android')
+
+include ':capacitor-status-bar'
+project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android')

+ 22 - 0
app-angular/android/gradle.properties

@@ -0,0 +1,22 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true

BIN
app-angular/android/gradle/wrapper/gradle-wrapper.jar


+ 6 - 0
app-angular/android/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,6 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-all.zip
+networkTimeout=10000
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists

+ 244 - 0
app-angular/android/gradlew

@@ -0,0 +1,244 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+#         * compound commands having a testable exit status, especially «case»;
+#         * various built-in commands including «command», «set», and «ulimit».
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+    echo "$*"
+} >&2
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD=$JAVA_HOME/jre/sh/java
+    else
+        JAVACMD=$JAVA_HOME/bin/java
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD=java
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC3045
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+        # shellcheck disable=SC3045
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
+    esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+# Collect all arguments for the java command;
+#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+#     shell script including quotes and variable substitutions, so put them in
+#     double quotes to make sure that they get re-expanded; and
+#   * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
+        -classpath "$CLASSPATH" \
+        org.gradle.wrapper.GradleWrapperMain \
+        "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+    die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
+
+exec "$JAVACMD" "$@"

+ 92 - 0
app-angular/android/gradlew.bat

@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

+ 5 - 0
app-angular/android/settings.gradle

@@ -0,0 +1,5 @@
+include ':app'
+include ':capacitor-cordova-android-plugins'
+project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
+
+apply from: 'capacitor.settings.gradle'

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

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

+ 48 - 2
app-angular/angular.json

@@ -17,7 +17,7 @@
         "build": {
           "builder": "@angular-devkit/build-angular:browser",
           "options": {
-            "outputPath": "dist/app-angular",
+            "outputPath": "www",
             "index": "src/index.html",
             "main": "src/main.ts",
             "polyfills": [
@@ -28,6 +28,11 @@
             "assets": [
               "src/favicon.ico",
               "src/assets",
+              {
+                "glob": "**/*.svg",
+                "input": "node_modules/ionicons/dist/ionicons/svg",
+                "output": "./svg"
+              },
               {
                 "glob": "**/*.svg",
                 "input": "node_modules/ionicons/dist/ionicons/svg",
@@ -66,6 +71,39 @@
               {
                 "input": "node_modules/@ionic/angular/css/flex-utils.css"
               },
+              {
+                "input": "src/theme/variables.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/core.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/normalize.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/structure.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/typography.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/display.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/padding.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/float-elements.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/text-alignment.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/text-transformation.css"
+              },
+              {
+                "input": "node_modules/@ionic/angular/css/flex-utils.css"
+              },
               {
                 "input": "src/theme/variables.css"
               }
@@ -77,7 +115,7 @@
               "budgets": [
                 {
                   "type": "initial",
-                  "maximumWarning": "500kb",
+                  "maximumWarning": "900kb",
                   "maximumError": "1mb"
                 },
                 {
@@ -129,6 +167,11 @@
             "assets": [
               "src/favicon.ico",
               "src/assets",
+              {
+                "glob": "**/*.svg",
+                "input": "node_modules/ionicons/dist/ionicons/svg",
+                "output": "./svg"
+              },
               {
                 "glob": "**/*.svg",
                 "input": "node_modules/ionicons/dist/ionicons/svg",
@@ -167,5 +210,8 @@
         }
       }
     }
+  },
+  "cli": {
+    "analytics": "bc2f0891-ea37-49cd-809c-9ae3fc6e37cf"
   }
 }

+ 12 - 0
app-angular/capacitor.config.ts

@@ -0,0 +1,12 @@
+import { CapacitorConfig } from '@capacitor/cli';
+
+const config: CapacitorConfig = {
+  appId: 'com.jxufe.ycc',
+  appName: 'FavorPet',
+  webDir: 'www',
+  server: {
+    androidScheme: 'https'
+  }
+};
+
+export default config;

+ 5 - 0
app-angular/ionic.config.json

@@ -0,0 +1,5 @@
+{
+  "name": "FavorPet",
+  "integrations": {},
+  "type": "angular"
+}

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 691 - 43
app-angular/package-lock.json


+ 14 - 5
app-angular/package.json

@@ -18,23 +18,32 @@
     "@angular/platform-browser": "^16.2.0",
     "@angular/platform-browser-dynamic": "^16.2.0",
     "@angular/router": "^16.2.0",
+    "@capacitor/android": "^5.5.1",
+    "@capacitor/app": "5.0.6",
+    "@capacitor/core": "5.5.1",
+    "@capacitor/haptics": "5.0.6",
+    "@capacitor/keyboard": "5.0.6",
+    "@capacitor/status-bar": "5.0.6",
     "@ionic/angular": "^7.5.0",
+    "parse": "^4.2.0",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
     "zone.js": "~0.13.0"
   },
   "devDependencies": {
-    "@angular-devkit/build-angular": "^16.2.3",
-    "@angular/cli": "~16.2.3",
+    "@angular-devkit/build-angular": "^16.2.2",
+    "@angular/cli": "~16.2.2",
     "@angular/compiler-cli": "^16.2.0",
+    "@capacitor/cli": "5.5.1",
+    "@ionic/angular-toolkit": "latest",
     "@types/jasmine": "~4.3.0",
+    "@types/parse": "^3.0.5",
     "jasmine-core": "~4.6.0",
     "karma": "~6.4.0",
     "karma-chrome-launcher": "~3.2.0",
     "karma-coverage": "~2.2.0",
     "karma-jasmine": "~5.1.0",
     "karma-jasmine-html-reporter": "~2.1.0",
-    "typescript": "~5.1.3",
-    "@ionic/angular-toolkit": "latest"
+    "typescript": "~5.1.3"
   }
-}
+}

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

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

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

@@ -2,9 +2,13 @@ import { NgModule } from '@angular/core';
 import { RouterModule, Routes } from '@angular/router';
 
 const routes: Routes = [
+
+  {
+    path: "", redirectTo: "/lesson/community", pathMatch: "full"
+  },
   {
-    path: 'lesson',
-    loadChildren: () => import('../modules/lesson/lesson.module').then(m => m.LessonModule)
+    path: 'user',
+    loadChildren: () => import('../modules/user/user.module').then(m => m.UserModule)
   }
 ];
 
@@ -13,3 +17,12 @@ const routes: Routes = [
   exports: [RouterModule]
 })
 export class AppRoutingModule { }
+
+let lessonRoute = {
+
+  path: 'lesson',
+  loadChildren: () => import('../modules/lesson/lesson.module').then(m => m.LessonModule)
+
+}
+
+routes.push(lessonRoute)

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 4
app-angular/src/app/app.component.html


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

@@ -1,44 +1,8 @@
+ion-tabs {
+    pointer-events: none;
 
-.bottom-navigation {
-  display: flex;
-  justify-content: space-evenly;
-  padding: 10px;
-  background-color: #f5f5f5;
-  position: fixed;
-  bottom: 0px;
-  left:0px;
-  width: 100vw;
-
-  .tab-button {
-    button {
-      border:none;
-      display: flex;
-      flex-direction: column;
-      align-items: center;
-      justify-content: center;
-      background: none;
-      color: #888;
-
-      svg {
-        width: 2em;height: 2em;
-        // width: 24px;
-        // height: 24px;
-        margin-bottom: 5px;
-      }
-      img {
-        width: 24px;
-        height: 24px;
-        margin-bottom: 5px;
-      }
-
-      span {
-        font-size: 12px;
-      }
-    }
-
-    .active {
-      color: #000;
-      font-weight: bold;
-    }
-  }
 }
+
+ion-tab-button {
+    pointer-events: all;
+}

+ 1 - 15
app-angular/src/app/app.component.ts

@@ -1,5 +1,4 @@
 import { Component } from '@angular/core';
-import { ActivatedRoute, Router } from '@angular/router';
 
 @Component({
   selector: 'app-root',
@@ -7,18 +6,5 @@ import { ActivatedRoute, Router } from '@angular/router';
   styleUrls: ['./app.component.scss']
 })
 export class AppComponent {
-  title = '第一个项目app-angular';
-  onClick(){
-    alert("我被点击了")
-  }
-  path = ""
-  constructor(private route:ActivatedRoute,private router:Router){
-    this.route.queryParams.subscribe(params=>{
-      this.path = location.pathname;
-    })
-  }
-  goTab(path:string){
-    this.path = path;
-    this.router.navigate([path])
-  }
+  title = 'app-angular';
 }

+ 7 - 0
app-angular/src/app/app.module.ts

@@ -1,17 +1,24 @@
 import { NgModule } from '@angular/core';
+import { FormsModule } from '@angular/forms';
 import { BrowserModule } from '@angular/platform-browser';
 
 import { AppRoutingModule } from './app-routing.module';
 import { AppComponent } from './app.component';
 import { IonicModule } from '@ionic/angular';
 
+import * as Parse from "parse"
+(Parse as any).serverURL = "http://web2023.fmode.cn:9999/parse"
+Parse.initialize("dev")
+
 @NgModule({
   declarations: [
     AppComponent,
+
   ],
   imports: [
     BrowserModule,
     AppRoutingModule,
+    FormsModule,
     IonicModule.forRoot()
   ],
   providers: [],

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

@@ -0,0 +1,80 @@
+<ion-header>
+    <ion-toolbar>
+        <ion-buttons slot="start">
+            <ion-button routerLink="/lesson/community" fill="clear" color="dark">
+                <ion-icon name="chevron-back-outline" size="small"></ion-icon>返回</ion-button>
+        </ion-buttons>
+        <ion-buttons slot="end">
+            <ion-button fill="clear" color="dark">
+                收藏</ion-button>
+        </ion-buttons>
+
+    </ion-toolbar>
+</ion-header>
+<ion-content color="light">
+    <ion-card>
+        <img alt="角色图" [src]="role?.get('img')" />
+        <ion-card-header>
+            <ion-card-title>{{role?.get('name')}}</ion-card-title>
+            <ion-card-subtitle>作者:{{role?.get('user')?.get('name')||"无名"}}</ion-card-subtitle>
+            <ion-card-subtitle>{{role?.get('type')||"角色类型"}}</ion-card-subtitle>
+            <ion-card-subtitle>{{role?.get('createdAt')| date: 'YYYY/MM/dd/HH:mm'||"发布时间"}}</ion-card-subtitle>
+        </ion-card-header>
+        <ion-card-content>
+            {{role?.get('cueword')||"角色生成的提示词..."}}
+        </ion-card-content>
+    </ion-card>
+    <!-- 评论区 -->
+    <ion-list [inset]="true">
+        <ion-item>
+            <ion-textarea label="评论一下吧" labelPlacement="floating" rows="5" [(ngModel)]="comment">
+            </ion-textarea>
+        </ion-item>
+        <ion-item>
+            <ion-buttons slot="end">
+                <ion-button color="medium" fill="outline" (click)="addComment()" shape="round">确定</ion-button>
+            </ion-buttons>
+        </ion-item>
+    </ion-list>
+    <ion-list [inset]="true">
+        <ng-container *ngFor="let comment of comments">
+            <ion-item class="comment-list">
+                <ion-label>
+                    <p class="commentator">用户昵称</p>
+                    <ion-note class="comment-content">{{comment}}</ion-note>
+                </ion-label>
+                <div class="comment-time">
+                    <ion-note color="medium">{{currentDate|date: 'HH:mm'}}</ion-note>
+                </div>
+            </ion-item>
+        </ng-container>
+        <ion-item class="comment-list">
+            <ion-label>
+                <p class="commentator">邱依依</p>
+                <ion-note class="comment-content">好看 ♥</ion-note>
+            </ion-label>
+            <div class="comment-time">
+                <ion-note color="medium">03:44</ion-note>
+            </div>
+        </ion-item>
+        <ion-item class="comment-list">
+            <ion-label>
+                <p class="commentator">秦酒</p>
+                <ion-note class="comment-content">也想试试</ion-note>
+            </ion-label>
+            <div class="comment-time">
+                <ion-note color="medium">Yesterday</ion-note>
+            </div>
+        </ion-item>
+        <ion-item class="comment-list">
+            <ion-label>
+                <p class="commentator">文斯斯</p>
+                <ion-note class="comment-content">更想吃=。=</ion-note>
+            </ion-label>
+            <div class="comment-time">
+                <ion-note color="medium">Yesterday</ion-note>
+            </div>
+        </ion-item>
+    </ion-list>
+
+</ion-content>

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

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

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

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

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

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

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

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

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

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

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

@@ -0,0 +1,28 @@
+ion-content {
+    height: calc(100vh - 121px) !important;
+}
+
+.foodContent {
+    display: -webkit-box;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: 2;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+.roleCard {
+    margin: 0px;
+}
+
+.metadata-end-wrapper {
+    position: absolute;
+
+    top: 3px;
+    inset-inline-end: 3px;
+
+    font-size: 0.6rem;
+
+    display: flex;
+    align-items: center;
+
+}

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

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

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

@@ -0,0 +1,75 @@
+import { Component } from '@angular/core';
+
+// 引用服务
+import { Router } from '@angular/router';
+
+// 引入Parse第三方库
+import * as Parse from "parse"
+(Parse as any).serverURL = "http://metapunk.cn:9999/parse"
+Parse.initialize("dev")
+
+@Component({
+  selector: 'app-community',
+  templateUrl: './community.component.html',
+  styleUrls: ['./community.component.scss']
+})
+export class CommunityComponent {
+
+  scienceList: Array<Parse.Object> = []
+  recommendList: Array<Parse.Object> = []
+  attentionList: Array<Parse.Object> = []
+
+
+  // 依赖注入
+  constructor(private router: Router) {
+    this.initPage();
+  }
+  // 首次进入页面,默认加载首批数据
+  async initPage() {
+    this.scienceList = await this.getScienceData()
+    this.recommendList = await this.gteRecommendData()
+    this.attentionList = await this.gteAttentionData()
+  }
+
+  // 数据加载相关函数
+  async getScienceData() {
+    let query = new Parse.Query("PetScience");
+    let list = await query.find();
+    return list
+  }
+  async gteRecommendData() {
+    let query = new Parse.Query("PetRecommend");
+    let list = await query.find();
+    return list
+  }
+  async gteAttentionData() {
+    let query = new Parse.Query("PetAttention");
+    let list = await query.find();
+    return list
+  }
+
+  cate: string = "推荐"
+
+
+  // 跳转函数
+  goScienceDetail(food: Parse.Object) {
+    this.router.navigate(["/lesson/community/scienceDetail"], {
+      queryParams: food
+    })
+  }
+
+  goRecommendDetail(view: Parse.Object) {
+    this.router.navigate(["/lesson/community/recommendDetail"], {
+      queryParams: view
+    })
+  }
+
+  goAttentionDetail(role: Parse.Object) {
+    this.router.navigate(["/lesson/community/attentionDetail"], {
+      queryParams: role
+    })
+  }
+
+
+
+}

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

@@ -0,0 +1,28 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { IonicModule } from '@ionic/angular';
+
+import { CommunityRoutingModule } from './community-routing.module';
+import { ScienceDetailComponent } from '../science-detail/science-detail.component';
+import { AttentionDetailComponent } from '../attention-detail/rattention-detail.component';
+import { RecommendDetailComponent } from '../recommend-detail/recommend-detail.component';
+
+@NgModule({
+
+    declarations: [
+       
+        ScienceDetailComponent,
+        RecommendDetailComponent,
+    ],
+    imports: [
+        CommonModule,
+        CommunityRoutingModule,
+        FormsModule,
+        IonicModule
+    ]
+})
+
+export class community {
+
+}

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

@@ -1,23 +0,0 @@
-<div class="lesson-card" >
-  <!--
-  <h1>{{name}}</h1>
-  <h2>{{author}}</h2>
-  <h1>{{lesson?.name}}</h1>
-  <h2>{{lesson?.author}}</h2>
-  <h2>{{lesson?.like}}</h2>
-  -->
-  <ion-card>
-      <img alt="Silhouette of mountains" src="https://ionicframework.com/docs/img/demos/card-media.png" />
-      <ion-card-header>
-        <ion-card-title>{{title1}}</ion-card-title>
-        <ion-card-subtitle>{{author}}</ion-card-subtitle>
-      </ion-card-header>
-    
-      <ion-card-content>
-        {{somedetails}}
-      </ion-card-content>
-    </ion-card>
-
-
-
-</div>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -1,6 +0,0 @@
-<h1>{{lesson.name}}</h1>
-<h2>作者:{{lesson.author}}</h2>
-<h2>点赞:{{lesson.like | tok}}</h2>
-<p>
-    描述:{{lesson.desc}}
-</p>

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


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

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

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


+ 0 - 23
app-angular/src/modules/lesson/find/find.component.scss

@@ -1,23 +0,0 @@
-page-about {
-    ion-content {
-    #container {
-    position: relative;
-    .box {
-    padding: 5px;
-    float: left;
-    .box_img {
-    padding: 5px;
-    border: 1px solid #cccccc;
-    box-shadow: 0 0 5px #ccc;
-    border-radius: 5px;
-    img {
-    width: 150px!important;
-    height: auto;
-    }
-    }
-    }
-    }
-    }
-    }
-    
-    

+ 0 - 13
app-angular/src/modules/lesson/find/find.component.ts

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

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

@@ -1,62 +0,0 @@
-<ion-content>
-  
-
-
-  <ion-card>
-    <ion-card-header>
-      <ion-card-title>RideQuest</ion-card-title>
-      <ion-card-subtitle>踏上新的地平线。</ion-card-subtitle>
-    </ion-card-header>
-    <ion-searchbar show-clear-button="focus" placeholder="发现更多路线"></ion-searchbar>
-    <h1>{{lessonName}}</h1>
-    <ion-card-content>
-      <ion-list>
-        <ng-container *ngFor="let lesson of lessonList;let i = index">
-          <ion-item (click)="goDetail(lesson)">
-            <ion-thumbnail slot="start">
-              <img  alt="Silhouette of mountains" [src]="lesson?.logo || 'https://ionicframework.com/docs/img/demos/thumbnail.svg'"  />
-            </ion-thumbnail>
-            <ion-label >热榜本地路线{{i+1}}:{{lesson.title1}} 点赞:{{toK(lesson.like)}}
-              点赞:{{lesson.like | tok}}</ion-label>
-          </ion-item>
-        </ng-container>
-      </ion-list>
-    </ion-card-content>
-  </ion-card>
-
-<div class="page-content">
-
-   
-    <div class="quick-links">
-      
-
-
-      
-
-      <!-- 组件:通过selector标签引用组件,并通过@Input传参,用[]传递变量 -->
-      <ng-container *ngFor="let lesson of lessonList;let i = index">
-        <app-comp-lesson-card [title1]="lesson.title1" [author]="lesson.author" [somedetails] = "lesson.somedetails" [lesson]="lesson" 
-        *ngIf="lesson.isEnabled" (click)="goDetail(lesson)"></app-comp-lesson-card>
-      </ng-container>
-
-      <!-- 组件:通过selector标签引用组件,并通过@Input传参 -->
-      <app-comp-lesson-card [name]="title"></app-comp-lesson-card>
-      <app-comp-lesson-card [name]="'title123'"></app-comp-lesson-card>
-      <app-comp-lesson-card name="666"></app-comp-lesson-card>
-      <app-comp-lesson-card somedetails = "我是精髓"></app-comp-lesson-card>
-      <app-comp-lesson-card></app-comp-lesson-card>
-      <app-comp-lesson-card></app-comp-lesson-card>
-      <app-comp-lesson-card></app-comp-lesson-card>
-      <!-- 添加更多的行 -->
-    </div>
-    <div class="course-area">
-      <div class="filter-tags">
-        <!-- 添加筛选标签 -->
-      </div>
-      <div class="course-list">
-        <!-- 添加课程列表 -->
-      </div>
-    </div>
-  </div>
-  
-</ion-content>

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

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

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

@@ -1,41 +0,0 @@
-import { Component } from '@angular/core';
-import { Router } from '@angular/router';
-
-@Component({
-  selector: 'app-home',
-  templateUrl: './home.component.html',
-  styleUrls: ['./home.component.scss']
-})
-export class HomeComponent {
-  selectedOption: string = 'frontend';
-  title = "临时tittle"
-  constructor(private router:Router){}
-  // 添加其他需要的逻辑和属性
-  lessonName = "Popular routes"
-  lessonList = [
-    {title1:"what a good day",name:"大前端",logo:"https://angular.cn/assets/images/logos/angular/angular.svg",like:12366,author:"ggg", somedetails:"阳光真不好,不走走",desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
-    {title1:"what a bad day",name:"微服务",like:25665,author:"aaa",somedetails:"阳光真不好,不走走", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
-    {title1:"what a sad day",name:"数据库",like:25665,author:"bbb", somedetails:"阳光真好,出去骑行",desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
-    {title1:"what a great day",name:"人工智能",like:1356999,author:"ccc", somedetails:"阳光真好,出去玩",desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
-    {title1:"what a wonderful day",name:"区块链",like:1356999,author:"ddd",somedetails:"阳光真好,出去跑跑", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
-    {title1:"lovely",name:"DevOps",like:3944999,author:"lty",somedetails:"阳光真好,呆家里", desc:`课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍课程介绍`,isEnabled:true},
-    {title1:"fine",name:"DevOps",like:3944999,author:"gda", desc:`骑行`,somedetails:"阳光真好,出去走走",isEnabled:false},
-  ]
-
-  // 路由传参:通过Router服务,携带查询参数,跳转至课程详情页
-  goDetail(lesson:any){
-    this.router.navigate(["/lesson/detail"],{
-      queryParams:lesson
-    })
-  }
-  toK(value:string|number){
-    value = Number(value)
-    if(value>1000*1000){
-      return (value / 1000 / 1000).toFixed(2) + "m"
-    }
-    if(value>1000){
-      return (value / 1000).toFixed(2) + "k"
-    }
-    return value
-  }
-}

+ 29 - 27
app-angular/src/modules/lesson/lesson-routing.module.ts

@@ -1,36 +1,38 @@
 import { NgModule } from '@angular/core';
 import { RouterModule, Routes } from '@angular/router';
-import { DetailComponent } from './detail/detail.component';
-import { HomeComponent } from './home/home.component';
-import { PageMineComponent } from './page-mine/page-mine.component';
-import { PageStudentComponent } from './page-student/page-student.component';
-import { PageStudentDetailComponent } from './page-student-detail/page-student-detail.component';
+import { MeComponent } from './me/me.component';
+import { TheyComponent } from './they/they.component';
+import { NearComponent } from './near/near.component';
+import { TheyDetailComponent } from './they-detail/they-detail.component';
+import { CommunityComponent } from './community/community.component';
+import { ScienceDetailComponent } from './science-detail/science-detail.component';
+import { ShareComponent } from './share/share.component';
+import { AttentionDetailComponent } from './attention-detail/rattention-detail.component';
+import { RecommendDetailComponent } from './recommend-detail/recommend-detail.component';
+import { UserFollowComponent } from './user-follow/user-follow.component';
+import { UserTagComponent } from './user-tag/user-tag.component';
+import { UserCollectionComponent } from './user-collection/user-collection.component';
+
 
-import { FindComponent } from './find/find.component';
 const routes: Routes = [
-  {
-    path:"home",component:HomeComponent
-  },
-  {
-    path:"detail",component:DetailComponent
-  },
-  {
-    path:"mine",component:PageMineComponent
-  },
-  {
-    path:"student",component:PageStudentComponent
-  },
-  {
-    path:"student/detail",component:PageStudentDetailComponent
-  }
-  ,
-  {
-    path:"find",component:FindComponent
-  }
+  { path: 'me', component: MeComponent },
+  { path: 'they', component: TheyComponent },
+  { path: 'community', component: CommunityComponent },
+  { path: 'near', component: NearComponent },
+  { path: 'they/detail', component: TheyDetailComponent },
+  { path: 'community/scienceDetail', component: ScienceDetailComponent },
+  { path: 'community/share', component: ShareComponent },
+  { path: 'community/attentionDetail', component: AttentionDetailComponent },
+  { path: 'community/recommendDetail', component: RecommendDetailComponent },
+  { path: "me/userFollow", component: UserFollowComponent },
+  { path: "me/userTag", component: UserTagComponent },
+  { path: "me/userCollection", component: UserCollectionComponent },
+
+
 ];
 
 @NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule]
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule]
 })
 export class LessonRoutingModule { }

+ 35 - 30
app-angular/src/modules/lesson/lesson.module.ts

@@ -1,39 +1,44 @@
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
-
-import { LessonRoutingModule } from './lesson-routing.module';
-import { HomeComponent } from './home/home.component';
-import { DetailComponent } from './detail/detail.component';
 import { FormsModule } from '@angular/forms';
-import { CompLessonCardComponent } from './comp-lesson-card/comp-lesson-card.component';
-import { PageMineComponent } from './page-mine/page-mine.component';
-import { CompNavButtonComponent } from './comp-nav-button/comp-nav-button.component';
-import { PageStudentComponent } from './page-student/page-student.component';
-import { PageStudentDetailComponent } from './page-student-detail/page-student-detail.component';
-import { TokPipe } from './tok.pipe';
-
-import { FindComponent } from './find/find.component';
 import { IonicModule } from '@ionic/angular';
 
+import { LessonRoutingModule } from './lesson-routing.module';
+import { TheyComponent } from './they/they.component';
+import { MeComponent } from './me/me.component';
+import { NearComponent } from './near/near.component';
+import { TheyDetailComponent } from './they-detail/they-detail.component';
+import { CommunityComponent } from './community/community.component';
+import { ScienceDetailComponent } from './science-detail/science-detail.component';
+import { ShareComponent } from './share/share.component';
+import { RecommendDetailComponent } from './recommend-detail/recommend-detail.component';
+import { AttentionDetailComponent } from './attention-detail/rattention-detail.component';
+import { UserFollowComponent } from './user-follow/user-follow.component';
+import { UserTagComponent } from './user-tag/user-tag.component';
+import { UserCollectionComponent } from './user-collection/user-collection.component';
 
 @NgModule({
-  declarations: [
-    HomeComponent,
-    DetailComponent,
-    CompLessonCardComponent,
-    PageMineComponent,
-    CompNavButtonComponent,
-    PageStudentComponent,
-    PageStudentDetailComponent,
-    TokPipe,
-    
-    FindComponent
-  ],
-  imports: [
-    CommonModule,
-    FormsModule,
-    LessonRoutingModule,
-    IonicModule
-  ]
+  declarations: [
+    TheyComponent,
+    MeComponent,
+    NearComponent,
+    TheyDetailComponent,
+    CommunityComponent,
+    ScienceDetailComponent,
+    ShareComponent,
+    RecommendDetailComponent,
+    AttentionDetailComponent,
+    UserFollowComponent,
+    UserTagComponent,
+    UserCollectionComponent,
+
+
+  ],
+  imports: [
+    CommonModule,
+    LessonRoutingModule,
+    FormsModule,
+    IonicModule
+  ]
 })
 export class LessonModule { }

+ 187 - 0
app-angular/src/modules/lesson/me/me.component.html

@@ -0,0 +1,187 @@
+<ion-header>
+    <ion-toolbar>
+        <ion-title>我的</ion-title>
+        <!-- 编辑信息按钮 -->
+        <ion-buttons slot="end">
+            <ion-button routerLink="/user/info">
+                <ion-icon slot="start" name="create-outline"></ion-icon>
+            </ion-button>
+            <ion-button id="myMenu">
+                <ion-icon name="menu-outline"></ion-icon>
+            </ion-button>
+            <ion-popover trigger="myMenu" triggerAction="click">
+                <ng-template>
+                    <ion-list>
+                        <ion-item [button]="true">
+                            <ion-icon name="scan-outline" size="small"></ion-icon>
+                            <ion-text>扫一扫</ion-text>
+                        </ion-item>
+                        <ion-item [button]="true">
+                            <ion-icon name="share-social-outline" size="small"></ion-icon>
+                            <ion-text>分享</ion-text>
+                        </ion-item>
+                        <ion-item [button]="true">
+                            <ion-icon name="pulse-outline" size="small"></ion-icon>
+                            <ion-text>客服</ion-text>
+                        </ion-item>
+
+                        <ion-item [button]="true">
+                            <ion-icon name="settings-outline" size="small"></ion-icon>
+                            <ion-text>设置</ion-text>
+                        </ion-item>
+                    </ion-list>
+                </ng-template>
+            </ion-popover>
+        </ion-buttons>
+    </ion-toolbar>
+</ion-header>
+<ion-content color="light">
+    <!-- 基本信息栏 -->
+    <ion-card>
+        <ion-list [inset]="true">
+            <ion-item lines="full">
+                <ion-avatar slot="start">
+                    <img alt="头像" src="https://ionicframework.com/docs/img/demos/avatar.svg" />
+                </ion-avatar>
+                <ion-label>
+                    {{currentUser?.get("name") || '昵称'}}
+                </ion-label>
+                <ion-buttons slot="end">
+                    <ion-button>
+                        <ion-icon name="heart-outline"></ion-icon>
+                        <ion-note>{{currentUser?.get("like") || '99'}}</ion-note>
+                    </ion-button>
+                </ion-buttons>
+            </ion-item>
+            <ion-item lines="none">
+                <ion-badge slot="start">{{currentUser?.get("tag") || '标签'}}</ion-badge>
+            </ion-item>
+            <ion-item lines="none">
+                <ion-label color="medium">
+                    {{currentUser?.get("desc") || '介绍一下自己吧'}}
+                </ion-label>
+            </ion-item>
+        </ion-list>
+    </ion-card>
+
+    <!-- 列表 -->
+    <ion-card class="myList">
+        <ion-list [inset]="true">
+            <ion-item button detail="true" routerLink="/lesson/me/userFollow">
+                <ion-label>
+                    <ion-note>关注</ion-note>
+                </ion-label>
+            </ion-item>
+            <ion-item button detail="true" routerLink="/lesson/me/userTag">
+                <ion-label>
+                    <ion-note>成就</ion-note>
+                </ion-label>
+            </ion-item>
+            <ion-item button detail="true" routerLink="/lesson/me/userCollection">
+                <ion-label>
+                    <ion-note>收藏</ion-note>
+                </ion-label>
+            </ion-item>
+        </ion-list>
+    </ion-card>
+
+
+    <!-- 详细内容 -->
+    <!-- 导航 -->
+    <ion-card>
+        <ion-toolbar>
+            <ion-segment value="关注">
+                <ion-segment-button value="推荐" (click)="cate='推荐'">
+                    <ion-icon name="bicycle-outline"></ion-icon>
+                    <ion-label>推荐</ion-label>
+                </ion-segment-button>
+                <ion-segment-button value="关注" (click)="cate='关注'">
+                    <ion-icon name="person-outline"></ion-icon>
+                    <ion-label>关注</ion-label>
+                </ion-segment-button>
+                <ion-segment-button value="科普" (click)="cate='科普'">
+                    <ion-icon name="fast-food-outline"></ion-icon>
+                    <ion-label>笔记</ion-label>
+                </ion-segment-button>
+            </ion-segment>
+            <ion-buttons slot="end"><ion-button>编辑</ion-button></ion-buttons>
+        </ion-toolbar>
+    </ion-card>
+
+    <!-- 美景推荐 -->
+
+    <ng-container *ngIf="cate=='推荐'">
+        <ion-list [inset]="true" lines="inset">
+            <ng-container *ngFor="let view of myViewList">
+                <ion-item>
+                    <ion-thumbnail slot="end">
+                        <img alt="推荐图" [src]="view?.get('img')" />
+                    </ion-thumbnail>
+                    <ion-label>
+                        <h2>{{view?.get('title')}}</h2>
+                        <p>{{view?.get('content')}}</p>
+                        <ion-note slot="start">{{view?.get('createdAt')| date: 'YYYY/MM/dd'||"发布时间"}}</ion-note>
+                    </ion-label>
+                </ion-item>
+            </ng-container>
+        </ion-list>
+    </ng-container>
+
+    <!-- 科普关注 -->
+    <ng-container *ngIf="cate=='关注'">
+        <ion-grid>
+            <ion-row>
+                <ng-container *ngFor="let role of myRoleList">
+                    <ion-col size="6">
+                        <ion-card class="roleCard">
+                            <img alt="关注图" [src]="role?.get('img')" />
+                            <ion-card-header>
+                                <ion-card-title>
+                                    {{role?.get('name')}}
+                                </ion-card-title>
+                                <ion-card-subtitle>{{role?.get('createdAt')| date:
+                                    'YYYY/MM/dd'||"发布时间"}}</ion-card-subtitle>
+                            </ion-card-header>
+
+                        </ion-card>
+                    </ion-col>
+                </ng-container>
+            </ion-row>
+        </ion-grid>
+    </ng-container>
+
+    <!-- 科普笔记 -->
+    <ng-container *ngIf="cate=='科普'">
+        <ng-container *ngFor="let food of myFoodList">
+            <ion-card>
+                <img alt="科普图" [src]="food?.get('img')" />
+                <ion-card-header>
+                    <ion-card-title>{{food?.get('name')}}</ion-card-title>
+                    <ion-card-subtitle>{{food?.get('createdAt')| date:
+                        'YYYY/MM/dd/HH:mm'||"发布时间"}}</ion-card-subtitle>
+                    <div class="metadata-end-wrapper-food">
+                        <ion-buttons slot="end">
+                            <ion-button>
+                                <ion-icon name="eye-outline" size="small"></ion-icon>
+                                <ion-note>{{food?.get('see')}}</ion-note>
+                            </ion-button>
+                            <ion-button>
+                                <ion-icon name="heart-outline" size="small"></ion-icon>
+                                <ion-note>{{food?.get('like')}}</ion-note>
+                            </ion-button>
+                        </ion-buttons>
+                    </div>
+                </ion-card-header>
+                <ion-card-content>
+                    <p class="foodContent">{{food?.get('content')}}</p>
+                </ion-card-content>
+            </ion-card>
+        </ng-container>
+    </ng-container>
+
+    <ion-list [inset]="true">
+        <ion-button *ngIf="!currentUser?.id" expand="block" routerLink="/user/login">登录</ion-button>
+        <ion-button *ngIf="currentUser?.id" fill="clear" expand="block" (click)="logout()">登出</ion-button>
+    </ion-list>
+
+</ion-content>

+ 57 - 0
app-angular/src/modules/lesson/me/me.component.scss

@@ -0,0 +1,57 @@
+ion-content {
+    height: calc(100vh - 121px) !important;
+}
+
+ion-item {
+    ion-icon {
+        margin-right: 9px;
+    }
+
+    font-size: 0.9rem;
+}
+
+.foodContent {
+    display: -webkit-box;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: 2;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+
+.myList {
+    padding: 0%;
+
+    ion-list {
+        margin: 0%;
+    }
+}
+
+
+.roleCard {
+    margin: 0px;
+}
+
+.metadata-end-wrapper {
+    position: absolute;
+
+    bottom: 0px;
+    inset-inline-end: 6px;
+
+    font-size: 0.6rem;
+
+    display: flex;
+    align-items: center;
+}
+
+.metadata-end-wrapper-food {
+    position: absolute;
+
+    top: 0px;
+    inset-inline-end: 0px;
+
+    font-size: 0.6rem;
+
+    display: flex;
+    align-items: center;
+
+}

+ 6 - 6
app-angular/src/modules/lesson/page-mine/detail/detail.component.spec.ts → app-angular/src/modules/lesson/me/me.component.spec.ts

@@ -1,16 +1,16 @@
 import { ComponentFixture, TestBed } from '@angular/core/testing';
 
-import { DetailComponent } from './detail.component';
+import { MeComponent } from './me.component';
 
-describe('DetailComponent', () => {
-  let component: DetailComponent;
-  let fixture: ComponentFixture<DetailComponent>;
+describe('MeComponent', () => {
+  let component: MeComponent;
+  let fixture: ComponentFixture<MeComponent>;
 
   beforeEach(() => {
     TestBed.configureTestingModule({
-      declarations: [DetailComponent]
+      declarations: [MeComponent]
     });
-    fixture = TestBed.createComponent(DetailComponent);
+    fixture = TestBed.createComponent(MeComponent);
     component = fixture.componentInstance;
     fixture.detectChanges();
   });

+ 72 - 0
app-angular/src/modules/lesson/me/me.component.ts

@@ -0,0 +1,72 @@
+import { Component } from '@angular/core';
+import { ToastController } from '@ionic/angular';
+import { UserService } from 'src/modules/user/service-user/user.service';
+import * as Parse from "parse"
+
+@Component({
+  selector: 'app-me',
+  templateUrl: './me.component.html',
+  styleUrls: ['./me.component.scss']
+})
+
+export class MeComponent {
+
+  currentUser: Parse.User | undefined
+
+
+  constructor(
+    private toastCtrl: ToastController,
+    public userServ: UserService
+  ) {
+    this.currentUser = Parse.User.current();
+  }
+
+  async ngOnInit() {
+    this.myRoleList = await this.gteAttentionData()
+    this.myFoodList = await this.getScienceData()
+    this.myViewList = await this.getViewDate()
+  }
+
+  cate: string = "关注"
+  //我的推荐分享
+  myViewList: Array<Parse.Object> = []
+  async getViewDate() {
+    let query = new Parse.Query("PetRecommend");
+    query.equalTo("user", Parse.User.current()?.toPointer())
+    query.include("user")
+    let list = await query.find();
+    return list
+  }
+  //我的科普关注
+  myRoleList: Array<Parse.Object> = []
+  async gteAttentionData() {
+    let query = new Parse.Query("PetAttention");
+    query.equalTo("user", Parse.User.current()?.toPointer())
+    query.include("user")
+    let list = await query.find();
+    return list
+  }
+  //我的科普分享
+  myFoodList: Array<Parse.Object> = []
+  async getScienceData() {
+    let query = new Parse.Query("PetScience");
+    query.equalTo("user", Parse.User.current()?.toPointer())
+    query.include("user")
+    let list = await query.find();
+    return list
+  }
+
+
+
+  async logout() {
+    await Parse.User.logOut()
+    this.currentUser = undefined
+    let toast = await this.toastCtrl.create({
+      message: "登出成功",
+      position: "top",
+      duration: 500
+    })
+    toast.present();
+  }
+
+}

+ 60 - 0
app-angular/src/modules/lesson/near/near.component.html

@@ -0,0 +1,60 @@
+<ion-header>
+    <ion-toolbar>
+        <ion-title>附近</ion-title>
+    </ion-toolbar>
+</ion-header>
+<ion-content>
+    搜索栏
+    <ion-searchbar animated="true" placeholder="搜索你要去的目的地"></ion-searchbar>
+
+    <!-- 地图导航 -->
+    <ion-card>
+        <img alt="定位" src="https://ionicframework.com/docs/img/demos/card-media.png" />
+    </ion-card>
+
+    <!-- 打卡签到卡片 -->
+    <ion-list>
+        <ion-item>
+            <ion-label>
+                当前区域科普商户列表
+            </ion-label>
+        </ion-item>
+        <ion-item>
+            <ion-thumbnail slot="start"><img alt="附近店面图"
+                    src="https://ionicframework.com/docs/img/demos/avatar.svg" /></ion-thumbnail>
+            <ion-label>
+                <strong>科普商户名</strong>
+                <p>评分:5.0分</p>
+                <p class="introduction">标签|地址</p>
+                <p class="introduction">推荐菜/食客评价</p>
+            </ion-label>
+        </ion-item>
+        <ion-item>
+            <ion-thumbnail slot="start"><img alt="附近店面图"
+                    src="http://qcloud.dpfile.com/pc/1S_E0Yzjk4BnRYSSRSfOXdJb2nYCnhCN45WXWlrPHJtCPkWLDk0eI9B8Xgm4UCmmbKcq9vnEaGy3xLEf-_v_oA.jpg" /></ion-thumbnail>
+            <ion-label>
+                <strong>黄记瓦罐煨汤(广场东路店)</strong>
+                <p>评分:3.8分</p>
+                <p class="introduction">标签|地址</p>
+                <p class="introduction">推荐菜/食客评价</p>
+            </ion-label>
+        </ion-item>
+        <ion-item>
+            <ion-thumbnail slot="start"><img alt="附近店面图"
+                    src="http://p0.meituan.net/biztone/882341109_1695830077224.jpeg%40340w_255h_1e_1c_1l%7Cwatermark%3D0" /></ion-thumbnail>
+            <ion-label>
+                <strong>堂瓦里·正宗赣菜(建德观店)</strong>
+                <p>评分:4.0分</p>
+                <p class="introduction">标签|地址</p>
+                <p class="introduction">推荐菜/食客评价</p>
+            </ion-label>
+        </ion-item>
+    </ion-list>
+
+
+
+
+    <!-- 测试 -->
+
+
+</ion-content>

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels