首页 > 其他分享 >一个帖子教你实现 商品下单、获取商品订单信息、商品送货时发送通知 一体化功能

一个帖子教你实现 商品下单、获取商品订单信息、商品送货时发送通知 一体化功能

时间:2022-12-13 10:24:27浏览次数:75  
标签:送货 val huawei 函数 商品 下单 fun com agconnect

1、介绍

总览

通过无缝数据库结构,在保证数据的可用性、一致性、安全性外,云数据库能够实现数据在客户端和云端之间的无缝同步。云函数提供serverless环境,AppGallery Connect的其他服务为云函数提供事件源。监听事件源可以触发相关函数。

 

您将建立什么

在本次codelab中,您将建立一个示例项目用于体验云数据库和云函数。云数据库中数据发生变化时,云函数HTTP触发器触发函数发送通知。流程如下:

  • 商品下单。

  • 获取商品订单信息。

  • 商品送货时,发送通知。

     

     

     

您将学会什么

在本次codelab中,您将学习:

  • 如何在AppGallery Connect中创建项目和新建应用。

  • 如何集成云数据库和云函数。

  • 如何使用云函数并且使用HTTP触发器发送通知。

 

2、您需要什么

硬件需求

  • 一台笔记本或台式电脑。

  • 一部装有EMUI 8.0或以上版本的华为手机,运行HMS Core (APK) 5.0.1.301或以上版本;或一部装有安卓7.0或以上版本的非华为手机,运行HMS Core (APK) 5.0.1.301或以上版本。该手机用于demo的运行和调测。

软件需求

  • JDK版本:1.8或以上

  • Android Studio版本:3.X或以上

  • SDK平台版本:24或以上

  • targetSdkVersion:29

  • compileSdkVersion:29

  • Gradle版本:4.6或以上

必备知识

安卓应用开发基础知识

 

3、能力接入准备

集成前,需要完成以下准备工作:

在进行准备前,请先注册开发者帐号

 

  • 在AppGallery Connect中创建项目和应用。

  • 创建Android Studio项目。

  • 生成签名证书。

  • 生成签名证书指纹。

  • 在AppGallery Connect中将签名指纹添加到应用中。

  • 添加必要配置。

  • 配置项目签名。

  • 同步项目。

详情请参见HUAWEI HMS Core集成准备

 

4、集成HMS Core SDK

添加您应用的AppGallery Connect配置文件

  1. 登录AppGallery Connect,点击“我的项目”,在项目列表中找到并点击您的项目。

  2. 在“项目设置”页面选择“常规”页签。

  3. 在“项目”区域下点击“数据处理位置”后的“启用”。

    cke_15201.png

  4. 点击“应用”区域的“agconnect-services.json”下载配置文件。

     

    cke_20802.png

  5. 把agconnect-services.json文件拷贝到项目的应用级根目录下。

     

    cke_24432.png

 

添加编译依赖

  1. 打开应用级的“build.gradle”文件。

  2. 在dependencies中添加如下编译依赖。

    dependencies { 
        //添加云函数和云数据库依赖。
        implementation 'com.huawei.agconnect:agconnect-cloud-database:{version}'
        implementation 'com.huawei.agconnect:agconnect-function-ktx:{version}'
    }

    注意:

    将{version}替换为云数据库的最新版本号,例如,com.huawei.agconnect:agconnect-cloud-database:1.5.3.300。最新的版本号请参见SDK版本更新说明

    将{version}替换为云函数的最新版本号,例如,com.huawei.agconnect:agconnect-function-ktx 1.7.1.300。最新的版本号请参见SDK版本更新说明

  3. 在build.gradle文件中,设置Java源代码的兼容性模式。

    compileOptions { 
    sourceCompatibility = 1.8 
    targetCompatibility = 1.8
    }
  4. 在应用级build.gradle文件中设置minSdkVersion。

    android {
     ... 
       defaultConfig {
          ... 
       minSdkVersion 26 
          ... 
      }
       ... 
    }
  5. 检查是否已添加AppGallery Connect插件。如没有,在应用级build.gradle文件中添加该插件。

    apply plugin: 'com.huawei.agconnect'

配置混淆脚本

编译APK前需要配置混淆脚本,避免混淆HMS Core SDK。如果出现混淆,HMS Core SDK可能无法正常工作。

Android Studio开发环境里的混淆脚本是“proguard-rules.pro”。

  1. 加入排除HMS SDK的混淆配置。

    -ignorewarnings 
    -keepattributes *Annotation* 
    -keepattributes Exceptions 
    -keepattributes InnerClasses 
    -keepattributes Signature 
    -keepattributes SourceFile,LineNumberTable 
    -keep class com.huawei.hianalytics.**{*;} 
    -keep class com.huawei.updatesdk.**{*;} 
    -keep class com.huawei.hms.**{*;}

     

5、设计UI

cke_98012.png

cke_102491.png

cke_107423.png

cke_112656.png

cke_116239.png

 

6、集成云函数

  1. 需要在handler.js文件中写入发送通知的函数。

  2. 在AppGallery Connect中创建函数。

  3. 输入函数名,上传创建的handler.js文件,并保存设置。

  4. 函数创建完成后,添加HTTP触发器。

     

     

7、初始化云数据库

  1. 初始化云数据库。

    override suspend fun initialize(): Result<Unit> {
            handler = CompletableDeferred()
            AGConnectCloudDB.initialize(context)
            initializeCloudDB()
            initializeZone()
            handler?.let { return it.await() }
                ?: run { return Result.Error() }
        }
    
        private fun initializeCloudDB() {
            val instance = AGConnectInstance.buildInstance(
                AGConnectOptionsBuilder().setRoutePolicy(
                    AGCRoutePolicy.GERMANY
                ).build(context)
            )
            mCloudDB = AGConnectCloudDB.getInstance(instance, AGConnectAuth.getInstance())
            mCloudDB.createObjectType(ObjectTypeInfoHelper.getObjectTypeInfo())
        }
    
    
    
    private fun initializeZone() {
            val mConfig = CloudDBZoneConfig(
                "CourierDbZone", 
                CloudDBZoneConfig.CloudDBZoneSyncProperty.CLOUDDBZONE_CLOUD_CACHE,
                CloudDBZoneConfig.CloudDBZoneAccessProperty.CLOUDDBZONE_PUBLIC
            )
            mConfig.persistenceEnabled = true
            val task = mCloudDB.openCloudDBZone2(mConfig, true)
            task.addOnSuccessListener {
                cloudDBZone = it
                handler?.complete(Result.Success(Unit))
            }.addOnFailureListener {
                handler?.complete(Result.Error(it.message))
            }
        }
  2. 产品列表由云数据库提供。用户在产品列表中选择某个产品时,售卖该产品的商店的经纬度发送到快递员的界面上。

    override suspend fun getOrders(): List<Order> {
            val result = CompletableDeferred<List<Order>>()
            cloudDBZone?.let { dbZone ->
                dbZone.executeQuery(
                    CloudDBZoneQuery.where(Order::class.java),
                    CloudDBZoneQuery.CloudDBZoneQueryPolicy.POLICY_QUERY_DEFAULT
                ).addOnCompleteListener{
                    if(it.isSuccessful) {
                        val cursor = it.result.snapshotObjects
                        val orders = mutableListOf<Order>()
                        while(cursor.hasNext()) {
                            orders.add(cursor.next())
                        }
                        result.complete(orders)
                    }else {
                        throw it.exception
                    }
                }
            }?: run {
                throw Exception("Cloud DB not initialized.")
            }
            return result.await()
        }

     

8、使用Location和Directions API

  1. 查看权限。

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  2. 在Android Studio页面,选择File > Sync Project with Gradle Files同步项目。

  3. 根据用户位置信息,通过Directions API创建路径。

    private fun getLastLocation() {
            val mLocationRequest = LocationRequest()
            mLocationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
            mLocationRequest.numUpdates = 1
            fusedLocationProviderClient.requestLocationUpdates(
                mLocationRequest,
                mLocationCallback,
                Looper.getMainLooper()
            )
    }
    private val mLocationCallback = object : LocationCallback() {
            override fun onLocationResult(locationResult: LocationResult) {
                courierTrackingViewModel.createRoute(
                    args.storeLocation,
                    locationResult.lastLocation,
                    DirectionType.DRIVING
                )
            }
        }
    @POST("{type}")
        suspend fun getDirections(
            @Path(value = "type",encoded = true) type : String,
            @Body directionRequest: DirectionsRequest,
            @Query("key") api_key: String,
        ): DirectionsNetwork
  4. 当Directions API返回成功结果后,标记用户和商店位置。

    private fun addMarker(latLng: LatLng, title: String, icon: Int): Marker? {
            val options = MarkerOptions()
                .position(latLng)
                .title(title)
                .icon(BitmapDescriptorFactory.fromResource(icon))
            return hMap?.addMarker(options)
        }
  5. 在地图上,用折现添加Directions API返回的经纬度信息。

    private fun addPolylines(route: Route) {
            route.pathPoints?.let { pathPoints ->
                val options = PolylineOptions()
                pathPoints.forEach { latLng ->
                    options.add(latLng)
                }
                options.color(
                    ContextCompat.getColor(
                        requireContext(), R.color.yellow_700
                    )
                )
                options.width(5f)
                hMap?.addPolyline(options)
            }
    }

9、HTTP触发器场景

您可以指定云函数的HTTP触发器给用户发送消息,通知他们快递员已到达。用户可以在地图上查看订单位置。

private suspend fun starSimulation(pathPoints: List<LatLng>?) {
        var marker: Marker?
        pathPoints?.let { paths ->
            paths.forEach { latLng ->
                marker = addMarker(latLng,"Courier",R.drawable.scooter_icon_128)
                animateCamera(latLng)
                delay(100)
                marker?.remove()
            }
        }
        sendNotification()
    }
    private fun sendNotification() {
        val pushToken = activity?.getSharedPreferences(
            "device_token", Context.MODE_PRIVATE
        )?.getString("device_token",null)
        pushToken?.let { token ->
            val parameterMap: HashMap<String, String> = HashMap()
            parameterMap["deviceToken"] = token
            AGConnectFunction.getInstance()
                .wrap("courier-tracking-notification-\$latest")  
                .call(parameterMap)}
         findNavController().popBackStack()}

10、恭喜您

祝贺您,您已经成功完成本codelab并学到了:

  • 如何继承云数据库和云函数。

  • 如何通过HTTP触发器发送通知。

11、参考文件

您可以下载源代码

​欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

标签:送货,val,huawei,函数,商品,下单,fun,com,agconnect
From: https://www.cnblogs.com/developer-huawei/p/16977826.html

相关文章

  • QT商品管理系统(数据库)
    QT商品管理系统(数据库)功能需求:在Linux系统内设计一个图形界面(GUI)的商品管理程序,必须实现对数据库的操作,以及提供,添加,查询,修改,删除和显示已存储数据等功能。设计要......
  • C/C++小商品信息管理系统设计与实现
    C/C++小商品信息管理系统设计与实现设计一个小商品信息管理系统。根据以下功能,分析使用的逻辑结构和存储结构。(1)增加功能:能录入新数据(包括:商品名称、商品编号、厂家、库......
  • Python爬虫实战,requests+openpyxl模块,爬取手机商品信息数据(附源码)
    前言今天给大家介绍的是Python爬取手机商品信息数据,在这里给需要的小伙伴们代码,并且给出一点小心得。首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的......
  • Python爬虫实战,requests+xlwt模块,爬取螺蛳粉商品数据(附源码)
    前言今天给大家介绍的是Python爬取螺蛳粉商品数据,在这里给需要的小伙伴们代码,并且给出一点小心得。首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是......
  • ※ 商品专题
    涉及多种商品的差异、包含等问题。1.包含问题通用方法为:selfjoin-->groupby --> havingcount()力扣1045:买下所有产品的客户#方法:selfjoinselectdistinct......
  • python实现简单的商品数据管理系统
    #一个商品名称价格库存总销量#存放商品的数据类型strsetlisttupledict#综合考虑,选择字典dict_data={}#{名称:{price:价格,inventory:库存,sa......
  • m基于ACO蚁群算法的考虑装载率的循环送货的最短线路规划MATLAB仿真
    1.算法概述        根据这些装载率再结合路径最短来设计几个循环送货的线路。最理想状态是一条循环路径出去把所有的货都能遍历,并且装载率也很高。但是显然理想状......
  • 为什么外贸独立站商品销量不好?
    近年来,由于卖家数量飙升,平台竞争持续升级,卖家之间的恶性循环竞争(刷单、跟进、价格战)以及平台政策的不断调整(佣金提高、手续费提高、PPC费用提高)等。,导致亚马逊等众多平......
  • HM-RocketMQ2.5【下单业务】
    1下单业务时序图调用下单服务:远程RPC调用订单服务预订单:用户不可见扣减库存:远程RPC调用库存服务扣减优惠券:远程RPC调用优惠券服务扣减用户预测:远程RPC调用用户服务......
  • JavaWeb商城项目的商品点赞功能模块的开发详
    一.JavaWeb商城项目的商品点赞功能开发过程记录1.1项目背景在完成内蒙古科技大学JavaWeb课程的大作业之后,本着练习的态度继续的写了一个功能:点赞功能。本需求看似简单,难......