zqy 2 years ago
parent
commit
b47167d452
100 changed files with 4856 additions and 0 deletions
  1. BIN
      FA/CarParkTest/1.png
  2. 30 0
      FA/CarParkTest/README_zh.md
  3. 49 0
      FA/CarParkTest/build.gradle
  4. 1 0
      FA/CarParkTest/entry/.gitignore
  5. 29 0
      FA/CarParkTest/entry/build.gradle
  6. BIN
      FA/CarParkTest/entry/libs/rt.jar
  7. 1 0
      FA/CarParkTest/entry/proguard-rules.pro
  8. 71 0
      FA/CarParkTest/entry/src/main/config.json
  9. 86 0
      FA/CarParkTest/entry/src/main/java/com/view/test/MainAbility.java
  10. 25 0
      FA/CarParkTest/entry/src/main/java/com/view/test/MyApplication.java
  11. 32 0
      FA/CarParkTest/entry/src/main/java/com/view/test/bean/BodyDTO.java
  12. 64 0
      FA/CarParkTest/entry/src/main/java/com/view/test/bean/HeaderDTO.java
  13. 87 0
      FA/CarParkTest/entry/src/main/java/com/view/test/bean/NotifyDataDTO.java
  14. 76 0
      FA/CarParkTest/entry/src/main/java/com/view/test/bean/ServicesDTO.java
  15. 58 0
      FA/CarParkTest/entry/src/main/java/com/view/test/bean/TestParkBean.java
  16. 539 0
      FA/CarParkTest/entry/src/main/java/com/view/test/slice/MainAbilitySlice.java
  17. 53 0
      FA/CarParkTest/entry/src/main/java/com/view/test/slice/SecondAbilitySlice.java
  18. 46 0
      FA/CarParkTest/entry/src/main/java/com/view/test/utils/ToolUtils.java
  19. 8 0
      FA/CarParkTest/entry/src/main/resources/base/element/boolean.json
  20. 24 0
      FA/CarParkTest/entry/src/main/resources/base/element/string.json
  21. 6 0
      FA/CarParkTest/entry/src/main/resources/base/graphic/background_ability_main.xml
  22. 6 0
      FA/CarParkTest/entry/src/main/resources/base/graphic/background_car.xml
  23. 6 0
      FA/CarParkTest/entry/src/main/resources/base/graphic/background_time.xml
  24. 210 0
      FA/CarParkTest/entry/src/main/resources/base/layout/ability_main.xml
  25. 27 0
      FA/CarParkTest/entry/src/main/resources/base/layout/ability_second.xml
  26. BIN
      FA/CarParkTest/entry/src/main/resources/base/media/back_icon.png
  27. BIN
      FA/CarParkTest/entry/src/main/resources/base/media/car.png
  28. BIN
      FA/CarParkTest/entry/src/main/resources/base/media/circle_icon.png
  29. BIN
      FA/CarParkTest/entry/src/main/resources/base/media/has_car_icon.png
  30. BIN
      FA/CarParkTest/entry/src/main/resources/base/media/icon.png
  31. BIN
      FA/CarParkTest/entry/src/main/resources/base/media/next.png
  32. 16 0
      FA/CarParkTest/entry/src/main/resources/en/element/string.json
  33. 16 0
      FA/CarParkTest/entry/src/main/resources/zh/element/string.json
  34. 29 0
      FA/CarParkTest/entry/src/ohosTest/java/com/view/test/ExampleOhosTest.java
  35. 24 0
      FA/CarParkTest/entry/src/test/java/com/view/test/ExampleTest.java
  36. BIN
      FA/CarParkTest/gradle/wrapper/gradle-wrapper.jar
  37. 5 0
      FA/CarParkTest/gradle/wrapper/gradle-wrapper.properties
  38. 1 0
      FA/CarParkTest/settings.gradle
  39. 14 0
      FA/Contacts/.idea/.deveco/module/entry.cache.json
  40. 12 0
      FA/Contacts/.idea/.deveco/project.cache.json
  41. 3 0
      FA/Contacts/.idea/.gitignore
  42. 24 0
      FA/Contacts/.idea/Contacts.iml
  43. 8 0
      FA/Contacts/.idea/configurationModuleSettings.xml
  44. 8 0
      FA/Contacts/.idea/modules.xml
  45. 134 0
      FA/Contacts/README_zh.md
  46. 26 0
      FA/Contacts/build-profile.json5
  47. 3 0
      FA/Contacts/entry/.gitignore
  48. 10 0
      FA/Contacts/entry/build-profile.json5
  49. 2 0
      FA/Contacts/entry/hvigorfile.js
  50. 5 0
      FA/Contacts/entry/package-lock.json
  51. 14 0
      FA/Contacts/entry/package.json
  52. 64 0
      FA/Contacts/entry/src/main/config.json
  53. 23 0
      FA/Contacts/entry/src/main/js/MainAbility/app.js
  54. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/checkbutton.png
  55. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/delete.png
  56. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/done.png
  57. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/head0.png
  58. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/head1.png
  59. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/head2.png
  60. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/head3.png
  61. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/head4.png
  62. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/images/Wallpaper.png
  63. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/images/bg-tv.jpg
  64. BIN
      FA/Contacts/entry/src/main/js/MainAbility/common/right.png
  65. 8 0
      FA/Contacts/entry/src/main/js/MainAbility/i18n/en-US.json
  66. 8 0
      FA/Contacts/entry/src/main/js/MainAbility/i18n/zh-CN.json
  67. 161 0
      FA/Contacts/entry/src/main/js/MainAbility/pages/index/index.css
  68. 57 0
      FA/Contacts/entry/src/main/js/MainAbility/pages/index/index.hml
  69. 167 0
      FA/Contacts/entry/src/main/js/MainAbility/pages/index/index.js
  70. 16 0
      FA/Contacts/entry/src/main/resources/base/element/string.json
  71. BIN
      FA/Contacts/entry/src/main/resources/base/media/icon.png
  72. 2 0
      FA/Contacts/hvigorfile.js
  73. 1657 0
      FA/Contacts/package-lock.json
  74. 18 0
      FA/Contacts/package.json
  75. 200 0
      FA/Contacts/quick_develop.md
  76. BIN
      FA/Contacts/resources/contacts.gif
  77. BIN
      FA/Contacts/resources/home.png
  78. BIN
      FA/Contacts/resources/new_project.png
  79. 90 0
      FA/DistSchedule/README_zh.md
  80. 46 0
      FA/DistSchedule/build.gradle
  81. 156 0
      FA/DistSchedule/docs/FAQs.md
  82. 295 0
      FA/DistSchedule/docs/学生党上手数字管家/README.md
  83. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/1.png
  84. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/10.png
  85. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/11.png
  86. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/12.png
  87. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/13.png
  88. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/14.png
  89. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/15.png
  90. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/16.png
  91. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/17.png
  92. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/18.png
  93. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/19.png
  94. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/2.png
  95. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/20.png
  96. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/21.png
  97. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/22.png
  98. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/23.png
  99. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/24.png
  100. BIN
      FA/DistSchedule/docs/学生党上手数字管家/resources/25.png

BIN
FA/CarParkTest/1.png


+ 30 - 0
FA/CarParkTest/README_zh.md

@@ -0,0 +1,30 @@
+# CarParkTest应用代码介绍
+
+### 简介
+
+CarParkTest是装在手机端的应用,根据智能停车设备上报的数据来进行停车位信息的反馈;
+
+### 代码结构
+
+本demo包括entry模块
+![](1.png)
+
+
+
+### 安装部署
+
+##### 1.代码编译运行步骤
+
+1)下载此项目,[链接](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/FA/CarParkTest )。
+
+2)开发环境搭建,开发工具:DevEco Studio 3.0 Beta1,SDK 请配置请参考[配置OpenHarmony SDK](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-sdk.md) 。
+
+3)导入OpenHarmony工程:OpenHarmony应用开发,只能通过导入Sample工程的方式来创建一个新工程,具体可参考[导入Sample工程创建一个新工程](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/import-sample-to-create-project.md)
+
+4)OpenHarmony应用运行在真机设备上,需要对应用进行签名,请参考[OpenHarmony 应用签名](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-app-signature.md)
+
+### 约束限制
+
+1. 提前准好已实名认证的开发者联盟账号 ,具体[参考](https://developer.huawei.com/consumer/cn/)
+2. 更多应用编译和签名资料,请[参考](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/deveco-studio-overview.md#/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/configuring-openharmony-sdk.md)
+3. 更多开发资料请登录官网: [参考](https://gitee.com/openharmony)

+ 49 - 0
FA/CarParkTest/build.gradle

@@ -0,0 +1,49 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+apply plugin: 'com.huawei.ohos.app'
+
+//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#ZH-CN_TOPIC_0000001154985555__section1112183053510
+ohos {
+    signingConfigs {
+        debug {
+            storeFile file('C:\\Users\\Administrator\\.ohos\\config\\auto_debug_260086000069925411.p12')
+            storePassword '0000001832E774DA16C0E6930236A2F70BE06152E2F15C7AC197E6B82FEB427B1585FF4F6B15C33C'
+            keyAlias = 'debugKey'
+            keyPassword '00000018C3FB65E006246B92BDB0688783666B0821EEA6CB375EBE5A41945CFBAF77AFCDF8584FB1'
+            signAlg = 'SHA256withECDSA'
+            profile file('C:\\Users\\Administrator\\.ohos\\config\\auto_debug_test_260086000069925411.p7b')
+            certpath file('C:\\Users\\Administrator\\.ohos\\config\\auto_debug_260086000069925411.cer')
+        }
+    }
+    compileSdkVersion 5
+    defaultConfig {
+        compatibleSdkVersion 4
+    }
+}
+
+buildscript {
+    repositories {
+        maven {
+            url 'https://repo.huaweicloud.com/repository/maven/'
+        }
+        maven {
+            url 'https://developer.huawei.com/repo/'
+        }
+        jcenter()
+    }
+    dependencies {
+        classpath 'com.huawei.ohos:hap:2.4.5.0'
+        classpath 'com.huawei.ohos:decctest:1.2.4.1'
+    }
+}
+
+allprojects {
+    repositories {
+        maven {
+            url 'https://repo.huaweicloud.com/repository/maven/'
+        }
+        maven {
+            url 'https://developer.huawei.com/repo/'
+        }
+        jcenter()
+    }
+}

+ 1 - 0
FA/CarParkTest/entry/.gitignore

@@ -0,0 +1 @@
+/build

+ 29 - 0
FA/CarParkTest/entry/build.gradle

@@ -0,0 +1,29 @@
+apply plugin: 'com.huawei.ohos.hap'
+apply plugin: 'com.huawei.ohos.decctest'
+//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#ZH-CN_TOPIC_0000001154985555__section1112183053510
+ohos {
+    compileSdkVersion 5
+    defaultConfig {
+        compatibleSdkVersion 4
+    }
+    buildTypes {
+        release {
+            proguardOpt {
+                proguardEnabled false
+                rulesFiles 'proguard-rules.pro'
+            }
+        }
+    }
+    
+}
+
+dependencies {
+    implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])
+    testImplementation 'junit:junit:4.13'
+    ohosTestImplementation 'com.huawei.ohos.testkit:runner:1.0.0.100'
+    implementation('org.apache.qpid:qpid-jms-client:0.50.0')
+    implementation('cn.hutool:hutool-all:5.4.3')
+}
+decc {
+    supportType = ['html','xml']
+}

BIN
FA/CarParkTest/entry/libs/rt.jar


+ 1 - 0
FA/CarParkTest/entry/proguard-rules.pro

@@ -0,0 +1 @@
+# config module specific ProGuard rules here.

+ 71 - 0
FA/CarParkTest/entry/src/main/config.json

@@ -0,0 +1,71 @@
+{
+  "app": {
+    "bundleName": "com.view.test",
+    "vendor": "view",
+    "version": {
+      "code": 1000000,
+      "name": "1.0.0"
+    }
+  },
+  "deviceConfig": {},
+  "module": {
+    "package": "com.view.test",
+    "name": ".MyApplication",
+    "mainAbility": "com.view.test.MainAbility",
+    "deviceType": [
+      "phone",
+      "tablet",
+      "tv",
+      "wearable",
+      "car"
+    ],
+    "metaData": {
+      "customizeData": [
+        {
+          "name": "hwc-theme",
+          "value": "androidhwext:style/Theme.Emui.Light.NoTitleBar",
+          "extra": ""
+        }
+      ]
+    },
+    "reqPermissions": [
+      {
+        "name": "ohos.permission.GET_NETWORK_INFO"
+      },
+      {
+        "name": "ohos.permission.SET_NETWORK_INFO"
+      },
+      {
+        "name": "ohos.permission.INTERNET"
+      }
+    ],
+    "distro": {
+      "deliveryWithInstall": true,
+      "moduleName": "entry",
+      "moduleType": "entry",
+      "installationFree": false
+    },
+    "abilities": [
+      {
+        "skills": [
+          {
+            "entities": [
+              "entity.system.home"
+            ],
+            "actions": [
+              "action.system.home",
+              "action.second"
+            ]
+          }
+        ],
+        "orientation": "unspecified",
+        "name": "com.view.test.MainAbility",
+        "icon": "$media:icon",
+        "description": "$string:mainability_description",
+        "label": "$string:entry_MainAbility",
+        "type": "page",
+        "launchType": "standard"
+      }
+    ]
+  }
+}

+ 86 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/MainAbility.java

@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test;
+
+import com.view.test.slice.MainAbilitySlice;
+import com.view.test.slice.SecondAbilitySlice;
+import ohos.aafwk.ability.Ability;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.Component;
+import ohos.agp.utils.Color;
+import ohos.agp.window.service.WindowManager;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.multimodalinput.event.KeyEvent;
+
+
+public class MainAbility extends Ability {
+
+
+
+    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0x11101, "MainAbility");
+
+    @Override
+    public void onStart(Intent intent) {
+        getWindow().setStatusBarColor(Color.WHITE.getValue());
+        getWindow().setStatusBarVisibility(Component.VISIBLE);
+        getWindow().addFlags(WindowManager.LayoutConfig.MARK_TRANSLUCENT_STATUS |
+                WindowManager.LayoutConfig.MARK_TRANSLUCENT_NAVIGATION
+        );
+        super.onStart(intent);
+        super.setMainRoute(MainAbilitySlice.class.getName());
+
+        addActionRoute("action.second", SecondAbilitySlice.class.getName());
+
+        HiLog.error(LABEL_LOG, "onStart");
+    }
+
+    @Override
+    protected void onActive() {
+        super.onActive();
+        HiLog.info(LABEL_LOG, "onActive");
+    }
+
+    @Override
+    protected void onInactive() {
+        super.onInactive();
+        HiLog.info(LABEL_LOG, "onInactive");
+    }
+
+    @Override
+    protected void onBackground() {
+        super.onBackground();
+        HiLog.info(LABEL_LOG, "onBackground");
+    }
+
+    @Override
+    protected void onForeground(Intent intent) {
+        super.onForeground(intent);
+        HiLog.info(LABEL_LOG, "onForeground");
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        HiLog.info(LABEL_LOG, "onStop");
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
+        HiLog.info(LABEL_LOG, "--------------------------onKeyDown");
+        return super.onKeyDown(keyCode, keyEvent);
+    }
+}

+ 25 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/MyApplication.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test;
+
+import ohos.aafwk.ability.AbilityPackage;
+
+public class MyApplication extends AbilityPackage {
+    @Override
+    public void onInitialize() {
+        super.onInitialize();
+    }
+}

+ 32 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/bean/BodyDTO.java

@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test.bean;
+
+import java.util.List;
+
+public class BodyDTO {
+    private List<ServicesDTO> services;
+
+    public List<ServicesDTO> getServices() {
+        return services;
+    }
+
+    public void setServices(List<ServicesDTO> services) {
+        this.services = services;
+    }
+
+
+}

+ 64 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/bean/HeaderDTO.java

@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test.bean;
+
+public class HeaderDTO {
+    private String app_id;
+    private String device_id;
+    private String node_id;
+    private String product_id;
+    private String gateway_id;
+
+    public String getApp_id() {
+        return app_id;
+    }
+
+    public void setApp_id(String app_id) {
+        this.app_id = app_id;
+    }
+
+    public String getDevice_id() {
+        return device_id;
+    }
+
+    public void setDevice_id(String device_id) {
+        this.device_id = device_id;
+    }
+
+    public String getNode_id() {
+        return node_id;
+    }
+
+    public void setNode_id(String node_id) {
+        this.node_id = node_id;
+    }
+
+    public String getProduct_id() {
+        return product_id;
+    }
+
+    public void setProduct_id(String product_id) {
+        this.product_id = product_id;
+    }
+
+    public String getGateway_id() {
+        return gateway_id;
+    }
+
+    public void setGateway_id(String gateway_id) {
+        this.gateway_id = gateway_id;
+    }
+}

+ 87 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/bean/NotifyDataDTO.java

@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test.bean;
+
+import java.util.List;
+
+public class NotifyDataDTO {
+    private HeaderDTO header;
+    private BodyDTO body;
+
+    public HeaderDTO getHeader() {
+        return header;
+    }
+
+    public void setHeader(HeaderDTO header) {
+        this.header = header;
+    }
+
+    public BodyDTO getBody() {
+        return body;
+    }
+
+    public void setBody(BodyDTO body) {
+        this.body = body;
+    }
+
+    public static class HeaderDTO {
+        private String app_id;
+        private String device_id;
+        private String node_id;
+        private String product_id;
+        private String gateway_id;
+
+        public String getApp_id() {
+            return app_id;
+        }
+
+        public void setApp_id(String app_id) {
+            this.app_id = app_id;
+        }
+
+        public String getDevice_id() {
+            return device_id;
+        }
+
+        public void setDevice_id(String device_id) {
+            this.device_id = device_id;
+        }
+
+        public String getNode_id() {
+            return node_id;
+        }
+
+        public void setNode_id(String node_id) {
+            this.node_id = node_id;
+        }
+
+        public String getProduct_id() {
+            return product_id;
+        }
+
+        public void setProduct_id(String product_id) {
+            this.product_id = product_id;
+        }
+
+        public String getGateway_id() {
+            return gateway_id;
+        }
+
+        public void setGateway_id(String gateway_id) {
+            this.gateway_id = gateway_id;
+        }
+    }
+}

+ 76 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/bean/ServicesDTO.java

@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test.bean;
+
+public class ServicesDTO {
+    private String service_id;
+    private ServicesDTO.PropertiesDTO properties;
+    private String event_time;
+
+    public String getService_id() {
+        return service_id;
+    }
+
+    public void setService_id(String service_id) {
+        this.service_id = service_id;
+    }
+
+    public ServicesDTO.PropertiesDTO getProperties() {
+        return properties;
+    }
+
+    public void setProperties(ServicesDTO.PropertiesDTO properties) {
+        this.properties = properties;
+    }
+
+    public String getEvent_time() {
+        return event_time;
+    }
+
+    public void setEvent_time(String event_time) {
+        this.event_time = event_time;
+    }
+
+    public static class PropertiesDTO {
+        private int allParks;
+        private int Location;
+        private int isPark;
+
+        public int getAllParks() {
+            return allParks;
+        }
+
+        public void setAllParks(int allParks) {
+            this.allParks = allParks;
+        }
+
+        public int getLocation() {
+            return Location;
+        }
+
+        public void setLocation(int location) {
+            this.Location = location;
+        }
+
+        public int getIsPark() {
+            return isPark;
+        }
+
+        public void setIsPark(int isPark) {
+            this.isPark = isPark;
+        }
+    }
+}

+ 58 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/bean/TestParkBean.java

@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test.bean;
+
+
+public class TestParkBean {
+
+    private String resource;
+    private String event;
+    private String event_time;
+    private NotifyDataDTO notify_data;
+
+    public String getResource() {
+        return resource;
+    }
+
+    public void setResource(String resource) {
+        this.resource = resource;
+    }
+
+    public String getEvent() {
+        return event;
+    }
+
+    public void setEvent(String event) {
+        this.event = event;
+    }
+
+    public String getEvent_time() {
+        return event_time;
+    }
+
+    public void setEvent_time(String event_time) {
+        this.event_time = event_time;
+    }
+
+    public NotifyDataDTO getNotify_data() {
+        return notify_data;
+    }
+
+    public void setNotify_data(NotifyDataDTO notify_data) {
+        this.notify_data = notify_data;
+    }
+
+}

+ 539 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/slice/MainAbilitySlice.java

@@ -0,0 +1,539 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test.slice;
+
+
+import cn.hutool.json.JSONUtil;
+import com.view.test.ResourceTable;
+import com.view.test.bean.ServicesDTO;
+import com.view.test.bean.TestParkBean;
+import com.view.test.utils.ToolUtils;
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.content.Intent;
+import ohos.agp.components.*;
+
+import ohos.app.dispatcher.task.TaskPriority;
+import ohos.data.DatabaseHelper;
+import ohos.data.preferences.Preferences;
+import ohos.hiviewdfx.HiLog;
+import ohos.hiviewdfx.HiLogLabel;
+import ohos.multimodalinput.event.KeyEvent;
+import org.apache.qpid.jms.JmsConnection;
+import org.apache.qpid.jms.JmsConnectionFactory;
+import org.apache.qpid.jms.JmsConnectionListener;
+import org.apache.qpid.jms.JmsQueue;
+import org.apache.qpid.jms.message.JmsInboundMessageDispatch;
+import org.apache.qpid.jms.transports.TransportOptions;
+import org.apache.qpid.jms.transports.TransportSupport;
+
+import javax.jms.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+import java.net.URI;
+
+import java.util.Hashtable;
+import java.util.List;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+public class MainAbilitySlice extends AbilitySlice {
+
+
+    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0x11101, "MainAbilitySlice");
+
+
+    /**
+     * 异步线程池,参数可以根据业务特点作调整,也可以用其他异步方式来处理。
+     */
+    private final static ExecutorService executorService = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
+            Runtime.getRuntime().availableProcessors() * 2, 60,
+            TimeUnit.SECONDS, new LinkedBlockingQueue<>(5000));
+
+    /**
+     * 连接凭证接入键值
+     */
+    private static String accessKey = "goy7cYSR";
+
+    /**
+     * 连接凭证接入码
+     */
+    private static String password = "euuottdbwwEYTNILsbk2lsPX9Xxbm3yt";
+
+    /**
+     * 队列名,可以使用默认队列DefaultQueue
+     */
+    private static String queueName = "Park1234";
+//    private static String queueName = "TestPark";
+
+    /**
+     * 按照qpid-jms的规范,组装连接URL。
+     */
+    private static String connectionUrl = "amqps://a16103bd0e.iot-amqps.cn-north-4.myhuaweicloud.com:5671?amqp.vhost=default&amqp.idleTimeout=8000&amqp.saslMechanisms=PLAIN";
+
+//    private static String connectionUrl = "amqps://${UUCID}.iot-amqps.cn-north-4.myhuaweicloud.com:5671?amqp.vhost=default&amqp.idleTimeout=8000&amqp.saslMechanisms=PLAIN";
+
+    private static Connection connection;
+    private static Session session;
+    private static MessageConsumer consumer;
+    private static  MessageProducer producer;
+    private static long lastReconnectTime = 0;
+    private static AtomicBoolean isReconnecting = new AtomicBoolean(false);
+
+
+    //页面组件
+    Image mImageBack = null;
+    Text mTextP = null;
+    StackLayout mSlHasCar = null;
+    Text mTextCar = null;
+    Text mTextCarInTime = null;
+    Text mTextCarOutTime = null;
+
+    boolean mIsPark = false;
+    String mEventTime = null;
+
+    //最近驶入时间
+    String mLastCarInTime = null;
+
+    //最后驶离时间
+    String mLastCarOutTime = null;
+
+    private final static String FILE_NAME = "data";
+    private final static String LAST_CAR_IN_TIME = "car_in_time";
+    private final static String LAST_CAR_OUT_TIME = "car_out_time";
+
+
+    DatabaseHelper databaseHelper = null;
+    Preferences preferences = null;
+
+    @Override
+    public void onStart(Intent intent) {
+        super.onStart(intent);
+        super.setUIContent(ResourceTable.Layout_ability_main);
+
+
+        databaseHelper = new DatabaseHelper(this);// context入 参类型为ohos.app.Context
+        preferences = databaseHelper.getPreferences(FILE_NAME);
+
+        //获取之前保存的数据,显示时间
+        if (preferences != null) {
+            mLastCarInTime = preferences.getString(LAST_CAR_IN_TIME, "");
+            mLastCarOutTime = preferences.getString(LAST_CAR_OUT_TIME, "");
+        }
+
+
+        initComponent();
+
+        getGlobalTaskDispatcher(TaskPriority.DEFAULT).asyncDispatch(new Runnable() {
+            @Override
+            public void run() {
+                amqpConnect();
+            }
+        });
+
+
+    }
+
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
+        HiLog.info(LABEL_LOG, "=============================onKeyDown keycode = " + keyCode);
+        if (2 == keyCode) {
+            shutdown();
+        }
+        return super.onKeyDown(keyCode, keyEvent);
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+    }
+
+    private void initComponent() {
+        mImageBack = (Image) findComponentById(ResourceTable.Id_back);
+        mImageBack.setClickedListener(new Component.ClickedListener() {
+            @Override
+            public void onClick(Component component) {
+                shutdown();
+                terminate();
+
+            }
+        });
+        mTextP = (Text) findComponentById(ResourceTable.Id_text_not_has_car);
+        mSlHasCar = (StackLayout) findComponentById(ResourceTable.Id_sl_has_car);
+
+        mTextCar = (Text) findComponentById(ResourceTable.Id_tx_car);
+
+        mTextCarInTime = (Text) findComponentById(ResourceTable.Id_tx_car_in_time);
+        mTextCarInTime.setText(mLastCarInTime);
+
+        mTextCarOutTime = (Text) findComponentById(ResourceTable.Id_tx_car_out_time);
+        mTextCarOutTime.setText(mLastCarOutTime);
+
+        if (mIsPark) {
+            hasCarDisplay();
+        } else {
+            noCarDisplay();
+        }
+    }
+
+    private void hasCarDisplay() {
+        mTextP.setVisibility(Component.INVISIBLE);
+        mSlHasCar.setVisibility(Component.VISIBLE);
+        mTextCar.setText(ResourceTable.String_string_has_car);
+        mTextCarInTime.setText(mLastCarInTime);
+        mTextCarOutTime.setText(mLastCarOutTime);
+
+        //驶入时间,驶离时间,写入持久化
+        HiLog.info(LABEL_LOG, "汽车驶入时间:" + mLastCarInTime);
+        HiLog.info(LABEL_LOG, "汽车驶离时间:" + mLastCarOutTime);
+        ToolUtils.writeToSP(preferences, LAST_CAR_IN_TIME, mLastCarInTime);
+        ToolUtils.writeToSP(preferences, LAST_CAR_OUT_TIME, mLastCarOutTime);
+    }
+
+    private void noCarDisplay() {
+        mTextP.setVisibility(Component.VISIBLE);
+        mSlHasCar.setVisibility(Component.INVISIBLE);
+        mTextCar.setText(ResourceTable.String_string_not_has_car);
+        mTextCarInTime.setText(mLastCarInTime);
+
+
+
+        mTextCarOutTime.setText(mLastCarOutTime);
+
+        //驶入时间,驶离时间,写入持久化
+        HiLog.info(LABEL_LOG, "汽车驶入时间:" + mLastCarInTime);
+        HiLog.info(LABEL_LOG, "汽车驶离时间:" + mLastCarOutTime);
+        ToolUtils.writeToSP(preferences, LAST_CAR_IN_TIME, mLastCarInTime);
+        ToolUtils.writeToSP(preferences, LAST_CAR_OUT_TIME, mLastCarOutTime);
+    }
+
+
+    void amqpConnect() {
+        HiLog.info(LABEL_LOG, "amqpTest");
+        try {
+            createConsumer();
+        } catch (Exception e) {
+            //异常情况,重新连接
+//            HiLog.error(LABEL_LOG, "amqpTest exception will reconnect");
+            reconnect();
+            e.printStackTrace();
+        }
+
+        // 处理消息有两种方式
+        // 1,主动拉数据(推荐),参照receiveMessage()
+//        receiveMessage();
+
+        //使用第二种方式:
+
+        // 2, 添加监听,参照consumer.setMessageListener(messageListener), 服务端主动推数据给客户端,但得考虑接受的数据速率是客户能力能够承受住的
+        try {
+            consumer.setMessageListener(messageListener);
+        } catch (JMSException e) {
+            e.printStackTrace();
+        }
+        // 防止主程序退出,这里休眠了60s,60s后程序会结束
+        // Thread.sleep( 60 * 1000L);
+        // shutdown();
+
+
+    }
+
+    private void createConsumer() throws Exception {
+        HiLog.info(LABEL_LOG, "createConsumer");
+        long timeStamp = System.currentTimeMillis();
+        //UserName组装方法,请参见文档:AMQP客户端接入说明。
+        String userName = "accessKey=" + accessKey + "|timestamp=" + timeStamp + "|";
+        HiLog.info(LABEL_LOG, "userName = " + userName);
+        HiLog.info(LABEL_LOG, "password = " + password);
+        Hashtable<String, String> hashtable = new Hashtable<>();
+        hashtable.put("connectionfactory.HwConnectionURL", connectionUrl);
+        hashtable.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.qpid.jms.jndi.JmsInitialContextFactory");
+        Context context = new InitialContext(hashtable);
+        JmsConnectionFactory cf = (JmsConnectionFactory) context.lookup("HwConnectionURL");
+
+        //信任服务端
+        TransportOptions to = new TransportOptions();
+        to.setTrustAll(true);
+        cf.setSslContext(TransportSupport.createJdkSslContext(to));
+
+
+        // 创建连接
+        Connection connection = cf.createConnection(userName, password);
+
+        ((JmsConnection) connection).addConnectionListener(myJmsConnectionListener);
+
+
+        connection.setExceptionListener(exceptionListener);
+        connection.start();
+        HiLog.info(LABEL_LOG, "createConsumer connection.start");
+
+        // 创建 Session
+        // Session.CLIENT_ACKNOWLEDGE: 收到消息后,需要手动调用message.acknowledge()。
+        // Session.AUTO_ACKNOWLEDGE: SDK自动ACK(推荐)。
+        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        HiLog.info(LABEL_LOG, "createConsumer connection.createSession");
+
+        // 创建 consumer
+        consumer = session.createConsumer(new JmsQueue(queueName));
+
+
+        HiLog.info(LABEL_LOG, "createConsumer end");
+    }
+
+    private void receiveMessage() {
+        HiLog.info(LABEL_LOG, "receiveMessage");
+        while (true) {
+            try {
+                if (consumer != null) {
+                    Message message = consumer.receive(1000);
+                    if (message != null) {
+                        HiLog.error(LABEL_LOG, "receiveMessage 222 msg : " + message.getBody(String.class));
+                    }
+
+                    // 建议异步处理收到的消息,确保receiveMessage函数里没有耗时逻辑。
+                    executorService.execute(() -> processMessage(message));
+                } else {
+                    Thread.sleep(1000L);
+                }
+            } catch (Exception e) {
+                HiLog.error(LABEL_LOG, "receiveMessage Exception e");
+                System.out.println("receiveMessage hand an exception: " + e.getMessage());
+                e.printStackTrace();
+                try {
+                    Thread.sleep(1000L);
+                } catch (InterruptedException interruptedException) {
+                    interruptedException.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 客户端断开需要重连
+     */
+    private void reconnect() {
+        if (isReconnecting.compareAndSet(false, true)) {
+            while (true) {
+                try {
+                    // 防止重连次数太多,重连时间间隔15s
+                    if (System.currentTimeMillis() - lastReconnectTime < 15 * 1000L) {
+                        Thread.sleep(15 * 1000L);
+                    }
+                    shutdown();
+                    createConsumer();
+                    lastReconnectTime = System.currentTimeMillis();
+                    isReconnecting.set(false);
+                    break;
+                } catch (Exception e) {
+                    lastReconnectTime = System.currentTimeMillis();
+                    System.out.println("reconnect hand an exception: " + e.getMessage());
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 在这里处理您收到消息后的具体业务逻辑。
+     */
+    private void processMessage(Message message) {
+        if (null == message) {
+//            HiLog.info(LABEL_LOG, "processMessage message is null");
+            return;
+        }
+
+        List<ServicesDTO> list = null;
+
+        try {
+            String body = message.getBody(String.class);
+            //接收到的数据
+            String content = new String(body);
+            System.out.println("receive an message, the content is " + content);
+
+            TestParkBean bean = JSONUtil.toBean(content, TestParkBean.class);
+            if (null != bean.getNotify_data() && null != bean.getNotify_data().getBody()) {
+                list = bean.getNotify_data().getBody().getServices();
+                if (null != list && list.size() > 0) {
+                    String dateStr = list.get(0).getEvent_time();
+                    // 时间上报时间"2020-01-23 12:23:56"
+                    mEventTime = ToolUtils.getDateStr(dateStr);
+                    ServicesDTO.PropertiesDTO propertiesDTO = list.get(0).getProperties();
+
+                    HiLog.info(LABEL_LOG, "park value = " + propertiesDTO.getIsPark() + "  mIsPark = " + mIsPark);
+
+                    if (0 == propertiesDTO.getIsPark() && mIsPark) {
+                        mIsPark = false;
+                        mLastCarOutTime = mEventTime;
+                        HiLog.info(LABEL_LOG, "last car out time = " + mLastCarOutTime);
+
+                    } else if (propertiesDTO.getIsPark() > 0 && !mIsPark){
+                        mIsPark = true;
+                        mLastCarInTime = mEventTime;
+                        HiLog.info(LABEL_LOG, "last car in time = " + mLastCarInTime);
+                    }
+                }
+            } else {
+                HiLog.error(LABEL_LOG, "processMessage message is exception!");
+            }
+
+            //处理数据结束后,需要更新UI
+            getUITaskDispatcher().asyncDispatch(new Runnable() {
+                @Override
+                public void run() {
+                    if (mIsPark) {
+                        hasCarDisplay();
+                    } else {
+                        noCarDisplay();
+                    }
+                }
+            });
+
+
+        } catch (Exception e) {
+            System.out.println("processMessage occurs error: " + e.getMessage());
+            e.printStackTrace();
+        }
+    }
+
+    private static void shutdown() {
+        HiLog.info(LABEL_LOG, "shutdown");
+        if (consumer != null) {
+            try {
+                consumer.close();
+            } catch (JMSException e) {
+                e.printStackTrace();
+            }
+        }
+        if (session != null) {
+            try {
+                session.close();
+            } catch (JMSException e) {
+                e.printStackTrace();
+            }
+        }
+        if (connection != null) {
+            try {
+                connection.setExceptionListener(null);
+                connection.close();
+            } catch (JMSException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private MessageListener messageListener = new MessageListener() {
+        @Override
+        public void onMessage(Message message) {
+            try {
+                HiLog.info(LABEL_LOG, "onMessage message = " + message.getBody(String.class));
+                // 建议异步处理收到的消息,确保onMessage函数里没有耗时逻辑。
+                // 如果业务处理耗时过程过长阻塞住线程,可能会影响SDK收到消息后的正常回调。
+                executorService.submit(() -> processMessage(message));
+            } catch (Exception e) {
+                System.out.println("submit task occurs exception: " + e.getMessage());
+                e.printStackTrace();
+            }
+        }
+    };
+
+    private ExceptionListener exceptionListener = new ExceptionListener() {
+        @Override
+        public void onException(JMSException e) {
+            e.printStackTrace();
+            System.out.println("connection has an exception:" + e);
+            // 链接发生异常,需要重连
+            reconnect();
+        }
+    };
+
+    private static JmsConnectionListener myJmsConnectionListener = new JmsConnectionListener() {
+        /**
+         * 连接成功建立。
+         */
+        @Override
+        public void onConnectionEstablished(URI remoteURI) {
+            HiLog.error(LABEL_LOG, "onConnectionEstablished, remoteUri:" + remoteURI);
+            System.out.println("onConnectionEstablished, remoteUri:" + remoteURI);
+        }
+
+        /**
+         * 尝试过最大重试次数之后,最终连接失败。
+         */
+        @Override
+        public void onConnectionFailure(Throwable error) {
+            HiLog.error(LABEL_LOG, "onConnectionFailure, " + error.getMessage());
+            System.out.println("onConnectionFailure, " + error.getMessage());
+        }
+
+        /**
+         * 连接中断。
+         */
+        @Override
+        public void onConnectionInterrupted(URI remoteURI) {
+            HiLog.error(LABEL_LOG, "onConnectionInterrupted, remoteUri:" + remoteURI);
+            System.out.println("onConnectionInterrupted, remoteUri:" + remoteURI);
+        }
+
+        /**
+         * 连接中断后又自动重连上。
+         */
+        @Override
+        public void onConnectionRestored(URI remoteURI) {
+            HiLog.error(LABEL_LOG, "onConnectionRestored, remoteUri:" + remoteURI);
+            System.out.println("onConnectionRestored, remoteUri:" + remoteURI);
+        }
+
+        @Override
+        public void onInboundMessage(JmsInboundMessageDispatch envelope) {
+            System.out.println("onInboundMessage, " + envelope);
+        }
+
+        @Override
+        public void onSessionClosed(Session session, Throwable cause) {
+            System.out.println("onSessionClosed, session=" + session + ", cause =" + cause);
+        }
+
+        @Override
+        public void onConsumerClosed(MessageConsumer consumer, Throwable cause) {
+            System.out.println("MessageConsumer, consumer=" + consumer + ", cause =" + cause);
+        }
+
+        @Override
+        public void onProducerClosed(MessageProducer producer, Throwable cause) {
+            System.out.println("MessageProducer, producer=" + producer + ", cause =" + cause);
+        }
+    };
+
+    @Override
+    protected void onResult(int requestCode, Intent resultIntent) {
+        super.onResult(requestCode, resultIntent);
+
+    }
+
+    @Override
+    public void onActive() {
+        super.onActive();
+        HiLog.error(LABEL_LOG, "onActive()");
+    }
+
+    @Override
+    public void onForeground(Intent intent) {
+        super.onForeground(intent);
+    }
+}

+ 53 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/slice/SecondAbilitySlice.java

@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test.slice;
+
+import com.view.test.ResourceTable;
+import ohos.aafwk.ability.AbilitySlice;
+import ohos.aafwk.content.Intent;
+
+public class SecondAbilitySlice extends AbilitySlice {
+    @Override
+    protected void onStart(Intent intent) {
+        super.onStart(intent);
+        super.setUIContent(ResourceTable.Layout_ability_second);
+    }
+
+    @Override
+    protected void onActive() {
+        super.onActive();
+    }
+
+    @Override
+    protected void onInactive() {
+        super.onInactive();
+    }
+
+    @Override
+    protected void onForeground(Intent intent) {
+        super.onForeground(intent);
+    }
+
+    @Override
+    protected void onBackground() {
+        super.onBackground();
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+    }
+}

+ 46 - 0
FA/CarParkTest/entry/src/main/java/com/view/test/utils/ToolUtils.java

@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test.utils;
+
+import ohos.data.distributed.common.Value;
+import ohos.data.preferences.Preferences;
+
+public class ToolUtils {
+    public static String getDateStr(String str) {
+        if (null == str) {
+            return null;
+        }
+
+        StringBuilder sb = new StringBuilder(str);
+        sb.replace(8,9, " ");
+        sb.replace(15, 16, "");
+
+
+        sb.insert(4, "-");
+        sb.insert(7, "-");
+        sb.insert(13, ":");
+        sb.insert(16, ":");
+
+        return sb.toString();
+    }
+
+    public static void writeToSP(Preferences pf, String key, String value) {
+        if (null != pf) {
+            pf.putString(key, value);
+            pf.flush();
+        }
+    }
+}

+ 8 - 0
FA/CarParkTest/entry/src/main/resources/base/element/boolean.json

@@ -0,0 +1,8 @@
+{
+  "boolean": [
+    {
+      "name": "boolean_1",
+      "value": true
+    }
+  ]
+}

+ 24 - 0
FA/CarParkTest/entry/src/main/resources/base/element/string.json

@@ -0,0 +1,24 @@
+{
+  "string": [
+    {
+      "name": "entry_MainAbility",
+      "value": "car_park_demo"
+    },
+    {
+      "name": "mainability_description",
+      "value": "Java_Empty Ability"
+    },
+    {
+      "name": "mainability_HelloWorld",
+      "value": "Hello World"
+    },
+    {
+      "name": "string_has_car",
+      "value": "         车位有停车                           请确认是否为主人车辆"
+    },
+    {
+      "name": "string_not_has_car",
+      "value": "     车位暂空,可停车"
+    }
+  ]
+}

+ 6 - 0
FA/CarParkTest/entry/src/main/resources/base/graphic/background_ability_main.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
+       ohos:shape="rectangle">
+    <solid
+        ohos:color="#FFFFFF"/>
+</shape>

+ 6 - 0
FA/CarParkTest/entry/src/main/resources/base/graphic/background_car.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
+       ohos:shape="oval">
+
+<solid ohos:color="#134E8E"/>
+</shape>

+ 6 - 0
FA/CarParkTest/entry/src/main/resources/base/graphic/background_time.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:ohos="http://schemas.huawei.com/res/ohos"
+       ohos:shape="rectangle">
+    <corners ohos:radius="16vp"/>
+    <solid ohos:color="#173878"/>
+</shape>

+ 210 - 0
FA/CarParkTest/entry/src/main/resources/base/layout/ability_main.xml

@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="utf-8"?>
+<DirectionalLayout
+    xmlns:ohos="http://schemas.huawei.com/res/ohos"
+    ohos:height="match_parent"
+    ohos:width="match_parent"
+    ohos:background_element="#FF0A2044"
+    ohos:orientation="vertical">
+
+    <DirectionalLayout
+        ohos:height="match_content"
+        ohos:width="match_parent"
+        ohos:orientation="horizontal"
+        ohos:left_padding="24vp"
+        ohos:top_padding="40vp"
+        >
+
+        <Image
+            ohos:id="$+id:back"
+            ohos:height="24vp"
+            ohos:width="24vp"
+            ohos:image_src="$media:back_icon"
+            ohos:long_click_enabled="true"
+            ></Image>
+
+        <Text
+            ohos:width="match_content"
+            ohos:height="match_content"
+            ohos:left_margin="73vp"
+            ohos:text_size="20fp"
+            ohos:text_color="#FFFFFF"
+            ohos:text="B区S188车位"
+            />
+
+    </DirectionalLayout>
+
+    <StackLayout
+        ohos:top_margin="82vp"
+        ohos:layout_alignment="center"
+        ohos:width="302vp"
+        ohos:height="302vp">
+
+        <Image
+            ohos:layout_alignment="center"
+            ohos:height="302vp"
+            ohos:width="302vp"
+            ohos:image_src="$media:circle_icon"
+            />
+
+        <!-- 有车,显示 -->
+        <StackLayout
+            ohos:id="$+id:sl_has_car"
+            ohos:layout_alignment="center"
+            ohos:visibility="hide"
+            ohos:height="302vp"
+            ohos:width="137vp">
+            <Image
+                ohos:width="match_parent"
+                ohos:height="match_parent"
+                ohos:image_src="$media:car"
+                />
+
+            <DirectionalLayout
+                ohos:height="97vp"
+                ohos:width="97vp"
+                ohos:orientation="vertical"
+                ohos:alignment="center"
+                ohos:layout_alignment="center"
+                ohos:background_element="$graphic:background_car"
+                >
+
+                <Image
+                    ohos:height="40vp"
+                    ohos:width="40vp"
+                    ohos:image_src="$media:has_car_icon"
+                    />
+
+                <Text
+                    ohos:height="match_content"
+                    ohos:width="match_content"
+                    ohos:text="有车"
+                    ohos:text_size="21fp"
+                    ohos:text_color="#ffffff"/>
+
+            </DirectionalLayout>
+
+        </StackLayout>
+
+        <!-- 无车,显示 -->
+        <Text
+            ohos:id="$+id:text_not_has_car"
+            ohos:layout_alignment="center"
+            ohos:height="186vp"
+            ohos:width="83vp"
+            ohos:text_size="140fp"
+            ohos:text_color="#66ffffff"
+            ohos:text="P"
+            />
+
+    </StackLayout>
+
+    <Text
+        ohos:id="$+id:tx_car"
+        ohos:top_margin="35vp"
+        ohos:layout_alignment="center"
+        ohos:height="match_content"
+        ohos:width="200vp"
+        ohos:multiple_lines="true"
+        ohos:text="$string:string_not_has_car"
+        ohos:text_color="#ffffff"
+        ohos:text_size="20fp"
+        />
+
+    <StackLayout
+        ohos:height="120vp"
+        ohos:width="312vp"
+        ohos:layout_alignment="center"
+        ohos:top_margin="74vp">
+
+        <DirectionalLayout
+            ohos:height="match_parent"
+            ohos:width="match_parent"
+            ohos:orientation="vertical"
+            ohos:layout_alignment="center"
+            ohos:background_element="$graphic:background_time"
+            ohos:padding="12vp"
+
+            >
+
+            <DirectionalLayout
+                ohos:height="48vp"
+                ohos:width="312vp"
+                ohos:orientation="horizontal"
+                ohos:alignment="vertical_center"
+                >
+                <Text
+                    ohos:width="match_content"
+                    ohos:height="match_content"
+                    ohos:text_size="16fp"
+                    ohos:text_color="#ffffff"
+                    ohos:text="最近驶入时间"
+                    ohos:right_margin="18vp"
+                    />
+
+                <Text
+                    ohos:id="$+id:tx_car_in_time"
+                    ohos:width="158vp"
+                    ohos:height="match_content"
+                    ohos:text_size="16fp"
+                    ohos:text_color="#ffffff"
+                    ohos:text_alignment="right"
+                    />
+
+                <Image
+                    ohos:height="24vp"
+                    ohos:width="24vp"
+                    ohos:image_src="$media:next"/>
+
+            </DirectionalLayout>
+
+
+            <DirectionalLayout
+                ohos:height="48vp"
+                ohos:width="312vp"
+                ohos:orientation="horizontal"
+                ohos:alignment="vertical_center"
+                >
+                <Text
+                    ohos:width="match_content"
+                    ohos:height="match_content"
+                    ohos:text_size="16fp"
+                    ohos:text_color="#ffffff"
+                    ohos:text="最后驶离时间"
+                    ohos:right_margin="18vp"
+                    />
+                <Text
+                    ohos:id="$+id:tx_car_out_time"
+                    ohos:width="158vp"
+                    ohos:height="match_content"
+                    ohos:text_size="16fp"
+                    ohos:text_color="#ffffff"
+                    ohos:text_alignment="right"
+                    />
+
+                <Image
+                    ohos:height="24vp"
+                    ohos:width="24vp"
+                    ohos:image_src="$media:next"/>
+
+            </DirectionalLayout>
+
+
+        </DirectionalLayout>
+
+        <Component
+            ohos:layout_alignment="center"
+            ohos:height="1vp"
+            ohos:left_margin="12vp"
+            ohos:right_margin="12vp"
+            ohos:width="match_parent"
+            ohos:background_element="#33ffffff"
+            ohos:left_padding="12vp"
+            ohos:right_padding="12vp"
+            />
+
+    </StackLayout>
+
+
+
+
+</DirectionalLayout>

+ 27 - 0
FA/CarParkTest/entry/src/main/resources/base/layout/ability_second.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<DirectionalLayout
+    xmlns:ohos="http://schemas.huawei.com/res/ohos"
+    ohos:height="match_parent"
+    ohos:width="match_parent"
+    ohos:alignment="center"
+    ohos:orientation="vertical">
+
+    <Text
+        ohos:id="$+id:text_helloworld"
+        ohos:height="match_content"
+        ohos:width="match_content"
+        ohos:background_element="$graphic:background_ability_main"
+        ohos:layout_alignment="horizontal_center"
+        ohos:text="$string:mainability_HelloWorld"
+        ohos:text_size="40vp"
+        />
+    <Button
+        ohos:id="$+id:test"
+        ohos:height="match_content"
+        ohos:width="match_content"
+        ohos:text="test second"
+        ohos:text_size="40vp"
+        ohos:background_element="$"
+        />
+
+</DirectionalLayout>

BIN
FA/CarParkTest/entry/src/main/resources/base/media/back_icon.png


BIN
FA/CarParkTest/entry/src/main/resources/base/media/car.png


BIN
FA/CarParkTest/entry/src/main/resources/base/media/circle_icon.png


BIN
FA/CarParkTest/entry/src/main/resources/base/media/has_car_icon.png


BIN
FA/CarParkTest/entry/src/main/resources/base/media/icon.png


BIN
FA/CarParkTest/entry/src/main/resources/base/media/next.png


+ 16 - 0
FA/CarParkTest/entry/src/main/resources/en/element/string.json

@@ -0,0 +1,16 @@
+{
+  "string": [
+    {
+      "name": "entry_MainAbility",
+      "value": "car_park_demo"
+    },
+    {
+      "name": "mainability_description",
+      "value": "Java_Empty Ability"
+    },
+    {
+      "name": "mainability_HelloWorld",
+      "value": "Hello World"
+    }
+  ]
+}

+ 16 - 0
FA/CarParkTest/entry/src/main/resources/zh/element/string.json

@@ -0,0 +1,16 @@
+{
+  "string": [
+    {
+      "name": "entry_MainAbility",
+      "value": "car_park_demo"
+    },
+    {
+      "name": "mainability_description",
+      "value": "Java_Empty Ability"
+    },
+    {
+      "name": "mainability_HelloWorld",
+      "value": "你好,世界"
+    }
+  ]
+}

+ 29 - 0
FA/CarParkTest/entry/src/ohosTest/java/com/view/test/ExampleOhosTest.java

@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test;
+
+import ohos.aafwk.ability.delegation.AbilityDelegatorRegistry;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class ExampleOhosTest {
+    @Test
+    public void testBundleName() {
+        final String actualBundleName = AbilityDelegatorRegistry.getArguments().getTestBundleName();
+        assertEquals("com.view.test", actualBundleName);
+    }
+}

+ 24 - 0
FA/CarParkTest/entry/src/test/java/com/view/test/ExampleTest.java

@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2021 KaiHong Device Co., Ltd.
+ * 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
+ *
+ *    http://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.
+ */
+
+package com.view.test;
+
+import org.junit.Test;
+
+public class ExampleTest {
+    @Test
+    public void onStart() {
+    }
+}

BIN
FA/CarParkTest/gradle/wrapper/gradle-wrapper.jar


+ 5 - 0
FA/CarParkTest/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://repo.huaweicloud.com/gradle/gradle-6.3-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists

+ 1 - 0
FA/CarParkTest/settings.gradle

@@ -0,0 +1 @@
+include ':entry'

+ 14 - 0
FA/Contacts/.idea/.deveco/module/entry.cache.json

@@ -0,0 +1,14 @@
+{
+	"BuildOptions":{
+		"SELECT_BUILD_TARGET":"default",
+		"BUILD_PATH":{
+			"OUTPUT_PATH":"C:\\Users\\china\\Desktop\\ddddddddd\\Contacts\\entry\\build\\default\\outputs\\default",
+			"RES_PATH":"C:\\Users\\china\\Desktop\\ddddddddd\\Contacts\\entry\\build\\default\\intermediates\\res\\default",
+			"ETS_SUPER_VISUAL_PATH":"C:\\Users\\china\\Desktop\\ddddddddd\\Contacts\\entry\\build\\default\\cache\\default\\CompileETS",
+			"JS_ASSETS_PATH":"C:\\Users\\china\\Desktop\\ddddddddd\\Contacts\\entry\\build\\default\\intermediates\\assets\\default",
+			"RES_PROFILE_PATH":"C:\\Users\\china\\Desktop\\ddddddddd\\Contacts\\entry\\build\\default\\intermediates\\res\\default\\resources\\base\\profile",
+			"WORKER_LOADER":"C:\\Users\\china\\Desktop\\ddddddddd\\Contacts\\entry\\build\\default\\intermediates\\loader\\default\\loader.json",
+			"MANIFEST_JSON":"C:\\Users\\china\\Desktop\\ddddddddd\\Contacts\\entry\\build\\default\\intermediates\\manifest\\default"
+		}
+	}
+}

+ 12 - 0
FA/Contacts/.idea/.deveco/project.cache.json

@@ -0,0 +1,12 @@
+{
+	"BuildOptions":{
+		"BUNDLE_NAME":"",
+		"BUILD_PATH":{
+			"OUTPUT_PATH":"C:\\Users\\china\\Desktop\\ddddddddd\\Contacts\\build\\outputs\\default"
+		},
+		"SELECT_BUILD_PRODUCT":"default"
+	},
+	"CommonInfo":{
+		"project.ide.version":"3.0.0.900"
+	}
+}

+ 3 - 0
FA/Contacts/.idea/.gitignore

@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml

+ 24 - 0
FA/Contacts/.idea/Contacts.iml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="EMPTY_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/build" />
+      <excludeFolder url="file://$MODULE_DIR$/node_modules" />
+      <excludeFolder url="file://$MODULE_DIR$/entry/build" />
+      <excludeFolder url="file://$MODULE_DIR$/entry/node_modules" />
+      <excludeFolder url="file://$MODULE_DIR$/entry/.cxx" />
+      <excludeFolder url="file://$MODULE_DIR$/entry/.preview" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module-library">
+      <library name="JS-3.1.5.5" type="ArkUI">
+        <CLASSES />
+        <JAVADOC />
+        <SOURCES>
+          <root url="file://$USER_HOME$/AppData/Local/OpenHarmony/Sdk/js/3.1.5.5/api" />
+        </SOURCES>
+      </library>
+    </orderEntry>
+  </component>
+</module>

+ 8 - 0
FA/Contacts/.idea/configurationModuleSettings.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ConfigurationPersistentSettings">
+    <settings>
+      <entry configurationName="entry" moduleName="entry" />
+    </settings>
+  </component>
+</project>

+ 8 - 0
FA/Contacts/.idea/modules.xml

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

+ 134 - 0
FA/Contacts/README_zh.md

@@ -0,0 +1,134 @@
+# Contacts应用代码介绍
+
+## 一、简介
+
+#### 1、样例效果
+
+Contacts应用是基于OpenHarmony SDK开发的安装在L1(3516)设备上的应用;应用主要功能是展示联系人列表,并点击某一列弹出联系人详细信息;
+
+![show](resources/contacts.gif)
+
+#### 2.设计OpenHarmony技术特性
+
+- JS UI  
+
+####  3.支持OpenHarmony版本
+
+OpenHarmony 3.0 LTS
+
+#### 4.支持开发板
+
+- 润和HiSpark Taurus AI Camera(Hi3516d)开发板套件
+
+## 二、快速上手
+
+#### 1.标准设备环境准备
+
+以润和HiSpark Taurus AI Camera(Hi3516d)开发板套件为例
+
+- [获取OpenHarmony源码](https://www.openharmony.cn/pages/0001000202/#%E5%AE%89%E8%A3%85%E5%BF%85%E8%A6%81%E7%9A%84%E5%BA%93%E5%92%8C%E5%B7%A5%E5%85%B7),OpenHarmony版本须3.0LTS;
+- [安装开发板环境](https://www.openharmony.cn/pages/0001000400/#hi3516%E5%B7%A5%E5%85%B7%E8%A6%81%E6%B1%82)
+- [开发板烧录](https://www.openharmony.cn/pages/0001000401/#%E4%BD%BF%E7%94%A8%E7%BD%91%E5%8F%A3%E7%83%A7%E5%BD%95)
+
+#### 2.应用编译环境准备
+
+- 下载DevEco Studio 3.0.0.601版本 [下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta);
+- 配置SDK,参考 [配置OpenHarmony-SDK](https://www.openharmony.cn/pages/00090001/#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6)
+- DevEco Studio 点击File -> Open 导入本下面的代码工程Contacts
+
+#### 3.项目下载和导入
+
+项目地址:https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/FA/Contacts
+
+1)git下载
+
+```
+git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git
+```
+
+2)项目导入
+
+打开DevEco Studio,点击File->Open->下载路径FA/Contacts
+
+
+#### 4.安装应用
+
+- [配置应用签名信息](https://www.openharmony.cn/pages/00090003/#%E7%94%9F%E6%88%90%E5%AF%86%E9%92%A5%E5%92%8C%E8%AF%81%E4%B9%A6%E8%AF%B7%E6%B1%82%E6%96%87%E4%BB%B6)
+
+- 安装应用
+
+  打开**OpenHarmony SDK路径 \toolchains** 文件夹下,执行如下hdc_std命令,其中**path**为hap包所在绝对路径。
+
+  ```
+  hdc_std install -r path\entry-debug-standard-ark-signed.hap
+  ```
+
+  **PS**环境准备,源码下载,编译,烧录设备,应用部署的完整步骤请参考[这里](https://blog.csdn.net/sd2131512/article/details/121403543)
+
+##  三、关键代码解读
+
+#### 1.目录结构
+
+```
+├─entry\src\main
+│          │  config.json  //应用配置文件
+│          │  
+│          ├─js
+│          │  └─MainAbility
+│          │      │  app.js  // 应用程序入口
+│          │      │  
+│          │      ├─common   // 公共资源
+│          │      │  │  checkbutton.png
+│          │      │  │  delete.png
+│          │      │  │  done.png
+│          │      │  │  head0.png
+│          │      │  │  head1.png
+│          │      │  │  head2.png
+│          │      │  │  head3.png
+│          │      │  │  head4.png
+│          │      │  │  right.png
+│          │      │  │  
+│          │      │  └─images
+│          │      │          bg-tv.jpg
+│          │      │          Wallpaper.png
+│          │      │          
+│          │      ├─i18n   // 多语言文件
+│          │      │      en-US.json
+│          │      │      zh-CN.json
+│          │      │      
+│          │      └─pages
+│          │          └─index
+│          │                  index.css  //页面样式
+│          │                  index.hml  //首页展示
+│          │                  index.js   //页面逻辑
+│          │                  
+│          └─resources
+│              ├─base
+│              │  ├─element
+│              │  │      string.json
+│              │  │      
+│              │  └─media
+│              │          icon.png
+│              │          
+│              └─rawfile
+```
+
+#### 2.日志查看方法
+
+```
+hdc_std shell hilog > /C:\Users\china\Desktop\hilog.txt
+```
+
+#### 3.关键代码
+
+- UI界面 index.hml
+
+## 四、如何从零开发Contacts
+
+[从零开发Contacts](quick_develop.md)
+
+##  五、参考链接
+
+- [OpenHarmony 基于JS扩展的类Web开发范式](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/Readme-CN.md)
+- [OpenHarmony应用接口](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/Readme-CN.md)
+

+ 26 - 0
FA/Contacts/build-profile.json5

@@ -0,0 +1,26 @@
+{
+  "app": {
+    "compileSdkVersion": 8,
+    "compatibleSdkVersion": 8,
+    "products": [
+      {
+        "name": "default",
+        "signingConfig": "default"
+      }
+    ],
+  },
+  "modules": [
+    {
+      "name": "entry",
+      "srcPath": "./entry",
+      "targets": [
+        {
+          "name": "default",
+          "applyToProducts": [
+            "default"
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 3 - 0
FA/Contacts/entry/.gitignore

@@ -0,0 +1,3 @@
+/node_modules
+/.preview
+/build

+ 10 - 0
FA/Contacts/entry/build-profile.json5

@@ -0,0 +1,10 @@
+{
+  "apiType": 'faMode',
+  "buildOption": {
+  },
+  "targets": [
+    {
+      "name": "default",
+    }
+  ]
+}

+ 2 - 0
FA/Contacts/entry/hvigorfile.js

@@ -0,0 +1,2 @@
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+module.exports = require('@ohos/hvigor-ohos-plugin').legacyHapTasks

+ 5 - 0
FA/Contacts/entry/package-lock.json

@@ -0,0 +1,5 @@
+{
+  "name": "entry",
+  "version": "1.0.0",
+  "lockfileVersion": 1
+}

+ 14 - 0
FA/Contacts/entry/package.json

@@ -0,0 +1,14 @@
+{
+	"license": "ISC",
+	"devDependencies": {},
+	"name": "entry",
+	"ohos": {
+		"org": "huawei",
+		"directoryLevel": "module",
+		"buildTool": "hvigor"
+	},
+	"description": "example description",
+	"repository": {},
+	"version": "1.0.0",
+	"dependencies": {}
+}

+ 64 - 0
FA/Contacts/entry/src/main/config.json

@@ -0,0 +1,64 @@
+{
+  "app": {
+    "vendor": "example",
+    "bundleName": "com.example.contacts",
+    "version": {
+      "code": 1000000,
+      "name": "1.0.0"
+    }
+  },
+  "deviceConfig": {},
+  "module": {
+    "mainAbility": ".MainAbility",
+    "deviceType": [
+      "phone",
+      "tablet"
+    ],
+    "abilities": [
+      {
+        "skills": [
+          {
+            "entities": [
+              "entity.system.home"
+            ],
+            "actions": [
+              "action.system.home"
+            ]
+          }
+        ],
+        "orientation": "unspecified",
+        "visible": true,
+        "srcPath": "MainAbility",
+        "name": ".MainAbility",
+        "srcLanguage": "js",
+        "icon": "$media:icon",
+        "description": "$string:MainAbility_desc",
+        "formsEnabled": false,
+        "label": "$string:MainAbility_label",
+        "type": "page",
+        "launchType": "standard"
+      }
+    ],
+    "distro": {
+      "moduleType": "entry",
+      "installationFree": false,
+      "deliveryWithInstall": true,
+      "moduleName": "entry"
+    },
+    "package": "com.example.entry",
+    "srcPath": "",
+    "name": ".entry",
+    "js": [
+      {
+        "pages": [
+          "pages/index/index"
+        ],
+        "name": ".MainAbility",
+        "window": {
+          "designWidth": 720,
+          "autoDesignWidth": false
+        }
+      }
+    ]
+  }
+}

+ 23 - 0
FA/Contacts/entry/src/main/js/MainAbility/app.js

@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021 Huawei Device Co., Ltd.
+ * 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
+ *
+ *     http://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.
+ */
+
+export default {
+    onCreate() {
+        console.info("Application onCreate");
+    },
+    onDestroy() {
+        console.info("Application onDestroy");
+    }
+};

BIN
FA/Contacts/entry/src/main/js/MainAbility/common/checkbutton.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/delete.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/done.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/head0.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/head1.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/head2.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/head3.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/head4.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/images/Wallpaper.png


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/images/bg-tv.jpg


BIN
FA/Contacts/entry/src/main/js/MainAbility/common/right.png


+ 8 - 0
FA/Contacts/entry/src/main/js/MainAbility/i18n/en-US.json

@@ -0,0 +1,8 @@
+{
+  "strings": {
+    "hello": "Hello",
+    "world": "World"
+  },
+  "Files": {
+  }
+}

+ 8 - 0
FA/Contacts/entry/src/main/js/MainAbility/i18n/zh-CN.json

@@ -0,0 +1,8 @@
+{
+  "strings": {
+    "hello": "您好",
+    "world": "世界"
+  },
+  "Files": {
+  }
+}

+ 161 - 0
FA/Contacts/entry/src/main/js/MainAbility/pages/index/index.css

@@ -0,0 +1,161 @@
+/*
+Copyright (c) 2021 Huawei Device Co., Ltd.
+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
+
+http://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.
+*/
+
+.container {
+    flex-direction: row;
+    justify-content: flex-start;
+}
+
+.list {
+    margin-right: 14px;
+    width: 100%;
+}
+
+.content {
+    flex-direction: column;
+    justify-content: center;
+    flex: 1;
+}
+
+.flex-row {
+    flex-direction: row;
+}
+
+@media screen and (device-type: tv) {
+    .list {
+        width: 50%;
+        padding-right: 24px;
+        padding-left: 24px;
+    }
+}
+
+.list-item {
+    height: 64px;
+    margin: 0 14px;
+    flex-direction: row;
+    align-items: center;
+}
+
+
+@media screen and (device-type: tv) {
+    .list-item {
+        height: 64px;
+        border-radius: 8px;
+        padding-left: 24px;
+        background-color: #d8d8d8;
+        opacity: 0.2;
+        flex-direction: row;
+        align-items: center;
+        margin: 5px 0;
+    }
+}
+
+.list-image {
+    height: 46px;
+    width: 46px;
+}
+
+.list-text {
+    margin-left: 16px;
+    font-size: 14px;
+}
+
+
+.detail-container {
+    width: 0px;
+    height: 0px;
+}
+
+.right-image {
+    width: 0px;
+    height: 0px;
+}
+
+@media screen and (device-type: phone) {
+    .right-image {
+        width: 30px;
+        height: 30px;
+    }
+}
+
+@media screen and (device-type: tv) {
+    .detail-container {
+        width: 50%;
+        height: 100%;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+    }
+
+    .detail-image {
+        height: 150px;
+        width: 150px;
+    }
+
+    .detail-name,.detail-phone  {
+        margin-top: 16px;
+        font-size: 24px;
+    }
+}
+
+.dialog-main {
+    width: 340px;
+}
+
+.dialog-div {
+    flex-direction: column;
+    align-items: center;
+    justify-content: space-between;
+}
+
+.input-box {
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    padding: 0 50px;
+}
+
+.inner-btn {
+    width: 200px;
+    height: 40px;
+    margin-top: 10px;
+    justify-content: space-around;
+    align-items: center;
+}
+
+.inner-btn > button {
+    font-size: 15px;
+}
+
+.label {
+    width: 60px;
+    text-align: center;
+    font-size: 20px;
+}
+
+.input {
+    font-size: 20px;
+    width: 200px;
+    background-color: #FFFFFF;
+    border-bottom: 1px solid #000000;
+    opacity: 0.5;
+}
+
+.avatar {
+    width: 150px;
+    height: 150px;
+    margin: 20px;
+}
+

+ 57 - 0
FA/Contacts/entry/src/main/js/MainAbility/pages/index/index.hml

@@ -0,0 +1,57 @@
+<!--
+Copyright (c) 2021 Huawei Device Co., Ltd.
+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
+
+    http://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.
+-->
+
+<div class="container">
+    <list class="list">
+        <list-item for="{{ contactList }}" class="list-item" onfocus="listFocus({{ $idx }})"
+                   onclick="clickItem({{ $idx }})">
+            <div class="container">
+            <image src="{{ $item.imageSrc }}" class="list-image"></image>
+            <div class="content">
+                <text class="list-text">
+                    {{ $item.name }}
+                </text>
+                <text class="list-text" focusable="true">
+                    {{ $item.phone }}
+                </text>
+            </div>
+            <image class="right-image" src="/common/right.png">
+            </image>
+            </div>
+        </list-item>
+    </list>
+
+    <dialog id="detailDialog" class="dialog-main" @cancel="dialogCancel">
+        <div class="dialog-div">
+            <image src="{{ imageSrc }}" class="avatar"></image>
+            <div class="input-box">
+                <div class="flex-row">
+                    <label class="label" target="name">名字</label>
+                    <input id="name" class="input" type="text" value="{{ name }}" @change="changeName">
+                    </input>
+                </div>
+                <div class="flex-row">
+                    <label class="label" target="phone">电话</label>
+                    <input id="phone" class="input" type="text" value="{{ phone }}" @change="changePhone">
+                    </input>
+                </div>
+            </div>
+            <div class="inner-btn">
+                <button class="btn" type="text" onclick="cancel">取消</button>
+                <button class="btn" type="text" onclick="confirm">确认</button>
+            </div>
+        </div>
+    </dialog>
+</div>

+ 167 - 0
FA/Contacts/entry/src/main/js/MainAbility/pages/index/index.js

@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2021 Huawei Device Co., Ltd.
+ * 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
+ *
+ *     http://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.
+ */
+
+import device from '@system.device';
+
+const HEAD_IMAGE = ["/common/head0.png", "/common/head1.png", "/common/head2.png", "/common/head3.png", "/common/head4.png"];
+
+export default {
+    //数据字段定义
+    data: {
+        contactList: [
+            {
+                imageSrc: HEAD_IMAGE[0],
+                name: "Alan",
+                phone: "020-00000000"
+            },
+            {
+                imageSrc: HEAD_IMAGE[2],
+                name: "Bob",
+                phone: "020-11111111"
+            },
+            {
+                imageSrc: HEAD_IMAGE[3],
+                name: "Carl",
+                phone: "0755-33333333"
+            },
+            {
+                imageSrc: HEAD_IMAGE[4],
+                name: "David",
+                phone: "19876543210"
+            },
+            {
+                imageSrc: HEAD_IMAGE[0],
+                name: "Alan",
+                phone: "020-00000000"
+            },
+            {
+                imageSrc: HEAD_IMAGE[1],
+                name: "Bob",
+                phone: "020-11111111"
+            },
+            {
+                imageSrc: HEAD_IMAGE[2],
+                name: "Carl",
+                phone: "12345678910"
+            },
+            {
+                imageSrc: HEAD_IMAGE[3],
+                name: "David",
+                phone: "19876543210"
+            },
+            {
+                imageSrc: HEAD_IMAGE[4],
+                name: "Alan",
+                phone: "020-00000000"
+            },
+            {
+                imageSrc: HEAD_IMAGE[0],
+                name: "Bob",
+                phone: "020-11111111"
+            },
+            {
+                imageSrc: HEAD_IMAGE[1],
+                name: "Carl",
+                phone: "12345678910"
+            },
+            {
+                imageSrc: HEAD_IMAGE[2],
+                name: "David",
+                phone: "19876543210"
+            },
+            {
+                imageSrc: HEAD_IMAGE[3],
+                name: "Alan",
+                phone: "020-00000000"
+            },
+            {
+                imageSrc: HEAD_IMAGE[4],
+                name: "Bob",
+                phone: "020-11111111"
+            },
+            {
+                imageSrc: HEAD_IMAGE[0],
+                name: "Carl",
+                phone: "12345678910"
+            },
+            {
+                imageSrc: HEAD_IMAGE[1],
+                name: "David",
+                phone: "19876543210"
+            }
+        ],
+        name: "Alan",
+        phone: "020-00000000",
+        imageSrc: HEAD_IMAGE[0],
+        index: 0
+    },
+    onShow() {
+        // 查询当前设备类型
+        device.getInfo({
+            success: (data) => {
+                if (data.deviceType && (data.deviceType === 'tv' || data.deviceType === 'wearable'
+                || data.deviceType === 'tablet')) {
+                    this.isPhoneDevice = false;
+                }
+            },
+            fail: function (data, code) {
+                console.info('Failed to obtain device information. Error code:' + code + '; Error information: ' + data);
+                this.isPhoneDevice = false;
+            }
+        });
+    },
+    onReady() {
+    },
+
+    onInit() {
+    },
+    clickItem(idx) {
+        this.imageSrc = this.contactList[idx].imageSrc;
+        this.name = this.contactList[idx].name;
+        this.phone = this.contactList[idx].phone;
+        this.showDialog();
+        this.index = idx;
+    },
+    showDialog() {
+        this.$element('detailDialog').show();
+    },
+    listFocus(idx) {
+        this.imageSrc = this.contactList[idx].imageSrc;
+        this.name = this.contactList[idx].name;
+        this.phone = this.contactList[idx].phone;
+    },
+    confirm() {
+        //修改对应行后保存到列表中
+        this.contactList[this.index].name = this.name;
+        this.contactList[this.index].phone = this.phone;
+        this.$element('detailDialog').close();
+    },
+    cancel() {
+        this.$element('detailDialog').close();
+    },
+    // 更新input Name值
+    changeName(e) {
+        let changeValue = e.text
+        this.name = changeValue;
+    },
+    // 更新input Phone值
+    changePhone(e) {
+        let changeValue = e.text;
+        this.phone = changeValue;
+    },
+    dialogCancel() {
+        this.$element('detailDialog').close();
+    }
+};

+ 16 - 0
FA/Contacts/entry/src/main/resources/base/element/string.json

@@ -0,0 +1,16 @@
+{
+  "string": [
+    {
+      "name": "entry_desc",
+      "value": "description"
+    },
+    {
+      "name": "MainAbility_desc",
+      "value": "description"
+    },
+    {
+      "name": "MainAbility_label",
+      "value": "联系人列表"
+    }
+  ]
+}

BIN
FA/Contacts/entry/src/main/resources/base/media/icon.png


+ 2 - 0
FA/Contacts/hvigorfile.js

@@ -0,0 +1,2 @@
+// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently.
+module.exports = require('@ohos/hvigor-ohos-plugin').legacyAppTasks

+ 1657 - 0
FA/Contacts/package-lock.json

@@ -0,0 +1,1657 @@
+{
+  "name": "contacts",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@ohos/hvigor": {
+      "version": "1.0.6",
+      "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor/-/@ohos/hvigor-1.0.6.tgz",
+      "integrity": "sha512-jjp7vpvUOMW1Nf7TdyhOtonwWHoSyBJLUiZTQqIx/GJV4UJyIqsiURUOqFwncQ4L7PDdeHuWly4uEelknYeWhg==",
+      "requires": {
+        "@ohos/hvigor-base": "1.0.6",
+        "interpret": "1.4.0",
+        "liftoff": "4.0.0",
+        "mute-stdout": "1.0.0",
+        "pretty-hrtime": "1.0.0",
+        "v8flags": "3.2.0",
+        "yargs": "7.1.0"
+      }
+    },
+    "@ohos/hvigor-base": {
+      "version": "1.0.6",
+      "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-base/-/@ohos/hvigor-base-1.0.6.tgz",
+      "integrity": "sha512-cRDnWICTxmpNiFb9clIioqP5Oik1seLCICztXVhZqultrHuxwTheCRUZrHwlpyWdkSB2Al+FFBqmSwzIgZX4IQ==",
+      "requires": {
+        "json5": "2.2.0",
+        "log4js": "6.4.1",
+        "undertaker": "1.2.1"
+      }
+    },
+    "@ohos/hvigor-ohos-plugin": {
+      "version": "1.0.6",
+      "resolved": "https://repo.harmonyos.com/npm/@ohos/hvigor-ohos-plugin/-/@ohos/hvigor-ohos-plugin-1.0.6.tgz",
+      "integrity": "sha512-MAAi8uJxMzODUoSSNfBr+fU4HQ20dfQtkje9I+X4asc7qY2kAplW/q9f5XS8IOvv8zhC8OcSgsAXOAJuLMstOQ==",
+      "requires": {
+        "@ohos/hvigor-base": "1.0.6",
+        "@ohos/sdkmanager-common": "1.1.3",
+        "ajv": "8.10.0",
+        "archiver": "5.3.0",
+        "execa": "5.1.1",
+        "fs-extra": "10.0.0",
+        "glob": "7.2.0",
+        "iconv-lite": "0.6.3",
+        "json5": "2.2.0",
+        "lodash": "4.17.21",
+        "pretty-hrtime": "1.0.3",
+        "resolve-package-path": "4.0.3"
+      },
+      "dependencies": {
+        "fs-extra": {
+          "version": "10.0.0",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.0.tgz",
+          "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
+          "requires": {
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^2.0.0"
+          }
+        },
+        "pretty-hrtime": {
+          "version": "1.0.3",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+          "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE="
+        }
+      }
+    },
+    "@ohos/sdkmanager-common": {
+      "version": "1.1.3",
+      "resolved": "https://repo.harmonyos.com/npm/@ohos/sdkmanager-common/-/@ohos/sdkmanager-common-1.1.3.tgz",
+      "integrity": "sha512-d2uhVauDDJZIUvyyaWWoavG4N/jLyfF5IH5kEXKV6R8HNf3606H1zDQzA+UZtOfwwJFXhD9djRjnVFNB8xc7aw=="
+    },
+    "ajv": {
+      "version": "8.10.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-8.10.0.tgz",
+      "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+    },
+    "archiver": {
+      "version": "5.3.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/archiver/-/archiver-5.3.0.tgz",
+      "integrity": "sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==",
+      "requires": {
+        "archiver-utils": "^2.1.0",
+        "async": "^3.2.0",
+        "buffer-crc32": "^0.2.1",
+        "readable-stream": "^3.6.0",
+        "readdir-glob": "^1.0.0",
+        "tar-stream": "^2.2.0",
+        "zip-stream": "^4.1.0"
+      }
+    },
+    "archiver-utils": {
+      "version": "2.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/archiver-utils/-/archiver-utils-2.1.0.tgz",
+      "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
+      "requires": {
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.0",
+        "lazystream": "^1.0.0",
+        "lodash.defaults": "^4.2.0",
+        "lodash.difference": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.union": "^4.6.0",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^2.0.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "2.3.7",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz",
+          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        }
+      }
+    },
+    "arr-filter": {
+      "version": "1.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/arr-filter/-/arr-filter-1.1.2.tgz",
+      "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
+      "requires": {
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+    },
+    "arr-map": {
+      "version": "2.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/arr-map/-/arr-map-2.0.2.tgz",
+      "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
+      "requires": {
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "array-each": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/array-each/-/array-each-1.0.1.tgz",
+      "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
+    },
+    "array-initial": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/array-initial/-/array-initial-1.1.0.tgz",
+      "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
+      "requires": {
+        "array-slice": "^1.0.0",
+        "is-number": "^4.0.0"
+      }
+    },
+    "array-last": {
+      "version": "1.3.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/array-last/-/array-last-1.3.0.tgz",
+      "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
+      "requires": {
+        "is-number": "^4.0.0"
+      }
+    },
+    "array-slice": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/array-slice/-/array-slice-1.1.0.tgz",
+      "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w=="
+    },
+    "async": {
+      "version": "3.2.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/async/-/async-3.2.3.tgz",
+      "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
+    },
+    "async-done": {
+      "version": "1.3.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/async-done/-/async-done-1.3.2.tgz",
+      "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.2",
+        "process-nextick-args": "^2.0.0",
+        "stream-exhaust": "^1.0.1"
+      }
+    },
+    "async-settle": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/async-settle/-/async-settle-1.0.0.tgz",
+      "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
+      "requires": {
+        "async-done": "^1.2.2"
+      }
+    },
+    "bach": {
+      "version": "1.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/bach/-/bach-1.2.0.tgz",
+      "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
+      "requires": {
+        "arr-filter": "^1.1.1",
+        "arr-flatten": "^1.0.1",
+        "arr-map": "^2.0.0",
+        "array-each": "^1.0.0",
+        "array-initial": "^1.0.0",
+        "array-last": "^1.1.1",
+        "async-done": "^1.2.2",
+        "async-settle": "^1.0.0",
+        "now-and-later": "^2.0.0"
+      }
+    },
+    "balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+    },
+    "bl": {
+      "version": "4.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "requires": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "3.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "requires": {
+        "fill-range": "^7.0.1"
+      }
+    },
+    "buffer": {
+      "version": "5.7.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "requires": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+    },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "camelcase": {
+      "version": "3.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/camelcase/-/camelcase-3.0.0.tgz",
+      "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo="
+    },
+    "cliui": {
+      "version": "3.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/cliui/-/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wrap-ansi": "^2.0.0"
+      }
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+    },
+    "collection-map": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/collection-map/-/collection-map-1.0.0.tgz",
+      "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
+      "requires": {
+        "arr-map": "^2.0.2",
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "compress-commons": {
+      "version": "4.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/compress-commons/-/compress-commons-4.1.1.tgz",
+      "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==",
+      "requires": {
+        "buffer-crc32": "^0.2.13",
+        "crc32-stream": "^4.0.2",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^3.6.0"
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+    },
+    "crc-32": {
+      "version": "1.2.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/crc-32/-/crc-32-1.2.1.tgz",
+      "integrity": "sha512-Dn/xm/1vFFgs3nfrpEVScHoIslO9NZRITWGz/1E/St6u4xw99vfZzVkW0OSnzx2h9egej9xwMCEut6sqwokM/w==",
+      "requires": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.3.1"
+      }
+    },
+    "crc32-stream": {
+      "version": "4.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/crc32-stream/-/crc32-stream-4.0.2.tgz",
+      "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
+      "requires": {
+        "crc-32": "^1.2.0",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "dependencies": {
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "d": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/d/-/d-1.0.1.tgz",
+      "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
+      "requires": {
+        "es5-ext": "^0.10.50",
+        "type": "^1.0.1"
+      }
+    },
+    "date-format": {
+      "version": "4.0.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/date-format/-/date-format-4.0.6.tgz",
+      "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw=="
+    },
+    "debug": {
+      "version": "4.3.4",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "requires": {
+        "ms": "2.1.2"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "default-resolution": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/default-resolution/-/default-resolution-2.0.0.tgz",
+      "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ="
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "detect-file": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/detect-file/-/detect-file-1.0.0.tgz",
+      "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc="
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es5-ext": {
+      "version": "0.10.59",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/es5-ext/-/es5-ext-0.10.59.tgz",
+      "integrity": "sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==",
+      "requires": {
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.3",
+        "next-tick": "^1.1.0"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "es6-symbol": {
+      "version": "3.1.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/es6-symbol/-/es6-symbol-3.1.3.tgz",
+      "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
+      "requires": {
+        "d": "^1.0.1",
+        "ext": "^1.1.2"
+      }
+    },
+    "es6-weak-map": {
+      "version": "2.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
+      "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.46",
+        "es6-iterator": "^2.0.3",
+        "es6-symbol": "^3.1.1"
+      }
+    },
+    "execa": {
+      "version": "5.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "requires": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      }
+    },
+    "exit-on-epipe": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
+      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
+    },
+    "expand-tilde": {
+      "version": "2.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/expand-tilde/-/expand-tilde-2.0.2.tgz",
+      "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
+      }
+    },
+    "ext": {
+      "version": "1.6.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/ext/-/ext-1.6.0.tgz",
+      "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==",
+      "requires": {
+        "type": "^2.5.0"
+      },
+      "dependencies": {
+        "type": {
+          "version": "2.6.0",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-2.6.0.tgz",
+          "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ=="
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "requires": {
+        "to-regex-range": "^5.0.1"
+      }
+    },
+    "find-up": {
+      "version": "1.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/find-up/-/find-up-1.1.2.tgz",
+      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+      "requires": {
+        "path-exists": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "findup-sync": {
+      "version": "5.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/findup-sync/-/findup-sync-5.0.0.tgz",
+      "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==",
+      "requires": {
+        "detect-file": "^1.0.0",
+        "is-glob": "^4.0.3",
+        "micromatch": "^4.0.4",
+        "resolve-dir": "^1.0.1"
+      }
+    },
+    "fined": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fined/-/fined-2.0.0.tgz",
+      "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==",
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "is-plain-object": "^5.0.0",
+        "object.defaults": "^1.1.0",
+        "object.pick": "^1.3.0",
+        "parse-filepath": "^1.0.2"
+      }
+    },
+    "flagged-respawn": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/flagged-respawn/-/flagged-respawn-2.0.0.tgz",
+      "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA=="
+    },
+    "flatted": {
+      "version": "3.2.5",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/flatted/-/flatted-3.2.5.tgz",
+      "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg=="
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+    },
+    "for-own": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/for-own/-/for-own-1.0.0.tgz",
+      "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+      "requires": {
+        "for-in": "^1.0.1"
+      }
+    },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
+    "fs-extra": {
+      "version": "10.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fs-extra/-/fs-extra-10.0.1.tgz",
+      "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
+      "requires": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
+    },
+    "get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+    },
+    "glob": {
+      "version": "7.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "global-modules": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/global-modules/-/global-modules-1.0.0.tgz",
+      "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+      "requires": {
+        "global-prefix": "^1.0.1",
+        "is-windows": "^1.0.1",
+        "resolve-dir": "^1.0.0"
+      }
+    },
+    "global-prefix": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/global-prefix/-/global-prefix-1.0.2.tgz",
+      "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+      "requires": {
+        "expand-tilde": "^2.0.2",
+        "homedir-polyfill": "^1.0.1",
+        "ini": "^1.3.4",
+        "is-windows": "^1.0.1",
+        "which": "^1.2.14"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.9",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.9.tgz",
+      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+    },
+    "homedir-polyfill": {
+      "version": "1.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+      "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+      "requires": {
+        "parse-passwd": "^1.0.0"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.8.9",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+      "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
+    },
+    "human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+    },
+    "hypium": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/hypium/-/hypium-1.0.0.tgz",
+      "integrity": "sha512-nl+RQVv2AU/5FvFRhsXyWO5wh+2huhdqRZ3bszBWZzW+kpNI3AT4ydvVRYIfaQbYwV4UlX/rSc7BtFjLAezhow=="
+    },
+    "iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      }
+    },
+    "ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "ini": {
+      "version": "1.3.8",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+    },
+    "interpret": {
+      "version": "1.4.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY="
+    },
+    "is-absolute": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-absolute/-/is-absolute-1.0.0.tgz",
+      "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+      "requires": {
+        "is-relative": "^1.0.0",
+        "is-windows": "^1.0.1"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+    },
+    "is-core-module": {
+      "version": "2.8.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-core-module/-/is-core-module-2.8.1.tgz",
+      "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+    },
+    "is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-number": {
+      "version": "4.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-4.0.0.tgz",
+      "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+    },
+    "is-plain-object": {
+      "version": "5.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-plain-object/-/is-plain-object-5.0.0.tgz",
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+    },
+    "is-relative": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-relative/-/is-relative-1.0.0.tgz",
+      "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+      "requires": {
+        "is-unc-path": "^1.0.0"
+      }
+    },
+    "is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+    },
+    "is-unc-path": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-unc-path/-/is-unc-path-1.0.0.tgz",
+      "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+      "requires": {
+        "unc-path-regex": "^0.1.2"
+      }
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI="
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+    },
+    "json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+    },
+    "json5": {
+      "version": "2.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/json5/-/json5-2.2.0.tgz",
+      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "requires": {
+        "graceful-fs": "^4.1.6",
+        "universalify": "^2.0.0"
+      }
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+    },
+    "last-run": {
+      "version": "1.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/last-run/-/last-run-1.1.1.tgz",
+      "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
+      "requires": {
+        "default-resolution": "^2.0.0",
+        "es6-weak-map": "^2.0.1"
+      }
+    },
+    "lazystream": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lazystream/-/lazystream-1.0.1.tgz",
+      "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+      "requires": {
+        "readable-stream": "^2.0.5"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "2.3.7",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-2.3.7.tgz",
+          "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        }
+      }
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "requires": {
+        "invert-kv": "^1.0.0"
+      }
+    },
+    "liftoff": {
+      "version": "4.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/liftoff/-/liftoff-4.0.0.tgz",
+      "integrity": "sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==",
+      "requires": {
+        "extend": "^3.0.2",
+        "findup-sync": "^5.0.0",
+        "fined": "^2.0.0",
+        "flagged-respawn": "^2.0.0",
+        "is-plain-object": "^5.0.0",
+        "object.map": "^1.0.1",
+        "rechoir": "^0.8.0",
+        "resolve": "^1.20.0"
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "lodash.defaults": {
+      "version": "4.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+      "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
+    },
+    "lodash.difference": {
+      "version": "4.5.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.difference/-/lodash.difference-4.5.0.tgz",
+      "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw="
+    },
+    "lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
+    },
+    "lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+    },
+    "lodash.union": {
+      "version": "4.6.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/lodash.union/-/lodash.union-4.6.0.tgz",
+      "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg="
+    },
+    "log4js": {
+      "version": "6.4.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/log4js/-/log4js-6.4.1.tgz",
+      "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==",
+      "requires": {
+        "date-format": "^4.0.3",
+        "debug": "^4.3.3",
+        "flatted": "^3.2.4",
+        "rfdc": "^1.3.0",
+        "streamroller": "^3.0.2"
+      }
+    },
+    "make-iterator": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/make-iterator/-/make-iterator-1.0.1.tgz",
+      "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+      "requires": {
+        "kind-of": "^6.0.2"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
+    "micromatch": {
+      "version": "4.0.5",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/micromatch/-/micromatch-4.0.5.tgz",
+      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "requires": {
+        "braces": "^3.0.2",
+        "picomatch": "^2.3.1"
+      }
+    },
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+    },
+    "minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/minimist/-/minimist-1.2.6.tgz",
+      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "mute-stdout": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/mute-stdout/-/mute-stdout-1.0.0.tgz",
+      "integrity": "sha1-WzLqB+tDyd7WEwQ0z5JvRrKn/U0="
+    },
+    "next-tick": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/next-tick/-/next-tick-1.1.0.tgz",
+      "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
+    },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+    },
+    "now-and-later": {
+      "version": "2.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/now-and-later/-/now-and-later-2.0.1.tgz",
+      "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
+      "requires": {
+        "once": "^1.3.2"
+      }
+    },
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "requires": {
+        "path-key": "^3.0.0"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+    },
+    "object.assign": {
+      "version": "4.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+      "requires": {
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "object.defaults": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/object.defaults/-/object.defaults-1.1.0.tgz",
+      "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+      "requires": {
+        "array-each": "^1.0.1",
+        "array-slice": "^1.0.0",
+        "for-own": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.map": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/object.map/-/object.map-1.0.1.tgz",
+      "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+      "requires": {
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.reduce": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/object.reduce/-/object.reduce-1.0.1.tgz",
+      "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
+      "requires": {
+        "for-own": "^1.0.0",
+        "make-iterator": "^1.0.0"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "requires": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "os-locale": {
+      "version": "1.4.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "requires": {
+        "lcid": "^1.0.0"
+      }
+    },
+    "parse-filepath": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/parse-filepath/-/parse-filepath-1.0.2.tgz",
+      "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+      "requires": {
+        "is-absolute": "^1.0.0",
+        "map-cache": "^0.2.0",
+        "path-root": "^0.1.1"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "parse-passwd": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/parse-passwd/-/parse-passwd-1.0.0.tgz",
+      "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
+    },
+    "path-exists": {
+      "version": "2.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/path-exists/-/path-exists-2.1.0.tgz",
+      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+      "requires": {
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+    },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "path-root": {
+      "version": "0.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/path-root/-/path-root-0.1.1.tgz",
+      "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+      "requires": {
+        "path-root-regex": "^0.1.0"
+      }
+    },
+    "path-root-regex": {
+      "version": "0.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/path-root-regex/-/path-root-regex-0.1.2.tgz",
+      "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0="
+    },
+    "path-type": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/path-type/-/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      }
+    },
+    "picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pretty-hrtime": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/pretty-hrtime/-/pretty-hrtime-1.0.0.tgz",
+      "integrity": "sha1-9ualItPmBwRSK/Db5oVu0g515Nw="
+    },
+    "printj": {
+      "version": "1.3.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/printj/-/printj-1.3.1.tgz",
+      "integrity": "sha512-GA3TdL8szPK4AQ2YnOe/b+Y1jUFwmmGMMK/qbY7VcE3Z7FU8JstbKiKRzO6CIiAKPhTO8m01NoQ0V5f3jc4OGg=="
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "requires": {
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "requires": {
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
+      }
+    },
+    "readable-stream": {
+      "version": "3.6.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "requires": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      }
+    },
+    "readdir-glob": {
+      "version": "1.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/readdir-glob/-/readdir-glob-1.1.1.tgz",
+      "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==",
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "rechoir": {
+      "version": "0.8.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/rechoir/-/rechoir-0.8.0.tgz",
+      "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+      "requires": {
+        "resolve": "^1.20.0"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
+    },
+    "resolve": {
+      "version": "1.22.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+      "requires": {
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+      "requires": {
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
+      }
+    },
+    "resolve-package-path": {
+      "version": "4.0.3",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/resolve-package-path/-/resolve-package-path-4.0.3.tgz",
+      "integrity": "sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==",
+      "requires": {
+        "path-root": "^0.1.1"
+      }
+    },
+    "rfdc": {
+      "version": "1.3.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/rfdc/-/rfdc-1.3.0.tgz",
+      "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "semver": {
+      "version": "5.7.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+    },
+    "signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+    },
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.11",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
+      "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g=="
+    },
+    "stream-exhaust": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+      "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw=="
+    },
+    "streamroller": {
+      "version": "3.0.6",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/streamroller/-/streamroller-3.0.6.tgz",
+      "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==",
+      "requires": {
+        "date-format": "^4.0.6",
+        "debug": "^4.3.4",
+        "fs-extra": "^10.0.1"
+      }
+    },
+    "string-width": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "requires": {
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "requires": {
+        "is-utf8": "^0.2.0"
+      }
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+    },
+    "tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "requires": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      }
+    },
+    "to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "requires": {
+        "is-number": "^7.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://repo.huaweicloud.com/repository/npm/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+        }
+      }
+    },
+    "type": {
+      "version": "1.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/type/-/type-1.2.0.tgz",
+      "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
+    },
+    "unc-path-regex": {
+      "version": "0.1.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
+      "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
+    },
+    "undertaker": {
+      "version": "1.2.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker/-/undertaker-1.2.1.tgz",
+      "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==",
+      "requires": {
+        "arr-flatten": "^1.0.1",
+        "arr-map": "^2.0.0",
+        "bach": "^1.0.0",
+        "collection-map": "^1.0.0",
+        "es6-weak-map": "^2.0.1",
+        "last-run": "^1.1.0",
+        "object.defaults": "^1.0.0",
+        "object.reduce": "^1.0.0",
+        "undertaker-registry": "^1.0.0"
+      }
+    },
+    "undertaker-registry": {
+      "version": "1.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+      "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA="
+    },
+    "universalify": {
+      "version": "2.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "requires": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "v8flags": {
+      "version": "3.2.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/v8flags/-/v8flags-3.2.0.tgz",
+      "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
+      "requires": {
+        "homedir-polyfill": "^1.0.1"
+      }
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "1.0.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/which-module/-/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8="
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "requires": {
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "y18n": {
+      "version": "3.2.2",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/y18n/-/y18n-3.2.2.tgz",
+      "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
+    },
+    "yargs": {
+      "version": "7.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/yargs/-/yargs-7.1.0.tgz",
+      "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+      "requires": {
+        "camelcase": "^3.0.0",
+        "cliui": "^3.2.0",
+        "decamelize": "^1.1.1",
+        "get-caller-file": "^1.0.1",
+        "os-locale": "^1.4.0",
+        "read-pkg-up": "^1.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^1.0.1",
+        "set-blocking": "^2.0.0",
+        "string-width": "^1.0.2",
+        "which-module": "^1.0.0",
+        "y18n": "^3.2.1",
+        "yargs-parser": "^5.0.0"
+      }
+    },
+    "yargs-parser": {
+      "version": "5.0.1",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/yargs-parser/-/yargs-parser-5.0.1.tgz",
+      "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==",
+      "requires": {
+        "camelcase": "^3.0.0",
+        "object.assign": "^4.1.0"
+      }
+    },
+    "zip-stream": {
+      "version": "4.1.0",
+      "resolved": "https://repo.huaweicloud.com/repository/npm/zip-stream/-/zip-stream-4.1.0.tgz",
+      "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==",
+      "requires": {
+        "archiver-utils": "^2.1.0",
+        "compress-commons": "^4.1.0",
+        "readable-stream": "^3.6.0"
+      }
+    }
+  }
+}

+ 18 - 0
FA/Contacts/package.json

@@ -0,0 +1,18 @@
+{
+	"license": "ISC",
+	"devDependencies": {},
+	"name": "contacts",
+	"ohos": {
+		"org": "huawei",
+		"directoryLevel": "project",
+		"buildTool": "hvigor"
+	},
+	"description": "example description",
+	"repository": {},
+	"version": "1.0.0",
+	"dependencies": {
+		"@ohos/hvigor-ohos-plugin": "1.0.6",
+		"hypium": "^1.0.0",
+		"@ohos/hvigor": "1.0.6"
+	}
+}

+ 200 - 0
FA/Contacts/quick_develop.md

@@ -0,0 +1,200 @@
+## Contacts
+
+### 简介
+
+Contacts应用是基于OpenHarmony SDK开发的安装在L1(3516)设备上的应用;应用主要功能是展示联系人列表,并点击某一列弹出联系人详细信息;
+
+![show](resources/contacts.gif)
+
+### 工程目录
+
+完整的项目结构目录如下
+
+```
+├─entry\src\main
+│          │  config.json  //应用配置文件
+│          │  
+│          ├─js
+│          │  └─MainAbility
+│          │      │  app.js  // 应用程序入口
+│          │      │  
+│          │      ├─common   // 公共资源
+│          │      │  │  checkbutton.png
+│          │      │  │  delete.png
+│          │      │  │  done.png
+│          │      │  │  head0.png
+│          │      │  │  head1.png
+│          │      │  │  head2.png
+│          │      │  │  head3.png
+│          │      │  │  head4.png
+│          │      │  │  right.png
+│          │      │  │  
+│          │      │  └─images
+│          │      │          bg-tv.jpg
+│          │      │          Wallpaper.png
+│          │      │          
+│          │      ├─i18n   // 多语言文件
+│          │      │      en-US.json
+│          │      │      zh-CN.json
+│          │      │      
+│          │      └─pages
+│          │          └─index
+│          │                  index.css  //页面样式
+│          │                  index.hml  //首页展示
+│          │                  index.js   //页面逻辑
+│          │                  
+│          └─resources
+│              ├─base
+│              │  ├─element
+│              │  │      string.json
+│              │  │      
+│              │  └─media
+│              │          icon.png
+│              │          
+│              └─rawfile
+```
+
+
+
+### 开发步骤
+
+#### 1. 新建OpenHarmony ETS项目
+
+在DevEco Studio中点击File -> New Project ->[Standard]Empty Ability->Next,Language 选择JS语言,最后点击Finish即创建成功。
+![image-20211124092813545](resources/new_project.png)
+
+#### 2. 编写主页面
+
+![image-20211124093106260](resources/home.png)
+
+
+
+##### 2.1页面展示
+
+1)最外层是[div](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-container-div.md)容器;
+
+2)再通过[list](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-container-list.md)包裹[list-item](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-container-list-item.md) 并设置点击事件[onclick](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-common-events.md);
+
+3)list_item 包括头像[image](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/js-reference/ts-based-declarative-development-paradigm/ts-container-column.md) 和包括姓名和电话号码的div 按行布局容器,以及右尖括号图标;
+
+4)[dialog](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-container-dialog.md)对话框容器包裹div容器和以及[button](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-basic-button.md)组件,且div容器里面也是两个[label](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-basic-label.md)和输入框的[input](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/arkui-js/js-components-basic-input.md)
+
+```
+<div class="container">
+    <list class="list">
+        <list-item for="{{ contactList }}" class="list-item" onfocus="listFocus({{ $idx }})"
+                   onclick="clickItem({{ $idx }})">
+            <image src="{{ $item.imageSrc }}" class="list-image"></image>
+            <div class="content">
+                <text class="list-text">
+                    {{ $item.name }}
+                </text>
+                <text class="list-text" focusable="true">
+                    {{ $item.phone }}
+                </text>
+            </div>
+            <image class="right-image" src="/common/right.png">
+            </image>
+        </list-item>
+    </list>
+
+    <dialog id="detailDialog" class="dialog-main" @cancel="dialogCancel">
+        <div class="dialog-div">
+            <image src="{{ imageSrc }}" class="avatar"></image>
+            <div class="input-box">
+                <div class="flex-row">
+                    <label class="label" target="name">名字</label>
+                    <input id="name" class="input" type="text" value="{{ name }}" @change="changeName">
+                    </input>
+                </div>
+                <div class="flex-row">
+                    <label class="label" target="phone">电话</label>
+                    <input id="phone" class="input" type="text" value="{{ phone }}" @change="changePhone">
+                    </input>
+                </div>
+            </div>
+            <div class="inner-btn">
+                <button class="btn" type="text" onclick="cancel">取消</button>
+                <button class="btn" type="text" onclick="confirm">确认</button>
+            </div>
+        </div>
+    </dialog>
+</div>
+```
+
+  
+
+##### 2.2点击事件
+
+点击某一行后,并根据当前行的id 弹出dialog对话框,展示对应的头像和名字和电话
+
+```
+ clickItem(idx) {
+        this.imageSrc = this.contactList[idx].imageSrc;
+        this.name = this.contactList[idx].name;
+        this.phone = this.contactList[idx].phone;
+        this.showDialog();
+        this.index = idx;
+    },
+```
+
+##### 2.3对话框姓名和电话修改
+
+点击对话框名字框/电话框,会弹出软键盘,输入完成后会修改对应内容
+
+```
+ // 更新input Name值
+    changeName(e) {
+        let changeValue = e.text
+        this.name = changeValue;
+    },
+    // 更新input Phone值
+    changePhone(e) {
+        let changeValue = e.text;
+        this.phone = changeValue;
+    },
+```
+
+##### 2.4对话框确定按钮
+
+点击对话框确定按钮后,会将修改的姓名和电话号码存储到联系人列表
+
+```
+confirm() {
+        //修改对应行后保存到列表中
+        this.contactList[this.index].name = this.name;
+        this.contactList[this.index].phone = this.phone;
+        this.$element('detailDialog').close();
+    },
+```
+
+
+
+### 项目下载和导入
+
+项目地址:https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/FA/Contacts
+
+1)git下载
+
+```
+git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git
+```
+
+2)项目导入
+
+打开DevEco Studio,点击File->Open->下载路径FA/Contacts
+
+### 约束与限制
+
+#### 1. 设备编译约束
+
+- [获取OpenHarmony源码](https://www.openharmony.cn/pages/0001000202/#%E5%AE%89%E8%A3%85%E5%BF%85%E8%A6%81%E7%9A%84%E5%BA%93%E5%92%8C%E5%B7%A5%E5%85%B7),OpenHarmony版本须3.0LTS;
+- [安装开发板环境](https://www.openharmony.cn/pages/0001000400/#hi3516%E5%B7%A5%E5%85%B7%E8%A6%81%E6%B1%82)
+- [开发板烧录](https://www.openharmony.cn/pages/0001000401/#%E4%BD%BF%E7%94%A8%E7%BD%91%E5%8F%A3%E7%83%A7%E5%BD%95)
+
+#### 2. 应用编译约束
+
+- 参考 [应用开发快速入门](https://www.openharmony.cn/pages/00090000/)
+- 集成开发环境:DevEco Studio 3.0.0.601版本[下载地址](https://developer.harmonyos.com/cn/develop/deveco-studio#download_beta);
+- OpenHarmony SDK 3.0.0.0;
+

BIN
FA/Contacts/resources/contacts.gif


BIN
FA/Contacts/resources/home.png


BIN
FA/Contacts/resources/new_project.png


+ 90 - 0
FA/DistSchedule/README_zh.md

@@ -0,0 +1,90 @@
+# 数字管家手机端介绍
+
+### 简介
+
+数字管家场景需要手机端、设备端和服务端三方协同完成,本文档介绍的demo是数字管家大场景中的手机端应用;用户注册登录后可创建我的家庭并管理家庭成员;可以添加设备(包括智能台灯,智能窗帘,智能养花机等)并进行配网和控制;添加日程编排、控制设备,从而达到多设备联动的效果;除了控制类设备外,告警类设备还可以检测环境状态,并主动将告警消息通知到家庭成员;
+
+### 代码结构
+
+本demo包括两个entry和netconfig两个模块,如下图是详细代码结构说明:
+
+entry模块:
+
+![代码结构](https://images.gitee.com/uploads/images/2021/1014/153519_fbc0e251_9290617.png "代码.png")
+
+netconfig配网模块
+
+![配网模块](https://images.gitee.com/uploads/images/2021/1014/161720_8b8b8d05_9290617.png "配网.png")
+
+### 安装部署
+
+##### 1.代码编译运行步骤
+
+1)提前准备好搭载HarmonyOS系统的手机,确保HarmonyOS 手机中api version 在 API 6以上。
+
+查看HarmonyOS  手机API方法:在HarmonyOS SDK存储目录下的**Sdk\toolchains**文件下打开命令行工具,执行如下命令进行查询真机设备的apiversion。
+
+HarmonyOS SDK存储目录可通过DevEco Studio中点击File->setting->SDM Manager->HarmonyOS Legacy SDK查询。
+
+```
+hdc shell 
+getprop hw_sc.build.os.apiversion // 返回数值是6或者6以上
+```
+
+2)准备HarmonyOS应用的开发环境,请参考 [搭建开发环境流程]( https://developer.harmonyos.com/cn/docs/documentation/doc-guides/installation_process-0000001071425528 );
+
+3)准备项目签名文件,并配置签名信息,请参考 [申请发布证书和Profile文件/配置签名信息](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/publish_app-0000001053223745#section178461193713)
+
+4)DevEco Studio打开本工程,并将下列文件bundleName由com.example.distschedule修改为自己申请的包名;
+
+```
+./netconfig/src/main/js/default/pages/index/index.js
+./entry/src/config.json
+./netconfig/src/main/config.json
+```
+
+5)真机运行应用请参考 [本地真机运行]( https://developer.harmonyos.com/cn/docs/documentation/doc-guides/run_phone_tablat-0000001064774652 );
+
+![安装成功](https://images.gitee.com/uploads/images/2021/1115/162915_f8a32bcd_2322605.gif "install.gif")
+
+
+
+##### 2.配网步骤
+
+1)给应用配置配置智慧服务意图,[ 设备碰一碰配置指南](../../dev/docs/NFC_label_definition)
+
+2)提前准备好智能设备端,且让设备端进入配网模式,可参考[设备端无感配网介绍](../../dev/docs/net_config#3%E6%93%8D%E4%BD%9C%E8%AF%B4%E6%98%8E);
+
+3)打开手机NFC功能,打开应用并登陆账号,手机碰一碰智能设备,等待拉起配网页面后开始给设备端配网;
+
+4)在设备端配网成功后,进入设备控制页可控制设备开关机等;
+
+![配网](https://gitee.com/openharmony-sig/knowledge_demo_smart_home/raw/master/dev/docs/quick_start/resource/gif_001.gif "net_config.gif")
+
+### 新智能设备接入
+
+参考 [数字管家设备接入指南](docs/数字管家设备接入指南.md),根据文档编写页面、处理相关逻辑和对接服务端接口,即可将已开发完成的智能设备快速接入到数字管家应用端。
+
+
+### 约束限制
+
+1. 提前准好已实名认证的开发者联盟账号 ,具体 [实名认证](https://developer.huawei.com/consumer/cn/doc/start/itrna-0000001076878172)
+
+2. 开发工具:DevEco Studio 3.0 Beta1  及以上,SDK 请配置 API Version 6 2.2.0.3 版本以上,具体 [DevEcoStudio下载](https://developer.harmonyos.com/cn/develop/deveco-studio#download/)
+
+3. 打开手机**设置 > 应用和服务 > 应用管理** (点击右上角图标,点击显示系统程序选项),搜索“智慧生活基础服务”,检测智慧生活基础服务的版本是否为12.0.2.306及以上。如果不是,请打开华为手机的“智慧生活”APP,点击“**我的 > 设置 > 检查应用更新**”,更新“智慧生活基础服务”。
+
+4. 更多资料请登录HarmonyOS应用开发官网: https://developer.harmonyos.com/cn/
+
+### 参考链接
+
+- [FAQs](docs/FAQs.md)
+- [数字管家FA服务端修改](docs/数字管家FA接入新服务端.md)
+- [数字管家设备接入FA指南](docs/数字管家设备接入指南.md)
+- [数字管家快速上手指南](../../dev/docs/quick_start/README.md)
+- [数字管家服务端](../../Server)
+- [数字管家设备端](../../dev/docs/README.md)
+- [HarmonyOS应用开发官网](https://developer.harmonyos.com/cn/)
+- [学生党上手数字管家 — — 碰一碰让台灯亮起来!](docs/学生党上手数字管家/README.md)
+
+

+ 46 - 0
FA/DistSchedule/build.gradle

@@ -0,0 +1,46 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+apply plugin: 'com.huawei.ohos.app'
+
+//For instructions on signature configuration, see https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide_debug_device-0000001053822404#section1112183053510
+ohos {
+    compileSdkVersion 6
+    defaultConfig {
+        compatibleSdkVersion 5
+    }
+}
+
+buildscript {
+    repositories {
+        maven {
+            url 'https://repo.huaweicloud.com/repository/maven/'
+        }
+        maven {
+            url 'https://developer.huawei.com/repo/'
+        }
+        maven {
+            url 'https://s01.oss.sonatype.org/content/repositories/releases/'
+        }
+    }
+    dependencies {
+        classpath 'com.huawei.ohos:hap:3.0.3.4'
+        classpath 'com.huawei.ohos:decctest:1.2.6.0'
+    }
+}
+
+allprojects {
+    repositories {
+        mavenCentral()
+        tasks.withType(JavaCompile) {
+            options.compilerArgs += ["-AeventBusIndex=org.greenrobot.eventbus.MyEventBusIndex"]
+        }
+        maven {
+            url 'https://repo.huaweicloud.com/repository/maven/'
+        }
+        maven {
+            url 'https://developer.huawei.com/repo/'
+        }
+        maven {
+            url 'https://s01.oss.sonatype.org/content/repositories/releases/'
+        }
+    }
+}

+ 156 - 0
FA/DistSchedule/docs/FAQs.md

@@ -0,0 +1,156 @@
+### FAQs
+
+#### **1. 手机碰一碰NFC标签,提示“未获取到应用信息”。**
+
+**问题现象**
+
+手机碰一碰NFC标签,提示“未获取到应用信息”。
+
+**可能原因**
+
+- 原因一:服务意图配置的HarmonyOS标签的产品型号不是当前的ProductID。
+- 原因二:NFC标签写入的码流中的ProductID有误。
+
+**解决措施**
+
+1.确认服务意图配置的HarmonyOS标签的产品型号是否为当前的ProductID。
+
+1.  登录华为智慧服务平台。
+2.  在服务列表中找到对应的原子化服务,单击“编辑”。
+3.  选择“配置 > HarmonyOS标签”,确认设备标签中的“产品型号”是否正确。如果不正确,需要重新配置。
+
+2.确认NFC标签码流的ProductID字段是否正确。如果不正确,需要重新写入。
+
+3.若之前已拉起成功,且上述检测均正确,可点击重新发布智慧服务至测试态。
+
+1. 登录华为智慧服务平台。
+2. 在服务列表中找到对应的原子化服务,单击“编辑”。
+3. 点击“测试 > 重新准备测试”按钮
+4. 等待几分钟重新尝试碰一碰
+
+#### **2. 手机碰一碰NFC标签,弹框提示“系统错误”,如何处理?**
+
+**问题现象**
+
+手机碰一碰待连接设备,弹框提示“系统错误”,更换Wi-Fi后报错仍无法清除。
+
+**可能原因**
+
+手机时间与网络时间不一致。
+
+设备发起请求时,会将手机时间与设备激活码等信息传到云端。云端会对手机时间与网络时间的一致性进行校验,以确保请求的合法性。如果两者的时间差大于一小时,则请求无效。
+
+**解决措施**
+
+将手机的时间设置为“自动设置”,使手机与当前网络上的时间同步。以华为手机为例:
+
+1.进入手机“设置”。
+
+2.选择“ 系统和更新 > 日期和时间”。
+
+3.开启“自动设置”开关。
+
+#### 3. 手机碰一碰拉起应用后闪退,或白屏后退回首页
+
+**问题现象**
+
+手机碰一碰拉起应用后,发现应用闪退或者白屏后退回首页。
+
+**可能原因**
+
+NFC卡片内自定义数据格式错误导致的。
+
+**解决措施**
+
+参考 [设备碰一碰配置指南](../../../dev/docs/NFC_label_definition/README.md#设备信息的准备) 设备信息的准备章节,对比产品profile和nfc数据两则是否一致
+
+#### 4. 进入NAN配网后,应用界面卡在开始获取wifi列表
+
+**问题现象**
+
+应用跳转NAN配网后,应用界面卡在开始获取wifi列表,且长期无变化。
+
+**可能原因**
+
+配网服务首次加载需等待一会。
+
+**解决措施**
+
+重新通过碰一碰再次尝试NAN配网。
+
+#### 5. NAN配网后,应用界面显示xxx失败
+
+**问题现象**
+
+应用界面显示诸如 连接设备失败、配网失败等字样。
+
+**可能原因**
+
+- nfc自定义数据中ApSSID字段写入错误;
+- 设备未进入到配网状态
+- 当前手机连接的热点需要二次验证(仅凭wifi名称和密码无法进行配网)
+- 手机和设备距离过远
+
+**解决措施**
+
+- 检查nfc ApSSID字段是否和板子/设备的热点名一致,不一致则重新写入;
+- 通过检查具体板子/设备的状态,或查看板子/设备热点是否已经开启;
+- 切换当前手机连接的网络至无需二次验证网络
+- 可将手机和板子/设备碰一碰后放置较近的距离,注意别多次触发碰一碰
+
+#### 6. NAN配网成功后,应用无反应或闪退
+
+**问题现象**
+
+设备已配网成功,应用仍在配网界面。
+
+**可能原因**
+
+netconfig模块下index.js代码中未修改包名。
+
+**解决措施**
+
+进入netconfig模块index.js文件下,将goToControl方法中的bundleName变量修改为自己的项目包名。
+
+#### 7. SoftAP配网,应用配网完成并跳转后发现无法控制设备
+
+**问题现象**
+
+SoftAP配网,在选择wifi名称和密码后,应用已经跳转至设备控制页面了,但无法进行控制。
+
+**可能原因**
+
+配网流程:由于大部分板子不支持STA和AP模式并存,所以在板子在接收到配网数据后,需和手机断开连接尝试联网和连接IoT云(联云需要一定时间,无法立马得知是否配网成功),而手机则会直接跳转至控制页面,并另开线程等待10s后进行状态查询,若为离线状态则提示配网失败。
+
+- 配网信息中密码错误;
+- 设备正在联网中;
+
+**解决措施**
+
+配网失败:
+
+检查配网时wifi密码是否正确
+
+配网成功:
+
+视当前网络情况,需等待板子连接IoT云成功后再进行控制操作,一般需要等待几秒即可。
+
+#### 8. 网络请求响应的数值异常
+
+**问题现象**
+
+请求的数据非正确项目数据
+
+**可能原因**
+
+- 为修改项目请求地址;
+- 服务端数据错误;
+
+**解决措施**
+
+- 检查OKHttpUtilsRx2.java中SERVER_URL变量是否为自己服务器api地址,检查DeviceStateListener.java中RABBITMQ_HOST变量是否为自己服务器地址;
+
+- 确认自己服务端的swagger下的接口能否正常请求,以本项目数字管家部署swagger为例,进入 [swagger地址](http://139.9.102.131:8080/distschedule-api/swagger-ui/index.html#/%E7%94%A8%E6%88%B7%E6%8E%A5%E5%8F%A3/getUserByPhoneUsingGET) ,在相应的请求接口中,点击Try it out -> 输入参数 -> execute,查看 Response body中是否有正确响应,若响应值错误则为服务端错误;
+
+- 检查请求方式是否与服务端相吻合。
+

+ 295 - 0
FA/DistSchedule/docs/学生党上手数字管家/README.md

@@ -0,0 +1,295 @@
+# **学生党上手数字管家 — — 碰一碰让台灯亮起来!**  
+>——以下是学生党个人总结的方法,参考了Gitee中数字管家的Demo文档并进行二次分析和总结,同时分享出来,希望能和大家一起进步。星星之火,点亮鸿蒙!
+
+在开始上手之前,我需要通过架构图带着大家来简单了解一下**数字管家**,下面为大家放上一张数字管家的结构图,帮助同学们在学习的时候有条不紊的梳理知识点和发现问题。
+
+![1.png](./resources/1.png)
+
+接下来为大家揭晓上手的关键,关键就在于**软件安装、硬件烧录、NFC配置**。其中**密钥、签名、证书文件的申请及配置**和**NFC配置**是**2个小难点**,所以在这篇学习心得分享上会着重提到我们遇到的这2个难点以及应对的办法。
+### 大体步骤如下:
+
+![2.png](./resources/2.png)
+#### 难点 · 1 · 密钥文件、签名文件、证书文件的申请及配置流程
+![3.png](./resources/3.png)
+注:图中每条路径上均为 〈目的 | 解决路径  方向〉 的排版方式,解决顺序由上往下(黄、蓝、粉)依次进行。
+
+#### 难点 · 2 · NFC配置流程
+![4.png](./resources/4.png)
+注:图中路径标签以及解决顺序同上。
+
+**需要具备的条件:**
+
+1、搭载HarmonyOS的华为手机,并且API版本在6以上,而且还要有NFC功能。(API的查询文档中会有详细说明)
+
+2、小熊派Hi3861开发板以及E53_SC1智慧台灯模块。
+
+
+
+**[ 温馨提示:建议同学们先看图,看懂了接下来就好办了。]**
+
+
+
+### **具体步骤如下:**
+
+#### 第一步:代码下载。
+
+下载源:
+
+https://gitee.com/openharmony-sig/knowledge_demo_smart_home
+
+![5.png](./resources/5.png)
+#### 第二步:IDE安装。
+
+下载源:
+
+https://developer.harmonyos.com/cn/develop/deveco-studio
+
+![6.png](./resources/6.png)
+**·安装后配置SDK版本为6以上即可**
+![7.png](./resources/7.png)
+
+
+
+#### 第三步:密钥、签名、证书文件的申请及配置
+##### ·首先在AppGallery Connect中创建项目
+
+https://developer.huawei.com/consumer/cn/service/josp/agc/index.html
+![8.png](./resources/8.png)
+![9.png](./resources/9.png)
+![10.png](./resources/10.png)
+![11.png](./resources/11.png)
+![12.png](./resources/12.png)
+![13.png](./resources/13.png)
+
+**·点击确认后,添加.JSON文件,请一定记住是放在entry之下。**
+
+![14.png](./resources/14.png)
+![15.png](./resources/15.png)
+
+注:无论是重构添加还是复制添加,请一定放在entry之下。
+
+##### ·分别在三个文件中把bundleName中的包名修改为自己定义的包名。
+
+**1.DistSchedule/entry/src/config.json**
+
+![16.png](./resources/16.png)
+
+**2.DistSchedule/netconfig/src/main/config.json**
+
+![17.png](./resources/17.png)
+
+**3.DistSchedule/netconfig/src/main/js/default/pages/index/index.js**
+
+![18.png](./resources/18.png)
+
+现在我们开始获取三个重要文件:p12、cer、p7b
+
+##### **·获取密钥. csr和签名.p12**
+
+·在Build(构建选项栏)中选择Generate Key and CSR选项,New创建新的密钥和签名文件。
+
+![19.png](./resources/19.png)
+
+**将.p12文件放在心仪的文件位置。Password为密码,自定义即可。**
+
+![20.png](./resources/20.png)
+
+**·First and last name 这一项必须填写,自定义即可。**
+![21.png](./resources/21.png)
+
+**·同样将.csr放在自己心仪的文件夹下。**
+
+![22.png](./resources/22.png)
+
+**·现在我们的密钥. csr和签名.p12就弄好了。**
+
+**~注:各种文件存放的位置一定要记住呦!**
+
+
+
+
+##### ·获取手机的DUID
+
+**·来到手机端,点击版本号6下进入开发者模式,打开USB调试,并将手机和PC端连接。**
+
+![23.png](./resources/23.png)
+
+
+
+
+**·来到SDK窗口,复制文件路径。**
+
+![24.png](./resources/24.png)
+
+**·来到文件窗口进入toolchains文件夹,全选文件路径并输入cmd,进入命令窗口。**
+
+![25.png](./resources/25.png)
+
+**·输入hdc shell bm get -u,就得到了手机的UDID。**
+
+![26.png](./resources/26.png)
+
+~注:UDID获取后记得保存在文本文档里呦!方便后面使用。
+
+如需查看手机的API版本号,则输入hdc shell 再输入getprop hw_sc.build.os.apiversion就可以获取了,手机的API版本号需要6以上的才能打开数字管家APP进行测试呦!
+
+
+##### ·获取证书.cer文件(这里会用到手机的UDID和.csr文件)
+·来到AGC设备管理平台,添加设备。
+![27.png](./resources/27.png)
+
+![28.png](./resources/28.png)
+
+**·之后转到证书管理平台,上传证书。**
+
+![29.png](./resources/29.png)
+
+·下载出来的文件就是.cer。到此,我们的证书.cer也弄好了。
+
+~接下来就剩.p7b文件了。
+
+##### ·获取证书.p7b文件(这里会用到已配置的手机和.cer文件)
+**·来到HAP平台。**
+
+![30.png](./resources/30.png)
+
+![31.png](./resources/31.png)
+
+![32.png](./resources/32.png)
+
+![33.png](./resources/33.png)
+·添加的操作很简便的,所以就不详细讲了。下载之后就可以得到.p7b文件了。
+
+**·到这一步,我们获取三个重要文件.p12、cer、p7b就完成了,接下来就是来到IDE中进行配置。**
+
+
+##### 在IDE中进行配置
+来到DevEco Studio(先登录),在 File (文件选项栏)> Project Structure > Project >Signing Configs
+
+**·自动配置的可以在文件夹.ohos\config中查看。(真机连接的时候才可以自动配置)**
+
+![34.png](./resources/34.png)
+
+#### 第四步:跑起来!
+
+来到运行/调试配置窗口,选择entry并勾选上Deploy Multi Hap Packages
+
+![35.png](./resources/35.png)
+
+![36.png](./resources/36.png)
+
+
+
+成功之后你将会在手机上看见数字管家的APP。
+
+
+
+![37.png](./resources/37.png)
+
+**如果没有成功,请细细品味难点1中的流程图。你品,你细品!**
+
+**到这一步的小伙伴一定很高兴对吧!我也为你感到高兴。但目前才完成了三分之一,不过离成功就只有简单的三分之二了,加油!**
+
+
+
+#### 第五步:硬件烧录
+**·USB串口驱动,下载源:http://www.wch.cn/search?q=ch340g&t=downloads**
+**安装好之后连接开发板,就可以在设备管理器中查看串口号,例如我的是COM3。**
+
+![38.png](./resources/38.png)
+
+**·之后安装HiBurn烧录软件,下载源:https://harmonyos.51cto.com/resource/29**
+**安装完毕后,打开HiBurn**
+
+![39.png](./resources/39.png)
+
+Setting->Com settings->Baud —— 波特率设置
+
+COM —— 串口选择
+
+Refresh —— 刷新串口
+
+Select file —— 烧录文件选择
+
+Connect —— 烧录连接
+
+图中COM为串口选择,如果已连接开发板,但软件没有发现就点一下Refresh;
+Select file为烧录文件位置选择,这里我们选择代码路径下:
+**knowledge_demo_smart_home\dev\docs\quick_start\resource\image\Hi3861_wifiiot_app_allinone.bin**
+点击Connect之后按一下开发板上的复位件RESET等待进度条跑完,就烧录好了。
+
+
+
+
+#### 第六步:最后一步NFC配置(其中FA信息配置和NFC写入内容尤为重要)
+
+##### 来到华为开发者联盟中的华为快服务智慧平台,创建服务模型。
+
+![40.png](./resources/40.png)
+
+![41.png](./resources/41.png)
+
+![42.png](./resources/42.png)
+
+![43.png](./resources/43.png)
+##### 创建完模型之后,进行信息配置
+**一、服务信息配置**
+
+![44.png](./resources/44.png)
+
+![45.png](./resources/45.png)
+
+**二、标签配置**
+
+
+![46.png](./resources/46.png)
+
+![47.png](./resources/47.png)
+
+**三、测试配置**
+
+![48.png](./resources/48.png)
+
+![49.png](./resources/49.png)
+
+确定之后开启调试即可。
+
+##### 最后一步:手机端碰一碰写入NFC信息
+
+·需要下载应用调测助手APP,申请Product ID,将已有的智慧台灯的标签内容先写入自定义缓存区,再去碰NFC芯片。
+
+·已有的智慧台灯的自定义数据:1246128c7b60ad1ed0286680f19206Lamp01308123456784011512teamX-Lamp01
+
+![50.png](./resources/50.png)
+
+**NFC标签的自定义数据是否按照如下格式。(引用于https://gitee.com/openharmony-sig/knowledge_demo_smart_home/dev/docs/NFC_label_definition/README.md)**
+
+| 标签代号 | 意义                | 限制条件                                                     | 样例                                                         |
+| -------- | ------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| 1        | IoTDA平台设备产品ID | 典型值24字节,小于32字节                                     | 6128c7b60ad1ed0286680f19                                     |
+| 2        | NodeID              | 典型值8字节,小于64字节                                      | Lamp01                                                       |
+| 3        | DevicePwd           | 典型值8字节,小于32字节                                      | 12345678                                                     |
+| 4        | 配网标识            | 1字节                                                        | 0:不需要配网设备(如手表平板等自带蜂窝网络的设备);<br />1:NAN配网(能自动使用当前网络配网,不需要输入密码);<br />2:softAp配网;<br />3:ble蓝牙配网; |
+| 5        | ApSSID              | 设备自己发出的热点名,典型值12字节,小于32字节,NAN配网和softAp配网必须提供;构成一般为前缀teamX + 设备ID模式 | teamX-Lamp01                                                 |
+| 6        | ApToken             | 典型值8字节,小于16字节;WIFI配网下必须提供(可以置空)      | 12345678                                                     |
+| 7        | BLE-MAC             | 典型值6字节;BLE配网下必须提供                               | 010203040506                                                 |
+
+###### 小知识点:NFC标签内容写入技巧(可以拿小本本记下来,有助于接下来的学习)
+
+![NFC写入.png](./resources/NFC写入.png)
+
+
+
+**··当屏幕前的你完成到这一步时。**
+**恭喜你!快去!接通开发板的电源,赶紧碰一碰点亮你的小台灯吧 ^^**
+
+![52.png](./resources/52.png)
+
+图中是两个手机连接一个设备,并且都拥有控制权。感兴趣的小伙伴可以去试试!
+至于怎么弄出来的,嘻嘻,我不说,自己去探索。
+
+#### 个人寄语:
+
+>文档当中仍然有很多不足之处,所以我将之定义为“学生党上手数字管家1.0”,分享出来的目的是希望大家能一起将文档更新为2.0、3.0……一直到最后的END版本。我们可以将各自总结的知识点融汇在一起,一起打造一个巨大的笔记本,让这本笔记记录我们的成长,也让我们的努力变得有迹可循!
+
+​           

BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/1.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/10.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/11.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/12.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/13.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/14.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/15.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/16.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/17.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/18.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/19.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/2.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/20.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/21.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/22.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/23.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/24.png


BIN
FA/DistSchedule/docs/学生党上手数字管家/resources/25.png


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